From 35ea29b184ca4cf5b96a27429dfc62521873a2d3 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Wed, 2 Apr 2025 21:50:00 +0200 Subject: [PATCH 001/126] prepare websocket redis sentinel code for upcoming native support of sentinel in python-socketio --- backend/open_webui/socket/main.py | 14 +----- backend/open_webui/utils/redis.py | 73 ++++--------------------------- 2 files changed, 11 insertions(+), 76 deletions(-) diff --git a/backend/open_webui/socket/main.py b/backend/open_webui/socket/main.py index 83dd74fff..c1ce42c79 100644 --- a/backend/open_webui/socket/main.py +++ b/backend/open_webui/socket/main.py @@ -9,9 +9,8 @@ from open_webui.models.users import Users, UserNameResponse from open_webui.models.channels import Channels from open_webui.models.chats import Chats from open_webui.utils.redis import ( - parse_redis_sentinel_url, get_sentinels_from_env, - AsyncRedisSentinelManager, + get_sentinel_url_from_env, ) from open_webui.env import ( @@ -38,16 +37,7 @@ log.setLevel(SRC_LOG_LEVELS["SOCKET"]) if WEBSOCKET_MANAGER == "redis": if WEBSOCKET_SENTINEL_HOSTS: - redis_config = parse_redis_sentinel_url(WEBSOCKET_REDIS_URL) - mgr = AsyncRedisSentinelManager( - WEBSOCKET_SENTINEL_HOSTS.split(","), - sentinel_port=int(WEBSOCKET_SENTINEL_PORT), - redis_port=redis_config["port"], - service=redis_config["service"], - db=redis_config["db"], - username=redis_config["username"], - password=redis_config["password"], - ) + mgr = socketio.AsyncRedisManager(get_sentinel_url_from_env(WEBSOCKET_REDIS_URL, WEBSOCKET_SENTINEL_HOSTS, WEBSOCKET_SENTINEL_PORT)) else: mgr = socketio.AsyncRedisManager(WEBSOCKET_REDIS_URL) sio = socketio.AsyncServer( diff --git a/backend/open_webui/utils/redis.py b/backend/open_webui/utils/redis.py index baccb16ad..715ac0d9b 100644 --- a/backend/open_webui/utils/redis.py +++ b/backend/open_webui/utils/redis.py @@ -4,7 +4,7 @@ from redis import asyncio as aioredis from urllib.parse import urlparse -def parse_redis_sentinel_url(redis_url): +def parse_redis_service_url(redis_url): parsed_url = urlparse(redis_url) if parsed_url.scheme != "redis": raise ValueError("Invalid Redis URL scheme. Must be 'redis'.") @@ -20,7 +20,7 @@ def parse_redis_sentinel_url(redis_url): def get_redis_connection(redis_url, redis_sentinels, decode_responses=True): if redis_sentinels: - redis_config = parse_redis_sentinel_url(redis_url) + redis_config = parse_redis_service_url(redis_url) sentinel = redis.sentinel.Sentinel( redis_sentinels, port=redis_config["port"], @@ -45,65 +45,10 @@ def get_sentinels_from_env(sentinel_hosts_env, sentinel_port_env): return [] -class AsyncRedisSentinelManager(socketio.AsyncRedisManager): - def __init__( - self, - sentinel_hosts, - sentinel_port=26379, - redis_port=6379, - service="mymaster", - db=0, - username=None, - password=None, - channel="socketio", - write_only=False, - logger=None, - redis_options=None, - ): - """ - Initialize the Redis Sentinel Manager. - This implementation mostly replicates the __init__ of AsyncRedisManager and - overrides _redis_connect() with a version that uses Redis Sentinel - - :param sentinel_hosts: List of Sentinel hosts - :param sentinel_port: Sentinel Port - :param redis_port: Redis Port (currently unsupported by aioredis!) - :param service: Master service name in Sentinel - :param db: Redis database to use - :param username: Redis username (if any) (currently unsupported by aioredis!) - :param password: Redis password (if any) - :param channel: The channel name on which the server sends and receives - notifications. Must be the same in all the servers. - :param write_only: If set to ``True``, only initialize to emit events. The - default of ``False`` initializes the class for emitting - and receiving. - :param redis_options: additional keyword arguments to be passed to - ``aioredis.from_url()``. - """ - self._sentinels = [(host, sentinel_port) for host in sentinel_hosts] - self._redis_port = redis_port - self._service = service - self._db = db - self._username = username - self._password = password - self._channel = channel - self.redis_options = redis_options or {} - - # connect and call grandparent constructor - self._redis_connect() - super(socketio.AsyncRedisManager, self).__init__( - channel=channel, write_only=write_only, logger=logger - ) - - def _redis_connect(self): - """Establish connections to Redis through Sentinel.""" - sentinel = aioredis.sentinel.Sentinel( - self._sentinels, - port=self._redis_port, - db=self._db, - password=self._password, - **self.redis_options, - ) - - self.redis = sentinel.master_for(self._service) - self.pubsub = self.redis.pubsub(ignore_subscribe_messages=True) +def get_sentinel_url_from_env(redis_url, sentinel_hosts_env, sentinel_port_env): + redis_config = parse_redis_service_url(redis_url) + username = redis_config["username"] or "" + password = redis_config["password"] or "" + auth_part = f"{username}:{password}" + hosts_part = ",".join(f"{host}:{sentinel_port_env}" for host in sentinel_hosts_env.split(",")) + return f"redis+sentinel://{auth_part}@{hosts_part}/{redis_config['db']}/{redis_config['service']}" From 257ca454569f1c4bd936a039c751f170ab3c6c38 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Thu, 3 Apr 2025 08:24:24 +0200 Subject: [PATCH 002/126] leave out @ in redis+sentine url when no username/password is provided --- backend/open_webui/utils/redis.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/utils/redis.py b/backend/open_webui/utils/redis.py index 715ac0d9b..24d3eefc7 100644 --- a/backend/open_webui/utils/redis.py +++ b/backend/open_webui/utils/redis.py @@ -49,6 +49,8 @@ def get_sentinel_url_from_env(redis_url, sentinel_hosts_env, sentinel_port_env): redis_config = parse_redis_service_url(redis_url) username = redis_config["username"] or "" password = redis_config["password"] or "" - auth_part = f"{username}:{password}" + auth_part = "" + if username or password: + auth_part = f"{username}:{password}@" hosts_part = ",".join(f"{host}:{sentinel_port_env}" for host in sentinel_hosts_env.split(",")) - return f"redis+sentinel://{auth_part}@{hosts_part}/{redis_config['db']}/{redis_config['service']}" + return f"redis+sentinel://{auth_part}{hosts_part}/{redis_config['db']}/{redis_config['service']}" From 5379c08b9dfd544cf22fb75b50a9346fc9c9cb87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:42:11 +0000 Subject: [PATCH 003/126] build(deps): bump azure-identity from 1.20.0 to 1.21.0 in /backend Bumps [azure-identity](https://github.com/Azure/azure-sdk-for-python) from 1.20.0 to 1.21.0. - [Release notes](https://github.com/Azure/azure-sdk-for-python/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-python/blob/main/doc/esrp_release.md) - [Commits](https://github.com/Azure/azure-sdk-for-python/compare/azure-identity_1.20.0...azure-identity_1.21.0) --- updated-dependencies: - dependency-name: azure-identity dependency-version: 1.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 499eae36d..c77f6ba6d 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -113,7 +113,7 @@ pytest-docker~=3.1.1 googleapis-common-protos==1.63.2 google-cloud-storage==2.19.0 -azure-identity==1.20.0 +azure-identity==1.21.0 azure-storage-blob==12.24.1 From 9e8b7ac61119d8d048ae03b2b7501b96a98e5085 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:42:14 +0000 Subject: [PATCH 004/126] build(deps): bump chromadb from 0.6.2 to 0.6.3 in /backend Bumps [chromadb](https://github.com/chroma-core/chroma) from 0.6.2 to 0.6.3. - [Release notes](https://github.com/chroma-core/chroma/releases) - [Changelog](https://github.com/chroma-core/chroma/blob/main/RELEASE_PROCESS.md) - [Commits](https://github.com/chroma-core/chroma/compare/0.6.2...0.6.3) --- updated-dependencies: - dependency-name: chromadb dependency-version: 0.6.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 499eae36d..5f1449641 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -44,7 +44,7 @@ langchain==0.3.19 langchain-community==0.3.18 fake-useragent==2.1.0 -chromadb==0.6.2 +chromadb==0.6.3 pymilvus==2.5.0 qdrant-client~=1.12.0 opensearch-py==2.8.0 From f187a1c9efd86a4ee1cc44ed4679e426d05c995e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:42:17 +0000 Subject: [PATCH 005/126] build(deps): bump pgvector from 0.3.5 to 0.4.0 in /backend Bumps [pgvector](https://github.com/pgvector/pgvector-python) from 0.3.5 to 0.4.0. - [Changelog](https://github.com/pgvector/pgvector-python/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgvector/pgvector-python/compare/v0.3.5...v0.4.0) --- updated-dependencies: - dependency-name: pgvector dependency-version: 0.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 499eae36d..5f82dbec2 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -18,7 +18,7 @@ alembic==1.14.0 peewee==3.17.9 peewee-migrate==1.12.2 psycopg2-binary==2.9.9 -pgvector==0.3.5 +pgvector==0.4.0 PyMySQL==1.1.1 bcrypt==4.3.0 From 96ecdc37b3656545a6d5536db72ba21ef8d64ce5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:42:21 +0000 Subject: [PATCH 006/126] build(deps): bump youtube-transcript-api from 0.6.3 to 1.0.3 in /backend Bumps [youtube-transcript-api](https://github.com/jdepoix/youtube-transcript-api) from 0.6.3 to 1.0.3. - [Release notes](https://github.com/jdepoix/youtube-transcript-api/releases) - [Commits](https://github.com/jdepoix/youtube-transcript-api/compare/v0.6.3...v1.0.3) --- updated-dependencies: - dependency-name: youtube-transcript-api dependency-version: 1.0.3 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 499eae36d..6c13fef10 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -93,7 +93,7 @@ authlib==1.4.1 black==25.1.0 langfuse==2.44.0 -youtube-transcript-api==0.6.3 +youtube-transcript-api==1.0.3 pytube==15.0.0 extract_msg From ba669955322ab956ff72a4ac6cfcf4cc6d89c5f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:42:44 +0000 Subject: [PATCH 007/126] build(deps): bump @tiptap/pm from 2.10.0 to 2.11.7 Bumps [@tiptap/pm](https://github.com/ueberdosis/tiptap/tree/HEAD/packages/pm) from 2.10.0 to 2.11.7. - [Release notes](https://github.com/ueberdosis/tiptap/releases) - [Changelog](https://github.com/ueberdosis/tiptap/blob/@tiptap/pm@2.11.7/packages/pm/CHANGELOG.md) - [Commits](https://github.com/ueberdosis/tiptap/commits/@tiptap/pm@2.11.7/packages/pm) --- updated-dependencies: - dependency-name: "@tiptap/pm" dependency-version: 2.11.7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 41 +++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/package-lock.json b/package-lock.json index 360d02a39..51dc782f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@tiptap/extension-highlight": "^2.10.0", "@tiptap/extension-placeholder": "^2.10.0", "@tiptap/extension-typography": "^2.10.0", - "@tiptap/pm": "^2.10.0", + "@tiptap/pm": "^2.11.7", "@tiptap/starter-kit": "^2.10.0", "@xyflow/svelte": "^0.1.19", "async": "^3.2.5", @@ -3042,9 +3042,9 @@ } }, "node_modules/@tiptap/pm": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.10.0.tgz", - "integrity": "sha512-ohshlWf4MlW6D3rQkNQnhmiQ2w4pwRoQcJmTPt8UJoIDGkeKmZh494fQp4Aeh80XuGd81SsCv//1HJeyaeHJYQ==", + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.11.7.tgz", + "integrity": "sha512-7gEEfz2Q6bYKXM07vzLUD0vqXFhC5geWRA6LCozTiLdVFDdHWiBrvb2rtkL5T7mfLq03zc1QhH7rI3F6VntOEA==", "license": "MIT", "dependencies": { "prosemirror-changeset": "^2.2.1", @@ -3061,10 +3061,10 @@ "prosemirror-schema-basic": "^1.2.3", "prosemirror-schema-list": "^1.4.1", "prosemirror-state": "^1.4.3", - "prosemirror-tables": "^1.6.1", + "prosemirror-tables": "^1.6.4", "prosemirror-trailing-node": "^3.0.0", "prosemirror-transform": "^1.10.2", - "prosemirror-view": "^1.36.0" + "prosemirror-view": "^1.37.0" }, "funding": { "type": "github", @@ -9783,9 +9783,10 @@ } }, "node_modules/prosemirror-model": { - "version": "1.23.0", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.23.0.tgz", - "integrity": "sha512-Q/fgsgl/dlOAW9ILu4OOhYWQbc7TQd4BwKH/RwmUjyVf8682Be4zj3rOYdLnYEcGzyg8LL9Q5IWYKD8tdToreQ==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.0.tgz", + "integrity": "sha512-/8XUmxWf0pkj2BmtqZHYJipTBMHIdVjuvFzMvEoxrtyGNmfvdhBiRwYt/eFwy2wA9DtBW3RLqvZnjurEkHaFCw==", + "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" } @@ -9819,16 +9820,16 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.1.tgz", - "integrity": "sha512-p8WRJNA96jaNQjhJolmbxTzd6M4huRE5xQ8OxjvMhQUP0Nzpo4zz6TztEiwk6aoqGBhz9lxRWR1yRZLlpQN98w==", + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.6.4.tgz", + "integrity": "sha512-TkDY3Gw52gRFRfRn2f4wJv5WOgAOXLJA2CQJYIJ5+kdFbfj3acR4JUW6LX2e1hiEBiUwvEhzH5a3cZ5YSztpIA==", "license": "MIT", "dependencies": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.24.1", + "prosemirror-state": "^1.4.3", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.37.2" } }, "node_modules/prosemirror-trailing-node": { @@ -9856,9 +9857,9 @@ } }, "node_modules/prosemirror-view": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.36.0.tgz", - "integrity": "sha512-U0GQd5yFvV5qUtT41X1zCQfbw14vkbbKwLlQXhdylEmgpYVHkefXYcC4HHwWOfZa3x6Y8wxDLUBv7dxN5XQ3nA==", + "version": "1.39.1", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.39.1.tgz", + "integrity": "sha512-GhLxH1xwnqa5VjhJ29LfcQITNDp+f1jzmMPXQfGW9oNrF0lfjPzKvV5y/bjIQkyKpwCX3Fp+GA4dBpMMk8g+ZQ==", "license": "MIT", "dependencies": { "prosemirror-model": "^1.20.0", diff --git a/package.json b/package.json index f670644df..f0658d161 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "@tiptap/extension-highlight": "^2.10.0", "@tiptap/extension-placeholder": "^2.10.0", "@tiptap/extension-typography": "^2.10.0", - "@tiptap/pm": "^2.10.0", + "@tiptap/pm": "^2.11.7", "@tiptap/starter-kit": "^2.10.0", "@xyflow/svelte": "^0.1.19", "async": "^3.2.5", From 8a81f5f18816d59c27f54cd5085f3762a6d5f1a5 Mon Sep 17 00:00:00 2001 From: Matthew O'Gorman Date: Sun, 6 Apr 2025 23:42:53 -0400 Subject: [PATCH 008/126] add support for elixir code syntax highlighting --- package-lock.json | 19 +++++++++++++++++++ package.json | 1 + src/lib/components/common/CodeEditor.svelte | 10 ++++++++++ 3 files changed, 30 insertions(+) diff --git a/package-lock.json b/package-lock.json index d3de96f8e..c70a017f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ "async": "^3.2.5", "bits-ui": "^0.19.7", "codemirror": "^6.0.1", + "codemirror-lang-elixir": "^4.0.0", "codemirror-lang-hcl": "^0.0.0-beta.2", "crc-32": "^1.2.2", "dayjs": "^1.11.10", @@ -4625,6 +4626,15 @@ "@codemirror/view": "^6.0.0" } }, + "node_modules/codemirror-lang-elixir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/codemirror-lang-elixir/-/codemirror-lang-elixir-4.0.0.tgz", + "integrity": "sha512-mzFesxo/t6KOxwnkqVd34R/q7yk+sMtHh6vUKGAvjwHmpL7bERHB+vQAsmU/nqrndkwVeJEHWGw/z/ybfdiudA==", + "dependencies": { + "@codemirror/language": "^6.0.0", + "lezer-elixir": "^1.0.0" + } + }, "node_modules/codemirror-lang-hcl": { "version": "0.0.0-beta.2", "resolved": "https://registry.npmjs.org/codemirror-lang-hcl/-/codemirror-lang-hcl-0.0.0-beta.2.tgz", @@ -7611,6 +7621,15 @@ "node": ">= 0.8.0" } }, + "node_modules/lezer-elixir": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/lezer-elixir/-/lezer-elixir-1.1.2.tgz", + "integrity": "sha512-K3yPMJcNhqCL6ugr5NkgOC1g37rcOM38XZezO9lBXy0LwWFd8zdWXfmRbY829vZVk0OGCQoI02yDWp9FF2OWZA==", + "dependencies": { + "@lezer/highlight": "^1.2.0", + "@lezer/lr": "^1.3.0" + } + }, "node_modules/lightningcss": { "version": "1.29.1", "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.1.tgz", diff --git a/package.json b/package.json index 9e6396015..f65fa663e 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "bits-ui": "^0.19.7", "codemirror": "^6.0.1", "codemirror-lang-hcl": "^0.0.0-beta.2", + "codemirror-lang-elixir": "^4.0.0", "crc-32": "^1.2.2", "dayjs": "^1.11.10", "dompurify": "^3.1.6", diff --git a/src/lib/components/common/CodeEditor.svelte b/src/lib/components/common/CodeEditor.svelte index 82ff13937..2c10ed13c 100644 --- a/src/lib/components/common/CodeEditor.svelte +++ b/src/lib/components/common/CodeEditor.svelte @@ -98,6 +98,16 @@ } }) ); + languages.push( + LanguageDescription.of({ + name: 'Elixir', + extensions: ['ex', 'exs'], + load() { + return import('codemirror-lang-elixir').then((m) => m.elixir()); + } + }) + ); + const getLang = async () => { const language = languages.find((l) => l.alias.includes(lang)); return await language?.load(); From dbc06084a786928a1cbd876cb1e62a032668bf3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 7 Apr 2025 03:43:31 +0000 Subject: [PATCH 009/126] build(deps): bump opentelemetry-instrumentation-logging Bumps [opentelemetry-instrumentation-logging](https://github.com/open-telemetry/opentelemetry-python-contrib) from 0.51b0 to 0.52b0. - [Release notes](https://github.com/open-telemetry/opentelemetry-python-contrib/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-python-contrib/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-python-contrib/commits) --- updated-dependencies: - dependency-name: opentelemetry-instrumentation-logging dependency-version: 0.52b0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- backend/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 499eae36d..2e027af1d 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -132,6 +132,6 @@ opentelemetry-instrumentation-fastapi==0.51b0 opentelemetry-instrumentation-sqlalchemy==0.51b0 opentelemetry-instrumentation-redis==0.51b0 opentelemetry-instrumentation-requests==0.51b0 -opentelemetry-instrumentation-logging==0.51b0 +opentelemetry-instrumentation-logging==0.52b0 opentelemetry-instrumentation-httpx==0.51b0 opentelemetry-instrumentation-aiohttp-client==0.51b0 \ No newline at end of file From 76d8935d0b094b897bf80ee2bb4a76fab81ca86d Mon Sep 17 00:00:00 2001 From: Aleix Dorca Date: Mon, 7 Apr 2025 08:31:44 +0200 Subject: [PATCH 010/126] Update catalan translation.json --- src/lib/i18n/locales/ca-ES/translation.json | 74 ++++++++++----------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index e1c666242..3c02b8060 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -6,7 +6,7 @@ "(latest)": "(últim)", "(Ollama)": "(Ollama)", "{{ models }}": "{{ models }}", - "{{COUNT}} Available Tools": "", + "{{COUNT}} Available Tools": "{{COUNT}} eines disponibles", "{{COUNT}} hidden lines": "{{COUNT}} línies ocultes", "{{COUNT}} Replies": "{{COUNT}} respostes", "{{user}}'s Chats": "Els xats de {{user}}", @@ -108,10 +108,10 @@ "Attribute for Username": "Atribut per al Nom d'usuari", "Audio": "Àudio", "August": "Agost", - "Auth": "", + "Auth": "Autenticació", "Authenticate": "Autenticar", "Authentication": "Autenticació", - "Auto": "", + "Auto": "Automàtic", "Auto-Copy Response to Clipboard": "Copiar la resposta automàticament al porta-retalls", "Auto-playback response": "Reproduir la resposta automàticament", "Autocomplete Generation": "Generació automàtica", @@ -121,7 +121,7 @@ "AUTOMATIC1111 Base URL": "URL Base d'AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "Es requereix l'URL Base d'AUTOMATIC1111.", "Available list": "Llista de disponibles", - "Available Tools": "", + "Available Tools": "Eines disponibles", "available!": "disponible!", "Awful": "Terrible", "Azure AI Speech": "Azure AI Speech", @@ -220,10 +220,10 @@ "Confirm your new password": "Confirma la teva nova contrasenya", "Connect to your own OpenAI compatible API endpoints.": "Connecta als teus propis punts de connexió de l'API compatible amb OpenAI", "Connect to your own OpenAPI compatible external tool servers.": "Connecta als teus propis servidors d'eines externs compatibles amb OpenAPI", - "Connection failed": "", - "Connection successful": "", + "Connection failed": "La connexió ha fallat", + "Connection successful": "Connexió correcta", "Connections": "Connexions", - "Connections saved successfully": "", + "Connections saved successfully": "Les connexions s'han desat correctament", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "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.", "Contact Admin for WebUI Access": "Posat en contacte amb l'administrador per accedir a WebUI", "Content": "Contingut", @@ -308,7 +308,7 @@ "Direct Connections": "Connexions directes", "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Les connexions directes permeten als usuaris connectar-se als seus propis endpoints d'API compatibles amb OpenAI.", "Direct Connections settings updated": "Configuració de les connexions directes actualitzada", - "Direct Tool Servers": "", + "Direct Tool Servers": "Servidors d'eines directes", "Disabled": "Deshabilitat", "Discover a function": "Descobrir una funció", "Discover a model": "Descobrir un model", @@ -385,7 +385,7 @@ "Enable Mirostat sampling for controlling perplexity.": "Permetre el mostreig de Mirostat per controlar la perplexitat", "Enable New Sign Ups": "Permetre nous registres", "Enabled": "Habilitat", - "Enforce Temporary Chat": "", + "Enforce Temporary Chat": "Forçar els xats temporals", "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", @@ -418,7 +418,7 @@ "Enter Kagi Search API Key": "Introdueix la clau API de Kagi Search", "Enter Key Behavior": "Introdueix el comportament de clau", "Enter language codes": "Introdueix els codis de llenguatge", - "Enter Mistral API Key": "", + "Enter Mistral API Key": "Entra la clau API de Mistral", "Enter Model ID": "Introdueix l'identificador del model", "Enter model tag (e.g. {{modelTag}})": "Introdueix l'etiqueta del model (p. ex. {{modelTag}})", "Enter Mojeek Search API Key": "Introdueix la clau API de Mojeek Search", @@ -443,7 +443,7 @@ "Enter server port": "Introdueix el port del servidor", "Enter stop sequence": "Introdueix la seqüència de parada", "Enter system prompt": "Introdueix la indicació de sistema", - "Enter system prompt here": "", + "Enter system prompt here": "Entra la indicació de sistema aquí", "Enter Tavily API Key": "Introdueix la clau API de Tavily", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Entra la URL pública de WebUI. Aquesta URL s'utilitzarà per generar els enllaços en les notificacions.", "Enter Tika Server URL": "Introdueix l'URL del servidor Tika", @@ -457,7 +457,7 @@ "Enter Your Email": "Introdueix el teu correu electrònic", "Enter Your Full Name": "Introdueix el teu nom complet", "Enter your message": "Introdueix el teu missatge", - "Enter your name": "", + "Enter your name": "Entra el teu nom", "Enter your new password": "Introdueix la teva nova contrasenya", "Enter Your Password": "Introdueix la teva contrasenya", "Enter Your Role": "Introdueix el teu rol", @@ -477,7 +477,7 @@ "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "S'ha superat el nombre de places a la vostra llicència. Poseu-vos en contacte amb el servei d'assistència per augmentar el nombre de places.", "Exclude": "Excloure", "Execute code for analysis": "Executar el codi per analitzar-lo", - "Executing **{{NAME}}**...": "", + "Executing **{{NAME}}**...": "Executant **{{NAME}}**...", "Expand": "Expandir", "Experimental": "Experimental", "Explain": "Explicar", @@ -502,7 +502,7 @@ "Failed to create API Key.": "No s'ha pogut crear la clau API.", "Failed to fetch models": "No s'han pogut obtenir els models", "Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls", - "Failed to save connections": "", + "Failed to save connections": "No s'han pogut desar les connexions", "Failed to save models configuration": "No s'ha pogut desar la configuració dels models", "Failed to update settings": "No s'han pogut actualitzar les preferències", "Failed to upload file.": "No s'ha pogut pujar l'arxiu.", @@ -535,7 +535,7 @@ "Forge new paths": "Crea nous camins", "Form": "Formulari", "Format your variables using brackets like this:": "Formata les teves variables utilitzant claudàtors així:", - "Forwards system user session credentials to authenticate": "", + "Forwards system user session credentials to authenticate": "Envia les credencials de l'usuari del sistema per autenticar", "Frequency Penalty": "Penalització per freqüència", "Full Context Mode": "Mode de context complert", "Function": "Funció", @@ -581,7 +581,7 @@ "Hex Color": "Color hexadecimal", "Hex Color - Leave empty for default color": "Color hexadecimal - Deixar buit per a color per defecte", "Hide": "Amaga", - "Hide Model": "", + "Hide Model": "Amagar el model", "Home": "Inici", "Host": "Servidor", "How can I help you today?": "Com et puc ajudar avui?", @@ -641,7 +641,7 @@ "Knowledge Access": "Accés al coneixement", "Knowledge created successfully.": "Coneixement creat correctament.", "Knowledge deleted successfully.": "Coneixement eliminat correctament.", - "Knowledge Public Sharing": "", + "Knowledge Public Sharing": "Compartir públicament el Coneixement", "Knowledge reset successfully.": "Coneixement restablert correctament.", "Knowledge updated successfully": "Coneixement actualitzat correctament.", "Kokoro.js (Browser)": "Kokoro.js (Navegador)", @@ -655,7 +655,7 @@ "LDAP": "LDAP", "LDAP server updated": "Servidor LDAP actualitzat", "Leaderboard": "Tauler de classificació", - "Learn more about OpenAPI tool servers.": "", + "Learn more about OpenAPI tool servers.": "Aprèn més sobre els servidors d'eines OpenAPI", "Leave empty for unlimited": "Deixar-ho buit per il·limitat", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Deixar-ho buit per incloure tots els models del punt de connexió \"{{url}}/api/tags\"", "Leave empty to include all models from \"{{url}}/models\" endpoint": "Deixar-ho buit per incloure tots els models del punt de connexió \"{{url}}/models\"", @@ -706,16 +706,16 @@ "Mirostat": "Mirostat", "Mirostat Eta": "Eta de Mirostat", "Mirostat Tau": "Tau de Mirostat", - "Mistral OCR": "", - "Mistral OCR API Key required.": "", + "Mistral OCR": "Mistral OCR", + "Mistral OCR API Key required.": "És necessària la clau API de Mistral OCR", "Model": "Model", "Model '{{modelName}}' has been successfully downloaded.": "El model '{{modelName}}' s'ha descarregat correctament.", "Model '{{modelTag}}' is already in queue for downloading.": "El model '{{modelTag}}' ja està en cua per ser descarregat.", "Model {{modelId}} not found": "No s'ha trobat el model {{modelId}}", "Model {{modelName}} is not vision capable": "El model {{modelName}} no és capaç de visió", "Model {{name}} is now {{status}}": "El model {{name}} ara és {{status}}", - "Model {{name}} is now hidden": "", - "Model {{name}} is now visible": "", + "Model {{name}} is now hidden": "El model {{name}} està ara amagat", + "Model {{name}} is now visible": "El model {{name}} està ara visible", "Model accepts image inputs": "El model accepta entrades d'imatge", "Model created successfully!": "Model creat correctament", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "S'ha detectat el camí del sistema de fitxers del model. És necessari un nom curt del model per actualitzar, no es pot continuar.", @@ -731,7 +731,7 @@ "Models": "Models", "Models Access": "Accés als models", "Models configuration saved successfully": "La configuració dels models s'ha desat correctament", - "Models Public Sharing": "", + "Models Public Sharing": "Compartició pública de models", "Mojeek Search API Key": "Clau API de Mojeek Search", "more": "més", "More": "Més", @@ -794,7 +794,7 @@ "Open file": "Obrir arxiu", "Open in full screen": "Obrir en pantalla complerta", "Open new chat": "Obre un xat nou", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI pot utilitzar eines de servidors OpenAPI.", "Open WebUI uses faster-whisper internally.": "Open WebUI utilitza faster-whisper internament.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI utilitza incrustacions de SpeechT5 i CMU Arctic.", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "La versió d'Open WebUI (v{{OPEN_WEBUI_VERSION}}) és inferior a la versió requerida (v{{REQUIRED_VERSION}})", @@ -804,7 +804,7 @@ "OpenAI API Key is required.": "Es requereix la clau API d'OpenAI.", "OpenAI API settings updated": "Configuració de l'API d'OpenAI actualitzada", "OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.", - "openapi.json Path": "", + "openapi.json Path": "openapi.json", "or": "o", "Organize your users": "Organitza els teus usuaris", "Other": "Altres", @@ -836,8 +836,8 @@ "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.": "No tanquis la pàgina de configuració mentre carregues el model.", "Please enter a prompt": "Si us plau, entra una indicació", - "Please enter a valid path": "", - "Please enter a valid URL": "", + "Please enter a valid path": "Si us plau, entra un camí vàlid", + "Please enter a valid URL": "Si us plau, entra una URL vàlida", "Please fill in all fields.": "Emplena tots els camps, si us plau.", "Please select a model first.": "Si us plau, selecciona un model primer", "Please select a model.": "Si us plau, selecciona un model.", @@ -853,14 +853,14 @@ "Profile Image": "Imatge de perfil", "Prompt": "Indicació", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Indicació (p.ex. Digues-me quelcom divertit sobre l'Imperi Romà)", - "Prompt Autocompletion": "", + "Prompt Autocompletion": "Completar automàticament la indicació", "Prompt Content": "Contingut de la indicació", "Prompt created successfully": "Indicació creada correctament", "Prompt suggestions": "Suggeriments d'indicacions", "Prompt updated successfully": "Indicació actualitzada correctament", "Prompts": "Indicacions", "Prompts Access": "Accés a les indicacions", - "Prompts Public Sharing": "", + "Prompts Public Sharing": "Compartició pública de indicacions", "Public": "Públic", "Pull \"{{searchValue}}\" from Ollama.com": "Obtenir \"{{searchValue}}\" de Ollama.com", "Pull a model from Ollama.com": "Obtenir un model d'Ollama.com", @@ -993,11 +993,11 @@ "Share": "Compartir", "Share Chat": "Compartir el xat", "Share to Open WebUI Community": "Compartir amb la comunitat OpenWebUI", - "Sharing Permissions": "", + "Sharing Permissions": "Compartir els permisos", "Show": "Mostrar", "Show \"What's New\" modal on login": "Veure 'Què hi ha de nou' a l'entrada", "Show Admin Details in Account Pending Overlay": "Mostrar els detalls de l'administrador a la superposició del compte pendent", - "Show Model": "", + "Show Model": "Mostrar el model", "Show shortcuts": "Mostrar dreceres", "Show your support!": "Mostra el teu suport!", "Showcased creativity": "Creativitat mostrada", @@ -1060,7 +1060,7 @@ "Thinking...": "Pensant...", "This action cannot be undone. Do you wish to continue?": "Aquesta acció no es pot desfer. Vols continuar?", "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Aquest canal es va crear el dia {{createdAt}}. Aquest és el començament del canal {{channelName}}.", - "This chat won’t appear in history and your messages will not be saved.": "", + "This chat won’t appear in history and your messages will not be saved.": "Aquest xat no apareixerà a l'historial i els teus missatges no es desaran.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Això assegura que les teves converses valuoses queden desades de manera segura a la teva base de dades. Gràcies!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Aquesta és una funció experimental, és possible que no funcioni com s'espera i està subjecta a canvis en qualsevol moment.", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Aquesta opció controla quants tokens es conserven en actualitzar el context. Per exemple, si s'estableix en 2, es conservaran els darrers 2 tokens del context de conversa. Preservar el context pot ajudar a mantenir la continuïtat d'una conversa, però pot reduir la capacitat de respondre a nous temes.", @@ -1108,7 +1108,7 @@ "Tool ID": "ID de l'eina", "Tool imported successfully": "Eina importada correctament", "Tool Name": "Nom de l'eina", - "Tool Servers": "", + "Tool Servers": "Servidors d'eines", "Tool updated successfully": "Eina actualitzada correctament", "Tools": "Eines", "Tools Access": "Accés a les eines", @@ -1116,7 +1116,7 @@ "Tools Function Calling Prompt": "Indicació per a la crida de funcions", "Tools have a function calling system that allows arbitrary code execution": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari", "Tools have a function calling system that allows arbitrary code execution.": "Les eines disposen d'un sistema de crida a funcions que permet execució de codi arbitrari.", - "Tools Public Sharing": "", + "Tools Public Sharing": "Compartició pública d'eines", "Top K": "Top K", "Top K Reranker": "Top K Reranker", "Top P": "Top P", @@ -1163,7 +1163,7 @@ "user": "usuari", "User": "Usuari", "User location successfully retrieved.": "Ubicació de l'usuari obtinguda correctament", - "User Webhooks": "", + "User Webhooks": "Webhooks d'usuari", "Username": "Nom d'usuari", "Users": "Usuaris", "Using the default arena model with all models. Click the plus button to add custom models.": "S'utilitza el model d'Arena predeterminat amb tots els models. Clica el botó més per afegir models personalitzats.", @@ -1178,7 +1178,7 @@ "Version": "Versió", "Version {{selectedVersion}} of {{totalVersions}}": "Versió {{selectedVersion}} de {{totalVersions}}", "View Replies": "Veure les respostes", - "View Result from **{{NAME}}**": "", + "View Result from **{{NAME}}**": "Veure el resultat de **{{NAME}}**", "Visibility": "Visibilitat", "Voice": "Veu", "Voice Input": "Entrada de veu", @@ -1196,7 +1196,7 @@ "Webhook URL": "URL del webhook", "WebUI Settings": "Preferències de WebUI", "WebUI URL": "URL de WebUI", - "WebUI will make requests to \"{{url}}\"": "", + "WebUI will make requests to \"{{url}}\"": "WebUI farà peticions a \"{{url}}\"", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI farà peticions a \"{{url}}/api/chat\"", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI farà peticions a \"{{url}}/chat/completions\"", "What are you trying to achieve?": "Què intentes aconseguir?", From aefb3117db8d02fd8f19ea6c8d1821cc708e96c8 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 6 Apr 2025 23:40:48 -0700 Subject: [PATCH 011/126] fix: chat completion non-existent model issue --- backend/open_webui/main.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index c9ca059c2..8e7d6a8be 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1108,13 +1108,15 @@ async def chat_completion( except Exception as e: log.debug(f"Error processing chat payload: {e}") - Chats.upsert_message_to_chat_by_id_and_message_id( - metadata["chat_id"], - metadata["message_id"], - { - "error": {"content": str(e)}, - }, - ) + if metadata.get("chat_id") and metadata.get("message_id"): + # Update the chat message with the error + Chats.upsert_message_to_chat_by_id_and_message_id( + metadata["chat_id"], + metadata["message_id"], + { + "error": {"content": str(e)}, + }, + ) raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, From 908492702ac8c5c4c3564e50fa69ba97c9b016a0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 6 Apr 2025 23:46:40 -0700 Subject: [PATCH 012/126] chore: bump --- backend/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index ab82b1736..eb0ea5435 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -124,9 +124,9 @@ ldap3==2.9.1 firecrawl-py==1.12.0 ## Trace -opentelemetry-api==1.30.0 -opentelemetry-sdk==1.30.0 -opentelemetry-exporter-otlp==1.30.0 +opentelemetry-api==1.31.1 +opentelemetry-sdk==1.31.1 +opentelemetry-exporter-otlp==1.31.1 opentelemetry-instrumentation==0.51b0 opentelemetry-instrumentation-fastapi==0.51b0 opentelemetry-instrumentation-sqlalchemy==0.51b0 From 54a74b2c0a89eb67a04ec9b254ae4e8458292835 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sun, 6 Apr 2025 23:46:59 -0700 Subject: [PATCH 013/126] chore: bump --- backend/requirements.txt | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index eb0ea5435..73c855084 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -127,11 +127,11 @@ firecrawl-py==1.12.0 opentelemetry-api==1.31.1 opentelemetry-sdk==1.31.1 opentelemetry-exporter-otlp==1.31.1 -opentelemetry-instrumentation==0.51b0 -opentelemetry-instrumentation-fastapi==0.51b0 -opentelemetry-instrumentation-sqlalchemy==0.51b0 -opentelemetry-instrumentation-redis==0.51b0 -opentelemetry-instrumentation-requests==0.51b0 +opentelemetry-instrumentation==0.52b0 +opentelemetry-instrumentation-fastapi==0.52b0 +opentelemetry-instrumentation-sqlalchemy==0.52b0 +opentelemetry-instrumentation-redis==0.52b0 +opentelemetry-instrumentation-requests==0.52b0 opentelemetry-instrumentation-logging==0.52b0 -opentelemetry-instrumentation-httpx==0.51b0 -opentelemetry-instrumentation-aiohttp-client==0.51b0 \ No newline at end of file +opentelemetry-instrumentation-httpx==0.52b0 +opentelemetry-instrumentation-aiohttp-client==0.52b0 \ No newline at end of file From 1efae95a36e070e47c01761c497dda1fe4142a14 Mon Sep 17 00:00:00 2001 From: Ho Kim Date: Mon, 7 Apr 2025 06:48:39 +0000 Subject: [PATCH 014/126] fix: internal server error when calling completions API with non-existent model names Signed-off-by: Ho Kim --- backend/open_webui/main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 8e7d6a8be..54cab47f1 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1053,6 +1053,9 @@ async def chat_completion( model_item = form_data.pop("model_item", {}) tasks = form_data.pop("background_tasks", None) + # placeholder + metadata = {} + try: if not model_item.get("direct", False): model_id = form_data.get("model", None) From 9cb1104f09123d91fea25ff69f22b84d49009f6f Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Mon, 7 Apr 2025 00:58:32 -0700 Subject: [PATCH 015/126] refac --- backend/open_webui/main.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 54cab47f1..5c5d86eb1 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1053,9 +1053,7 @@ async def chat_completion( model_item = form_data.pop("model_item", {}) tasks = form_data.pop("background_tasks", None) - # placeholder metadata = {} - try: if not model_item.get("direct", False): model_id = form_data.get("model", None) From f172403049aa5e5b9d486d649f0a783ef0eb81ae Mon Sep 17 00:00:00 2001 From: Haodong Tian <48872409+tth37@users.noreply.github.com> Date: Mon, 7 Apr 2025 16:11:54 +0800 Subject: [PATCH 016/126] Update zh-CN translation.json --- src/lib/i18n/locales/zh-CN/translation.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index d354e7fdb..0f9134c2b 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -111,7 +111,7 @@ "Auth": "授权", "Authenticate": "认证", "Authentication": "身份验证", - "Auto": "", + "Auto": "自动", "Auto-Copy Response to Clipboard": "自动复制回复到剪贴板", "Auto-playback response": "自动念出回复内容", "Autocomplete Generation": "输入框内容猜测补全", @@ -655,7 +655,7 @@ "LDAP": "LDAP", "LDAP server updated": "LDAP 服务器已更新", "Leaderboard": "排行榜", - "Learn more about OpenAPI tool servers.": "", + "Learn more about OpenAPI tool servers.": "进一步了解 OpenAPI 工具服务器。", "Leave empty for unlimited": "留空表示无限制", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "留空以包含来自 \"{{url}}/api/tags\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/models\" endpoint": "留空以包含来自 \"{{url}}/models\" 端点的所有模型", @@ -794,7 +794,7 @@ "Open file": "打开文件", "Open in full screen": "全屏打开", "Open new chat": "打开新对话", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI 可使用任何 OpenAPI 服务器提供的工具。", "Open WebUI uses faster-whisper internally.": "Open WebUI 使用内置 faster-whisper。", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI 使用 SpeechT5 和 CMU Arctic speaker embedding。", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "当前 Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低于所需的版本 (v{{REQUIRED_VERSION}})", From b81789190e352aaac9a891b8d22b0ee2acb460b0 Mon Sep 17 00:00:00 2001 From: SadmL Date: Mon, 7 Apr 2025 12:04:58 +0300 Subject: [PATCH 017/126] [i18n] Russian locale update --- src/lib/i18n/locales/ru-RU/translation.json | 112 ++++++++++---------- 1 file changed, 56 insertions(+), 56 deletions(-) diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 115b87b23..8bd81ae5f 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -6,7 +6,7 @@ "(latest)": "(последняя)", "(Ollama)": "", "{{ models }}": "{{ модели }}", - "{{COUNT}} Available Tools": "", + "{{COUNT}} Available Tools": "{{COUNT}} доступных инструментов", "{{COUNT}} hidden lines": "{{COUNT}} скрытых строк", "{{COUNT}} Replies": "{{COUNT}} Ответов", "{{user}}'s Chats": "Чаты {{user}}'а", @@ -49,10 +49,10 @@ "Adjusting these settings will apply changes universally to all users.": "Изменения в этих настройках будут применены для всех пользователей.", "admin": "админ", "Admin": "Админ", - "Admin Panel": "Админ панель", + "Admin Panel": "Панель администратора", "Admin Settings": "Настройки администратора", "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Администраторы всегда имеют доступ ко всем инструментам; пользователям нужны инструменты, назначенные для каждой модели в рабочем пространстве.", - "Advanced Parameters": "Расширенные Параметры", + "Advanced Parameters": "Расширенные параметры", "Advanced Params": "Расширенные параметры", "All": "Все", "All Documents": "Все документы", @@ -108,10 +108,10 @@ "Attribute for Username": "Атрибут для имени пользователя", "Audio": "Аудио", "August": "Август", - "Auth": "", + "Auth": "Вход", "Authenticate": "Аутентификация", "Authentication": "Аутентификация", - "Auto": "", + "Auto": "Автоматически", "Auto-Copy Response to Clipboard": "Автоматическое копирование ответа в буфер обмена", "Auto-playback response": "Автоматическое воспроизведение ответа", "Autocomplete Generation": "Генерация автозаполнения", @@ -121,7 +121,7 @@ "AUTOMATIC1111 Base URL": "Базовый URL адрес AUTOMATIC1111", "AUTOMATIC1111 Base URL is required.": "Необходим базовый адрес URL AUTOMATIC1111.", "Available list": "Список доступных", - "Available Tools": "", + "Available Tools": "Доступные инструменты", "available!": "доступно!", "Awful": "Ужасно", "Azure AI Speech": "Azure AI Speech", @@ -220,10 +220,10 @@ "Confirm your new password": "Подтвердите свой новый пароль", "Connect to your own OpenAI compatible API endpoints.": "Подключитесь к своим собственным энд-поинтам API, совместимым с OpenAI.", "Connect to your own OpenAPI compatible external tool servers.": "Подключитесь к вашим собственным внешним инструментальным серверам, совместимым с OpenAPI.", - "Connection failed": "", - "Connection successful": "", + "Connection failed": "Подключение не удалось", + "Connection successful": "Успешное подключение", "Connections": "Подключения", - "Connections saved successfully": "", + "Connections saved successfully": "Подключение успешно сохранено", "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Ограничивает усилия по обоснованию для моделей обоснования. Применимо только к моделям обоснования от конкретных поставщиков, которые поддерживают усилия по обоснованию.", "Contact Admin for WebUI Access": "Обратитесь к администратору для получения доступа к WebUI", "Content": "Содержание", @@ -254,7 +254,7 @@ "Create Admin Account": "Создать Аккаунт Администратора", "Create Channel": "Создать Канал", "Create Group": "Создать Группу", - "Create Knowledge": "Создать Знания", + "Create Knowledge": "Создать Знание", "Create new key": "Создать новый ключ", "Create new secret key": "Создать новый секретный ключ", "Created at": "Создано", @@ -304,11 +304,11 @@ "Describe your knowledge base and objectives": "Опишите свою базу знаний и цели", "Description": "Описание", "Didn't fully follow instructions": "Не полностью следует инструкциям", - "Direct": "", + "Direct": "Прямое", "Direct Connections": "Прямые подключения", "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Прямые подключения позволяют пользователям подключаться к своим собственным конечным точкам API, совместимым с OpenAI.", "Direct Connections settings updated": "Настройки прямых подключений обновлены", - "Direct Tool Servers": "", + "Direct Tool Servers": "Прямые сервера инструментов", "Disabled": "Отключено", "Discover a function": "Найти функцию", "Discover a model": "Найти модель", @@ -329,7 +329,7 @@ "Do not install functions from sources you do not fully trust.": "Не устанавливайте функции из источников, которым вы не полностью доверяете.", "Do not install tools from sources you do not fully trust.": "Не устанавливайте инструменты из источников, которым вы не полностью доверяете.", "Docling": "", - "Docling Server URL required.": "", + "Docling Server URL required.": "Необходим URL сервера Docling", "Document": "Документ", "Document Intelligence": "Интеллектуальный анализ документов", "Document Intelligence endpoint and key required.": "Требуется энд-поинт анализа документов и ключ.", @@ -350,7 +350,7 @@ "Draw": "Рисовать", "Drop any files here to add to the conversation": "Перетащите сюда файлы, чтобы добавить их в разговор", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "например, '30s','10m'. Допустимые единицы времени: 's', 'm', 'h'.", - "e.g. \"json\" or a JSON schema": "", + "e.g. \"json\" or a JSON schema": "например, \"json\" или схему JSON", "e.g. 60": "например, 60", "e.g. A filter to remove profanity from text": "например, фильтр для удаления ненормативной лексики из текста", "e.g. My Filter": "например, мой фильтр", @@ -385,7 +385,7 @@ "Enable Mirostat sampling for controlling perplexity.": "Включите выборку Mirostat для контроля путаницы.", "Enable New Sign Ups": "Разрешить новые регистрации", "Enabled": "Включено", - "Enforce Temporary Chat": "", + "Enforce Temporary Chat": "Принудительный временный чат", "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 могли запомнить", @@ -402,7 +402,7 @@ "Enter Chunk Size": "Введите размер фрагмента", "Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Введите пары \"token:bias_value\", разделенные запятыми (пример: 5432:100, 413:-100).", "Enter description": "Введите описание", - "Enter Docling Server URL": "", + "Enter Docling Server URL": "Введите URL сервера Docling", "Enter Document Intelligence Endpoint": "Введите энд-поинт анализа документов", "Enter Document Intelligence Key": "Введите ключ для анализа документов", "Enter domains separated by commas (e.g., example.com,site.org)": "Введите домены, разделенные запятыми (например, example.com,site.org)", @@ -418,7 +418,7 @@ "Enter Kagi Search API Key": "Введите ключ API поиска Kagi", "Enter Key Behavior": "Введите ключ поведения", "Enter language codes": "Введите коды языков", - "Enter Mistral API Key": "", + "Enter Mistral API Key": "Введите ключ API для Mistral", "Enter Model ID": "Введите ID модели", "Enter model tag (e.g. {{modelTag}})": "Введите тег модели (например, {{modelTag}})", "Enter Mojeek Search API Key": "Введите ключ API поиска Mojeek", @@ -443,21 +443,21 @@ "Enter server port": "Введите порт сервера", "Enter stop sequence": "Введите последовательность остановки", "Enter system prompt": "Введите системный промпт", - "Enter system prompt here": "", + "Enter system prompt here": "Введите системный промпт здесь", "Enter Tavily API Key": "Введите ключ API Tavily", "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Введите общедоступный URL вашего WebUI. Этот URL будет использоваться для создания ссылок в уведомлениях.", "Enter Tika Server URL": "Введите URL-адрес сервера Tika", "Enter timeout in seconds": "Введите время ожидания в секундах", "Enter to Send": "Enter для отправки", "Enter Top K": "Введите Top K", - "Enter Top K Reranker": "", + "Enter Top K Reranker": "Введите Top K переоценщика", "Enter URL (e.g. http://127.0.0.1:7860/)": "Введите URL-адрес (например, http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Введите URL-адрес (например, http://localhost:11434)", "Enter your current password": "Введите ваш текущий пароль", "Enter Your Email": "Введите вашу электронную почту", "Enter Your Full Name": "Введите ваше полное имя", "Enter your message": "Введите ваше сообщение", - "Enter your name": "", + "Enter your name": "Введите ваше имя", "Enter your new password": "Введите свой новый пароль", "Enter Your Password": "Введите ваш пароль", "Enter Your Role": "Введите вашу роль", @@ -477,7 +477,7 @@ "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Превышено количество мест в вашей лицензии. Пожалуйста, свяжитесь со службой поддержки, чтобы увеличить количество мест.", "Exclude": "Исключать", "Execute code for analysis": "Выполнить код для анализа", - "Executing **{{NAME}}**...": "", + "Executing **{{NAME}}**...": "Выполняю **{{NAME}}**...", "Expand": "Расширить", "Experimental": "Экспериментальное", "Explain": "Объяснить", @@ -495,14 +495,14 @@ "Export Prompts": "Экспортировать промпты", "Export to CSV": "Экспортировать в CSV", "Export Tools": "Экспортировать инструменты", - "External": "", + "External": "Внешнее", "External Models": "Внешние модели", "Failed to add file.": "Не удалось добавить файл.", - "Failed to connect to {{URL}} OpenAPI tool server": "", + "Failed to connect to {{URL}} OpenAPI tool server": "Не удалось подключиться к серверу инструмента OpenAI {{URL}}", "Failed to create API Key.": "Не удалось создать ключ API.", "Failed to fetch models": "Не удалось получить модели", "Failed to read clipboard contents": "Не удалось прочитать содержимое буфера обмена", - "Failed to save connections": "", + "Failed to save connections": "Не удалось сохранить подключения", "Failed to save models configuration": "Не удалось сохранить конфигурацию моделей", "Failed to update settings": "Не удалось обновить настройки", "Failed to upload file.": "Не удалось загрузить файл.", @@ -535,7 +535,7 @@ "Forge new paths": "Прокладывайте новые пути", "Form": "Форма", "Format your variables using brackets like this:": "Отформатируйте переменные, используя такие : скобки", - "Forwards system user session credentials to authenticate": "", + "Forwards system user session credentials to authenticate": "Перенаправляет учетные данные сеанса системного пользователя для проверки подлинности", "Frequency Penalty": "Штраф за частоту", "Full Context Mode": "Режим полного контекста", "Function": "Функция", @@ -581,7 +581,7 @@ "Hex Color": "Цвет Hex", "Hex Color - Leave empty for default color": "Цвет Hex - оставьте пустым значение цвета по умолчанию", "Hide": "Скрыть", - "Hide Model": "", + "Hide Model": "Скрыть модель", "Home": "Домой", "Host": "Хост", "How can I help you today?": "Чем я могу помочь вам сегодня?", @@ -612,14 +612,14 @@ "Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui", "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Влияет на то, насколько быстро алгоритм реагирует на обратную связь из сгенерированного текста. Более низкая скорость обучения приведет к более медленной корректировке, в то время как более высокая скорость обучения сделает алгоритм более отзывчивым.", "Info": "Информация", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Вводите весь контент в качестве контекста для комплексной обработки, это рекомендуется для сложных запросов.", "Input commands": "Введите команды", "Install from Github URL": "Установка с URL-адреса Github", "Instant Auto-Send After Voice Transcription": "Мгновенная автоматическая отправка после расшифровки голоса", "Integration": "Интеграция", "Interface": "Интерфейс", "Invalid file format.": "Неверный формат файла.", - "Invalid JSON schema": "", + "Invalid JSON schema": "Недопустимая схема JSON", "Invalid Tag": "Недопустимый тег", "is typing...": "печатает...", "January": "Январь", @@ -641,7 +641,7 @@ "Knowledge Access": "Доступ к Знаниям", "Knowledge created successfully.": "Знания созданы успешно.", "Knowledge deleted successfully.": "Знания успешно удалены.", - "Knowledge Public Sharing": "", + "Knowledge Public Sharing": "Публичный обмен знаниями", "Knowledge reset successfully.": "Знания успешно сброшены.", "Knowledge updated successfully": "Знания успешно обновлены", "Kokoro.js (Browser)": "Kokoro.js (Браузер)", @@ -655,10 +655,10 @@ "LDAP": "", "LDAP server updated": "LDAP сервер обновлен", "Leaderboard": "Таблица Лидеров", - "Learn more about OpenAPI tool servers.": "", + "Learn more about OpenAPI tool servers.": "Узнайте больше о серверах инструментов OpenAPI.", "Leave empty for unlimited": "Оставьте пустым для неограниченного", - "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "", - "Leave empty to include all models from \"{{url}}/models\" endpoint": "", + "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Оставьте пустым, чтобы включить все модели из конечной точки \"{{url}}/api/tags\"", + "Leave empty to include all models from \"{{url}}/models\" endpoint": "Оставьте поле пустым, чтобы включить все модели из конечной точки \"{{url}}/models\"", "Leave empty to include all models or select specific models": "Оставьте поле пустым, чтобы включить все модели или выбрать конкретные модели", "Leave empty to use the default prompt, or enter a custom prompt": "Оставьте пустым, чтобы использовать промпт по умолчанию, или введите пользовательский промпт", "Leave model field empty to use the default model.": "Оставьте поле model пустым, чтобы использовать модель по умолчанию.", @@ -668,8 +668,8 @@ "Llama.cpp": "", "LLMs can make mistakes. Verify important information.": "LLMs могут допускать ошибки. Проверяйте важную информацию.", "Loader": "Загрузчик", - "Loading Kokoro.js...": "", - "Local": "", + "Loading Kokoro.js...": "Загрузка Kokoro.js", + "Local": "Локально", "Local Models": "Локальные модели", "Location access not allowed": "Доступ к местоположению запрещен", "Logit Bias": "", @@ -707,15 +707,15 @@ "Mirostat Eta": "Mirostat Eta", "Mirostat Tau": "Mirostat Tau", "Mistral OCR": "", - "Mistral OCR API Key required.": "", + "Mistral OCR API Key required.": "Требуется API ключ Mistral OCR.", "Model": "Модель", "Model '{{modelName}}' has been successfully downloaded.": "Модель '{{modelName}}' успешно загружена.", "Model '{{modelTag}}' is already in queue for downloading.": "Модель '{{modelTag}}' уже находится в очереди на загрузку.", "Model {{modelId}} not found": "Модель {{modelId}} не найдена", "Model {{modelName}} is not vision capable": "Модель {{modelName}} не поддерживает зрение", "Model {{name}} is now {{status}}": "Модель {{name}} теперь {{status}}", - "Model {{name}} is now hidden": "", - "Model {{name}} is now visible": "", + "Model {{name}} is now hidden": "Модель {{name}} теперь скрыта", + "Model {{name}} is now visible": "Модель {{name}} теперь видна", "Model accepts image inputs": "Модель принимает изображения как входные данные", "Model created successfully!": "Модель успешно создана!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Обнаружен путь к файловой системе модели. Для обновления требуется краткое имя модели, не удается продолжить.", @@ -731,7 +731,7 @@ "Models": "Модели", "Models Access": "Доступ к Моделям", "Models configuration saved successfully": "Конфигурация модели успешно сохранена.", - "Models Public Sharing": "", + "Models Public Sharing": "Публичный обмен моделями", "Mojeek Search API Key": "Ключ API для поиска Mojeek", "more": "больше", "More": "Больше", @@ -794,7 +794,7 @@ "Open file": "Открыть файл", "Open in full screen": "Открыть на весь экран", "Open new chat": "Открыть новый чат", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI может использовать инструменты, предоставляемые любым сервером OpenAPI.", "Open WebUI uses faster-whisper internally.": "Open WebUI использует более быстрый внутренний интерфейс whisper.", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "В Open WebUI используются встраиваемые движки генерации речи SpeechT5 и CMU Arctic.", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Версия Open WebUI (v{{OPEN_WEBUI_VERSION}}) ниже требуемой версии (v{{REQUIRED_VERSION}})", @@ -804,7 +804,7 @@ "OpenAI API Key is required.": "Требуется ключ API OpenAI.", "OpenAI API settings updated": "Настройки OpenAI API обновлены", "OpenAI URL/Key required.": "Требуется URL-адрес API OpenAI или ключ API.", - "openapi.json Path": "", + "openapi.json Path": "Путь openapi.json", "or": "или", "Organize your users": "Организуйте своих пользователей", "Other": "Прочее", @@ -836,8 +836,8 @@ "Please carefully review the following warnings:": "Пожалуйста, внимательно ознакомьтесь со следующими предупреждениями:", "Please do not close the settings page while loading the model.": "Пожалуйста, не закрывайте страницу настроек во время загрузки модели.", "Please enter a prompt": "Пожалуйста, введите подсказку", - "Please enter a valid path": "", - "Please enter a valid URL": "", + "Please enter a valid path": "Пожалуйста, введите правильный путь", + "Please enter a valid URL": "Пожалуйста, введите правильный URL", "Please fill in all fields.": "Пожалуйста, заполните все поля.", "Please select a model first.": "Пожалуйста, сначала выберите модель.", "Please select a model.": "Пожалуйста, выберите модель.", @@ -849,7 +849,7 @@ "Presence Penalty": "Штраф за присутствие", "Previous 30 days": "Предыдущие 30 дней", "Previous 7 days": "Предыдущие 7 дней", - "Private": "", + "Private": "Частное", "Profile Image": "Изображение профиля", "Prompt": "Промпт", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Промпт (например, Расскажи мне интересный факт о Римской империи)", @@ -860,8 +860,8 @@ "Prompt updated successfully": "Промпт успешно обновлён", "Prompts": "Промпты", "Prompts Access": "Доступ к промптам", - "Prompts Public Sharing": "", - "Public": "", + "Prompts Public Sharing": "Публичный обмен промптами", + "Public": "Публичное", "Pull \"{{searchValue}}\" from Ollama.com": "Загрузить \"{{searchValue}}\" с Ollama.com", "Pull a model from Ollama.com": "Загрузить модель с Ollama.com", "Query Generation Prompt": "Запрос на генерацию промпта", @@ -993,11 +993,11 @@ "Share": "Поделиться", "Share Chat": "Поделиться чатом", "Share to Open WebUI Community": "Поделиться с сообществом OpenWebUI", - "Sharing Permissions": "", + "Sharing Permissions": "Разрешения на общий доступ", "Show": "Показать", "Show \"What's New\" modal on login": "Показывать окно «Что нового» при входе в систему", "Show Admin Details in Account Pending Overlay": "Показывать данные администратора в оверлее ожидающей учетной записи", - "Show Model": "", + "Show Model": "Показать модель", "Show shortcuts": "Показать горячие клавиши", "Show your support!": "Поддержите нас!", "Showcased creativity": "Продемонстрирован творческий подход", @@ -1024,11 +1024,11 @@ "Suggested": "Предложено", "Support": "Поддержать", "Support this plugin:": "Поддержите этот плагин", - "Sync directory": "", + "Sync directory": "Каталог синхронизации", "System": "Система", "System Instructions": "Системные инструкции", "System Prompt": "Системный промпт", - "Tags": "", + "Tags": "Теги", "Tags Generation": "Генерация тегов", "Tags Generation Prompt": "Промпт для генерации тегов", "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Выборка без хвостов используется для уменьшения влияния менее вероятных токенов на выходные данные. Более высокое значение (например, 2.0) еще больше уменьшит влияние, в то время как значение 1.0 отключает эту настройку.", @@ -1059,8 +1059,8 @@ "Theme": "Тема", "Thinking...": "Думаю...", "This action cannot be undone. Do you wish to continue?": "Это действие нельзя отменить. Вы хотите продолжить?", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "", - "This chat won’t appear in history and your messages will not be saved.": "", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Этот канал был создан {{createdAt}}. Это самое начало канала {{channelName}}.", + "This chat won’t appear in history and your messages will not be saved.": "Этот чат не появится в истории, и ваши сообщения не будут сохранены.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Это обеспечивает сохранение ваших ценных разговоров в безопасной базе данных на вашем сервере. Спасибо!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Это экспериментальная функция, она может работать не так, как ожидалось, и может быть изменена в любое время.", "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Этот параметр определяет, сколько токенов сохраняется при обновлении контекста. Например, если задано значение 2, будут сохранены последние 2 токена контекста беседы. Сохранение контекста может помочь сохранить непрерывность беседы, но может уменьшить возможность отвечать на новые темы.", @@ -1108,7 +1108,7 @@ "Tool ID": "ID Инструмента", "Tool imported successfully": "Инструмент успешно импортирован", "Tool Name": "Имя Инструмента", - "Tool Servers": "", + "Tool Servers": "Сервер Инструмента", "Tool updated successfully": "Инструмент успешно обновлен", "Tools": "Инструменты", "Tools Access": "Доступ к инструментам", @@ -1116,7 +1116,7 @@ "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.": "Инструменты имеют систему вызова функций, которая позволяет выполнять произвольный код.", - "Tools Public Sharing": "", + "Tools Public Sharing": "Публичный обмен инструментами", "Top K": "Top K", "Top K Reranker": "", "Top P": "Top P", @@ -1174,11 +1174,11 @@ "Valves updated successfully": "Вентили успешно обновлены", "variable": "переменная", "variable to have them replaced with clipboard content.": "переменную, чтобы заменить их содержимым буфера обмена.", - "Verify Connection": "", + "Verify Connection": "Проверить подключение", "Version": "Версия", "Version {{selectedVersion}} of {{totalVersions}}": "Версия {{selectedVersion}} из {{totalVersions}}", "View Replies": "С ответами", - "View Result from **{{NAME}}**": "", + "View Result from **{{NAME}}**": "Просмотр результата от **{{NAME}}**", "Visibility": "Видимость", "Voice": "Голос", "Voice Input": "Ввод голоса", @@ -1196,7 +1196,7 @@ "Webhook URL": "URL-адрес веб-хука", "WebUI Settings": "Настройки WebUI", "WebUI URL": "", - "WebUI will make requests to \"{{url}}\"": "", + "WebUI will make requests to \"{{url}}\"": "WebUI будет отправлять запросы к \"{{url}}\"", "WebUI will make requests to \"{{url}}/api/chat\"": "WebUI будет отправлять запросы к \"{{url}}/api/chat\"", "WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI будет отправлять запросы к \"{{url}}/chat/completions\"", "What are you trying to achieve?": "Чего вы пытаетесь достичь?", From 5c658a4879d4b7c48cb8ec11b513138d10a8b295 Mon Sep 17 00:00:00 2001 From: Thomas Lehmann Date: Wed, 26 Mar 2025 18:24:49 +0100 Subject: [PATCH 018/126] feat(config): add config OAUTH_CODE_CHALLENGE_METHOD Add support to enable OIDC code challenge method (PKCE). --- backend/open_webui/config.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 8238f8a87..0d45d658b 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -456,6 +456,12 @@ OAUTH_SCOPES = PersistentConfig( os.environ.get("OAUTH_SCOPES", "openid email profile"), ) +OAUTH_CODE_CHALLENGE_METHOD = PersistentConfig( + "OAUTH_CODE_CHALLENGE_METHOD", + "oauth.oidc.code_challenge_method", + os.environ.get("OAUTH_CODE_CHALLENGE_METHOD", None), +) + OAUTH_PROVIDER_NAME = PersistentConfig( "OAUTH_PROVIDER_NAME", "oauth.oidc.provider_name", @@ -601,14 +607,21 @@ def load_oauth_providers(): ): def oidc_oauth_register(client): + client_kwargs = { + "scope": OAUTH_SCOPES.value, + } + + if OAUTH_CODE_CHALLENGE_METHOD.value and OAUTH_CODE_CHALLENGE_METHOD.value == "S256": + client_kwargs["code_challenge_method"] = "S256" + elif OAUTH_CODE_CHALLENGE_METHOD.value: + raise Exception('Code challenge methods other than "%s" not supported. Given: "%s"' % ("S256", OAUTH_CODE_CHALLENGE_METHOD.value)) + client.register( name="oidc", client_id=OAUTH_CLIENT_ID.value, client_secret=OAUTH_CLIENT_SECRET.value, server_metadata_url=OPENID_PROVIDER_URL.value, - client_kwargs={ - "scope": OAUTH_SCOPES.value, - }, + client_kwargs=client_kwargs, redirect_uri=OPENID_REDIRECT_URI.value, ) From d8a7e9c660a0c5115c578fd092aee70b8f2bccaf Mon Sep 17 00:00:00 2001 From: Alexander Grimm Date: Mon, 7 Apr 2025 11:33:29 +0000 Subject: [PATCH 019/126] fix: correct document citation --- backend/open_webui/utils/middleware.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index badae9906..5e6f286a0 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -897,12 +897,14 @@ async def process_chat_payload(request, form_data, user, metadata, model): # If context is not empty, insert it into the messages if len(sources) > 0: context_string = "" - for source_idx, source in enumerate(sources): + citated_file_idx = {} + for _, source in enumerate(sources, 1): if "document" in source: - for doc_idx, doc_context in enumerate(source["document"]): - context_string += ( - f'{doc_context}\n' - ) + for doc_context, doc_meta in zip(source["document"], source['metadata']): + file_id = doc_meta.get('file_id') + if file_id not in citated_file_idx: + citated_file_idx[file_id] = len(citated_file_idx) + 1 + context_string += f"{citated_file_idx[file_id]}{doc_context}\n" context_string = context_string.strip() prompt = get_last_user_message(form_data["messages"]) From 1e7a36478bc4cf36caa85f4944740fbfeef3d7e7 Mon Sep 17 00:00:00 2001 From: Alexander Grimm Date: Mon, 7 Apr 2025 14:07:27 +0200 Subject: [PATCH 020/126] ~ update to latest change --- backend/open_webui/utils/middleware.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 5e6f286a0..2c6728955 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -904,7 +904,9 @@ async def process_chat_payload(request, form_data, user, metadata, model): file_id = doc_meta.get('file_id') if file_id not in citated_file_idx: citated_file_idx[file_id] = len(citated_file_idx) + 1 - context_string += f"{citated_file_idx[file_id]}{doc_context}\n" + context_string += ( + f'{doc_context}\n' + ) context_string = context_string.strip() prompt = get_last_user_message(form_data["messages"]) From 818d24e672c248d8376404a4e8b9d68afe4ff0ec Mon Sep 17 00:00:00 2001 From: aleprj Date: Mon, 7 Apr 2025 11:15:47 -0300 Subject: [PATCH 021/126] fix: add appid to the URL to ensure we fetch the correct parameters in all scenarios --- 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 8238f8a87..a060d48b2 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -560,7 +560,7 @@ def load_oauth_providers(): name="microsoft", client_id=MICROSOFT_CLIENT_ID.value, client_secret=MICROSOFT_CLIENT_SECRET.value, - server_metadata_url=f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration", + server_metadata_url=f"https://login.microsoftonline.com/{MICROSOFT_CLIENT_TENANT_ID.value}/v2.0/.well-known/openid-configuration?appid={MICROSOFT_CLIENT_ID.value}", client_kwargs={ "scope": MICROSOFT_OAUTH_SCOPE.value, }, From 4e545d432ba8d5606b519db52b602cd73a8aa2a7 Mon Sep 17 00:00:00 2001 From: hurxxxx Date: Tue, 8 Apr 2025 00:44:10 +0900 Subject: [PATCH 022/126] feat: add new admin func - reindex knowledge files --- backend/open_webui/routers/knowledge.py | 69 +++++++++++++++++++ src/lib/apis/knowledge/index.ts | 29 ++++++++ .../admin/Settings/Documents.svelte | 38 ++++++++-- 3 files changed, 131 insertions(+), 5 deletions(-) diff --git a/backend/open_webui/routers/knowledge.py b/backend/open_webui/routers/knowledge.py index bc1e2429e..ab745cf84 100644 --- a/backend/open_webui/routers/knowledge.py +++ b/backend/open_webui/routers/knowledge.py @@ -159,6 +159,72 @@ async def create_new_knowledge( status_code=status.HTTP_400_BAD_REQUEST, detail=ERROR_MESSAGES.FILE_EXISTS, ) + + + +############################ +# ReindexKnowledgeFiles +############################ + + +@router.post("/reindex", response_model=bool) +async def reindex_knowledge_files( + request: Request, + user=Depends(get_verified_user) +): + if user.role != "admin": + raise HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail=ERROR_MESSAGES.UNAUTHORIZED, + ) + + knowledge_bases = Knowledges.get_knowledge_bases() + + log.info(f"Starting reindexing for {len(knowledge_bases)} knowledge bases") + + for knowledge_base in knowledge_bases: + try: + files = Files.get_files_by_ids(knowledge_base.data.get("file_ids", [])) + + try: + if VECTOR_DB_CLIENT.has_collection(collection_name=knowledge_base.id): + VECTOR_DB_CLIENT.delete_collection( + collection_name=knowledge_base.id + ) + except Exception as e: + log.error(f"Error deleting collection {knowledge_base.id}: {str(e)}") + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Error deleting vector DB collection" + ) + + failed_files = [] + for file in files: + try: + process_file( + request, + ProcessFileForm(file_id=file.id, collection_name=knowledge_base.id), + user=user, + ) + except Exception as e: + log.error(f"Error processing file {file.filename} (ID: {file.id}): {str(e)}") + failed_files.append({"file_id": file.id, "error": str(e)}) + continue + + except Exception as e: + log.error(f"Error processing knowledge base {knowledge_base.id}: {str(e)}") + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, + detail=f"Error processing knowledge base" + ) + + if failed_files: + log.warning(f"Failed to process {len(failed_files)} files in knowledge base {knowledge_base.id}") + for failed in failed_files: + log.warning(f"File ID: {failed['file_id']}, Error: {failed['error']}") + + log.info("Reindexing completed successfully") + return True ############################ @@ -676,3 +742,6 @@ def add_files_to_knowledge_batch( return KnowledgeFilesResponse( **knowledge.model_dump(), files=Files.get_files_by_ids(existing_file_ids) ) + + + diff --git a/src/lib/apis/knowledge/index.ts b/src/lib/apis/knowledge/index.ts index c5fad1323..a1b80dbe4 100644 --- a/src/lib/apis/knowledge/index.ts +++ b/src/lib/apis/knowledge/index.ts @@ -345,3 +345,32 @@ export const deleteKnowledgeById = async (token: string, id: string) => { return res; }; + + +export const reindexKnowledgeFiles = async (token: string) => { + let error = null; + + const res = await fetch(`${WEBUI_API_BASE_URL}/knowledge/reindex`, { + method: 'POST', + headers: { + Accept: 'application/json', + 'Content-Type': 'application/json', + authorization: `Bearer ${token}` + } + }) + .then(async (res) => { + if (!res.ok) throw await res.json(); + return res.json(); + }) + .catch((err) => { + error = err.detail; + console.log(err); + return null; + }); + + if (error) { + throw error; + } + + return res; +}; \ No newline at end of file diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index b105ebdb9..294d8d0d7 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -13,14 +13,12 @@ updateEmbeddingConfig, getRerankingConfig, updateRerankingConfig, - resetUploadDir, getRAGConfig, updateRAGConfig } from '$lib/apis/retrieval'; - import { knowledge, models } from '$lib/stores'; - import { getKnowledgeBases } from '$lib/apis/knowledge'; - import { uploadDir, deleteAllFiles, deleteFileById } from '$lib/apis/files'; + import { reindexKnowledgeFiles} from '$lib/apis/knowledge'; + import { deleteAllFiles } from '$lib/apis/files'; import ResetUploadDirConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; import ResetVectorDBConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; @@ -31,12 +29,12 @@ const i18n = getContext('i18n'); - let scanDirLoading = false; let updateEmbeddingModelLoading = false; let updateRerankingModelLoading = false; let showResetConfirm = false; let showResetUploadDirConfirm = false; + let showReindexConfirm = false; let embeddingEngine = ''; let embeddingModel = ''; @@ -333,6 +331,21 @@ }} /> + + { + const res = await reindexKnowledgeFiles(localStorage.token).catch((error) => { + toast.error(`${error}`); + return null; + }); + + if (res) { + toast.success($i18n.t('Success')); + } + }} +/> +
{ @@ -950,6 +963,21 @@ +
+
+ {$i18n.t('Reindex Knowledge Base Vectors')} +
+
+ +
+
From 7c828015d34f447f1267b77c245b2a258b63d267 Mon Sep 17 00:00:00 2001 From: hurxxxx Date: Tue, 8 Apr 2025 00:53:11 +0900 Subject: [PATCH 023/126] fix: ReindexKnowledgeFilesConfirmDialog --- src/lib/components/admin/Settings/Documents.svelte | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 294d8d0d7..97c62c6a4 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -22,6 +22,7 @@ import ResetUploadDirConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; import ResetVectorDBConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; + import ReindexKnowledgeFilesConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; import SensitiveInput from '$lib/components/common/SensitiveInput.svelte'; import Tooltip from '$lib/components/common/Tooltip.svelte'; import Switch from '$lib/components/common/Switch.svelte'; @@ -332,7 +333,7 @@ /> - { const res = await reindexKnowledgeFiles(localStorage.token).catch((error) => { From e7715f37609917800d2c0029c583227f99d42d0a Mon Sep 17 00:00:00 2001 From: hurxxxx Date: Tue, 8 Apr 2025 01:37:50 +0900 Subject: [PATCH 024/126] i18n: add reindex knowledge files dialog --- src/lib/i18n/locales/ar-BH/translation.json | 2 ++ src/lib/i18n/locales/ar/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/bo-TB/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/et-EE/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, 104 insertions(+) diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 84f008c94..b4844b9d9 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "رفض عندما لا ينبغي أن يكون", "Regenerate": "تجديد", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "ملاحظات الإصدار", "Relevance": "", "Remove": "إزالة", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index 998a204fc..85bb2662d 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -878,6 +878,8 @@ "References from": "مراجع من", "Refused when it shouldn't have": "رفض عندما لا ينبغي أن يكون", "Regenerate": "تجديد", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "ملاحظات الإصدار", "Relevance": "الصلة", "Remove": "إزالة", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 2c082c8fa..5e7b7c2a1 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -878,6 +878,8 @@ "References from": "Препратки от", "Refused when it shouldn't have": "Отказано, когато не трябва да бъде", "Regenerate": "Регенериране", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Бележки по изданието", "Relevance": "Релевантност", "Remove": "Изтриване", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index da1a3a038..f5a17d7a8 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "যদি উপযুক্ত নয়, তবে রেজিগেনেট করা হচ্ছে", "Regenerate": "রেজিগেনেট করুন", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "রিলিজ নোটসমূহ", "Relevance": "", "Remove": "রিমুভ করুন", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index c7aaa559f..31ce0d199 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -878,6 +878,8 @@ "References from": "ནས་ལུང་འདྲེན།", "Refused when it shouldn't have": "མི་དགོས་དུས་ཁས་མ་བླངས།", "Regenerate": "བསྐྱར་བཟོ།", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "འགྲེམས་སྤེལ་མཆན་བུ།", "Relevance": "འབྲེལ་ཡོད་རང་བཞིན།", "Remove": "འདོར་བ།", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index e1c666242..566d347ee 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -878,6 +878,8 @@ "References from": "Referències de", "Refused when it shouldn't have": "Refusat quan no hauria d'haver estat", "Regenerate": "Regenerar", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notes de la versió", "Relevance": "Rellevància", "Remove": "Eliminar", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 0f8113db6..4e3736d9c 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "", "Regenerate": "", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Release Notes", "Relevance": "", "Remove": "", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 9f016e181..437e60f64 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -878,6 +878,8 @@ "References from": "Reference z", "Refused when it shouldn't have": "Odmítnuto, když nemělo být.", "Regenerate": "Regenerovat", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Záznamy o vydání", "Relevance": "Relevance", "Remove": "Odebrat", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index cc052471d..5311c88a6 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Afvist, når den ikke burde have været det", "Regenerate": "Regenerer", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Udgivelsesnoter", "Relevance": "", "Remove": "Fjern", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index deb96b8be..07607e204 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -878,6 +878,8 @@ "References from": "Referenzen aus", "Refused when it shouldn't have": "Abgelehnt, obwohl es nicht hätte abgelehnt werden sollen", "Regenerate": "Neu generieren", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Veröffentlichungshinweise", "Relevance": "Relevanz", "Remove": "Entfernen", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 169e10eb9..da4b79392 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "", "Regenerate": "", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Release Borks", "Relevance": "", "Remove": "", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index a465d847a..857f4b3f5 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -878,6 +878,8 @@ "References from": "Αναφορές από", "Refused when it shouldn't have": "Αρνήθηκε όταν δεν έπρεπε", "Regenerate": "Αναγεννήστε", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Σημειώσεις Έκδοσης", "Relevance": "Σχετικότητα", "Remove": "Αφαίρεση", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index b955a3195..f91dc930c 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "", "Regenerate": "", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "", "Relevance": "", "Remove": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index b955a3195..f91dc930c 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "", "Regenerate": "", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "", "Relevance": "", "Remove": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index ee3f61bb0..b32ace619 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -878,6 +878,8 @@ "References from": "Referencias desde", "Refused when it shouldn't have": "Rechazado cuando no debería haberlo hecho", "Regenerate": "Regenerar", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notas de la Versión", "Relevance": "Relevancia", "Remove": "Eliminar", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index cdbdc92ba..a923d4477 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -878,6 +878,8 @@ "References from": "Viited allikast", "Refused when it shouldn't have": "Keeldus, kui ei oleks pidanud", "Regenerate": "Regenereeri", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Väljalaskemärkmed", "Relevance": "Asjakohasus", "Remove": "Eemalda", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index ecc639d01..5ab31746e 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -878,6 +878,8 @@ "References from": "Erreferentziak hemendik", "Refused when it shouldn't have": "Ukatu duenean ukatu behar ez zuenean", "Regenerate": "Bersortu", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Bertsio oharrak", "Relevance": "Garrantzia", "Remove": "Kendu", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 8a932d8a4..b63f163ca 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "رد شده زمانی که باید نباشد", "Regenerate": "ری\u200cسازی", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "یادداشت\u200cهای انتشار", "Relevance": "ارتباط", "Remove": "حذف", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index e3d57d1f7..12d362b6c 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -878,6 +878,8 @@ "References from": "Viitteet lähteistä", "Refused when it shouldn't have": "Kieltäytyi, vaikka ei olisi pitänyt", "Regenerate": "Uudelleentuota", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Julkaisutiedot", "Relevance": "Relevanssi", "Remove": "Poista", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index aa8254a8d..bf3723d39 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Refusé alors qu'il n'aurait pas dû l'être", "Regenerate": "Regénérer", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notes de publication", "Relevance": "", "Remove": "Retirer", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index a8e1a06c5..7e0df6e9c 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -878,6 +878,8 @@ "References from": "Références de", "Refused when it shouldn't have": "Refusé alors qu'il n'aurait pas dû l'être", "Regenerate": "Regénérer", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notes de mise à jour", "Relevance": "Pertinence", "Remove": "Retirer", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index df9d3f57c..1e221ccab 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "נדחה כאשר לא היה צריך", "Regenerate": "הפק מחדש", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "הערות שחרור", "Relevance": "", "Remove": "הסר", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index ed3b9300a..5ba9a244f 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "जब ऐसा नहीं होना चाहिए था तो मना कर दिया", "Regenerate": "पुनः जेनरेट", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "रिलीज नोट्स", "Relevance": "", "Remove": "हटा दें", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index ed6cc5396..8ea16e951 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Odbijen kada nije trebao biti", "Regenerate": "Regeneriraj", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Bilješke o izdanju", "Relevance": "", "Remove": "Ukloni", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 29e40bd8d..a0ae4b277 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -878,6 +878,8 @@ "References from": "Hivatkozások innen", "Refused when it shouldn't have": "Elutasítva, amikor nem kellett volna", "Regenerate": "Újragenerálás", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Kiadási jegyzetek", "Relevance": "Relevancia", "Remove": "Eltávolítás", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 2acf4dfcc..784e9d473 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Menolak ketika seharusnya tidak", "Regenerate": "Regenerasi", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Catatan Rilis", "Relevance": "", "Remove": "Hapus", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index a5cbcb5e5..16c85b43e 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -878,6 +878,8 @@ "References from": "Tagairtí ó", "Refused when it shouldn't have": "Diúltaíodh nuair nár chóir dó", "Regenerate": "Athghiniúint", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Nótaí Scaoilte", "Relevance": "Ábharthacht", "Remove": "Bain", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 65af4f24f..0b1b71878 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Rifiutato quando non avrebbe dovuto", "Regenerate": "Rigenera", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Note di rilascio", "Relevance": "", "Remove": "Rimuovi", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index d8bae40cd..8238b3754 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "拒否すべきでないのに拒否した", "Regenerate": "再生成", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "リリースノート", "Relevance": "", "Remove": "削除", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 9162ae463..efcd677dd 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "უარა, როგორც უნდა იყოს", "Regenerate": "თავიდან გენერაცია", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "გამოცემის შენიშვნები", "Relevance": "შესაბამისობა", "Remove": "წაშლა", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 164894b75..16734be32 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -878,6 +878,8 @@ "References from": "출처", "Refused when it shouldn't have": "허용되지 않았지만 허용되어야 합니다.", "Regenerate": "재생성", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "릴리스 노트", "Relevance": "관련도", "Remove": "삭제", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 404dd9426..d59922f0d 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Atmesta kai neturėtų būti atmesta", "Regenerate": "Generuoti iš naujo", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Naujovės", "Relevance": "", "Remove": "Pašalinti", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 2d489bea3..093de457d 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Menolak dimana ia tidak sepatutnya", "Regenerate": "Jana semula", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Nota Keluaran", "Relevance": "", "Remove": "Hapuskan", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 04f8118b5..10bfc3ba3 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -878,6 +878,8 @@ "References from": "Henviser fra", "Refused when it shouldn't have": "Avvist når det ikke burde ha blitt det", "Regenerate": "Generer på nytt", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Utgivelsesnotater", "Relevance": "Relevans", "Remove": "Fjern", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 2a629d85d..5ecacc036 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -878,6 +878,8 @@ "References from": "Referenties van", "Refused when it shouldn't have": "Geweigerd terwijl het niet had moeten", "Regenerate": "Regenereren", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Release-opmerkingen", "Relevance": "Relevantie", "Remove": "Verwijderen", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index b3bedd540..54651146d 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "ਜਦੋਂ ਇਹ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਸੀ ਤਾਂ ਇਨਕਾਰ ਕੀਤਾ", "Regenerate": "ਮੁੜ ਬਣਾਓ", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "ਰਿਲੀਜ਼ ਨੋਟਸ", "Relevance": "", "Remove": "ਹਟਾਓ", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 966775ecc..22c55a19f 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -878,6 +878,8 @@ "References from": "Odniesienia do", "Refused when it shouldn't have": "Odmówił, gdy nie powinien", "Regenerate": "Wygeneruj ponownie", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notatki do wydania", "Relevance": "Trafność", "Remove": "Usuń", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 96717e610..0ea68ab78 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -878,6 +878,8 @@ "References from": "Referências de", "Refused when it shouldn't have": "Recusado quando não deveria", "Regenerate": "Gerar novamente", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notas de Lançamento", "Relevance": "Relevância", "Remove": "Remover", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index d7076396b..5f0c4b60f 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Recusado quando não deveria", "Regenerate": "Regenerar", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Notas de Lançamento", "Relevance": "", "Remove": "Remover", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 4aa4a59e6..7da4d25dd 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -878,6 +878,8 @@ "References from": "Referințe din", "Refused when it shouldn't have": "Refuzat când nu ar fi trebuit", "Regenerate": "Regenerare", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Note de Lansare", "Relevance": "Relevanță", "Remove": "Înlătură", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 115b87b23..5ff06f09b 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -878,6 +878,8 @@ "References from": "Отсылки к", "Refused when it shouldn't have": "Отказано в доступе, когда это не должно было произойти", "Regenerate": "Перегенерировать", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Примечания к выпуску", "Relevance": "Актуальность", "Remove": "Удалить", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 857fe69ac..444af0bd6 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -878,6 +878,8 @@ "References from": "Referencie z", "Refused when it shouldn't have": "Odmietnuté, keď nemalo byť.", "Regenerate": "Regenerovať", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Záznamy o vydaní", "Relevance": "Relevancia", "Remove": "Odstrániť", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 0368645bf..d0b9d6fba 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -878,6 +878,8 @@ "References from": "Референце од", "Refused when it shouldn't have": "Одбијено када није требало", "Regenerate": "Поново створи", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Напомене о издању", "Relevance": "Примењивост", "Remove": "Уклони", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 80034d13f..6925c797b 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "Avvisades när det inte borde ha gjort det", "Regenerate": "Regenerera", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Versionsinformation", "Relevance": "", "Remove": "Ta bort", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 948916c43..cd74878f2 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "ปฏิเสธเมื่อไม่ควรทำ", "Regenerate": "สร้างใหม่", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "บันทึกรุ่น", "Relevance": "", "Remove": "ลบ", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index b955a3195..f91dc930c 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -878,6 +878,8 @@ "References from": "", "Refused when it shouldn't have": "", "Regenerate": "", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "", "Relevance": "", "Remove": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 27459854b..fee12349e 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -878,6 +878,8 @@ "References from": "Referanslar arasından", "Refused when it shouldn't have": "Reddedilmemesi gerekirken reddedildi", "Regenerate": "Tekrar Oluştur", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Sürüm Notları", "Relevance": "İlgili", "Remove": "Kaldır", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 614ef8942..1a851fcf1 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -878,6 +878,8 @@ "References from": "Посилання з", "Refused when it shouldn't have": "Відмовив, коли не мав би", "Regenerate": "Регенерувати", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Нотатки до випуску", "Relevance": "Актуальність", "Remove": "Видалити", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index fcddb6959..4f7ed935c 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -878,6 +878,8 @@ "References from": "سے حوالہ جات", "Refused when it shouldn't have": "جب انکار نہیں ہونا چاہیے تھا، انکار کر دیا", "Regenerate": "دوبارہ تخلیق کریں", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "ریلیز نوٹس", "Relevance": "موزونیت", "Remove": "ہٹا دیں", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index eacc3449d..1b3bafb8f 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -878,6 +878,8 @@ "References from": "Tham khảo từ", "Refused when it shouldn't have": "Từ chối trả lời mà nhẽ không nên làm vậy", "Regenerate": "Tạo sinh lại câu trả lời", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "Mô tả những cập nhật mới", "Relevance": "Mức độ liên quan", "Remove": "Xóa", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index d354e7fdb..20d798eaf 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -878,6 +878,8 @@ "References from": "来自", "Refused when it shouldn't have": "无理拒绝", "Regenerate": "重新生成", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "更新日志", "Relevance": "相关性", "Remove": "移除", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 8c22d68d3..679bb979c 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -878,6 +878,8 @@ "References from": "引用來源", "Refused when it shouldn't have": "不應拒絕時拒絕了", "Regenerate": "重新產生", + "Reindex": "", + "Reindex Knowledge Base Vectors": "", "Release Notes": "釋出説明", "Relevance": "相關性", "Remove": "移除", From f3f45209e9a441447e7ea01efcf4087a08fad494 Mon Sep 17 00:00:00 2001 From: Gilles M <10937624+gem85247@users.noreply.github.com> Date: Mon, 7 Apr 2025 19:01:18 +0200 Subject: [PATCH 025/126] fix: manifest.json cross-origin When utilizing Cloudflare Zero Trust, fetching the manifest.json file may encounter issues because the request is redirected through the Zero Trust authentication page. --- src/app.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app.html b/src/app.html index e64e6d583..d19f3d227 100644 --- a/src/app.html +++ b/src/app.html @@ -9,7 +9,7 @@ - + Date: Mon, 7 Apr 2025 14:49:47 -0600 Subject: [PATCH 026/126] fix: Upgrade OpenTelemetry instrumentation packages to 0.52b1 This commit updates all OpenTelemetry instrumentation dependencies (FastAPI, SQLAlchemy, Redis, Requests, Logging, HTTPX, aiohttp-client) from version 0.52b0 to 0.52b1 to satisfy opentelemetry-sdk==1.31.1 dependencies. --- backend/requirements.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index 73c855084..56cde3862 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -127,11 +127,11 @@ firecrawl-py==1.12.0 opentelemetry-api==1.31.1 opentelemetry-sdk==1.31.1 opentelemetry-exporter-otlp==1.31.1 -opentelemetry-instrumentation==0.52b0 -opentelemetry-instrumentation-fastapi==0.52b0 -opentelemetry-instrumentation-sqlalchemy==0.52b0 -opentelemetry-instrumentation-redis==0.52b0 -opentelemetry-instrumentation-requests==0.52b0 -opentelemetry-instrumentation-logging==0.52b0 -opentelemetry-instrumentation-httpx==0.52b0 -opentelemetry-instrumentation-aiohttp-client==0.52b0 \ No newline at end of file +opentelemetry-instrumentation==0.52b1 +opentelemetry-instrumentation-fastapi==0.52b1 +opentelemetry-instrumentation-sqlalchemy==0.52b1 +opentelemetry-instrumentation-redis==0.52b1 +opentelemetry-instrumentation-requests==0.52b1 +opentelemetry-instrumentation-logging==0.52b1 +opentelemetry-instrumentation-httpx==0.52b1 +opentelemetry-instrumentation-aiohttp-client==0.52b1 From 353b104c77e83b644b48382cefa48bd602d0c212 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Tue, 8 Apr 2025 00:42:37 -0400 Subject: [PATCH 027/126] add support for searching files --- backend/open_webui/routers/files.py | 43 +++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index c30366545..1c1c1657e 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -1,6 +1,8 @@ import logging import os import uuid +from fnmatch import fnmatch +from functools import lru_cache from pathlib import Path from typing import Optional from urllib.parse import quote @@ -72,6 +74,19 @@ def has_access_to_file( return has_access +############################ +# Get all files for user, with 1 cache +############################ + + +@lru_cache(maxsize=1) +def get_all_files_for_user(user_id: str, admin: bool): + if admin: + return Files.get_files() + else: + return Files.get_files_by_user_id(user_id) + + ############################ # Upload File ############################ @@ -177,6 +192,34 @@ async def list_files(user=Depends(get_verified_user), content: bool = Query(True return files +############################ +# Search Files +############################ + + +@router.get("/search", response_model=list[FileModelResponse]) +async def search_files( + filename: str = Query(..., description="Filename pattern to search for. Supports wildcards such as '*.pdf'"), + user=Depends(get_verified_user) +): + # Retrieve files from cache + files = get_all_files_for_user(user.id, user.role == "admin") + + # Normalize pattern and file names + normalized_pattern = normalize_text(filename).lower() + matching_files = [ + file for file in files + if fnmatch(normalize_text(file.filename).lower(), normalized_pattern) + ] + + if not matching_files: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="No files found matching the pattern." + ) + return matching_files + + ############################ # Delete All Files ############################ From 7c1b0046874ae7182c443ab91246c1e384eafb21 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Tue, 8 Apr 2025 00:44:47 -0400 Subject: [PATCH 028/126] simplify logic --- backend/open_webui/routers/files.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 1c1c1657e..c16870e9b 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -205,12 +205,8 @@ async def search_files( # Retrieve files from cache files = get_all_files_for_user(user.id, user.role == "admin") - # Normalize pattern and file names - normalized_pattern = normalize_text(filename).lower() - matching_files = [ - file for file in files - if fnmatch(normalize_text(file.filename).lower(), normalized_pattern) - ] + # Get matching files + matching_files = [file for file in files if fnmatch(file.filename.lower(), filename.lower())] if not matching_files: raise HTTPException( From e06ff17a709cfa6e320abc2f43850c0fab4e9908 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Tue, 8 Apr 2025 00:48:54 -0400 Subject: [PATCH 029/126] Fix formatting --- backend/open_webui/routers/files.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index c16870e9b..eed622029 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -199,19 +199,24 @@ async def list_files(user=Depends(get_verified_user), content: bool = Query(True @router.get("/search", response_model=list[FileModelResponse]) async def search_files( - filename: str = Query(..., description="Filename pattern to search for. Supports wildcards such as '*.pdf'"), + filename: str = Query( + ..., + description="Filename pattern to search for. Supports wildcards such as '*.txt'" + ), user=Depends(get_verified_user) ): # Retrieve files from cache files = get_all_files_for_user(user.id, user.role == "admin") # Get matching files - matching_files = [file for file in files if fnmatch(file.filename.lower(), filename.lower())] + matching_files = [ + file for file in files if fnmatch(file.filename.lower(), filename.lower()) + ] if not matching_files: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, - detail="No files found matching the pattern." + detail="No files found matching the pattern.", ) return matching_files From 8609ca3657743c60a45fbefce02c8c0f48bd368b Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Tue, 8 Apr 2025 00:49:55 -0400 Subject: [PATCH 030/126] Fix formatting again --- backend/open_webui/routers/files.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index eed622029..e1113473d 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -201,9 +201,9 @@ async def list_files(user=Depends(get_verified_user), content: bool = Query(True async def search_files( filename: str = Query( ..., - description="Filename pattern to search for. Supports wildcards such as '*.txt'" + description="Filename pattern to search for. Supports wildcards such as '*.txt'", ), - user=Depends(get_verified_user) + user=Depends(get_verified_user), ): # Retrieve files from cache files = get_all_files_for_user(user.id, user.role == "admin") @@ -212,7 +212,7 @@ async def search_files( matching_files = [ file for file in files if fnmatch(file.filename.lower(), filename.lower()) ] - + if not matching_files: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, From 1c60b8d543d37fc56c71b2a7debaf3d9dda76570 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Tue, 8 Apr 2025 00:56:21 -0400 Subject: [PATCH 031/126] Rewrite logic --- backend/open_webui/routers/files.py | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index e1113473d..61ee89f43 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -2,7 +2,6 @@ import logging import os import uuid from fnmatch import fnmatch -from functools import lru_cache from pathlib import Path from typing import Optional from urllib.parse import quote @@ -74,19 +73,6 @@ def has_access_to_file( return has_access -############################ -# Get all files for user, with 1 cache -############################ - - -@lru_cache(maxsize=1) -def get_all_files_for_user(user_id: str, admin: bool): - if admin: - return Files.get_files() - else: - return Files.get_files_by_user_id(user_id) - - ############################ # Upload File ############################ @@ -205,8 +191,14 @@ async def search_files( ), user=Depends(get_verified_user), ): - # Retrieve files from cache - files = get_all_files_for_user(user.id, user.role == "admin") + """ + Search for files by filename with support for wildcard patterns. + """ + # Get files according to user role + if user.role == "admin": + files = Files.get_files() + else: + files = Files.get_files_by_user_id(user.id) # Get matching files matching_files = [ From fed47f2e2b2917f7fc033cec2e386dc03c8a2c99 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Tue, 8 Apr 2025 01:00:06 -0400 Subject: [PATCH 032/126] Add content param to /search route --- backend/open_webui/routers/files.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/backend/open_webui/routers/files.py b/backend/open_webui/routers/files.py index 61ee89f43..8a2888d86 100644 --- a/backend/open_webui/routers/files.py +++ b/backend/open_webui/routers/files.py @@ -189,6 +189,7 @@ async def search_files( ..., description="Filename pattern to search for. Supports wildcards such as '*.txt'", ), + content: bool = Query(True), user=Depends(get_verified_user), ): """ @@ -210,6 +211,11 @@ async def search_files( status_code=status.HTTP_404_NOT_FOUND, detail="No files found matching the pattern.", ) + + if not content: + for file in matching_files: + del file.data["content"] + return matching_files From b15adc63fe5965bce15255ccbb5991e61d51a635 Mon Sep 17 00:00:00 2001 From: Haodong Tian <48872409+tth37@users.noreply.github.com> Date: Tue, 8 Apr 2025 14:24:39 +0800 Subject: [PATCH 033/126] Update zh-CN translation.json - Standardize Chinese translations for "autocomplete" --- src/lib/i18n/locales/zh-CN/translation.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 0f9134c2b..cee5564a8 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -114,8 +114,8 @@ "Auto": "自动", "Auto-Copy Response to Clipboard": "自动复制回复到剪贴板", "Auto-playback response": "自动念出回复内容", - "Autocomplete Generation": "输入框内容猜测补全", - "Autocomplete Generation Input Max Length": "输入框内容猜测补全输入最大长度", + "Autocomplete Generation": "输入框内容自动补全", + "Autocomplete Generation Input Max Length": "输入框内容自动补全输入最大长度", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api 鉴权字符串", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础地址", @@ -154,7 +154,7 @@ "Channel Name": "频道名称", "Channels": "频道", "Character": "字符", - "Character limit for autocomplete generation input": "输入框内容猜测补全输入的字符限制", + "Character limit for autocomplete generation input": "输入框内容自动补全输入的字符限制", "Chart new frontiers": "开拓新领域", "Chat": "对话", "Chat Background Image": "对话背景图片", @@ -375,7 +375,7 @@ "Embedding Model Engine": "语义向量模型引擎", "Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"", "Enable API Key": "启用 API 密钥", - "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容猜测补全", + "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容自动补全", "Enable Code Execution": "启用代码执行", "Enable Code Interpreter": "启用代码解释器", "Enable Community Sharing": "启用分享至社区", From 00f58658f7e633e63623c8866dd720fb60e02fe2 Mon Sep 17 00:00:00 2001 From: Haodong Tian <48872409+tth37@users.noreply.github.com> Date: Tue, 8 Apr 2025 07:01:56 +0000 Subject: [PATCH 034/126] i18n: Apply i18n to Web Search proxy tooltips --- src/lib/components/admin/Settings/WebSearch.svelte | 8 ++++++-- src/lib/i18n/locales/ar-BH/translation.json | 2 ++ src/lib/i18n/locales/ar/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/bo-TB/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/et-EE/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 ++ 53 files changed, 110 insertions(+), 2 deletions(-) diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index cec4cabe6..5e27274e0 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -481,8 +481,12 @@
diff --git a/src/lib/i18n/locales/ar-BH/translation.json b/src/lib/i18n/locales/ar-BH/translation.json index 84f008c94..207caf045 100644 --- a/src/lib/i18n/locales/ar-BH/translation.json +++ b/src/lib/i18n/locales/ar-BH/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar أستخدم", "Use groups to group your users and assign permissions.": "", "Use Initials": "Initials أستخدم", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (أولاما)", "use_mmap (Ollama)": "use_mmap (أولاما)", "user": "مستخدم", diff --git a/src/lib/i18n/locales/ar/translation.json b/src/lib/i18n/locales/ar/translation.json index 998a204fc..8fe564ed3 100644 --- a/src/lib/i18n/locales/ar/translation.json +++ b/src/lib/i18n/locales/ar/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar أستخدم", "Use groups to group your users and assign permissions.": "استخدم المجموعات لتجميع المستخدمين وتحديد الصلاحيات.", "Use Initials": "Initials أستخدم", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (أولاما)", "use_mmap (Ollama)": "use_mmap (أولاما)", "user": "مستخدم", diff --git a/src/lib/i18n/locales/bg-BG/translation.json b/src/lib/i18n/locales/bg-BG/translation.json index 2c082c8fa..cd4851217 100644 --- a/src/lib/i18n/locales/bg-BG/translation.json +++ b/src/lib/i18n/locales/bg-BG/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Използвайте Gravatar", "Use groups to group your users and assign permissions.": "Използвайте групи, за да групирате вашите потребители и да присвоите разрешения.", "Use Initials": "Използвайте инициали", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "потребител", diff --git a/src/lib/i18n/locales/bn-BD/translation.json b/src/lib/i18n/locales/bn-BD/translation.json index da1a3a038..0b81ac911 100644 --- a/src/lib/i18n/locales/bn-BD/translation.json +++ b/src/lib/i18n/locales/bn-BD/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar ব্যবহার করুন", "Use groups to group your users and assign permissions.": "", "Use Initials": "নামের আদ্যক্ষর ব্যবহার করুন", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (ওলামা)", "use_mmap (Ollama)": "use_mmap (ওলামা)", "user": "ব্যবহারকারী", diff --git a/src/lib/i18n/locales/bo-TB/translation.json b/src/lib/i18n/locales/bo-TB/translation.json index c7aaa559f..eb93c0b50 100644 --- a/src/lib/i18n/locales/bo-TB/translation.json +++ b/src/lib/i18n/locales/bo-TB/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar བེད་སྤྱོད།", "Use groups to group your users and assign permissions.": "ཁྱེད་ཀྱི་བེད་སྤྱོད་མཁན་ཚོགས་པ་བཟོ་བ་དང་དབང་ཚད་སྤྲོད་པར་ཚོགས་པ་བེད་སྤྱོད་གཏོང་བ།", "Use Initials": "མིང་གི་ཡིག་འབྲུ་མགོ་མ་བེད་སྤྱོད།", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "བེད་སྤྱོད་མཁན།", diff --git a/src/lib/i18n/locales/ca-ES/translation.json b/src/lib/i18n/locales/ca-ES/translation.json index 3c02b8060..d49d37bd4 100644 --- a/src/lib/i18n/locales/ca-ES/translation.json +++ b/src/lib/i18n/locales/ca-ES/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Utilitzar Gravatar", "Use groups to group your users and assign permissions.": "Utilitza grups per agrupar els usuaris i assignar permisos.", "Use Initials": "Utilitzar inicials", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "usuari", diff --git a/src/lib/i18n/locales/ceb-PH/translation.json b/src/lib/i18n/locales/ceb-PH/translation.json index 0f8113db6..3e40eb80c 100644 --- a/src/lib/i18n/locales/ceb-PH/translation.json +++ b/src/lib/i18n/locales/ceb-PH/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Paggamit sa Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "", "use_mmap (Ollama)": "", "user": "tiggamit", diff --git a/src/lib/i18n/locales/cs-CZ/translation.json b/src/lib/i18n/locales/cs-CZ/translation.json index 9f016e181..5c531e4f1 100644 --- a/src/lib/i18n/locales/cs-CZ/translation.json +++ b/src/lib/i18n/locales/cs-CZ/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Použití Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Použijte iniciály", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "uživatel", diff --git a/src/lib/i18n/locales/da-DK/translation.json b/src/lib/i18n/locales/da-DK/translation.json index cc052471d..6afeaed71 100644 --- a/src/lib/i18n/locales/da-DK/translation.json +++ b/src/lib/i18n/locales/da-DK/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Brug Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Brug initialer", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "bruger", diff --git a/src/lib/i18n/locales/de-DE/translation.json b/src/lib/i18n/locales/de-DE/translation.json index deb96b8be..8eac9637c 100644 --- a/src/lib/i18n/locales/de-DE/translation.json +++ b/src/lib/i18n/locales/de-DE/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar verwenden", "Use groups to group your users and assign permissions.": "Nutzen Sie Gruppen, um Ihre Benutzer zu gruppieren und Berechtigungen zuzuweisen.", "Use Initials": "Initialen verwenden", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "Benutzer", diff --git a/src/lib/i18n/locales/dg-DG/translation.json b/src/lib/i18n/locales/dg-DG/translation.json index 169e10eb9..b25eaa106 100644 --- a/src/lib/i18n/locales/dg-DG/translation.json +++ b/src/lib/i18n/locales/dg-DG/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Use Gravatar much avatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Use Initials much initial", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "", "use_mmap (Ollama)": "", "user": "user much user", diff --git a/src/lib/i18n/locales/el-GR/translation.json b/src/lib/i18n/locales/el-GR/translation.json index a465d847a..0d4a65df4 100644 --- a/src/lib/i18n/locales/el-GR/translation.json +++ b/src/lib/i18n/locales/el-GR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Χρησιμοποιήστε Gravatar", "Use groups to group your users and assign permissions.": "Χρησιμοποιήστε ομάδες για να ομαδοποιήσετε τους χρήστες σας και να αναθέσετε δικαιώματα.", "Use Initials": "Χρησιμοποιήστε Αρχικά", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "user", diff --git a/src/lib/i18n/locales/en-GB/translation.json b/src/lib/i18n/locales/en-GB/translation.json index b955a3195..eee132072 100644 --- a/src/lib/i18n/locales/en-GB/translation.json +++ b/src/lib/i18n/locales/en-GB/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "", "Use groups to group your users and assign permissions.": "", "Use Initials": "", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "", "use_mmap (Ollama)": "", "user": "", diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index b955a3195..eee132072 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "", "Use groups to group your users and assign permissions.": "", "Use Initials": "", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "", "use_mmap (Ollama)": "", "user": "", diff --git a/src/lib/i18n/locales/es-ES/translation.json b/src/lib/i18n/locales/es-ES/translation.json index ee3f61bb0..88552b64e 100644 --- a/src/lib/i18n/locales/es-ES/translation.json +++ b/src/lib/i18n/locales/es-ES/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Usar Gravatar", "Use groups to group your users and assign permissions.": "Usar grupos para agrupar a usuarios y asignar permisos.", "Use Initials": "Usar Iniciales", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "usuario", diff --git a/src/lib/i18n/locales/et-EE/translation.json b/src/lib/i18n/locales/et-EE/translation.json index cdbdc92ba..df43ddc1f 100644 --- a/src/lib/i18n/locales/et-EE/translation.json +++ b/src/lib/i18n/locales/et-EE/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Kasuta Gravatari", "Use groups to group your users and assign permissions.": "Kasutage gruppe oma kasutajate grupeerimiseks ja õiguste määramiseks.", "Use Initials": "Kasuta initsiaale", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "kasutaja", diff --git a/src/lib/i18n/locales/eu-ES/translation.json b/src/lib/i18n/locales/eu-ES/translation.json index ecc639d01..d33abf2cf 100644 --- a/src/lib/i18n/locales/eu-ES/translation.json +++ b/src/lib/i18n/locales/eu-ES/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Erabili Gravatar", "Use groups to group your users and assign permissions.": "Erabili taldeak zure erabiltzaileak taldekatu eta baimenak esleitzeko.", "Use Initials": "Erabili inizialak", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "erabiltzailea", diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index 8a932d8a4..01dad6da0 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "استفاده از گراواتار", "Use groups to group your users and assign permissions.": "", "Use Initials": "استفاده از سرواژه", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (اولاما)", "use_mmap (Ollama)": "use_mmap (اولاما)", "user": "کاربر", diff --git a/src/lib/i18n/locales/fi-FI/translation.json b/src/lib/i18n/locales/fi-FI/translation.json index e3d57d1f7..ea88b5a89 100644 --- a/src/lib/i18n/locales/fi-FI/translation.json +++ b/src/lib/i18n/locales/fi-FI/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Käytä Gravataria", "Use groups to group your users and assign permissions.": "Käytä ryhmiä jäsentääksesi käyttäjiä ja antaaksesi käyttöoikeuksia.", "Use Initials": "Käytä alkukirjaimia", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "käyttäjä", diff --git a/src/lib/i18n/locales/fr-CA/translation.json b/src/lib/i18n/locales/fr-CA/translation.json index aa8254a8d..0bd3b7c3c 100644 --- a/src/lib/i18n/locales/fr-CA/translation.json +++ b/src/lib/i18n/locales/fr-CA/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Utilisez Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Utiliser les initiales", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "utiliser mmap (Ollama)", "user": "utilisateur", diff --git a/src/lib/i18n/locales/fr-FR/translation.json b/src/lib/i18n/locales/fr-FR/translation.json index a8e1a06c5..42124e0b5 100644 --- a/src/lib/i18n/locales/fr-FR/translation.json +++ b/src/lib/i18n/locales/fr-FR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Utiliser Gravatar", "Use groups to group your users and assign permissions.": "Utilisez des groupes pour regrouper vos utilisateurs et attribuer des permissions.", "Use Initials": "Utiliser les initiales", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "Utiliser mlock (Ollama)", "use_mmap (Ollama)": "Utiliser mmap (Ollama)", "user": "utilisateur", diff --git a/src/lib/i18n/locales/he-IL/translation.json b/src/lib/i18n/locales/he-IL/translation.json index df9d3f57c..11036d17d 100644 --- a/src/lib/i18n/locales/he-IL/translation.json +++ b/src/lib/i18n/locales/he-IL/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "שימוש ב Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "שימוש ב initials", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (אולמה)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "משתמש", diff --git a/src/lib/i18n/locales/hi-IN/translation.json b/src/lib/i18n/locales/hi-IN/translation.json index ed3b9300a..5112b49e1 100644 --- a/src/lib/i18n/locales/hi-IN/translation.json +++ b/src/lib/i18n/locales/hi-IN/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar का प्रयोग करें", "Use groups to group your users and assign permissions.": "", "Use Initials": "प्रथमाक्षर का प्रयोग करें", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (ओलामा)", "use_mmap (Ollama)": "use_mmap (ओलामा)", "user": "उपयोगकर्ता", diff --git a/src/lib/i18n/locales/hr-HR/translation.json b/src/lib/i18n/locales/hr-HR/translation.json index ed6cc5396..b1300672c 100644 --- a/src/lib/i18n/locales/hr-HR/translation.json +++ b/src/lib/i18n/locales/hr-HR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Koristi Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Koristi inicijale", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "korisnik", diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 29e40bd8d..e5300b17b 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar használata", "Use groups to group your users and assign permissions.": "", "Use Initials": "Monogram használata", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "felhasználó", diff --git a/src/lib/i18n/locales/id-ID/translation.json b/src/lib/i18n/locales/id-ID/translation.json index 2acf4dfcc..f5c5fd868 100644 --- a/src/lib/i18n/locales/id-ID/translation.json +++ b/src/lib/i18n/locales/id-ID/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gunakan Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Gunakan Inisial", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "pengguna", diff --git a/src/lib/i18n/locales/ie-GA/translation.json b/src/lib/i18n/locales/ie-GA/translation.json index a5cbcb5e5..38e31071c 100644 --- a/src/lib/i18n/locales/ie-GA/translation.json +++ b/src/lib/i18n/locales/ie-GA/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Úsáid Gravatar", "Use groups to group your users and assign permissions.": "Úsáid grúpaí chun d'úsáideoirí a ghrúpáil agus ceadanna a shannadh", "Use Initials": "Úsáid ceannlitreacha", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "úsáideoir", diff --git a/src/lib/i18n/locales/it-IT/translation.json b/src/lib/i18n/locales/it-IT/translation.json index 65af4f24f..684927605 100644 --- a/src/lib/i18n/locales/it-IT/translation.json +++ b/src/lib/i18n/locales/it-IT/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Usa Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Usa iniziali", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "utente", diff --git a/src/lib/i18n/locales/ja-JP/translation.json b/src/lib/i18n/locales/ja-JP/translation.json index d8bae40cd..1c04dce45 100644 --- a/src/lib/i18n/locales/ja-JP/translation.json +++ b/src/lib/i18n/locales/ja-JP/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar を使用する", "Use groups to group your users and assign permissions.": "", "Use Initials": "初期値を使用する", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "", "use_mmap (Ollama)": "", "user": "ユーザー", diff --git a/src/lib/i18n/locales/ka-GE/translation.json b/src/lib/i18n/locales/ka-GE/translation.json index 9162ae463..0e531dc6f 100644 --- a/src/lib/i18n/locales/ka-GE/translation.json +++ b/src/lib/i18n/locales/ka-GE/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar-ის გამოყენება", "Use groups to group your users and assign permissions.": "", "Use Initials": "ინიციალების გამოყენება", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "მომხმარებელი", diff --git a/src/lib/i18n/locales/ko-KR/translation.json b/src/lib/i18n/locales/ko-KR/translation.json index 164894b75..313472f36 100644 --- a/src/lib/i18n/locales/ko-KR/translation.json +++ b/src/lib/i18n/locales/ko-KR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar 사용", "Use groups to group your users and assign permissions.": "그룹을 사용하여 사용자를 그룹화하고 권한을 할당하세요.", "Use Initials": "초성 사용", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (올라마)", "use_mmap (Ollama)": "use_mmap (올라마)", "user": "사용자", diff --git a/src/lib/i18n/locales/lt-LT/translation.json b/src/lib/i18n/locales/lt-LT/translation.json index 404dd9426..f270d8f10 100644 --- a/src/lib/i18n/locales/lt-LT/translation.json +++ b/src/lib/i18n/locales/lt-LT/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Naudoti Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Naudotojo inicialai", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "naudotojas", diff --git a/src/lib/i18n/locales/ms-MY/translation.json b/src/lib/i18n/locales/ms-MY/translation.json index 2d489bea3..b61c4932f 100644 --- a/src/lib/i18n/locales/ms-MY/translation.json +++ b/src/lib/i18n/locales/ms-MY/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gunakan Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Gunakan nama pendek", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "se_mmap (Ollama)", "user": "pengguna", diff --git a/src/lib/i18n/locales/nb-NO/translation.json b/src/lib/i18n/locales/nb-NO/translation.json index 04f8118b5..0daeef0a8 100644 --- a/src/lib/i18n/locales/nb-NO/translation.json +++ b/src/lib/i18n/locales/nb-NO/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Bruk Gravatar", "Use groups to group your users and assign permissions.": "Bruk grupper til å samle brukere og tildele tillatelser.", "Use Initials": "Bruk initialer", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "bruker", diff --git a/src/lib/i18n/locales/nl-NL/translation.json b/src/lib/i18n/locales/nl-NL/translation.json index 2a629d85d..26bde2119 100644 --- a/src/lib/i18n/locales/nl-NL/translation.json +++ b/src/lib/i18n/locales/nl-NL/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gebruik Gravatar", "Use groups to group your users and assign permissions.": "Gebruik groepen om gebruikers te groeperen en rechten aan te wijzen", "Use Initials": "Gebruik initialen", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "gebruiker", diff --git a/src/lib/i18n/locales/pa-IN/translation.json b/src/lib/i18n/locales/pa-IN/translation.json index b3bedd540..5a64908d1 100644 --- a/src/lib/i18n/locales/pa-IN/translation.json +++ b/src/lib/i18n/locales/pa-IN/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "ਗ੍ਰਾਵਾਟਾਰ ਵਰਤੋ", "Use groups to group your users and assign permissions.": "", "Use Initials": "ਸ਼ੁਰੂਆਤੀ ਅੱਖਰ ਵਰਤੋ", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (ਓਲਾਮਾ)", "use_mmap (Ollama)": "use_mmap (ਓਲਾਮਾ)", "user": "ਉਪਭੋਗਤਾ", diff --git a/src/lib/i18n/locales/pl-PL/translation.json b/src/lib/i18n/locales/pl-PL/translation.json index 966775ecc..04a84e58c 100644 --- a/src/lib/i18n/locales/pl-PL/translation.json +++ b/src/lib/i18n/locales/pl-PL/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Użyj Gravatara", "Use groups to group your users and assign permissions.": "Wykorzystaj grupy do grupowania użytkowników i przypisywania uprawnień.", "Use Initials": "Użyj inicjałów", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "użyj_mlock (Ollama)", "use_mmap (Ollama)": "użyj_mmap (Ollama)", "user": "użytkownik", diff --git a/src/lib/i18n/locales/pt-BR/translation.json b/src/lib/i18n/locales/pt-BR/translation.json index 96717e610..c761f6aa3 100644 --- a/src/lib/i18n/locales/pt-BR/translation.json +++ b/src/lib/i18n/locales/pt-BR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Usar Gravatar", "Use groups to group your users and assign permissions.": "Use grupos para agrupar seus usuários e atribuir permissões.", "Use Initials": "Usar Iniciais", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "usuário", diff --git a/src/lib/i18n/locales/pt-PT/translation.json b/src/lib/i18n/locales/pt-PT/translation.json index d7076396b..44acd5b99 100644 --- a/src/lib/i18n/locales/pt-PT/translation.json +++ b/src/lib/i18n/locales/pt-PT/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Usar Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Usar Iniciais", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "utilizador", diff --git a/src/lib/i18n/locales/ro-RO/translation.json b/src/lib/i18n/locales/ro-RO/translation.json index 4aa4a59e6..413a9788c 100644 --- a/src/lib/i18n/locales/ro-RO/translation.json +++ b/src/lib/i18n/locales/ro-RO/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Folosește Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Folosește Inițialele", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "utilizator", diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 115b87b23..94fe6b358 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Использовать Gravatar", "Use groups to group your users and assign permissions.": "Используйте группы, чтобы группировать пользователей и назначать разрешения.", "Use Initials": "Использовать инициалы", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "пользователь", diff --git a/src/lib/i18n/locales/sk-SK/translation.json b/src/lib/i18n/locales/sk-SK/translation.json index 857fe69ac..765160a89 100644 --- a/src/lib/i18n/locales/sk-SK/translation.json +++ b/src/lib/i18n/locales/sk-SK/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Použiť Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "Použiť iniciály", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "používateľ", diff --git a/src/lib/i18n/locales/sr-RS/translation.json b/src/lib/i18n/locales/sr-RS/translation.json index 0368645bf..436e22c46 100644 --- a/src/lib/i18n/locales/sr-RS/translation.json +++ b/src/lib/i18n/locales/sr-RS/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Користи Граватар", "Use groups to group your users and assign permissions.": "Користите групе да бисте разврстали ваше кориснике и доделили овлашћења.", "Use Initials": "Користи иницијале", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "корисник", diff --git a/src/lib/i18n/locales/sv-SE/translation.json b/src/lib/i18n/locales/sv-SE/translation.json index 80034d13f..a825c3ef8 100644 --- a/src/lib/i18n/locales/sv-SE/translation.json +++ b/src/lib/i18n/locales/sv-SE/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Använd Gravatar", "Use groups to group your users and assign permissions.": "Använd grupper för att gruppera dina användare och tilldela behörigheter.", "Use Initials": "Använd initialer", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "användare", diff --git a/src/lib/i18n/locales/th-TH/translation.json b/src/lib/i18n/locales/th-TH/translation.json index 948916c43..2f9614bf3 100644 --- a/src/lib/i18n/locales/th-TH/translation.json +++ b/src/lib/i18n/locales/th-TH/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "ใช้ Gravatar", "Use groups to group your users and assign permissions.": "", "Use Initials": "ใช้ตัวย่อ", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "ผู้ใช้", diff --git a/src/lib/i18n/locales/tk-TW/translation.json b/src/lib/i18n/locales/tk-TW/translation.json index b955a3195..eee132072 100644 --- a/src/lib/i18n/locales/tk-TW/translation.json +++ b/src/lib/i18n/locales/tk-TW/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "", "Use groups to group your users and assign permissions.": "", "Use Initials": "", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "", "use_mmap (Ollama)": "", "user": "", diff --git a/src/lib/i18n/locales/tr-TR/translation.json b/src/lib/i18n/locales/tr-TR/translation.json index 27459854b..84131252e 100644 --- a/src/lib/i18n/locales/tr-TR/translation.json +++ b/src/lib/i18n/locales/tr-TR/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Gravatar Kullan", "Use groups to group your users and assign permissions.": "Kullanıcılarınızı gruplamak ve izinler atamak için grupları kullanın.", "Use Initials": "Baş Harfleri Kullan", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "kullanıcı", diff --git a/src/lib/i18n/locales/uk-UA/translation.json b/src/lib/i18n/locales/uk-UA/translation.json index 614ef8942..dbe123946 100644 --- a/src/lib/i18n/locales/uk-UA/translation.json +++ b/src/lib/i18n/locales/uk-UA/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Змінити аватар", "Use groups to group your users and assign permissions.": "Використовуйте групи, щоб об’єднувати користувачів і призначати дозволи.", "Use Initials": "Використовувати ініціали", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "користувач", diff --git a/src/lib/i18n/locales/ur-PK/translation.json b/src/lib/i18n/locales/ur-PK/translation.json index fcddb6959..52801e513 100644 --- a/src/lib/i18n/locales/ur-PK/translation.json +++ b/src/lib/i18n/locales/ur-PK/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "گراویٹر استعمال کریں", "Use groups to group your users and assign permissions.": "", "Use Initials": "ابتدائیات استعمال کریں", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "استعمال کریں_mlock (Ollama)", "use_mmap (Ollama)": "استعمال_mmap (Ollama)", "user": "صارف", diff --git a/src/lib/i18n/locales/vi-VN/translation.json b/src/lib/i18n/locales/vi-VN/translation.json index eacc3449d..a855c9a34 100644 --- a/src/lib/i18n/locales/vi-VN/translation.json +++ b/src/lib/i18n/locales/vi-VN/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "Sử dụng Gravatar", "Use groups to group your users and assign permissions.": "Sử dụng nhóm để nhóm người dùng của bạn và gán quyền.", "Use Initials": "Sử dụng tên viết tắt", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "Người sử dụng", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index cee5564a8..5e00edb0a 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "使用来自 Gravatar 的头像", "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限。", "Use Initials": "使用首个字符作为头像", + "Use no proxy to fetch page contents.": "不使用代理获取页面内容。", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "使用由 http_proxy 和 https_proxy 环境变量指定的代理获取页面内容。", "use_mlock (Ollama)": "use_mlock(Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "用户", diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index 8c22d68d3..6da765621 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -1158,6 +1158,8 @@ "Use Gravatar": "使用 Gravatar", "Use groups to group your users and assign permissions.": "使用群組來組織您的使用者並分配權限。", "Use Initials": "使用姓名縮寫", + "Use no proxy to fetch page contents.": "", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", "use_mlock (Ollama)": "使用 mlock (Ollama)", "use_mmap (Ollama)": "使用 mmap (Ollama)", "user": "使用者", From e92d3073bbfa69d5fadec597ea63aa1ff98918e1 Mon Sep 17 00:00:00 2001 From: Haodong Tian <48872409+tth37@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:37:50 +0800 Subject: [PATCH 035/126] Update zh-CN translation.json - Minor fix --- src/lib/i18n/locales/zh-CN/translation.json | 30 ++++++++++----------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 5e00edb0a..a65b166f4 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -111,11 +111,11 @@ "Auth": "授权", "Authenticate": "认证", "Authentication": "身份验证", - "Auto": "自动", + "Auto": "", "Auto-Copy Response to Clipboard": "自动复制回复到剪贴板", "Auto-playback response": "自动念出回复内容", - "Autocomplete Generation": "输入框内容自动补全", - "Autocomplete Generation Input Max Length": "输入框内容自动补全输入最大长度", + "Autocomplete Generation": "输入框内容猜测补全", + "Autocomplete Generation Input Max Length": "输入框内容猜测补全输入最大长度", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api 鉴权字符串", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础地址", @@ -154,7 +154,7 @@ "Channel Name": "频道名称", "Channels": "频道", "Character": "字符", - "Character limit for autocomplete generation input": "输入框内容自动补全输入的字符限制", + "Character limit for autocomplete generation input": "输入框内容猜测补全输入的字符限制", "Chart new frontiers": "开拓新领域", "Chat": "对话", "Chat Background Image": "对话背景图片", @@ -375,14 +375,14 @@ "Embedding Model Engine": "语义向量模型引擎", "Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"", "Enable API Key": "启用 API 密钥", - "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容自动补全", + "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容猜测补全", "Enable Code Execution": "启用代码执行", "Enable Code Interpreter": "启用代码解释器", "Enable Community Sharing": "启用分享至社区", "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中,确保它们不会被交换到磁盘。这可以通过避免页面错误和确保快速数据访问来帮助维持性能。", "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "启用内存映射(mmap)以加载模型数据。此选项允许系统通过将磁盘文件视为在RAM中来使用磁盘存储作为RAM的扩展。这可以通过更快的数据访问来提高模型性能。然而,它可能无法在所有系统上正常工作,并且可能会消耗大量磁盘空间。", "Enable Message Rating": "启用回复评价", - "Enable Mirostat sampling for controlling perplexity.": "启用Mirostat采样以控制困惑度", + "Enable Mirostat sampling for controlling perplexity.": "启用 Mirostat 采样以控制困惑度", "Enable New Sign Ups": "允许新用户注册", "Enabled": "启用", "Enforce Temporary Chat": "强制临时聊天", @@ -655,7 +655,7 @@ "LDAP": "LDAP", "LDAP server updated": "LDAP 服务器已更新", "Leaderboard": "排行榜", - "Learn more about OpenAPI tool servers.": "进一步了解 OpenAPI 工具服务器。", + "Learn more about OpenAPI tool servers.": "", "Leave empty for unlimited": "留空表示无限制", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "留空以包含来自 \"{{url}}/api/tags\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/models\" endpoint": "留空以包含来自 \"{{url}}/models\" 端点的所有模型", @@ -687,7 +687,7 @@ "Manage Pipelines": "管理 Pipeline", "Manage Tool Servers": "管理工具服务器", "March": "三月", - "Max Tokens (num_predict)": "最大Token数量 (num_predict)", + "Max Tokens (num_predict)": "最大 Token 数量 (num_predict)", "Max Upload Count": "最大上传数量", "Max Upload Size": "最大上传大小", "Maximum of 3 models can be downloaded simultaneously. Please try again later.": "最多可以同时下载 3 个模型,请稍后重试。", @@ -771,7 +771,7 @@ "Notifications": "桌面通知", "November": "十一月", "num_gpu (Ollama)": "num_gpu (Ollama)", - "num_thread (Ollama)": "num_thread(Ollama)", + "num_thread (Ollama)": "num_thread (Ollama)", "OAuth ID": "OAuth ID", "October": "十月", "Off": "关闭", @@ -794,7 +794,7 @@ "Open file": "打开文件", "Open in full screen": "全屏打开", "Open new chat": "打开新对话", - "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI 可使用任何 OpenAPI 服务器提供的工具。", + "Open WebUI can use tools provided by any OpenAPI server.": "", "Open WebUI uses faster-whisper internally.": "Open WebUI 使用内置 faster-whisper。", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI 使用 SpeechT5 和 CMU Arctic speaker embedding。", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "当前 Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低于所需的版本 (v{{REQUIRED_VERSION}})", @@ -846,7 +846,7 @@ "Positive attitude": "积极的态度", "Prefix ID": "Prefix ID", "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Prefix ID 用于通过为模型 ID 添加前缀来避免与其他连接发生冲突 - 留空则禁用此功能", - "Presence Penalty": "重复惩罚(Presence Penalty)", + "Presence Penalty": "重复惩罚 (Presence Penalty)", "Previous 30 days": "过去 30 天", "Previous 7 days": "过去 7 天", "Private": "私有", @@ -885,7 +885,7 @@ "Rename": "重命名", "Reorder Models": "重新排序模型", "Repeat Last N": "重复最后 N 次", - "Repeat Penalty (Ollama)": "重复惩罚(Ollama)", + "Repeat Penalty (Ollama)": "重复惩罚 (Ollama)", "Reply in Thread": "在主题中回复", "Request Mode": "请求模式", "Reranking Model": "重排模型", @@ -1158,10 +1158,8 @@ "Use Gravatar": "使用来自 Gravatar 的头像", "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限。", "Use Initials": "使用首个字符作为头像", - "Use no proxy to fetch page contents.": "不使用代理获取页面内容。", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "使用由 http_proxy 和 https_proxy 环境变量指定的代理获取页面内容。", - "use_mlock (Ollama)": "use_mlock(Ollama)", - "use_mmap (Ollama)": "use_mmap (Ollama)", + "use_mlock (Ollama)": "使用 mlock (Ollama)", + "use_mmap (Ollama)": "使用 mmap (Ollama)", "user": "用户", "User": "用户", "User location successfully retrieved.": "成功检索到用户位置。", From 399e7b1670a14e9956071a8cd90ca0c8fce8ef82 Mon Sep 17 00:00:00 2001 From: Haodong Tian <48872409+tth37@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:47:24 +0800 Subject: [PATCH 036/126] Update zh-CN translation.json --- src/lib/i18n/locales/zh-CN/translation.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index a65b166f4..f22634c7a 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -111,11 +111,11 @@ "Auth": "授权", "Authenticate": "认证", "Authentication": "身份验证", - "Auto": "", + "Auto": "自动", "Auto-Copy Response to Clipboard": "自动复制回复到剪贴板", "Auto-playback response": "自动念出回复内容", - "Autocomplete Generation": "输入框内容猜测补全", - "Autocomplete Generation Input Max Length": "输入框内容猜测补全输入最大长度", + "Autocomplete Generation": "输入框内容自动补全", + "Autocomplete Generation Input Max Length": "输入框内容自动补全输入最大长度", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api 鉴权字符串", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 基础地址", @@ -154,7 +154,7 @@ "Channel Name": "频道名称", "Channels": "频道", "Character": "字符", - "Character limit for autocomplete generation input": "输入框内容猜测补全输入的字符限制", + "Character limit for autocomplete generation input": "输入框内容自动补全输入的字符限制", "Chart new frontiers": "开拓新领域", "Chat": "对话", "Chat Background Image": "对话背景图片", @@ -375,7 +375,7 @@ "Embedding Model Engine": "语义向量模型引擎", "Embedding model set to \"{{embedding_model}}\"": "语义向量模型设置为 \"{{embedding_model}}\"", "Enable API Key": "启用 API 密钥", - "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容猜测补全", + "Enable autocomplete generation for chat messages": "启用聊天消息的输入框内容自动补全", "Enable Code Execution": "启用代码执行", "Enable Code Interpreter": "启用代码解释器", "Enable Community Sharing": "启用分享至社区", @@ -655,7 +655,7 @@ "LDAP": "LDAP", "LDAP server updated": "LDAP 服务器已更新", "Leaderboard": "排行榜", - "Learn more about OpenAPI tool servers.": "", + "Learn more about OpenAPI tool servers.": "进一步了解 OpenAPI 工具服务器。", "Leave empty for unlimited": "留空表示无限制", "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "留空以包含来自 \"{{url}}/api/tags\" 端点的所有模型", "Leave empty to include all models from \"{{url}}/models\" endpoint": "留空以包含来自 \"{{url}}/models\" 端点的所有模型", @@ -794,7 +794,7 @@ "Open file": "打开文件", "Open in full screen": "全屏打开", "Open new chat": "打开新对话", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open WebUI can use tools provided by any OpenAPI server.": "Open WebUI 可使用任何 OpenAPI 服务器提供的工具。", "Open WebUI uses faster-whisper internally.": "Open WebUI 使用内置 faster-whisper。", "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI 使用 SpeechT5 和 CMU Arctic speaker embedding。", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "当前 Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低于所需的版本 (v{{REQUIRED_VERSION}})", @@ -1158,8 +1158,8 @@ "Use Gravatar": "使用来自 Gravatar 的头像", "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限。", "Use Initials": "使用首个字符作为头像", - "use_mlock (Ollama)": "使用 mlock (Ollama)", - "use_mmap (Ollama)": "使用 mmap (Ollama)", + "use_mlock (Ollama)": "use_mlock (Ollama)", + "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "用户", "User": "用户", "User location successfully retrieved.": "成功检索到用户位置。", From d50ca0aa43c4626a9970134d6778030425ffcd5b Mon Sep 17 00:00:00 2001 From: Haodong Tian <48872409+tth37@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:49:20 +0800 Subject: [PATCH 037/126] Update zh-CN translation.json --- src/lib/i18n/locales/zh-CN/translation.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index f22634c7a..c2e2ec841 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -1158,8 +1158,10 @@ "Use Gravatar": "使用来自 Gravatar 的头像", "Use groups to group your users and assign permissions.": "使用权限组来组织用户并分配权限。", "Use Initials": "使用首个字符作为头像", - "use_mlock (Ollama)": "use_mlock (Ollama)", - "use_mmap (Ollama)": "use_mmap (Ollama)", + "Use no proxy to fetch page contents.": "不使用代理获取页面内容。", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "使用由 http_proxy 和 https_proxy 环境变量指定的代理获取页面内容。", + "use_mlock (Ollama)": "use_mlock(Ollama)", + "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "用户", "User": "用户", "User location successfully retrieved.": "成功检索到用户位置。", From 337c7caafa0225badaaedd361ec323b63f75734a Mon Sep 17 00:00:00 2001 From: Florian Maurer Date: Tue, 8 Apr 2025 13:51:54 +0200 Subject: [PATCH 038/126] improve stack trace of duckduckgo exception * fix search_results out of scope * ddgs.text does already always return a list --- backend/open_webui/retrieval/web/duckduckgo.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/open_webui/retrieval/web/duckduckgo.py b/backend/open_webui/retrieval/web/duckduckgo.py index d95086671..550c59793 100644 --- a/backend/open_webui/retrieval/web/duckduckgo.py +++ b/backend/open_webui/retrieval/web/duckduckgo.py @@ -3,6 +3,7 @@ from typing import Optional from open_webui.retrieval.web.main import SearchResult, get_filtered_results from duckduckgo_search import DDGS +from duckduckgo_search.exceptions import RatelimitException from open_webui.env import SRC_LOG_LEVELS log = logging.getLogger(__name__) @@ -22,16 +23,15 @@ def search_duckduckgo( list[SearchResult]: A list of search results """ # Use the DDGS context manager to create a DDGS object + search_results = [] with DDGS() as ddgs: # Use the ddgs.text() method to perform the search - ddgs_gen = ddgs.text( - query, safesearch="moderate", max_results=count, backend="api" - ) - # Check if there are search results - if ddgs_gen: - # Convert the search results into a list - search_results = [r for r in ddgs_gen] - + try: + search_results = ddgs.text( + query, safesearch="moderate", max_results=count, backend="api" + ) + except RatelimitException as e: + log.error(f"RatelimitException: {e}") if filter_list: search_results = get_filtered_results(search_results, filter_list) From 760ea3f4afbbaa4f2046dc53aa9ea3fd2f784c53 Mon Sep 17 00:00:00 2001 From: Florian Maurer Date: Tue, 8 Apr 2025 14:01:44 +0200 Subject: [PATCH 039/126] duckduckgo: backend api has been deprecated since december also increase duckduckgo-search version see https://github.com/deedy5/duckduckgo_search/commit/3ee8e08b1c8efc9b7356f406db299f1114dc4860 --- backend/open_webui/retrieval/web/duckduckgo.py | 2 +- backend/requirements.txt | 2 +- pyproject.toml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/retrieval/web/duckduckgo.py b/backend/open_webui/retrieval/web/duckduckgo.py index 550c59793..bf8ae6880 100644 --- a/backend/open_webui/retrieval/web/duckduckgo.py +++ b/backend/open_webui/retrieval/web/duckduckgo.py @@ -28,7 +28,7 @@ def search_duckduckgo( # Use the ddgs.text() method to perform the search try: search_results = ddgs.text( - query, safesearch="moderate", max_results=count, backend="api" + query, safesearch="moderate", max_results=count, backend="lite" ) except RatelimitException as e: log.error(f"RatelimitException: {e}") diff --git a/backend/requirements.txt b/backend/requirements.txt index 56cde3862..ad490d00a 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -98,7 +98,7 @@ pytube==15.0.0 extract_msg pydub -duckduckgo-search~=7.3.2 +duckduckgo-search~=7.5.5 ## Google Drive google-api-python-client diff --git a/pyproject.toml b/pyproject.toml index 52260e45e..18e833290 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,7 +104,7 @@ dependencies = [ "extract_msg", "pydub", - "duckduckgo-search~=7.3.2", + "duckduckgo-search~=7.5.5", "google-api-python-client", "google-auth-httplib2", From f5b2867e458e644ec5a8402848055dba04266763 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Tue, 8 Apr 2025 12:35:04 +0200 Subject: [PATCH 040/126] fix: mismatch between TOOL_SERVERS / TOOL_SERVER_CONNECTIONS indexing --- backend/open_webui/routers/tools.py | 4 ++-- backend/open_webui/utils/tools.py | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/tools.py b/backend/open_webui/routers/tools.py index 8a98b4e20..56ede2208 100644 --- a/backend/open_webui/routers/tools.py +++ b/backend/open_webui/routers/tools.py @@ -45,7 +45,7 @@ async def get_tools(request: Request, user=Depends(get_verified_user)): ) tools = Tools.get_tools() - for idx, server in enumerate(request.app.state.TOOL_SERVERS): + for server in request.app.state.TOOL_SERVERS: tools.append( ToolUserResponse( **{ @@ -60,7 +60,7 @@ async def get_tools(request: Request, user=Depends(get_verified_user)): .get("description", ""), }, "access_control": request.app.state.config.TOOL_SERVER_CONNECTIONS[ - idx + server["idx"] ] .get("config", {}) .get("access_control", None), diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 734c23e1b..325b55c45 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -55,7 +55,12 @@ def get_tools( tool_server_connection = ( request.app.state.config.TOOL_SERVER_CONNECTIONS[server_idx] ) - tool_server_data = request.app.state.TOOL_SERVERS[server_idx] + tool_server_data = None + for server in request.app.state.TOOL_SERVERS: + if server["idx"] == server_idx: + tool_server_data = server + break + assert tool_server_data is not None specs = tool_server_data.get("specs", []) for spec in specs: From d99a883867230293200fd212ecfa1257d18fbcc1 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Tue, 8 Apr 2025 12:17:32 +0200 Subject: [PATCH 041/126] fix: convert ogg to wav for OpenAI transcription endpoint --- backend/open_webui/routers/audio.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index ea1372623..ffb949fea 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -68,8 +68,8 @@ from pydub import AudioSegment from pydub.utils import mediainfo -def is_mp4_audio(file_path): - """Check if the given file is an MP4 audio file.""" +def audio_needs_conversion(file_path): + """Check if the given file needs to be converted to a different format.""" if not os.path.isfile(file_path): log.error(f"File not found: {file_path}") return False @@ -80,13 +80,15 @@ def is_mp4_audio(file_path): and info.get("codec_type") == "audio" and info.get("codec_tag_string") == "mp4a" ): - return True - return False + return "mp4" + elif info.get("format_name") == "ogg": + return "ogg" + return None -def convert_mp4_to_wav(file_path, output_path): - """Convert MP4 audio file to WAV format.""" - audio = AudioSegment.from_file(file_path, format="mp4") +def convert_audio_to_wav(file_path, output_path, conversion_type): + """Convert MP4/OGG audio file to WAV format.""" + audio = AudioSegment.from_file(file_path, format=conversion_type) audio.export(output_path, format="wav") log.info(f"Converted {file_path} to {output_path}") @@ -496,10 +498,15 @@ def transcribe(request: Request, file_path): log.debug(data) return data elif request.app.state.config.STT_ENGINE == "openai": - if is_mp4_audio(file_path): - os.rename(file_path, file_path.replace(".wav", ".mp4")) - # Convert MP4 audio file to WAV format - convert_mp4_to_wav(file_path.replace(".wav", ".mp4"), file_path) + conversion_type = audio_needs_conversion(file_path) + if conversion_type: + os.rename(file_path, file_path.replace(".wav", f".{conversion_type}")) + # Convert unsupported audio file to WAV format + convert_audio_to_wav( + file_path.replace(".wav", f".{conversion_type}"), + file_path, + conversion_type, + ) r = None try: From 27e8c6fce4d3b543bc1749b63c8891ece9388304 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:11:37 +0200 Subject: [PATCH 042/126] feat: add support for OpenAPI spec in YAML format --- backend/open_webui/utils/tools.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 734c23e1b..3d7f627b5 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -4,6 +4,7 @@ import re import inspect import aiohttp import asyncio +import yaml from typing import Any, Awaitable, Callable, get_type_hints, Dict, List, Union, Optional from functools import update_wrapper, partial @@ -398,7 +399,13 @@ async def get_tool_server_data(token: str, url: str) -> Dict[str, Any]: if response.status != 200: error_body = await response.json() raise Exception(error_body) - res = await response.json() + + # Check if URL ends with .yaml or .yml to determine format + if url.lower().endswith((".yaml", ".yml")): + text_content = await response.text() + res = yaml.safe_load(text_content) + else: + res = await response.json() except Exception as err: print("Error:", err) if isinstance(err, dict) and "detail" in err: From 81af20aa9bbf01a6b740f82e276efbcd04003367 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Tue, 8 Apr 2025 15:13:58 +0200 Subject: [PATCH 043/126] refac: use logging instead of print --- backend/open_webui/utils/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index 3d7f627b5..91b01f7d8 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -407,7 +407,7 @@ async def get_tool_server_data(token: str, url: str) -> Dict[str, Any]: else: res = await response.json() except Exception as err: - print("Error:", err) + log.exception(f"Could not fetch tool server spec from {url}") if isinstance(err, dict) and "detail" in err: error = err["detail"] else: From 2337b3660993cf0de96d4a189e9bf5ec1ac9ece4 Mon Sep 17 00:00:00 2001 From: Robert Norberg Date: Tue, 8 Apr 2025 12:08:32 -0400 Subject: [PATCH 044/126] add debug logging to RAG utils --- backend/open_webui/retrieval/utils.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/backend/open_webui/retrieval/utils.py b/backend/open_webui/retrieval/utils.py index 12d48f869..a00e6982c 100644 --- a/backend/open_webui/retrieval/utils.py +++ b/backend/open_webui/retrieval/utils.py @@ -77,6 +77,7 @@ def query_doc( collection_name: str, query_embedding: list[float], k: int, user: UserModel = None ): try: + log.debug(f"query_doc:doc {collection_name}") result = VECTOR_DB_CLIENT.search( collection_name=collection_name, vectors=[query_embedding], @@ -94,6 +95,7 @@ def query_doc( def get_doc(collection_name: str, user: UserModel = None): try: + log.debug(f"get_doc:doc {collection_name}") result = VECTOR_DB_CLIENT.get(collection_name=collection_name) if result: @@ -116,6 +118,7 @@ def query_doc_with_hybrid_search( r: float, ) -> dict: try: + log.debug(f"query_doc_with_hybrid_search:doc {collection_name}") bm25_retriever = BM25Retriever.from_texts( texts=collection_result.documents[0], metadatas=collection_result.metadatas[0], @@ -168,6 +171,7 @@ def query_doc_with_hybrid_search( ) return result except Exception as e: + log.exception(f"Error querying doc {collection_name} with hybrid search: {e}") raise e @@ -257,6 +261,7 @@ def query_collection( ) -> dict: results = [] for query in queries: + log.debug(f"query_collection:query {query}") query_embedding = embedding_function(query, prefix=RAG_EMBEDDING_QUERY_PREFIX) for collection_name in collection_names: if collection_name: @@ -292,6 +297,7 @@ def query_collection_with_hybrid_search( collection_results = {} for collection_name in collection_names: try: + log.debug(f"query_collection_with_hybrid_search:VECTOR_DB_CLIENT.get:collection {collection_name}") collection_results[collection_name] = VECTOR_DB_CLIENT.get( collection_name=collection_name ) @@ -613,6 +619,7 @@ def generate_openai_batch_embeddings( user: UserModel = None, ) -> Optional[list[list[float]]]: try: + log.debug(f"generate_openai_batch_embeddings:model {model} batch size: {len(texts)}") json_data = {"input": texts, "model": model} if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str): json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix @@ -655,6 +662,7 @@ def generate_ollama_batch_embeddings( user: UserModel = None, ) -> Optional[list[list[float]]]: try: + log.debug(f"generate_ollama_batch_embeddings:model {model} batch size: {len(texts)}") json_data = {"input": texts, "model": model} if isinstance(RAG_EMBEDDING_PREFIX_FIELD_NAME, str) and isinstance(prefix, str): json_data[RAG_EMBEDDING_PREFIX_FIELD_NAME] = prefix From f822d89350dc67a1c5adc399bbe216caf953b314 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:38:00 +0200 Subject: [PATCH 045/126] Update env.py --- backend/open_webui/env.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index e3819fdc5..27ea3eda2 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -326,6 +326,19 @@ REDIS_URL = os.environ.get("REDIS_URL", "") REDIS_SENTINEL_HOSTS = os.environ.get("REDIS_SENTINEL_HOSTS", "") REDIS_SENTINEL_PORT = os.environ.get("REDIS_SENTINEL_PORT", "26379") +#################################### +# UVICORN WORKERS +#################################### + +UVICORN_WORKERS = os.environ.get("UVICORN_WORKERS", "1") +try: + UVICORN_WORKERS = int(UVICORN_WORKERS) + if UVICORN_WORKERS < 1: + UVICORN_WORKERS = 1 +except ValueError: + UVICORN_WORKERS = 1 + log.info(f"Invalid UVICORN_WORKERS value, defaulting to {UVICORN_WORKERS}") + #################################### # WEBUI_AUTH (Required for security) #################################### From 4c9a791b0640f5932d5c4219472a5580c403b046 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:47:48 +0200 Subject: [PATCH 046/126] Update env.py --- backend/open_webui/env.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 27ea3eda2..49aee4457 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -330,6 +330,7 @@ REDIS_SENTINEL_PORT = os.environ.get("REDIS_SENTINEL_PORT", "26379") # UVICORN WORKERS #################################### +# Number of uvicorn worker processes for handling requests UVICORN_WORKERS = os.environ.get("UVICORN_WORKERS", "1") try: UVICORN_WORKERS = int(UVICORN_WORKERS) From 2c1d0e385742d16f26b6e2eba23ec84826e51e1b Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:50:07 +0200 Subject: [PATCH 047/126] Update start.sh --- backend/start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/start.sh b/backend/start.sh index 671c22ff7..b9a30fd3d 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -65,4 +65,4 @@ if [ -n "$SPACE_ID" ]; then export WEBUI_URL=${SPACE_HOST} fi -WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" exec uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' +WEBUI_SECRET_KEY="$WEBUI_SECRET_KEY" exec uvicorn open_webui.main:app --host "$HOST" --port "$PORT" --forwarded-allow-ips '*' --workers "${UVICORN_WORKERS:-1}" From 65b5c6c0c72b4ad30f76b54deb34e98dc5a3cf40 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:52:12 +0200 Subject: [PATCH 048/126] Update start_windows.bat --- backend/start_windows.bat | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/start_windows.bat b/backend/start_windows.bat index 19f6f123c..661ecc494 100644 --- a/backend/start_windows.bat +++ b/backend/start_windows.bat @@ -41,5 +41,6 @@ IF "%WEBUI_SECRET_KEY%%WEBUI_JWT_SECRET_KEY%" == " " ( :: Execute uvicorn SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%" -uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*' --ws auto +IF "%UVICORN_WORKERS%"=="" SET UVICORN_WORKERS=1 +uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*' --workers %UVICORN_WORKERS% --ws auto :: For ssl user uvicorn open_webui.main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*' --ssl-keyfile "key.pem" --ssl-certfile "cert.pem" --ws auto From f17befc853bee73d60354a1e62e78056dfed4a10 Mon Sep 17 00:00:00 2001 From: DrMelone <27028174+Classic298@users.noreply.github.com> Date: Tue, 8 Apr 2025 18:55:07 +0200 Subject: [PATCH 049/126] Update __init__.py --- backend/open_webui/__init__.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/__init__.py b/backend/open_webui/__init__.py index d85be48da..0c70cb63a 100644 --- a/backend/open_webui/__init__.py +++ b/backend/open_webui/__init__.py @@ -73,8 +73,15 @@ def serve( os.environ["LD_LIBRARY_PATH"] = ":".join(LD_LIBRARY_PATH) import open_webui.main # we need set environment variables before importing main + from open_webui.env import UVICORN_WORKERS # Import the workers setting - uvicorn.run(open_webui.main.app, host=host, port=port, forwarded_allow_ips="*") + uvicorn.run( + open_webui.main.app, + host=host, + port=port, + forwarded_allow_ips="*", + workers=UVICORN_WORKERS + ) @app.command() From 60d11c1f6f2982209f89083c3e2a2c471587bdfb Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 8 Apr 2025 12:50:25 -0700 Subject: [PATCH 050/126] enh: password max length verification --- backend/open_webui/constants.py | 1 + backend/open_webui/routers/auths.py | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/backend/open_webui/constants.py b/backend/open_webui/constants.py index 86d87a2c3..95c54a0d2 100644 --- a/backend/open_webui/constants.py +++ b/backend/open_webui/constants.py @@ -31,6 +31,7 @@ class ERROR_MESSAGES(str, Enum): USERNAME_TAKEN = ( "Uh-oh! This username is already registered. Please choose another username." ) + PASSWORD_TOO_LONG = "Uh-oh! The password you entered is too long. Please make sure your password is less than 72 bytes long." COMMAND_TAKEN = "Uh-oh! This command is already registered. Please choose another command string." FILE_EXISTS = "Uh-oh! This file is already registered. Please choose another file." diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 67c2e9f2a..7905799e6 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -454,6 +454,13 @@ async def signup(request: Request, response: Response, form_data: SignupForm): # Disable signup after the first user is created request.app.state.config.ENABLE_SIGNUP = False + # The password passed to bcrypt must be 72 bytes or fewer. If it is longer, it will be truncated before hashing. + if len(form_data.password.encode("utf-8")) > 72: + raise HTTPException( + status.HTTP_400_BAD_REQUEST, + detail=ERROR_MESSAGES.PASSWORD_TOO_LONG, + ) + hashed = get_password_hash(form_data.password) user = Auths.insert_new_auth( form_data.email.lower(), From 63eab422082c6da8d762870c8dbd9a7971aa88f0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 8 Apr 2025 12:51:48 -0700 Subject: [PATCH 051/126] refac --- src/lib/components/chat/ToolServersModal.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/chat/ToolServersModal.svelte b/src/lib/components/chat/ToolServersModal.svelte index 3f25b184e..24a86e48b 100644 --- a/src/lib/components/chat/ToolServersModal.svelte +++ b/src/lib/components/chat/ToolServersModal.svelte @@ -15,7 +15,7 @@ let selectedTools = []; - $: selectedTools = $tools.filter((tool) => selectedToolIds.includes(tool.id)); + $: selectedTools = ($tools ?? []).filter((tool) => selectedToolIds.includes(tool.id)); const i18n = getContext('i18n'); From de1e9f3c0fc8799620a05d77bb30a74d8ff6e3e6 Mon Sep 17 00:00:00 2001 From: Tiancong Li Date: Wed, 9 Apr 2025 15:25:37 +0800 Subject: [PATCH 052/126] i18n: update zh-TW --- src/lib/i18n/locales/zh-TW/translation.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/lib/i18n/locales/zh-TW/translation.json b/src/lib/i18n/locales/zh-TW/translation.json index eaeae20cc..a25b09536 100644 --- a/src/lib/i18n/locales/zh-TW/translation.json +++ b/src/lib/i18n/locales/zh-TW/translation.json @@ -878,8 +878,8 @@ "References from": "引用來源", "Refused when it shouldn't have": "不應拒絕時拒絕了", "Regenerate": "重新產生", - "Reindex": "", - "Reindex Knowledge Base Vectors": "", + "Reindex": "重新索引", + "Reindex Knowledge Base Vectors": "重新索引知識庫向量", "Release Notes": "釋出説明", "Relevance": "相關性", "Remove": "移除", @@ -1160,8 +1160,8 @@ "Use Gravatar": "使用 Gravatar", "Use groups to group your users and assign permissions.": "使用群組來組織您的使用者並分配權限。", "Use Initials": "使用姓名縮寫", - "Use no proxy to fetch page contents.": "", - "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "", + "Use no proxy to fetch page contents.": "不使用代理擷取頁面內容。", + "Use proxy designated by http_proxy and https_proxy environment variables to fetch page contents.": "使用 http_proxy 和 https_proxy 環境變數指定的代理擷取頁面內容。", "use_mlock (Ollama)": "使用 mlock (Ollama)", "use_mmap (Ollama)": "使用 mmap (Ollama)", "user": "使用者", From 92611b588c009032c2d7a8e9eabc9e60109055db Mon Sep 17 00:00:00 2001 From: Panda Date: Wed, 9 Apr 2025 09:44:10 +0200 Subject: [PATCH 053/126] i18n: zh-cn --- src/lib/i18n/locales/zh-CN/translation.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index e97161e95..5c6337a54 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -878,8 +878,8 @@ "References from": "来自", "Refused when it shouldn't have": "无理拒绝", "Regenerate": "重新生成", - "Reindex": "", - "Reindex Knowledge Base Vectors": "", + "Reindex": "重建索引", + "Reindex Knowledge Base Vectors": "重建知识库向量", "Release Notes": "更新日志", "Relevance": "相关性", "Remove": "移除", From 17ea20d3ad4fdb99b3015df43edd03c5a9486071 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Wed, 9 Apr 2025 09:46:44 +0200 Subject: [PATCH 054/126] feat: OpenAPI YAML support for frontend toolserver --- package-lock.json | 26 ++++++++++++++++++++------ package.json | 3 ++- src/lib/apis/index.ts | 12 ++++++++++-- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e1aeb293..86b36e96b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,7 +70,8 @@ "turndown": "^7.2.0", "undici": "^7.3.0", "uuid": "^9.0.1", - "vite-plugin-static-copy": "^2.2.0" + "vite-plugin-static-copy": "^2.2.0", + "yaml": "^2.7.1" }, "devDependencies": { "@sveltejs/adapter-auto": "3.2.2", @@ -9514,6 +9515,16 @@ "node": ">=10" } }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", @@ -13031,12 +13042,15 @@ } }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.1.tgz", + "integrity": "sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/yauzl": { diff --git a/package.json b/package.json index 15d9d4707..346a7ddc8 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,8 @@ "turndown": "^7.2.0", "undici": "^7.3.0", "uuid": "^9.0.1", - "vite-plugin-static-copy": "^2.2.0" + "vite-plugin-static-copy": "^2.2.0", + "yaml": "^2.7.1" }, "engines": { "node": ">=18.13.0 <=22.x.x", diff --git a/src/lib/apis/index.ts b/src/lib/apis/index.ts index cdd6887b2..6e8a332d4 100644 --- a/src/lib/apis/index.ts +++ b/src/lib/apis/index.ts @@ -2,6 +2,7 @@ import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants'; import { convertOpenApiToToolPayload } from '$lib/utils'; import { getOpenAIModelsDirect } from './openai'; +import { parse } from 'yaml'; import { toast } from 'svelte-sonner'; export const getModels = async ( @@ -271,8 +272,15 @@ export const getToolServerData = async (token: string, url: string) => { } }) .then(async (res) => { - if (!res.ok) throw await res.json(); - return res.json(); + // Check if URL ends with .yaml or .yml to determine format + if (url.toLowerCase().endsWith('.yaml') || url.toLowerCase().endsWith('.yml')) { + if (!res.ok) throw await res.text(); + const text = await res.text(); + return parse(text); + } else { + if (!res.ok) throw await res.json(); + return res.json(); + } }) .catch((err) => { console.log(err); From 2e7a01f30adb5e641805f2c37921d111f955f31d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Behrmann?= Date: Wed, 9 Apr 2025 10:49:25 +0200 Subject: [PATCH 055/126] fix: choose the first mail if multiple are returned from LDAP --- backend/open_webui/routers/auths.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py index 7905799e6..6574ef0b1 100644 --- a/backend/open_webui/routers/auths.py +++ b/backend/open_webui/routers/auths.py @@ -230,11 +230,13 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm): entry = connection_app.entries[0] username = str(entry[f"{LDAP_ATTRIBUTE_FOR_USERNAME}"]).lower() - email = str(entry[f"{LDAP_ATTRIBUTE_FOR_MAIL}"]) - if not email or email == "" or email == "[]": + email = entry[f"{LDAP_ATTRIBUTE_FOR_MAIL}"] + if not email: raise HTTPException(400, "User does not have a valid email address.") - else: + elif isinstance(email, str): email = email.lower() + elif isinstance(email, list): + email = email[0].lower() cn = str(entry["cn"]) user_dn = entry.entry_dn From 68aea6bf10f432806fe5ceb1b346e28b0147b0c1 Mon Sep 17 00:00:00 2001 From: Miroslav Valcicak Date: Wed, 9 Apr 2025 16:18:58 +0200 Subject: [PATCH 056/126] feat: disable persistent config --- backend/open_webui/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 8238f8a87..936bd3840 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -201,6 +201,7 @@ def save_config(config): T = TypeVar("T") +PERSISTENT_CONFIG_ENABLED = os.environ.get("PERSISTENT_CONFIG_ENABLED", "True").lower() == "true" class PersistentConfig(Generic[T]): def __init__(self, env_name: str, config_path: str, env_value: T): @@ -208,7 +209,7 @@ class PersistentConfig(Generic[T]): self.config_path = config_path self.env_value = env_value self.config_value = get_config_value(config_path) - if self.config_value is not None: + if self.config_value is not None and PERSISTENT_CONFIG_ENABLED: log.info(f"'{env_name}' loaded from the latest database entry") self.value = self.config_value else: From 15fd822916797ea3fed3e0ef42e76f8679dfb140 Mon Sep 17 00:00:00 2001 From: Noam Tamim Date: Wed, 9 Apr 2025 19:45:17 +0300 Subject: [PATCH 057/126] Set FastAPI title to `Open WebUI` This affects the generated OpenAPI (`/docs` and `/openapi.json`). --- backend/open_webui/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index c9ca059c2..2bbd25ae2 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -426,6 +426,7 @@ async def lifespan(app: FastAPI): app = FastAPI( + title="Open WebUI", docs_url="/docs" if ENV == "dev" else None, openapi_url="/openapi.json" if ENV == "dev" else None, redoc_url=None, From 87af2692e51b0ea930c337960e12f63a9d613fcd Mon Sep 17 00:00:00 2001 From: asncx <1337balazs@gmail.com> Date: Wed, 9 Apr 2025 20:56:49 +0200 Subject: [PATCH 058/126] fix: folder chat rename --- src/lib/components/layout/Sidebar/ChatItem.svelte | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lib/components/layout/Sidebar/ChatItem.svelte b/src/lib/components/layout/Sidebar/ChatItem.svelte index 0c15a334e..96631e125 100644 --- a/src/lib/components/layout/Sidebar/ChatItem.svelte +++ b/src/lib/components/layout/Sidebar/ChatItem.svelte @@ -83,6 +83,8 @@ currentChatPage.set(1); await chats.set(await getChatList(localStorage.token, $currentChatPage)); await pinnedChats.set(await getPinnedChatList(localStorage.token)); + + dispatch('change'); } }; From a5faaf388e2e961cc2d75a751ecad8a18654166e Mon Sep 17 00:00:00 2001 From: Miroslav Valcicak Date: Wed, 9 Apr 2025 21:22:25 +0200 Subject: [PATCH 059/126] refactor: rename persistent config variable --- backend/open_webui/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 936bd3840..bdd6ec874 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -201,7 +201,7 @@ def save_config(config): T = TypeVar("T") -PERSISTENT_CONFIG_ENABLED = os.environ.get("PERSISTENT_CONFIG_ENABLED", "True").lower() == "true" +ENABLE_PERSISTENT_CONFIG = os.environ.get("ENABLE_PERSISTENT_CONFIG", "True").lower() == "true" class PersistentConfig(Generic[T]): def __init__(self, env_name: str, config_path: str, env_value: T): @@ -209,7 +209,7 @@ class PersistentConfig(Generic[T]): self.config_path = config_path self.env_value = env_value self.config_value = get_config_value(config_path) - if self.config_value is not None and PERSISTENT_CONFIG_ENABLED: + if self.config_value is not None and ENABLE_PERSISTENT_CONFIG: log.info(f"'{env_name}' loaded from the latest database entry") self.value = self.config_value else: From 7cee0073cfa15b58eb7ae43598864bc9cc6490a1 Mon Sep 17 00:00:00 2001 From: Beni34 <83817491+Beni34@users.noreply.github.com> Date: Wed, 9 Apr 2025 21:40:23 +0200 Subject: [PATCH 060/126] Update translation.json --- src/lib/i18n/locales/hu-HU/translation.json | 906 ++++++++++---------- 1 file changed, 453 insertions(+), 453 deletions(-) diff --git a/src/lib/i18n/locales/hu-HU/translation.json b/src/lib/i18n/locales/hu-HU/translation.json index 29e40bd8d..115a9a36a 100644 --- a/src/lib/i18n/locales/hu-HU/translation.json +++ b/src/lib/i18n/locales/hu-HU/translation.json @@ -1,14 +1,14 @@ { - "-1 for no limit, or a positive integer for a specific limit": "", + "-1 for no limit, or a positive integer for a specific limit": "-1 a korlátlanhoz, vagy pozitív egész szám egy konkrét limithoz", "'s', 'm', 'h', 'd', 'w' or '-1' for no expiration.": "'s', 'm', 'h', 'd', 'w' vagy '-1' ha nincs lejárat.", "(e.g. `sh webui.sh --api --api-auth username_password`)": "(pl. `sh webui.sh --api --api-auth username_password`)", "(e.g. `sh webui.sh --api`)": "(pl. `sh webui.sh --api`)", "(latest)": "(legújabb)", - "(Ollama)": "", + "(Ollama)": "(Ollama)", "{{ models }}": "{{ modellek }}", - "{{COUNT}} Available Tools": "", - "{{COUNT}} hidden lines": "", - "{{COUNT}} Replies": "", + "{{COUNT}} Available Tools": "{{COUNT}} Elérhető eszköz", + "{{COUNT}} hidden lines": "{{COUNT}} rejtett sor", + "{{COUNT}} Replies": "{{COUNT}} Válasz", "{{user}}'s Chats": "{{user}} beszélgetései", "{{webUIName}} Backend Required": "{{webUIName}} Backend szükséges", "*Prompt node ID(s) are required for image generation": "*Prompt node ID(k) szükségesek a képgeneráláshoz", @@ -16,36 +16,36 @@ "A task model is used when performing tasks such as generating titles for chats and web search queries": "A feladat modell olyan feladatokhoz használatos, mint a beszélgetések címeinek generálása és webes keresési lekérdezések", "a user": "egy felhasználó", "About": "Névjegy", - "Accept autocomplete generation / Jump to prompt variable": "", - "Access": "", - "Access Control": "", - "Accessible to all users": "", + "Accept autocomplete generation / Jump to prompt variable": "Automatikus kiegészítés elfogadása / Ugrás a prompt változóhoz", + "Access": "Hozzáférés", + "Access Control": "Hozzáférés-vezérlés", + "Accessible to all users": "Minden felhasználó számára elérhető", "Account": "Fiók", "Account Activation Pending": "Fiók aktiválása folyamatban", "Accurate information": "Pontos információ", "Actions": "Műveletek", - "Activate": "", - "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "", + "Activate": "Aktiválás", + "Activate this command by typing \"/{{COMMAND}}\" to chat input.": "Aktiváld ezt a parancsot a \"/{{COMMAND}}\" beírásával a csevegőmezőbe.", "Active Users": "Aktív felhasználók", "Add": "Hozzáadás", - "Add a model ID": "", + "Add a model ID": "Modell azonosító hozzáadása", "Add a short description about what this model does": "Adj hozzá egy rövid leírást arról, hogy mit csinál ez a modell", "Add a tag": "Címke hozzáadása", "Add Arena Model": "Arena modell hozzáadása", - "Add Connection": "", + "Add Connection": "Kapcsolat hozzáadása", "Add Content": "Tartalom hozzáadása", "Add content here": "Tartalom hozzáadása ide", "Add custom prompt": "Egyéni prompt hozzáadása", "Add Files": "Fájlok hozzáadása", - "Add Group": "", + "Add Group": "Csoport hozzáadása", "Add Memory": "Memória hozzáadása", "Add Model": "Modell hozzáadása", - "Add Reaction": "", + "Add Reaction": "Reakció hozzáadása", "Add Tag": "Címke hozzáadása", "Add Tags": "Címkék hozzáadása", "Add text content": "Szöveges tartalom hozzáadása", "Add User": "Felhasználó hozzáadása", - "Add User Group": "", + "Add User Group": "Felhasználói csoport hozzáadása", "Adjusting these settings will apply changes universally to all users.": "Ezen beállítások módosítása minden felhasználóra érvényes lesz.", "admin": "admin", "Admin": "Admin", @@ -54,76 +54,76 @@ "Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Az adminok mindig hozzáférnek minden eszközhöz; a felhasználóknak modellenként kell eszközöket hozzárendelni a munkaterületen.", "Advanced Parameters": "Haladó paraméterek", "Advanced Params": "Haladó paraméterek", - "All": "", + "All": "Mind", "All Documents": "Minden dokumentum", - "All models deleted successfully": "", - "Allow Chat Controls": "", - "Allow Chat Delete": "", + "All models deleted successfully": "Minden modell sikeresen törölve", + "Allow Chat Controls": "Csevegésvezérlők engedélyezése", + "Allow Chat Delete": "Csevegés törlésének engedélyezése", "Allow Chat Deletion": "Beszélgetések törlésének engedélyezése", - "Allow Chat Edit": "", - "Allow File Upload": "", + "Allow Chat Edit": "Csevegés szerkesztésének engedélyezése", + "Allow File Upload": "Fájlfeltöltés engedélyezése", "Allow non-local voices": "Nem helyi hangok engedélyezése", "Allow Temporary Chat": "Ideiglenes beszélgetés engedélyezése", "Allow User Location": "Felhasználói helyzet engedélyezése", "Allow Voice Interruption in Call": "Hang megszakítás engedélyezése hívás közben", - "Allowed Endpoints": "", + "Allowed Endpoints": "Engedélyezett végpontok", "Already have an account?": "Már van fiókod?", - "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.": "", - "Always": "", - "Always Collapse Code Blocks": "", - "Always Expand Details": "", - "Amazing": "", + "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.": "Alternatíva a top_p helyett, célja a minőség és változatosság egyensúlyának biztosítása. A p paraméter a token figyelembevételének minimális valószínűségét jelzi a legvalószínűbb token valószínűségéhez képest. Például, ha p=0,05 és a legvalószínűbb token valószínűsége 0,9, a 0,045-nél kisebb értékű logitok kiszűrésre kerülnek.", + "Always": "Mindig", + "Always Collapse Code Blocks": "Kódblokkok mindig összecsukása", + "Always Expand Details": "Részletek mindig kibontása", + "Amazing": "Csodálatos", "an assistant": "egy asszisztens", - "Analyzed": "", - "Analyzing...": "", + "Analyzed": "Elemezve", + "Analyzing...": "Elemzés...", "and": "és", "and {{COUNT}} more": "és még {{COUNT}} db", "and create a new shared link.": "és hozz létre egy új megosztott linket.", "API Base URL": "API alap URL", "API Key": "API kulcs", "API Key created.": "API kulcs létrehozva.", - "API Key Endpoint Restrictions": "", + "API Key Endpoint Restrictions": "API kulcs végpont korlátozások", "API keys": "API kulcsok", - "Application DN": "", - "Application DN Password": "", - "applies to all users with the \"user\" role": "", + "Application DN": "Alkalmazás DN", + "Application DN Password": "Alkalmazás DN jelszó", + "applies to all users with the \"user\" role": "minden \"felhasználó\" szerepkörű felhasználóra vonatkozik", "April": "Április", "Archive": "Archiválás", "Archive All Chats": "Minden beszélgetés archiválása", "Archived Chats": "Archivált beszélgetések", - "archived-chat-export": "", - "Are you sure you want to clear all memories? This action cannot be undone.": "", - "Are you sure you want to delete this channel?": "", - "Are you sure you want to delete this message?": "", - "Are you sure you want to unarchive all archived chats?": "", + "archived-chat-export": "archivált csevegés exportálása", + "Are you sure you want to clear all memories? This action cannot be undone.": "Biztosan törölni szeretnéd az összes memóriát? Ez a művelet nem vonható vissza.", + "Are you sure you want to delete this channel?": "Biztosan törölni szeretnéd ezt a csatornát?", + "Are you sure you want to delete this message?": "Biztosan törölni szeretnéd ezt az üzenetet?", + "Are you sure you want to unarchive all archived chats?": "Biztosan vissza szeretnéd állítani az összes archivált csevegést?", "Are you sure?": "Biztos vagy benne?", "Arena Models": "Arena modellek", "Artifacts": "Műtermékek", - "Ask": "", + "Ask": "Kérdezz", "Ask a question": "Kérdezz valamit", "Assistant": "Asszisztens", - "Attach file from knowledge": "", + "Attach file from knowledge": "Fájl csatolása a tudásbázisból", "Attention to detail": "Részletekre való odafigyelés", - "Attribute for Mail": "", - "Attribute for Username": "", + "Attribute for Mail": "Email attribútum", + "Attribute for Username": "Felhasználónév attribútum", "Audio": "Hang", "August": "Augusztus", - "Auth": "", - "Authenticate": "", - "Authentication": "", - "Auto": "", + "Auth": "Hitelesítés", + "Authenticate": "Hitelesítés", + "Authentication": "Hitelesítés", + "Auto": "Automatikus", "Auto-Copy Response to Clipboard": "Válasz automatikus másolása a vágólapra", "Auto-playback response": "Automatikus válasz lejátszás", - "Autocomplete Generation": "", - "Autocomplete Generation Input Max Length": "", + "Autocomplete Generation": "Automatikus kiegészítés generálása", + "Autocomplete Generation Input Max Length": "Automatikus kiegészítés bemenet maximális hossza", "Automatic1111": "Automatic1111", "AUTOMATIC1111 Api Auth String": "AUTOMATIC1111 Api hitelesítési karakterlánc", "AUTOMATIC1111 Base URL": "AUTOMATIC1111 alap URL", "AUTOMATIC1111 Base URL is required.": "AUTOMATIC1111 alap URL szükséges.", "Available list": "Elérhető lista", - "Available Tools": "", + "Available Tools": "Elérhető eszközök", "available!": "elérhető!", - "Awful": "", + "Awful": "Szörnyű", "Azure AI Speech": "Azure AI beszéd", "Azure Region": "Azure régió", "Back": "Vissza", @@ -133,36 +133,36 @@ "Batch Size (num_batch)": "Köteg méret (num_batch)", "before": "előtt", "Being lazy": "Lustaság", - "Beta": "", - "Bing Search V7 Endpoint": "", - "Bing Search V7 Subscription Key": "", - "Bocha Search API Key": "", - "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "", + "Beta": "Béta", + "Bing Search V7 Endpoint": "Bing Search V7 végpont", + "Bing Search V7 Subscription Key": "Bing Search V7 előfizetési kulcs", + "Bocha Search API Key": "Bocha Search API kulcs", + "Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "Specifikus tokenek növelése vagy büntetése korlátozott válaszokhoz. Az elfogultság értékei -100 és 100 között lesznek rögzítve (beleértve). (Alapértelmezett: nincs)", "Brave Search API Key": "Brave Search API kulcs", - "By {{name}}": "", - "Bypass Embedding and Retrieval": "", + "By {{name}}": "Készítette: {{name}}", + "Bypass Embedding and Retrieval": "Beágyazás és visszakeresés kihagyása", "Bypass SSL verification for Websites": "SSL ellenőrzés kihagyása weboldalakhoz", - "Calendar": "", + "Calendar": "Naptár", "Call": "Hívás", "Call feature is not supported when using Web STT engine": "A hívás funkció nem támogatott Web STT motor használatakor", "Camera": "Kamera", "Cancel": "Mégse", "Capabilities": "Képességek", - "Capture": "", - "Certificate Path": "", + "Capture": "Rögzítés", + "Certificate Path": "Tanúsítvány útvonal", "Change Password": "Jelszó módosítása", - "Channel Name": "", - "Channels": "", + "Channel Name": "Csatorna neve", + "Channels": "Csatornák", "Character": "Karakter", - "Character limit for autocomplete generation input": "", - "Chart new frontiers": "", + "Character limit for autocomplete generation input": "Karakterlimit az automatikus kiegészítés bemenetéhez", + "Chart new frontiers": "Új határok feltérképezése", "Chat": "Beszélgetés", "Chat Background Image": "Beszélgetés háttérkép", "Chat Bubble UI": "Beszélgetés buborék felület", "Chat Controls": "Beszélgetés vezérlők", "Chat direction": "Beszélgetés iránya", "Chat Overview": "Beszélgetés áttekintés", - "Chat Permissions": "", + "Chat Permissions": "Beszélgetési engedélyek", "Chat Tags Auto-Generation": "Beszélgetés címkék automatikus generálása", "Chats": "Beszélgetések", "Check Again": "Ellenőrzés újra", @@ -171,17 +171,17 @@ "Choose a model before saving...": "Válassz modellt mentés előtt...", "Chunk Overlap": "Darab átfedés", "Chunk Size": "Darab méret", - "Ciphers": "", + "Ciphers": "Titkosítási algoritmusok", "Citation": "Idézet", "Clear memory": "Memória törlése", - "Clear Memory": "", - "click here": "", - "Click here for filter guides.": "", + "Clear Memory": "Memória törlése", + "click here": "kattints ide", + "Click here for filter guides.": "Kattints ide a szűrő útmutatókért.", "Click here for help.": "Kattints ide segítségért.", "Click here to": "Kattints ide", "Click here to download user import template file.": "Kattints ide a felhasználó importálási sablon letöltéséhez.", "Click here to learn more about faster-whisper and see the available models.": "Kattints ide, hogy többet tudj meg a faster-whisperről és lásd az elérhető modelleket.", - "Click here to see available models.": "", + "Click here to see available models.": "Kattints ide az elérhető modellek megtekintéséhez.", "Click here to select": "Kattints ide a kiválasztáshoz", "Click here to select a csv file.": "Kattints ide egy CSV fájl kiválasztásához.", "Click here to select a py file.": "Kattints ide egy py fájl kiválasztásához.", @@ -190,22 +190,22 @@ "Click on the user role button to change a user's role.": "Kattints a felhasználói szerep gombra a felhasználó szerepének módosításához.", "Clipboard write permission denied. Please check your browser settings to grant the necessary access.": "Vágólap írási engedély megtagadva. Kérjük, ellenőrizd a böngésző beállításait a szükséges hozzáférés megadásához.", "Clone": "Klónozás", - "Clone Chat": "", - "Clone of {{TITLE}}": "", + "Clone Chat": "Beszélgetés klónozása", + "Clone of {{TITLE}}": "{{TITLE}} klónja", "Close": "Bezárás", "Code execution": "Kód végrehajtás", - "Code Execution": "", - "Code Execution Engine": "", - "Code Execution Timeout": "", + "Code Execution": "Kód végrehajtás", + "Code Execution Engine": "Kód végrehajtási motor", + "Code Execution Timeout": "Kód végrehajtási időtúllépés", "Code formatted successfully": "Kód sikeresen formázva", - "Code Interpreter": "", - "Code Interpreter Engine": "", - "Code Interpreter Prompt Template": "", - "Collapse": "", + "Code Interpreter": "Kód értelmező", + "Code Interpreter Engine": "Kód értelmező motor", + "Code Interpreter Prompt Template": "Kód értelmező prompt sablon", + "Collapse": "Összecsukás", "Collection": "Gyűjtemény", - "Color": "", + "Color": "Szín", "ComfyUI": "ComfyUI", - "ComfyUI API Key": "", + "ComfyUI API Key": "ComfyUI API kulcs", "ComfyUI Base URL": "ComfyUI alap URL", "ComfyUI Base URL is required.": "ComfyUI alap URL szükséges.", "ComfyUI Workflow": "ComfyUI munkafolyamat", @@ -213,30 +213,30 @@ "Command": "Parancs", "Completions": "Kiegészítések", "Concurrent Requests": "Párhuzamos kérések", - "Configure": "", + "Configure": "Konfigurálás", "Confirm": "Megerősítés", "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.": "", - "Connect to your own OpenAPI compatible external tool servers.": "", - "Connection failed": "", - "Connection successful": "", + "Confirm your new password": "Erősítsd meg az új jelszavad", + "Connect to your own OpenAI compatible API endpoints.": "Csatlakozz saját OpenAI kompatibilis API végpontjaidhoz.", + "Connect to your own OpenAPI compatible external tool servers.": "Csatlakozz saját OpenAPI kompatibilis külső eszköszervereidhez.", + "Connection failed": "Kapcsolat sikertelen", + "Connection successful": "Kapcsolat sikeres", "Connections": "Kapcsolatok", - "Connections saved successfully": "", - "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "", + "Connections saved successfully": "Kapcsolatok sikeresen mentve", + "Constrains effort on reasoning for reasoning models. Only applicable to reasoning models from specific providers that support reasoning effort.": "Korlátozza az érvelési erőfeszítést az érvelési modellek esetében. Csak bizonyos szolgáltatóktól származó, érvelési erőfeszítést támogató modellekre alkalmazható.", "Contact Admin for WebUI Access": "Lépj kapcsolatba az adminnal a WebUI hozzáférésért", "Content": "Tartalom", - "Content Extraction Engine": "", + "Content Extraction Engine": "Tartalom kinyerési motor", "Context Length": "Kontextus hossz", "Continue Response": "Válasz folytatása", "Continue with {{provider}}": "Folytatás {{provider}} szolgáltatóval", - "Continue with Email": "", - "Continue with LDAP": "", + "Continue with Email": "Folytatás emaillel", + "Continue with LDAP": "Folytatás LDAP-val", "Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "Szabályozd, hogyan legyen felosztva az üzenet szövege a TTS kérésekhez. A 'Központozás' mondatokra bontja, a 'Bekezdések' bekezdésekre bontja, a 'Nincs' pedig egyetlen szövegként kezeli az üzenetet.", - "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "", + "Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "Szabályozza a generált szövegben lévő token sorozatok ismétlődését. Magasabb érték (pl. 1,5) erősebben bünteti az ismétléseket, alacsonyabb érték (pl. 1,1) engedékenyebb. 1-nél kikapcsolva.", "Controls": "Vezérlők", - "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "", + "Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "Szabályozza a kimenet koherenciája és változatossága közötti egyensúlyt. Alacsonyabb érték fókuszáltabb és koherensebb szöveget eredményez.", "Copied": "Másolva", "Copied shared chat URL to clipboard!": "Megosztott beszélgetés URL másolva a vágólapra!", "Copied to clipboard": "Vágólapra másolva", @@ -246,14 +246,14 @@ "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": "", + "CORS must be properly configured by the provider to allow requests from Open WebUI.": "A CORS-t megfelelően kell konfigurálnia a szolgáltatónak, hogy engedélyezze az Open WebUI-ból érkező kéréseket.", + "Create": "Létrehozás", + "Create a knowledge base": "Tudásbázis létrehozása", "Create a model": "Modell létrehozása", "Create Account": "Fiók létrehozása", - "Create Admin Account": "", - "Create Channel": "", - "Create Group": "", + "Create Admin Account": "Admin fiók létrehozása", + "Create Channel": "Csatorna létrehozása", + "Create Group": "Csoport létrehozása", "Create Knowledge": "Tudás létrehozása", "Create new key": "Új kulcs létrehozása", "Create new secret key": "Új titkos kulcs létrehozása", @@ -261,256 +261,256 @@ "Created At": "Létrehozva", "Created by": "Létrehozta", "CSV Import": "CSV importálás", - "Ctrl+Enter to Send": "", + "Ctrl+Enter to Send": "Ctrl+Enter a küldéshez", "Current Model": "Jelenlegi modell", "Current Password": "Jelenlegi jelszó", "Custom": "Egyéni", - "Danger Zone": "", + "Danger Zone": "Veszélyzóna", "Dark": "Sötét", "Database": "Adatbázis", "December": "December", "Default": "Alapértelmezett", "Default (Open AI)": "Alapértelmezett (Open AI)", "Default (SentenceTransformers)": "Alapértelmezett (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.": "Az alapértelmezett mód szélesebb modellválasztékkal működik az eszközök egyszeri meghívásával a végrehajtás előtt. A natív mód a modell beépített eszközhívási képességeit használja ki, de ehhez a modellnek eredendően támogatnia kell ezt a funkciót.", "Default Model": "Alapértelmezett modell", "Default model updated": "Alapértelmezett modell frissítve", - "Default Models": "", - "Default permissions": "", - "Default permissions updated successfully": "", + "Default Models": "Alapértelmezett modellek", + "Default permissions": "Alapértelmezett engedélyek", + "Default permissions updated successfully": "Alapértelmezett engedélyek sikeresen frissítve", "Default Prompt Suggestions": "Alapértelmezett prompt javaslatok", - "Default to 389 or 636 if TLS is enabled": "", - "Default to ALL": "", - "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "", + "Default to 389 or 636 if TLS is enabled": "Alapértelmezés szerint 389 vagy 636, ha a TLS engedélyezve van", + "Default to ALL": "Alapértelmezés szerint MIND", + "Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "Alapértelmezés szerint szegmentált visszakeresés a fókuszált és releváns tartalom kinyeréséhez, ez a legtöbb esetben ajánlott.", "Default User Role": "Alapértelmezett felhasználói szerep", "Delete": "Törlés", "Delete a model": "Modell törlése", "Delete All Chats": "Minden beszélgetés törlése", - "Delete All Models": "", + "Delete All Models": "Minden modell törlése", "Delete chat": "Beszélgetés törlése", "Delete Chat": "Beszélgetés törlése", "Delete chat?": "Törli a beszélgetést?", "Delete folder?": "Törli a mappát?", "Delete function?": "Törli a funkciót?", - "Delete Message": "", - "Delete message?": "", + "Delete Message": "Üzenet törlése", + "Delete message?": "Üzenet törlése?", "Delete prompt?": "Törli a promptot?", "delete this link": "link törlése", "Delete tool?": "Törli az eszközt?", "Delete User": "Felhasználó törlése", "Deleted {{deleteModelTag}}": "{{deleteModelTag}} törölve", "Deleted {{name}}": "{{name}} törölve", - "Deleted User": "", - "Describe your knowledge base and objectives": "", + "Deleted User": "Felhasználó törölve", + "Describe your knowledge base and objectives": "Írd le a tudásbázisodat és céljaidat", "Description": "Leírás", "Didn't fully follow instructions": "Nem követte teljesen az utasításokat", - "Direct": "", - "Direct Connections": "", - "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "", - "Direct Connections settings updated": "", - "Direct Tool Servers": "", + "Direct": "Közvetlen", + "Direct Connections": "Közvetlen kapcsolatok", + "Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "A közvetlen kapcsolatok lehetővé teszik a felhasználók számára, hogy saját OpenAI kompatibilis API végpontjaikhoz csatlakozzanak.", + "Direct Connections settings updated": "Közvetlen kapcsolatok beállításai frissítve", + "Direct Tool Servers": "Közvetlen eszköszerverek", "Disabled": "Letiltva", "Discover a function": "Funkció felfedezése", "Discover a model": "Modell felfedezése", "Discover a prompt": "Prompt felfedezése", "Discover a tool": "Eszköz felfedezése", - "Discover how to use Open WebUI and seek support from the community.": "", - "Discover wonders": "", + "Discover how to use Open WebUI and seek support from the community.": "Fedezd fel, hogyan használd az Open WebUI-t és kérj támogatást a közösségtől.", + "Discover wonders": "Csodák felfedezése", "Discover, download, and explore custom functions": "Fedezz fel, tölts le és fedezz fel egyéni funkciókat", "Discover, download, and explore custom prompts": "Fedezz fel, tölts le és fedezz fel egyéni promptokat", "Discover, download, and explore custom tools": "Fedezz fel, tölts le és fedezz fel egyéni eszközöket", "Discover, download, and explore model presets": "Fedezz fel, tölts le és fedezz fel modell beállításokat", "Dismissible": "Elutasítható", - "Display": "", + "Display": "Megjelenítés", "Display Emoji in Call": "Emoji megjelenítése hívásban", "Display the username instead of You in the Chat": "Felhasználónév megjelenítése a 'Te' helyett a beszélgetésben", - "Displays citations in the response": "", - "Dive into knowledge": "", + "Displays citations in the response": "Idézetek megjelenítése a válaszban", + "Dive into knowledge": "Merülj el a tudásban", "Do not install functions from sources you do not fully trust.": "Ne telepíts funkciókat olyan forrásokból, amelyekben nem bízol teljesen.", "Do not install tools from sources you do not fully trust.": "Ne telepíts eszközöket olyan forrásokból, amelyekben nem bízol teljesen.", - "Docling": "", - "Docling Server URL required.": "", + "Docling": "Docling", + "Docling Server URL required.": "Docling szerver URL szükséges.", "Document": "Dokumentum", - "Document Intelligence": "", - "Document Intelligence endpoint and key required.": "", + "Document Intelligence": "Dokumentum intelligencia", + "Document Intelligence endpoint and key required.": "Dokumentum intelligencia végpont és kulcs szükséges.", "Documentation": "Dokumentáció", "Documents": "Dokumentumok", "does not make any external connections, and your data stays securely on your locally hosted server.": "nem létesít külső kapcsolatokat, és az adataid biztonságban maradnak a helyileg hosztolt szervereden.", - "Domain Filter List": "", + "Domain Filter List": "Domain szűrőlista", "Don't have an account?": "Nincs még fiókod?", "don't install random functions from sources you don't trust.": "ne telepíts véletlenszerű funkciókat olyan forrásokból, amelyekben nem bízol.", "don't install random tools from sources you don't trust.": "ne telepíts véletlenszerű eszközöket olyan forrásokból, amelyekben nem bízol.", "Don't like the style": "Nem tetszik a stílus", "Done": "Kész", "Download": "Letöltés", - "Download as SVG": "", + "Download as SVG": "Letöltés SVG-ként", "Download canceled": "Letöltés megszakítva", "Download Database": "Adatbázis letöltése", - "Drag and drop a file to upload or select a file to view": "", + "Drag and drop a file to upload or select a file to view": "Húzz ide egy fájlt a feltöltéshez vagy válassz fájlt a megtekintéshez", "Draw": "Rajzolás", "Drop any files here to add to the conversation": "Húzz ide fájlokat a beszélgetéshez való hozzáadáshoz", "e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "pl. '30s','10m'. Érvényes időegységek: 's', 'm', 'h'.", - "e.g. \"json\" or a JSON schema": "", - "e.g. 60": "", - "e.g. A filter to remove profanity from text": "", - "e.g. My Filter": "", - "e.g. My Tools": "", - "e.g. my_filter": "", - "e.g. my_tools": "", - "e.g. Tools for performing various operations": "", + "e.g. \"json\" or a JSON schema": "pl. \"json\" vagy egy JSON séma", + "e.g. 60": "pl. 60", + "e.g. A filter to remove profanity from text": "pl. Egy szűrő a trágárság eltávolítására a szövegből", + "e.g. My Filter": "pl. Az én szűrőm", + "e.g. My Tools": "pl. Az én eszközeim", + "e.g. my_filter": "pl. az_en_szűrőm", + "e.g. my_tools": "pl. az_en_eszkozeim", + "e.g. Tools for performing various operations": "pl. Eszközök különböző műveletek elvégzéséhez", "Edit": "Szerkesztés", "Edit Arena Model": "Arena modell szerkesztése", - "Edit Channel": "", - "Edit Connection": "", - "Edit Default Permissions": "", + "Edit Channel": "Csatorna szerkesztése", + "Edit Connection": "Kapcsolat szerkesztése", + "Edit Default Permissions": "Alapértelmezett engedélyek szerkesztése", "Edit Memory": "Memória szerkesztése", "Edit User": "Felhasználó szerkesztése", - "Edit User Group": "", + "Edit User Group": "Felhasználói csoport szerkesztése", "ElevenLabs": "ElevenLabs", "Email": "Email", - "Embark on adventures": "", - "Embedding": "", + "Embark on adventures": "Vágj bele kalandokba", + "Embedding": "Beágyazás", "Embedding Batch Size": "Beágyazási köteg méret", "Embedding Model": "Beágyazási modell", "Embedding Model Engine": "Beágyazási modell motor", "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 Execution": "", - "Enable Code Interpreter": "", + "Enable API Key": "API kulcs engedélyezése", + "Enable autocomplete generation for chat messages": "Automatikus kiegészítés engedélyezése csevegőüzenetekhez", + "Enable Code Execution": "Kód végrehajtás engedélyezése", + "Enable Code Interpreter": "Kód értelmező engedélyezése", "Enable Community Sharing": "Közösségi megosztás engedélyezése", - "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.": "", - "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "", + "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.": "Engedélyezd a memória zárolást (mlock), hogy a modell adatai ne kerüljenek ki a RAM-ból. Ez az opció a modell munkakészletének oldalait a RAM-ban rögzíti, így nem kerülnek a lemezre. Ez segíthet a teljesítmény fenntartásában az oldalhibák elkerülésével és a gyors adathozzáférés biztosításával.", + "Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Engedélyezd a memória leképezést (mmap) a modell adatainak betöltéséhez. Ez az opció lehetővé teszi a rendszer számára, hogy a lemeztárolót a RAM kiterjesztéseként használja, a lemezfájlokat RAM-ban lévőként kezelve. Ez javíthatja a modell teljesítményét a gyorsabb adathozzáférés révén. Azonban nem minden rendszerrel működik megfelelően és jelentős lemezterületet foglalhat.", "Enable Message Rating": "Üzenet értékelés engedélyezése", - "Enable Mirostat sampling for controlling perplexity.": "", + "Enable Mirostat sampling for controlling perplexity.": "Engedélyezd a Mirostat mintavételezést a perplexitás szabályozásához.", "Enable New Sign Ups": "Új regisztrációk engedélyezése", "Enabled": "Engedélyezve", - "Enforce Temporary Chat": "", + "Enforce Temporary Chat": "Ideiglenes csevegés kikényszerítése", "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", "Enter api auth string (e.g. username:password)": "Add meg az API hitelesítési karakterláncot (pl. felhasználónév:jelszó)", - "Enter Application DN": "", - "Enter Application DN Password": "", - "Enter Bing Search V7 Endpoint": "", - "Enter Bing Search V7 Subscription Key": "", - "Enter Bocha Search API Key": "", + "Enter Application DN": "Add meg az alkalmazás DN-t", + "Enter Application DN Password": "Add meg az alkalmazás DN jelszavát", + "Enter Bing Search V7 Endpoint": "Add meg a Bing Search V7 végpontot", + "Enter Bing Search V7 Subscription Key": "Add meg a Bing Search V7 előfizetési kulcsot", + "Enter Bocha Search API Key": "Add meg a Bocha Search API kulcsot", "Enter Brave Search API Key": "Add meg a Brave Search API kulcsot", - "Enter certificate path": "", + "Enter certificate path": "Add meg a tanúsítvány útvonalát", "Enter CFG Scale (e.g. 7.0)": "Add meg a CFG skálát (pl. 7.0)", "Enter Chunk Overlap": "Add meg a darab átfedést", "Enter Chunk Size": "Add meg a darab méretet", - "Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "", + "Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Add meg vesszővel elválasztott \"token:bias_érték\" párokat (példa: 5432:100, 413:-100)", "Enter description": "Add meg a leírást", - "Enter Docling Server URL": "", - "Enter Document Intelligence Endpoint": "", - "Enter Document Intelligence Key": "", - "Enter domains separated by commas (e.g., example.com,site.org)": "", - "Enter Exa API Key": "", + "Enter Docling Server URL": "Add meg a Docling szerver URL-t", + "Enter Document Intelligence Endpoint": "Add meg a dokumentum intelligencia végpontot", + "Enter Document Intelligence Key": "Add meg a dokumentum intelligencia kulcsot", + "Enter domains separated by commas (e.g., example.com,site.org)": "Add meg a domaineket vesszővel elválasztva (pl. example.com,site.org)", + "Enter Exa API Key": "Add meg az Exa API kulcsot", "Enter Github Raw URL": "Add meg a Github Raw URL-t", "Enter Google PSE API Key": "Add meg a Google PSE API kulcsot", "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 Key Behavior": "", + "Enter Jina API Key": "Add meg a Jina API kulcsot", + "Enter Jupyter Password": "Add meg a Jupyter jelszavát", + "Enter Jupyter Token": "Add meg a Jupyter tokent", + "Enter Jupyter URL": "Add meg a Jupyter URL-t", + "Enter Kagi Search API Key": "Add meg a Kagi Search API kulcsot", + "Enter Key Behavior": "Add meg a kulcs viselkedését", "Enter language codes": "Add meg a nyelvi kódokat", - "Enter Mistral API Key": "", + "Enter Mistral API Key": "Add meg a Mistral API kulcsot", "Enter Model ID": "Add meg a modell azonosítót", "Enter model tag (e.g. {{modelTag}})": "Add meg a modell címkét (pl. {{modelTag}})", - "Enter Mojeek Search API Key": "", + "Enter Mojeek Search API Key": "Add meg a Mojeek Search API kulcsot", "Enter Number of Steps (e.g. 50)": "Add meg a lépések számát (pl. 50)", - "Enter Perplexity API Key": "", - "Enter proxy URL (e.g. https://user:password@host:port)": "", - "Enter reasoning effort": "", + "Enter Perplexity API Key": "Add meg a Perplexity API kulcsot", + "Enter proxy URL (e.g. https://user:password@host:port)": "Add meg a proxy URL-t (pl. https://user:password@host:port)", + "Enter reasoning effort": "Add meg az érvelési erőfeszítést", "Enter Sampler (e.g. Euler a)": "Add meg a mintavételezőt (pl. Euler a)", "Enter Scheduler (e.g. Karras)": "Add meg az ütemezőt (pl. Karras)", "Enter Score": "Add meg a pontszámot", "Enter SearchApi API Key": "Add meg a SearchApi API kulcsot", "Enter SearchApi Engine": "Add meg a SearchApi motort", "Enter Searxng Query URL": "Add meg a Searxng lekérdezési URL-t", - "Enter Seed": "", - "Enter SerpApi API Key": "", - "Enter SerpApi Engine": "", + "Enter Seed": "Add meg a seed értéket", + "Enter SerpApi API Key": "Add meg a SerpApi API kulcsot", + "Enter SerpApi Engine": "Add meg a SerpApi motort", "Enter Serper API Key": "Add meg a Serper API kulcsot", "Enter Serply API Key": "Add meg a Serply API kulcsot", "Enter Serpstack API Key": "Add meg a Serpstack API kulcsot", - "Enter server host": "", - "Enter server label": "", - "Enter server port": "", + "Enter server host": "Add meg a szerver hosztot", + "Enter server label": "Add meg a szerver címkét", + "Enter server port": "Add meg a szerver portot", "Enter stop sequence": "Add meg a leállítási szekvenciát", "Enter system prompt": "Add meg a rendszer promptot", - "Enter system prompt here": "", + "Enter system prompt here": "Írd ide a rendszer promptot", "Enter Tavily API Key": "Add meg a Tavily API kulcsot", - "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "", + "Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Add meg a WebUI nyilvános URL-jét. Ez az URL lesz használva az értesítésekben lévő linkek generálásához.", "Enter Tika Server URL": "Add meg a Tika szerver URL-t", - "Enter timeout in seconds": "", - "Enter to Send": "", + "Enter timeout in seconds": "Add meg az időtúllépést másodpercekben", + "Enter to Send": "Enter a küldéshez", "Enter Top K": "Add meg a Top K értéket", - "Enter Top K Reranker": "", + "Enter Top K Reranker": "Add meg a Top K újrarangsorolót", "Enter URL (e.g. http://127.0.0.1:7860/)": "Add meg az URL-t (pl. http://127.0.0.1:7860/)", "Enter URL (e.g. http://localhost:11434)": "Add meg az URL-t (pl. http://localhost:11434)", - "Enter your current password": "", + "Enter your current password": "Add meg a jelenlegi jelszavad", "Enter Your Email": "Add meg az email címed", "Enter Your Full Name": "Add meg a teljes neved", "Enter your message": "Írd be az üzeneted", - "Enter your name": "", - "Enter your new password": "", + "Enter your name": "Add meg a neved", + "Enter your new password": "Add meg az új jelszavad", "Enter Your Password": "Add meg a jelszavad", "Enter Your Role": "Add meg a szereped", - "Enter Your Username": "", - "Enter your webhook URL": "", + "Enter Your Username": "Add meg a felhasználóneved", + "Enter your webhook URL": "Add meg a webhook URL-t", "Error": "Hiba", "ERROR": "HIBA", - "Error accessing Google Drive: {{error}}": "", - "Error uploading file: {{error}}": "", + "Error accessing Google Drive: {{error}}": "Hiba a Google Drive elérése során: {{error}}", + "Error uploading file: {{error}}": "Hiba a fájl feltöltése során: {{error}}", "Evaluations": "Értékelések", - "Exa API Key": "", - "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "", - "Example: ALL": "", - "Example: mail": "", - "Example: ou=users,dc=foo,dc=example": "", - "Example: sAMAccountName or uid or userPrincipalName": "", - "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "", + "Exa API Key": "Exa API kulcs", + "Example: (&(objectClass=inetOrgPerson)(uid=%s))": "Példa: (&(objectClass=inetOrgPerson)(uid=%s))", + "Example: ALL": "Példa: MIND", + "Example: mail": "Példa: email", + "Example: ou=users,dc=foo,dc=example": "Példa: ou=users,dc=foo,dc=example", + "Example: sAMAccountName or uid or userPrincipalName": "Példa: sAMAccountName vagy uid vagy userPrincipalName", + "Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "Túllépted a licencben lévő helyek számát. Kérjük, vedd fel a kapcsolatot a támogatással a helyek számának növeléséhez.", "Exclude": "Kizárás", - "Execute code for analysis": "", - "Executing **{{NAME}}**...": "", - "Expand": "", + "Execute code for analysis": "Kód végrehajtása elemzéshez", + "Executing **{{NAME}}**...": "**{{NAME}}** végrehajtása...", + "Expand": "Kibontás", "Experimental": "Kísérleti", - "Explain": "", - "Explain this section to me in more detail": "", - "Explore the cosmos": "", + "Explain": "Magyarázat", + "Explain this section to me in more detail": "Magyarázd el ezt a részt részletesebben", + "Explore the cosmos": "Fedezd fel a kozmoszt", "Export": "Exportálás", - "Export All Archived Chats": "", + "Export All Archived Chats": "Minden archivált csevegés exportálása", "Export All Chats (All Users)": "Minden beszélgetés exportálása (minden felhasználó)", "Export chat (.json)": "Beszélgetés exportálása (.json)", "Export Chats": "Beszélgetések exportálása", "Export Config to JSON File": "Konfiguráció exportálása JSON fájlba", "Export Functions": "Funkciók exportálása", "Export Models": "Modellek exportálása", - "Export Presets": "", + "Export Presets": "Előre beállított exportálás", "Export Prompts": "Promptok exportálása", - "Export to CSV": "", + "Export to CSV": "Exportálás CSV-be", "Export Tools": "Eszközök exportálása", - "External": "", + "External": "Külső", "External Models": "Külső modellek", "Failed to add file.": "Nem sikerült hozzáadni a fájlt.", - "Failed to connect to {{URL}} OpenAPI tool server": "", + "Failed to connect to {{URL}} OpenAPI tool server": "Nem sikerült csatlakozni a {{URL}} OpenAPI eszköszerverhez", "Failed to create API Key.": "Nem sikerült létrehozni az API kulcsot.", - "Failed to fetch models": "", + "Failed to fetch models": "Nem sikerült lekérni a modelleket", "Failed to read clipboard contents": "Nem sikerült olvasni a vágólap tartalmát", - "Failed to save connections": "", - "Failed to save models configuration": "", + "Failed to save connections": "Nem sikerült menteni a kapcsolatokat", + "Failed to save models configuration": "Nem sikerült menteni a modellek konfigurációját", "Failed to update settings": "Nem sikerült frissíteni a beállításokat", "Failed to upload file.": "Nem sikerült feltölteni a fájlt.", - "Features": "", - "Features Permissions": "", + "Features": "Funkciók", + "Features Permissions": "Funkciók engedélyei", "February": "Február", "Feedback History": "Visszajelzés előzmények", - "Feedbacks": "", + "Feedbacks": "Visszajelzések", "Feel free to add specific details": "Nyugodtan adj hozzá specifikus részleteket", "File": "Fájl", "File added successfully.": "Fájl sikeresen hozzáadva.", @@ -519,7 +519,7 @@ "File not found.": "Fájl nem található.", "File removed successfully.": "Fájl sikeresen eltávolítva.", "File size should not exceed {{maxSize}} MB.": "A fájl mérete nem haladhatja meg a {{maxSize}} MB-ot.", - "File uploaded successfully": "", + "File uploaded successfully": "Fájl sikeresen feltöltve", "Files": "Fájlok", "Filter is now globally disabled": "A szűrő globálisan letiltva", "Filter is now globally enabled": "A szűrő globálisan engedélyezve", @@ -532,160 +532,160 @@ "Folder name cannot be empty.": "A mappa neve nem lehet üres.", "Folder name updated successfully": "Mappa neve sikeresen frissítve", "Followed instructions perfectly": "Tökéletesen követte az utasításokat", - "Forge new paths": "", + "Forge new paths": "Új utak kovácsolása", "Form": "Űrlap", "Format your variables using brackets like this:": "Formázd a változóidat zárójelekkel így:", - "Forwards system user session credentials to authenticate": "", + "Forwards system user session credentials to authenticate": "Továbbítja a rendszer felhasználói munkamenet hitelesítő adatait a hitelesítéshez", "Frequency Penalty": "Gyakorisági büntetés", - "Full Context Mode": "", + "Full Context Mode": "Teljes kontextus mód", "Function": "Funkció", - "Function Calling": "", + "Function Calling": "Funkcióhívás", "Function created successfully": "Funkció sikeresen létrehozva", "Function deleted successfully": "Funkció sikeresen törölve", - "Function Description": "", - "Function ID": "", + "Function Description": "Funkció leírása", + "Function ID": "Funkció azonosító", "Function is now globally disabled": "A funkció globálisan letiltva", "Function is now globally enabled": "A funkció globálisan engedélyezve", - "Function Name": "", + "Function Name": "Funkció neve", "Function updated successfully": "Funkció sikeresen frissítve", "Functions": "Funkciók", "Functions allow arbitrary code execution": "A funkciók tetszőleges kód végrehajtását teszik lehetővé", "Functions allow arbitrary code execution.": "A funkciók tetszőleges kód végrehajtását teszik lehetővé.", "Functions imported successfully": "Funkciók sikeresen importálva", - "Gemini": "", - "Gemini API Config": "", - "Gemini API Key is required.": "", + "Gemini": "Gemini", + "Gemini API Config": "Gemini API konfiguráció", + "Gemini API Key is required.": "Gemini API kulcs szükséges.", "General": "Általános", - "Generate an image": "", + "Generate an image": "Kép generálása", "Generate Image": "Kép generálása", - "Generate prompt pair": "", + "Generate prompt pair": "Prompt pár generálása", "Generating search query": "Keresési lekérdezés generálása", - "Get started": "", - "Get started with {{WEBUI_NAME}}": "", + "Get started": "Kezdj neki", + "Get started with {{WEBUI_NAME}}": "Kezdj neki a {{WEBUI_NAME}}-val", "Global": "Globális", "Good Response": "Jó válasz", - "Google Drive": "", + "Google Drive": "Google Drive", "Google PSE API Key": "Google PSE API kulcs", "Google PSE Engine Id": "Google PSE motor azonosító", - "Group created successfully": "", - "Group deleted successfully": "", - "Group Description": "", - "Group Name": "", - "Group updated successfully": "", - "Groups": "", + "Group created successfully": "Csoport sikeresen létrehozva", + "Group deleted successfully": "Csoport sikeresen törölve", + "Group Description": "Csoport leírása", + "Group Name": "Csoport neve", + "Group updated successfully": "Csoport sikeresen frissítve", + "Groups": "Csoportok", "Haptic Feedback": "Tapintási visszajelzés", "has no conversations.": "nincsenek beszélgetései.", "Hello, {{name}}": "Helló, {{name}}", "Help": "Segítség", "Help us create the best community leaderboard by sharing your feedback history!": "Segíts nekünk a legjobb közösségi ranglista létrehozásában a visszajelzési előzményeid megosztásával!", - "Hex Color": "", - "Hex Color - Leave empty for default color": "", + "Hex Color": "Hexa szín", + "Hex Color - Leave empty for default color": "Hexa szín - Hagyd üresen az alapértelmezett színhez", "Hide": "Elrejtés", - "Hide Model": "", - "Home": "", - "Host": "", + "Hide Model": "Modell elrejtése", + "Home": "Kezdőlap", + "Host": "Hoszt", "How can I help you today?": "Hogyan segíthetek ma?", - "How would you rate this response?": "", + "How would you rate this response?": "Hogyan értékelnéd ezt a választ?", "Hybrid Search": "Hibrid keresés", "I acknowledge that I have read and I understand the implications of my action. I am aware of the risks associated with executing arbitrary code and I have verified the trustworthiness of the source.": "Elismerem, hogy elolvastam és megértem a cselekedetem következményeit. Tisztában vagyok a tetszőleges kód végrehajtásával járó kockázatokkal, és ellenőriztem a forrás megbízhatóságát.", "ID": "Azonosító", - "Ignite curiosity": "", - "Image": "", - "Image Compression": "", - "Image Generation": "", + "Ignite curiosity": "Kíváncsiság felkeltése", + "Image": "Kép", + "Image Compression": "Képtömörítés", + "Image Generation": "Képgenerálás", "Image Generation (Experimental)": "Képgenerálás (kísérleti)", "Image Generation Engine": "Képgenerálási motor", - "Image Max Compression Size": "", - "Image Prompt Generation": "", - "Image Prompt Generation Prompt": "", + "Image Max Compression Size": "Kép maximális tömörítési mérete", + "Image Prompt Generation": "Kép prompt generálás", + "Image Prompt Generation Prompt": "Kép prompt generálási prompt", "Image Settings": "Kép beállítások", "Images": "Képek", "Import Chats": "Beszélgetések importálása", "Import Config from JSON File": "Konfiguráció importálása JSON fájlból", "Import Functions": "Funkciók importálása", "Import Models": "Modellek importálása", - "Import Presets": "", + "Import Presets": "Előre beállított importálás", "Import Prompts": "Promptok importálása", "Import Tools": "Eszközök importálása", "Include": "Tartalmaz", "Include `--api-auth` flag when running stable-diffusion-webui": "Add hozzá a `--api-auth` kapcsolót a stable-diffusion-webui futtatásakor", "Include `--api` flag when running stable-diffusion-webui": "Add hozzá a `--api` kapcsolót a stable-diffusion-webui futtatásakor", - "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "", + "Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Befolyásolja, hogy az algoritmus milyen gyorsan reagál a generált szöveg visszajelzéseire. Alacsonyabb tanulási ráta lassabb调整okat eredményez, míg magasabb ráta gyorsabb reagálást biztosít.", "Info": "Információ", - "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "", + "Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Az összes tartalom kontextusként való befecskendezése átfogó feldolgozáshoz, ez összetett lekérdezésekhez ajánlott.", "Input commands": "Beviteli parancsok", "Install from Github URL": "Telepítés Github URL-ről", "Instant Auto-Send After Voice Transcription": "Azonnali automatikus küldés hangfelismerés után", - "Integration": "", + "Integration": "Integráció", "Interface": "Felület", "Invalid file format.": "Érvénytelen fájlformátum.", - "Invalid JSON schema": "", + "Invalid JSON schema": "Érvénytelen JSON séma", "Invalid Tag": "Érvénytelen címke", - "is typing...": "", + "is typing...": "ír...", "January": "Január", - "Jina API Key": "", + "Jina API Key": "Jina API kulcs", "join our Discord for help.": "Csatlakozz a Discord szerverünkhöz segítségért.", "JSON": "JSON", "JSON Preview": "JSON előnézet", "July": "Július", "June": "Június", - "Jupyter Auth": "", - "Jupyter URL": "", + "Jupyter Auth": "Jupyter hitelesítés", + "Jupyter URL": "Jupyter URL", "JWT Expiration": "JWT lejárat", "JWT Token": "JWT token", - "Kagi Search API Key": "", + "Kagi Search API Key": "Kagi Search API kulcs", "Keep Alive": "Kapcsolat fenntartása", - "Key": "", + "Key": "Kulcs", "Keyboard shortcuts": "Billentyűparancsok", "Knowledge": "Tudásbázis", - "Knowledge Access": "", + "Knowledge Access": "Tudásbázis hozzáférés", "Knowledge created successfully.": "Tudásbázis sikeresen létrehozva.", "Knowledge deleted successfully.": "Tudásbázis sikeresen törölve.", - "Knowledge Public Sharing": "", + "Knowledge Public Sharing": "Tudásbázis nyilvános megosztása", "Knowledge reset successfully.": "Tudásbázis sikeresen visszaállítva.", "Knowledge updated successfully": "Tudásbázis sikeresen frissítve", - "Kokoro.js (Browser)": "", - "Kokoro.js Dtype": "", - "Label": "", + "Kokoro.js (Browser)": "Kokoro.js (Böngésző)", + "Kokoro.js Dtype": "Kokoro.js Dtype", + "Label": "Címke", "Landing Page Mode": "Kezdőlap mód", "Language": "Nyelv", "Last Active": "Utoljára aktív", "Last Modified": "Utoljára módosítva", - "Last reply": "", - "LDAP": "", - "LDAP server updated": "", + "Last reply": "Utolsó válasz", + "LDAP": "LDAP", + "LDAP server updated": "LDAP szerver frissítve", "Leaderboard": "Ranglista", - "Learn more about OpenAPI tool servers.": "", + "Learn more about OpenAPI tool servers.": "Tudj meg többet az OpenAPI eszköszerverekről.", "Leave empty for unlimited": "Hagyja üresen a korlátlan használathoz", - "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "", - "Leave empty to include all models from \"{{url}}/models\" endpoint": "", + "Leave empty to include all models from \"{{url}}/api/tags\" endpoint": "Hagyja üresen, hogy az összes modellt tartalmazza a \"{{url}}/api/tags\" végpontból", + "Leave empty to include all models from \"{{url}}/models\" endpoint": "Hagyja üresen, hogy az összes modellt tartalmazza a \"{{url}}/models\" végpontból", "Leave empty to include all models or select specific models": "Hagyja üresen az összes modell használatához, vagy válasszon ki konkrét modelleket", "Leave empty to use the default prompt, or enter a custom prompt": "Hagyja üresen az alapértelmezett prompt használatához, vagy adjon meg egyéni promptot", - "Leave model field empty to use the default model.": "", - "License": "", + "Leave model field empty to use the default model.": "Hagyja üresen a modell mezőt az alapértelmezett modell használatához.", + "License": "Licenc", "Light": "Világos", "Listening...": "Hallgatás...", - "Llama.cpp": "", + "Llama.cpp": "Llama.cpp", "LLMs can make mistakes. Verify important information.": "Az LLM-ek hibázhatnak. Ellenőrizze a fontos információkat.", - "Loader": "", - "Loading Kokoro.js...": "", - "Local": "", + "Loader": "Betöltő", + "Loading Kokoro.js...": "Kokoro.js betöltése...", + "Local": "Helyi", "Local Models": "Helyi modellek", - "Location access not allowed": "", - "Logit Bias": "", + "Location access not allowed": "Helyhozzáférés nem engedélyezett", + "Logit Bias": "Logit elfogultság", "Lost": "Elveszett", "LTR": "LTR", "Made by Open WebUI Community": "Az OpenWebUI közösség által készítve", "Make sure to enclose them with": "Győződjön meg róla, hogy körülveszi őket", "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 Direct Connections": "", - "Manage Models": "", - "Manage Ollama": "", - "Manage Ollama API Connections": "", - "Manage OpenAI API Connections": "", + "Manage Direct Connections": "Közvetlen kapcsolatok kezelése", + "Manage Models": "Modellek kezelése", + "Manage Ollama": "Ollama kezelése", + "Manage Ollama API Connections": "Ollama API kapcsolatok kezelése", + "Manage OpenAI API Connections": "OpenAI API kapcsolatok kezelése", "Manage Pipelines": "Folyamatok kezelése", - "Manage Tool Servers": "", + "Manage Tool Servers": "Eszközszerverek kezelése", "March": "Március", "Max Tokens (num_predict)": "Maximum tokenek (num_predict)", "Max Upload Count": "Maximum feltöltések száma", @@ -706,68 +706,68 @@ "Mirostat": "Mirostat", "Mirostat Eta": "Mirostat Eta", "Mirostat Tau": "Mirostat Tau", - "Mistral OCR": "", - "Mistral OCR API Key required.": "", + "Mistral OCR": "Mistral OCR", + "Mistral OCR API Key required.": "Mistral OCR API kulcs szükséges.", "Model": "Modell", "Model '{{modelName}}' has been successfully downloaded.": "A '{{modelName}}' modell sikeresen letöltve.", "Model '{{modelTag}}' is already in queue for downloading.": "A '{{modelTag}}' modell már a letöltési sorban van.", "Model {{modelId}} not found": "A {{modelId}} modell nem található", "Model {{modelName}} is not vision capable": "A {{modelName}} modell nem képes képfeldolgozásra", "Model {{name}} is now {{status}}": "A {{name}} modell most {{status}} állapotban van", - "Model {{name}} is now hidden": "", - "Model {{name}} is now visible": "", + "Model {{name}} is now hidden": "A {{name}} modell most elrejtve", + "Model {{name}} is now visible": "A {{name}} modell most látható", "Model accepts image inputs": "A modell elfogad képbemenetet", "Model created successfully!": "Modell sikeresen létrehozva!", "Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modell fájlrendszer útvonal észlelve. A modell rövid neve szükséges a frissítéshez, nem folytatható.", - "Model Filtering": "", + "Model Filtering": "Modellszűrés", "Model ID": "Modell azonosító", - "Model IDs": "", + "Model IDs": "Modell azonosítók", "Model Name": "Modell neve", "Model not selected": "Nincs kiválasztva modell", "Model Params": "Modell paraméterek", - "Model Permissions": "", + "Model Permissions": "Modell engedélyek", "Model updated successfully": "Modell sikeresen frissítve", "Modelfile Content": "Modellfájl tartalom", "Models": "Modellek", - "Models Access": "", - "Models configuration saved successfully": "", - "Models Public Sharing": "", - "Mojeek Search API Key": "", + "Models Access": "Modellek hozzáférése", + "Models configuration saved successfully": "Modellek konfigurációja sikeresen mentve", + "Models Public Sharing": "Modellek nyilvános megosztása", + "Mojeek Search API Key": "Mojeek Search API kulcs", "more": "több", "More": "Több", "Name": "Név", - "Name your knowledge base": "", - "Native": "", + "Name your knowledge base": "Nevezd el a tudásbázisodat", + "Native": "Natív", "New Chat": "Új beszélgetés", - "New Folder": "", + "New Folder": "Új mappa", "New Password": "Új jelszó", - "new-channel": "", + "new-channel": "új csatorna", "No content found": "Nem található tartalom", "No content to speak": "Nincs felolvasható tartalom", "No distance available": "Nincs elérhető távolság", "No feedbacks found": "Nem található visszajelzés", "No file selected": "Nincs kiválasztva fájl", "No files found.": "Nem található fájl.", - "No groups with access, add a group to grant access": "", + "No groups with access, add a group to grant access": "Nincs hozzáféréssel rendelkező csoport, adj hozzá egy csoportot a hozzáférés megadásához", "No HTML, CSS, or JavaScript content found.": "Nem található HTML, CSS vagy JavaScript tartalom.", - "No inference engine with management support found": "", + "No inference engine with management support found": "Nem található kezelést támogató következtetési motor", "No knowledge found": "Nem található tudásbázis", - "No memories to clear": "", - "No model IDs": "", + "No memories to clear": "Nincs törlendő memória", + "No model IDs": "Nincs modell azonosító", "No models found": "Nem található modell", - "No models selected": "", + "No models selected": "Nincs kiválasztott modell", "No results found": "Nincs találat", "No search query generated": "Nem generálódott keresési lekérdezés", "No source available": "Nincs elérhető forrás", - "No users were found.": "", + "No users were found.": "Nem található felhasználó.", "No valves to update": "Nincs frissítendő szelep", "None": "Nincs", "Not factually correct": "Tényszerűen nem helyes", "Not helpful": "Nem segítőkész", "Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Megjegyzés: Ha minimum pontszámot állít be, a keresés csak olyan dokumentumokat ad vissza, amelyek pontszáma nagyobb vagy egyenlő a minimum pontszámmal.", "Notes": "Jegyzetek", - "Notification Sound": "", - "Notification Webhook": "", + "Notification Sound": "Értesítési hang", + "Notification Webhook": "Értesítési webhook", "Notifications": "Értesítések", "November": "November", "num_gpu (Ollama)": "num_gpu (Ollama)", @@ -779,14 +779,14 @@ "OLED Dark": "OLED sötét", "Ollama": "Ollama", "Ollama API": "Ollama API", - "Ollama API settings updated": "", + "Ollama API settings updated": "Ollama API beállítások frissítve", "Ollama Version": "Ollama verzió", "On": "Be", - "OneDrive": "", - "Only alphanumeric characters and hyphens are allowed": "", + "OneDrive": "OneDrive", + "Only alphanumeric characters and hyphens are allowed": "Csak alfanumerikus karakterek és kötőjelek engedélyezettek", "Only alphanumeric characters and hyphens are allowed in the command string.": "Csak alfanumerikus karakterek és kötőjelek engedélyezettek a parancssorban.", "Only collections can be edited, create a new knowledge base to edit/add documents.": "Csak gyűjtemények szerkeszthetők, hozzon létre új tudásbázist dokumentumok szerkesztéséhez/hozzáadásához.", - "Only select users and groups with permission can access": "", + "Only select users and groups with permission can access": "Csak a kiválasztott, engedéllyel rendelkező felhasználók és csoportok férhetnek hozzá", "Oops! Looks like the URL is invalid. Please double-check and try again.": "Hoppá! Úgy tűnik, az URL érvénytelen. Kérjük, ellenőrizze és próbálja újra.", "Oops! There are files still uploading. Please wait for the upload to complete.": "Hoppá! Még vannak feltöltés alatt álló fájlok. Kérjük, várja meg a feltöltés befejezését.", "Oops! There was an error in the previous response.": "Hoppá! Hiba történt az előző válaszban.", @@ -794,38 +794,38 @@ "Open file": "Fájl megnyitása", "Open in full screen": "Megnyitás teljes képernyőn", "Open new chat": "Új beszélgetés megnyitása", - "Open WebUI can use tools provided by any OpenAPI server.": "", + "Open WebUI can use tools provided by any OpenAPI server.": "Az Open WebUI bármely OpenAPI szerver által biztosított eszközöket használhat.", "Open WebUI uses faster-whisper internally.": "Az Open WebUI belsőleg a faster-whispert használja.", - "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "", + "Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Az Open WebUI a SpeechT5-öt és a CMU Arctic hangszóró beágyazásokat használja.", "Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Az Open WebUI verzió (v{{OPEN_WEBUI_VERSION}}) alacsonyabb, mint a szükséges verzió (v{{REQUIRED_VERSION}})", "OpenAI": "OpenAI", "OpenAI API": "OpenAI API", "OpenAI API Config": "OpenAI API konfiguráció", "OpenAI API Key is required.": "OpenAI API kulcs szükséges.", - "OpenAI API settings updated": "", + "OpenAI API settings updated": "OpenAI API beállítások frissítve", "OpenAI URL/Key required.": "OpenAI URL/kulcs szükséges.", - "openapi.json Path": "", + "openapi.json Path": "openapi.json útvonal", "or": "vagy", - "Organize your users": "", + "Organize your users": "Szervezd meg a felhasználóidat", "Other": "Egyéb", "OUTPUT": "KIMENET", "Output format": "Kimeneti formátum", "Overview": "Áttekintés", "page": "oldal", "Password": "Jelszó", - "Paste Large Text as File": "", + "Paste Large Text as File": "Nagy szöveg beillesztése fájlként", "PDF document (.pdf)": "PDF dokumentum (.pdf)", "PDF Extract Images (OCR)": "PDF képek kinyerése (OCR)", "pending": "függőben", "Permission denied when accessing media devices": "Hozzáférés megtagadva a médiaeszközökhöz", "Permission denied when accessing microphone": "Hozzáférés megtagadva a mikrofonhoz", "Permission denied when accessing microphone: {{error}}": "Hozzáférés megtagadva a mikrofonhoz: {{error}}", - "Permissions": "", - "Perplexity API Key": "", + "Permissions": "Engedélyek", + "Perplexity API Key": "Perplexity API kulcs", "Personalization": "Személyre szabás", "Pin": "Rögzítés", "Pinned": "Rögzítve", - "Pioneer insights": "", + "Pioneer insights": "Úttörő betekintések", "Pipeline deleted successfully": "Folyamat sikeresen törölve", "Pipeline downloaded successfully": "Folyamat sikeresen letöltve", "Pipelines": "Folyamatok", @@ -834,46 +834,46 @@ "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 do not close the settings page while loading the model.": "Kérjük, ne zárja be a beállítások oldalt a modell betöltése közben.", "Please enter a prompt": "Kérjük, adjon meg egy promptot", - "Please enter a valid path": "", - "Please enter a valid URL": "", + "Please enter a valid path": "Kérjük, adjon meg egy érvényes útvonalat", + "Please enter a valid URL": "Kérjük, adjon meg egy érvényes URL-t", "Please fill in all fields.": "Kérjük, töltse ki az összes mezőt.", - "Please select a model first.": "", - "Please select a model.": "", + "Please select a model first.": "Kérjük, először válasszon egy modellt.", + "Please select a model.": "Kérjük, válasszon egy modellt.", "Please select a reason": "Kérjük, válasszon egy okot", - "Port": "", + "Port": "Port", "Positive attitude": "Pozitív hozzáállás", - "Prefix ID": "", - "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "", - "Presence Penalty": "", + "Prefix ID": "Előtag azonosító", + "Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "Az előtag azonosító a modell azonosítókhoz hozzáadott előtag segítségével elkerüli az egyéb kapcsolatokkal való ütközéseket - hagyja üresen a letiltáshoz", + "Presence Penalty": "Jelenléti büntetés", "Previous 30 days": "Előző 30 nap", "Previous 7 days": "Előző 7 nap", - "Private": "", + "Private": "Privát", "Profile Image": "Profilkép", - "Prompt": "", + "Prompt": "Prompt", "Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (pl. Mondj egy érdekes tényt a Római Birodalomról)", - "Prompt Autocompletion": "", + "Prompt Autocompletion": "Prompt automatikus kiegészítés", "Prompt Content": "Prompt tartalom", - "Prompt created successfully": "", + "Prompt created successfully": "Prompt sikeresen létrehozva", "Prompt suggestions": "Prompt javaslatok", - "Prompt updated successfully": "", + "Prompt updated successfully": "Prompt sikeresen frissítve", "Prompts": "Promptok", - "Prompts Access": "", - "Prompts Public Sharing": "", - "Public": "", + "Prompts Access": "Promptok hozzáférése", + "Prompts Public Sharing": "Promptok nyilvános megosztása", + "Public": "Nyilvános", "Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" letöltése az Ollama.com-ról", "Pull a model from Ollama.com": "Modell letöltése az Ollama.com-ról", - "Query Generation Prompt": "", + "Query Generation Prompt": "Lekérdezés generálási prompt", "RAG Template": "RAG sablon", "Rating": "Értékelés", "Re-rank models by topic similarity": "Modellek újrarangsorolása téma hasonlóság alapján", - "Read": "", + "Read": "Olvasás", "Read Aloud": "Felolvasás", - "Reasoning Effort": "", + "Reasoning Effort": "Érvelési erőfeszítés", "Record voice": "Hang rögzítése", "Redirecting you to Open WebUI Community": "Átirányítás az OpenWebUI közösséghez", - "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "", + "Reduces the probability of generating nonsense. A higher value (e.g. 100) will give more diverse answers, while a lower value (e.g. 10) will be more conservative.": "Csökkenti a ostobaság generálásának valószínűségét. Magasabb érték (pl. 100) változatosabb válaszokat ad, míg alacsonyabb érték (pl. 10) konzervatívabb lesz.", "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Hivatkozzon magára \"Felhasználó\"-ként (pl. \"A Felhasználó spanyolul tanul\")", "References from": "Hivatkozások innen", "Refused when it shouldn't have": "Elutasítva, amikor nem kellett volna", @@ -883,24 +883,24 @@ "Remove": "Eltávolítás", "Remove Model": "Modell eltávolítása", "Rename": "Átnevezés", - "Reorder Models": "", + "Reorder Models": "Modellek átrendezése", "Repeat Last N": "Utolsó N ismétlése", - "Repeat Penalty (Ollama)": "", - "Reply in Thread": "", + "Repeat Penalty (Ollama)": "Ismétlési büntetés (Ollama)", + "Reply in Thread": "Válasz szálban", "Request Mode": "Kérési mód", "Reranking Model": "Újrarangsoroló modell", "Reranking model disabled": "Újrarangsoroló modell letiltva", "Reranking model set to \"{{reranking_model}}\"": "Újrarangsoroló modell beállítva erre: \"{{reranking_model}}\"", "Reset": "Visszaállítás", - "Reset All Models": "", + "Reset All Models": "Minden modell visszaállítása", "Reset Upload Directory": "Feltöltési könyvtár visszaállítása", "Reset Vector Storage/Knowledge": "Vektor tárhely/tudásbázis visszaállítása", - "Reset view": "", + "Reset view": "Nézet visszaállítása", "Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "A válasz értesítések nem aktiválhatók, mert a weboldal engedélyei meg lettek tagadva. Kérjük, látogasson el a böngésző beállításaihoz a szükséges hozzáférés megadásához.", "Response splitting": "Válasz felosztás", "Result": "Eredmény", - "Retrieval": "", - "Retrieval Query Generation": "", + "Retrieval": "Visszakeresés", + "Retrieval Query Generation": "Visszakeresési lekérdezés generálása", "Rich Text Input for Chat": "Formázott szövegbevitel a chathez", "RK": "RK", "Role": "Szerep", @@ -919,22 +919,22 @@ "Scroll to bottom when switching between branches": "Görgetés az aljára ágak közötti váltáskor", "Search": "Keresés", "Search a model": "Modell keresése", - "Search Base": "", + "Search Base": "Keresési alap", "Search Chats": "Beszélgetések keresése", "Search Collection": "Gyűjtemény keresése", - "Search Filters": "", + "Search Filters": "Keresési szűrők", "search for tags": "címkék keresése", "Search Functions": "Funkciók keresése", "Search Knowledge": "Tudásbázis keresése", "Search Models": "Modellek keresése", - "Search options": "", + "Search options": "Keresési opciók", "Search Prompts": "Promptok keresése", "Search Result Count": "Keresési találatok száma", - "Search the internet": "", + "Search the internet": "Keresés az interneten", "Search Tools": "Eszközök keresése", "SearchApi API Key": "SearchApi API kulcs", "SearchApi Engine": "SearchApi motor", - "Searched {{count}} sites": "", + "Searched {{count}} sites": "{{count}} oldal keresése megtörtént", "Searching \"{{searchQuery}}\"": "Keresés: \"{{searchQuery}}\"", "Searching Knowledge for \"{{searchQuery}}\"": "Tudásbázis keresése: \"{{searchQuery}}\"", "Searxng Query URL": "Searxng lekérdezési URL", @@ -944,13 +944,13 @@ "Select a base model": "Válasszon egy alapmodellt", "Select a engine": "Válasszon egy motort", "Select a function": "Válasszon egy funkciót", - "Select a group": "", + "Select a group": "Válasszon egy csoportot", "Select a model": "Válasszon egy modellt", "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 an auth method": "Válasszon egy hitelesítési módszert", + "Select an Ollama instance": "Válasszon egy Ollama példányt", "Select Engine": "Motor kiválasztása", "Select Knowledge": "Tudásbázis kiválasztása", "Select only one model to call": "Csak egy modellt válasszon ki hívásra", @@ -961,8 +961,8 @@ "Send message": "Üzenet küldése", "Sends `stream_options: { include_usage: true }` in the request.\nSupported providers will return token usage information in the response when set.": "A kérésben elküldi a `stream_options: { include_usage: true }` opciót.\nA támogatott szolgáltatók token használati információt küldenek vissza a válaszban, ha be van állítva.", "September": "Szeptember", - "SerpApi API Key": "", - "SerpApi Engine": "", + "SerpApi API Key": "SerpApi API kulcs", + "SerpApi Engine": "SerpApi motor", "Serper API Key": "Serper API kulcs", "Serply API Key": "Serply API kulcs", "Serpstack API Key": "Serpstack API kulcs", @@ -970,7 +970,7 @@ "Set as default": "Beállítás alapértelmezettként", "Set CFG Scale": "CFG skála beállítása", "Set Default Model": "Alapértelmezett modell beállítása", - "Set embedding model": "", + "Set embedding model": "Beágyazási modell beállítása", "Set embedding model (e.g. {{model}})": "Beágyazási modell beállítása (pl. {{model}})", "Set Image Size": "Képméret beállítása", "Set reranking model (e.g. {{model}})": "Újrarangsoroló modell beállítása (pl. {{model}})", @@ -978,37 +978,37 @@ "Set Scheduler": "Ütemező beállítása", "Set Steps": "Lépések beállítása", "Set Task Model": "Feladat modell beállítása", - "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "", - "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "", + "Set the number of layers, which will be off-loaded to GPU. Increasing this value can significantly improve performance for models that are optimized for GPU acceleration but may also consume more power and GPU resources.": "Állítsd be a GPU-ra áthelyezett rétegek számát. Ezen érték növelése jelentősen javíthatja a GPU-ra optimalizált modellek teljesítményét, de több energiát és GPU erőforrást is fogyaszthat.", + "Set the number of worker threads used for computation. This option controls how many threads are used to process incoming requests concurrently. Increasing this value can improve performance under high concurrency workloads but may also consume more CPU resources.": "Állítsd be a számítási feladatokhoz használt munkaszálak számát. Ez az opció szabályozza, hány szál dolgozik párhuzamosan a bejövő kérések feldolgozásán. Az érték növelése javíthatja a teljesítményt nagy párhuzamosságú munkaterhelés esetén, de több CPU-erőforrást is fogyaszthat.", "Set Voice": "Hang beállítása", "Set whisper model": "Whisper modell beállítása", - "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "", - "Sets how far back for the model to look back to prevent repetition.": "", - "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "", - "Sets the size of the context window used to generate the next token.": "", - "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "", + "Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Egységes elfogultságot állít be az egyszer már megjelent tokenek ellen. Magasabb érték (pl. 1,5) erősebben bünteti az ismétléseket, alacsonyabb érték (pl. 0,9) engedékenyebb. 0-nál kikapcsolva.", + "Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "Skálázott elfogultságot állít be az ismétlések büntetésére a tokenek megjelenési száma alapján. Magasabb érték (pl. 1,5) erősebben bünteti az ismétléseket, alacsonyabb érték (pl. 0,9) engedékenyebb. 0-nál kikapcsolva.", + "Sets how far back for the model to look back to prevent repetition.": "Beállítja, hogy a modell mennyire nézzen vissza az ismétlések elkerülése érdekében.", + "Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "Beállítja a generáláshoz használt véletlenszám seed-et. Egy adott szám megadása esetén a modell ugyanazt a szöveget generálja ugyanarra a prompt-ra.", + "Sets the size of the context window used to generate the next token.": "Beállítja a következő token generálásához használt kontextusablak méretét.", + "Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "Beállítja a használandó leállítási szekvenciákat. Ha ezt a mintát észleli, az LLM leállítja a szöveg generálását és visszatér. Több leállítási minta is megadható különálló stop paraméterek megadásával egy modellfájlban.", "Settings": "Beállítások", "Settings saved successfully!": "Beállítások sikeresen mentve!", "Share": "Megosztás", "Share Chat": "Beszélgetés megosztása", "Share to Open WebUI Community": "Megosztás az OpenWebUI közösséggel", - "Sharing Permissions": "", + "Sharing Permissions": "Megosztási engedélyek", "Show": "Mutat", - "Show \"What's New\" modal on login": "", + "Show \"What's New\" modal on login": "\"Mi újság\" modal megjelenítése bejelentkezéskor", "Show Admin Details in Account Pending Overlay": "Admin részletek megjelenítése a függő fiók átfedésben", - "Show Model": "", + "Show Model": "Modell megjelenítése", "Show shortcuts": "Gyorsbillentyűk megjelenítése", "Show your support!": "Mutassa meg támogatását!", "Showcased creativity": "Kreativitás bemutatva", "Sign in": "Bejelentkezés", "Sign in to {{WEBUI_NAME}}": "Bejelentkezés ide: {{WEBUI_NAME}}", - "Sign in to {{WEBUI_NAME}} with LDAP": "", + "Sign in to {{WEBUI_NAME}} with LDAP": "Bejelentkezés ide: {{WEBUI_NAME}} LDAP-val", "Sign Out": "Kijelentkezés", "Sign up": "Regisztráció", "Sign up to {{WEBUI_NAME}}": "Regisztráció ide: {{WEBUI_NAME}}", "Signing in to {{WEBUI_NAME}}": "Bejelentkezés ide: {{WEBUI_NAME}}", - "sk-1234": "", + "sk-1234": "sk-1234", "Source": "Forrás", "Speech Playback Speed": "Beszéd lejátszási sebesség", "Speech recognition error: {{error}}": "Beszédfelismerési hiba: {{error}}", @@ -1028,70 +1028,70 @@ "System": "Rendszer", "System Instructions": "Rendszer utasítások", "System Prompt": "Rendszer prompt", - "Tags": "", - "Tags Generation": "", + "Tags": "Címkék", + "Tags Generation": "Címke generálás", "Tags Generation Prompt": "Címke generálási prompt", - "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "", - "Talk to model": "", + "Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "A farok nélküli mintavétel csökkenti a kevésbé valószínű tokenek hatását a kimeneten. Magasabb érték (pl. 2,0) jobban csökkenti a hatást, míg az 1,0 érték kikapcsolja ezt a beállítást.", + "Talk to model": "Beszélj a modellel", "Tap to interrupt": "Koppintson a megszakításhoz", - "Tasks": "", + "Tasks": "Feladatok", "Tavily API Key": "Tavily API kulcs", "Tell us more:": "Mondjon többet:", "Temperature": "Hőmérséklet", "Template": "Sablon", - "Temporary Chat": "Ideiglenes chat", + "Temporary Chat": "Ideiglenes csevegés", "Text Splitter": "Szöveg felosztó", "Text-to-Speech Engine": "Szöveg-beszéd motor", "Tfs Z": "Tfs Z", "Thanks for your feedback!": "Köszönjük a visszajelzést!", - "The Application Account DN you bind with for search": "", - "The base to search for users": "", - "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "", + "The Application Account DN you bind with for search": "Az alkalmazás fiók DN, amellyel kereséshez kötsz", + "The base to search for users": "A felhasználók keresésének alapja", + "The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "A köteg méret meghatározza, hány szöveges kérést dolgoz fel egyszerre. Magasabb köteg méret növelheti a modell teljesítményét és sebességét, de több memóriát is igényel.", "The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "A bővítmény fejlesztői lelkes önkéntesek a közösségből. Ha hasznosnak találja ezt a bővítményt, kérjük, fontolja meg a fejlesztéséhez való hozzájárulást.", "The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "Az értékelési ranglista az Elo értékelési rendszeren alapul és valós időben frissül.", - "The LDAP attribute that maps to the mail that users use to sign in.": "", - "The LDAP attribute that maps to the username that users use to sign in.": "", + "The LDAP attribute that maps to the mail that users use to sign in.": "Az LDAP attribútum, amely a felhasználók bejelentkezéshez használt emailjéhez kapcsolódik.", + "The LDAP attribute that maps to the username that users use to sign in.": "Az LDAP attribútum, amely a felhasználók bejelentkezéshez használt felhasználónevéhez kapcsolódik.", "The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "A ranglista jelenleg béta verzióban van, és az algoritmus finomítása során módosíthatjuk az értékelési számításokat.", "The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "A maximális fájlméret MB-ban. Ha a fájlméret meghaladja ezt a limitet, a fájl nem lesz feltöltve.", - "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "A chatben egyszerre használható fájlok maximális száma. Ha a fájlok száma meghaladja ezt a limitet, a fájlok nem lesznek feltöltve.", + "The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "A csevegésben egyszerre használható fájlok maximális száma. Ha a fájlok száma meghaladja ezt a limitet, a fájlok nem lesznek feltöltve.", "The score should be a value between 0.0 (0%) and 1.0 (100%).": "A pontszámnak 0,0 (0%) és 1,0 (100%) közötti értéknek kell lennie.", - "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "", + "The temperature of the model. Increasing the temperature will make the model answer more creatively.": "A modell hőmérséklete. A hőmérséklet növelése kreatívabb válaszokat eredményez a modelltől.", "Theme": "Téma", "Thinking...": "Gondolkodik...", "This action cannot be undone. Do you wish to continue?": "Ez a művelet nem vonható vissza. Szeretné folytatni?", - "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "", - "This chat won’t appear in history and your messages will not be saved.": "", + "This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Ez a csatorna {{createdAt}} időpontban jött létre. Ez a {{channelName}} csatorna legeslegeleje.", + "This chat won’t appear in history and your messages will not be saved.": "Ez a csevegés nem jelenik meg az előzményekben, és az üzeneteid nem kerülnek mentésre.", "This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ez biztosítja, hogy értékes beszélgetései biztonságosan mentésre kerüljenek a backend adatbázisban. Köszönjük!", "This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ez egy kísérleti funkció, lehet, hogy nem a várt módon működik és bármikor változhat.", - "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "", - "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "", + "This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Ez az opció szabályozza, hány token marad meg a kontextus frissítésekor. Például, ha 2-re van állítva, a beszélgetés kontextusának utolsó 2 tokenje megmarad. A kontextus megőrzése segíthet a beszélgetés folytonosságának fenntartásában, de csökkentheti az új témákra való reagálás képességét.", + "This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "Ez az opció beállítja a modell által generálható tokenek maximális számát a válaszban. Ezen limit növelése hosszabb válaszokat tesz lehetővé, de növelheti a nem hasznos vagy irreleváns tartalom generálásának valószínűségét.", "This option will delete all existing files in the collection and replace them with newly uploaded files.": "Ez az opció törli az összes meglévő fájlt a gyűjteményben és lecseréli őket az újonnan feltöltött fájlokkal.", "This response was generated by \"{{model}}\"": "Ezt a választ a \"{{model}}\" generálta", "This will delete": "Ez törölni fogja", "This will delete {{NAME}} and all its contents.": "Ez törölni fogja a {{NAME}}-t és minden tartalmát.", - "This will delete all models including custom models": "", - "This will delete all models including custom models and cannot be undone.": "", + "This will delete all models including custom models": "Ez törölni fogja az összes modellt, beleértve az egyéni modelleket is", + "This will delete all models including custom models and cannot be undone.": "Ez törölni fogja az összes modellt, beleértve az egyéni modelleket is, és nem vonható vissza.", "This will reset the knowledge base and sync all files. Do you wish to continue?": "Ez visszaállítja a tudásbázist és szinkronizálja az összes fájlt. Szeretné folytatni?", "Thorough explanation": "Alapos magyarázat", - "Thought for {{DURATION}}": "", - "Thought for {{DURATION}} seconds": "", + "Thought for {{DURATION}}": "Gondolkodott {{DURATION}} ideig", + "Thought for {{DURATION}} seconds": "Gondolkodott {{DURATION}} másodpercig", "Tika": "Tika", "Tika Server URL required.": "Tika szerver URL szükséges.", "Tiktoken": "Tiktoken", - "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Frissítsen több változó helyet egymás után a tab billentyű megnyomásával a chat bevitelben minden helyettesítés után.", + "Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Frissítsen több változó helyet egymás után a tab billentyű megnyomásával a csevegő bevitelben minden helyettesítés után.", "Title": "Cím", "Title (e.g. Tell me a fun fact)": "Cím (pl. Mondj egy érdekes tényt)", "Title Auto-Generation": "Cím automatikus generálása", "Title cannot be an empty string.": "A cím nem lehet üres karakterlánc.", - "Title Generation": "", + "Title Generation": "Cím generálás", "Title Generation Prompt": "Cím generálási prompt", - "TLS": "", + "TLS": "TLS", "To access the available model names for downloading,": "A letölthető modellek nevének eléréséhez,", "To access the GGUF models available for downloading,": "A letölthető GGUF modellek eléréséhez,", "To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "A WebUI eléréséhez kérjük, forduljon az adminisztrátorhoz. Az adminisztrátorok az Admin Panelen keresztül kezelhetik a felhasználói státuszokat.", "To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "A tudásbázis csatolásához először adja hozzá őket a \"Knowledge\" munkaterülethez.", - "To learn more about available endpoints, visit our documentation.": "", - "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Adatai védelme érdekében a visszajelzésből csak az értékelések, modell azonosítók, címkék és metaadatok kerülnek megosztásra - a chat előzményei privátak maradnak és nem kerülnek megosztásra.", + "To learn more about available endpoints, visit our documentation.": "Az elérhető végpontokról további információért látogassa meg dokumentációnkat.", + "To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Adatai védelme érdekében a visszajelzésből csak az értékelések, modell azonosítók, címkék és metaadatok kerülnek megosztásra - a csevegési előzményei privátak maradnak és nem kerülnek megosztásra.", "To select actions here, add them to the \"Functions\" workspace first.": "A műveletek kiválasztásához először adja hozzá őket a \"Functions\" munkaterülethez.", "To select filters here, add them to the \"Functions\" workspace first.": "A szűrők kiválasztásához először adja hozzá őket a \"Functions\" munkaterülethez.", "To select toolkits here, add them to the \"Tools\" workspace first.": "Az eszközkészletek kiválasztásához először adja hozzá őket a \"Tools\" munkaterülethez.", @@ -1104,38 +1104,38 @@ "Too verbose": "Túl bőbeszédű", "Tool created successfully": "Eszköz sikeresen létrehozva", "Tool deleted successfully": "Eszköz sikeresen törölve", - "Tool Description": "", - "Tool ID": "", + "Tool Description": "Eszköz leírása", + "Tool ID": "Eszköz azonosító", "Tool imported successfully": "Eszköz sikeresen importálva", - "Tool Name": "", - "Tool Servers": "", + "Tool Name": "Eszköz neve", + "Tool Servers": "Eszközszerverek", "Tool updated successfully": "Eszköz sikeresen frissítve", "Tools": "Eszközök", - "Tools Access": "", + "Tools Access": "Eszközök hozzáférése", "Tools are a function calling system with arbitrary code execution": "Az eszközök olyan függvényhívó rendszert alkotnak, amely tetszőleges kód végrehajtását teszi lehetővé", - "Tools Function Calling Prompt": "", + "Tools Function Calling Prompt": "Eszközök függvényhívási promptja", "Tools have a function calling system that allows arbitrary code execution": "Az eszközök olyan függvényhívó rendszerrel rendelkeznek, amely lehetővé teszi tetszőleges kód végrehajtását", "Tools have a function calling system that allows arbitrary code execution.": "Az eszközök olyan függvényhívó rendszerrel rendelkeznek, amely lehetővé teszi tetszőleges kód végrehajtását.", - "Tools Public Sharing": "", + "Tools Public Sharing": "Eszközök nyilvános megosztása", "Top K": "Top K", - "Top K Reranker": "", + "Top K Reranker": "Top K újrarangsoroló", "Top P": "Top P", - "Transformers": "", + "Transformers": "Transformerek", "Trouble accessing Ollama?": "Problémája van az Ollama elérésével?", - "Trust Proxy Environment": "", + "Trust Proxy Environment": "Proxy környezet megbízhatósága", "TTS Model": "TTS modell", "TTS Settings": "TTS beállítások", "TTS Voice": "TTS hang", "Type": "Típus", "Type Hugging Face Resolve (Download) URL": "Adja meg a Hugging Face Resolve (Letöltési) URL-t", - "Uh-oh! There was an issue with the response.": "", + "Uh-oh! There was an issue with the response.": "Jaj! Probléma adódott a válasszal.", "UI": "Felhasználói felület", - "Unarchive All": "", - "Unarchive All Archived Chats": "", - "Unarchive Chat": "", - "Unlock mysteries": "", + "Unarchive All": "Minden visszaállítása", + "Unarchive All Archived Chats": "Minden archivált csevegés visszaállítása", + "Unarchive Chat": "Csevegés visszaállítása", + "Unlock mysteries": "Titkok feloldása", "Unpin": "Rögzítés feloldása", - "Unravel secrets": "", + "Unravel secrets": "Titkok megfejtése", "Untagged": "Címkézetlen", "Update": "Frissítés", "Update and Copy Link": "Frissítés és link másolása", @@ -1144,27 +1144,27 @@ "Updated": "Frissítve", "Updated at": "Frissítve ekkor", "Updated At": "Frissítve ekkor", - "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "", + "Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Frissítsen licencelt csomagra a bővített képességekért, beleértve az egyéni témázást és márkázást, valamint dedikált támogatást.", "Upload": "Feltöltés", "Upload a GGUF model": "GGUF modell feltöltése", "Upload directory": "Könyvtár feltöltése", "Upload files": "Fájlok feltöltése", "Upload Files": "Fájlok feltöltése", - "Upload Pipeline": "Pipeline feltöltése", + "Upload Pipeline": "Folyamat feltöltése", "Upload Progress": "Feltöltési folyamat", - "URL": "", + "URL": "URL", "URL Mode": "URL mód", "Use '#' in the prompt input to load and include your knowledge.": "Használja a '#' karaktert a prompt bevitelénél a tudásbázis betöltéséhez és felhasználásához.", "Use Gravatar": "Gravatar használata", - "Use groups to group your users and assign permissions.": "", + "Use groups to group your users and assign permissions.": "Használj csoportokat a felhasználók csoportosításához és engedélyek hozzárendeléséhez.", "Use Initials": "Monogram használata", "use_mlock (Ollama)": "use_mlock (Ollama)", "use_mmap (Ollama)": "use_mmap (Ollama)", "user": "felhasználó", "User": "Felhasználó", "User location successfully retrieved.": "Felhasználó helye sikeresen lekérve.", - "User Webhooks": "", - "Username": "", + "User Webhooks": "Felhasználói webhookok", + "Username": "Felhasználónév", "Users": "Felhasználók", "Using the default arena model with all models. Click the plus button to add custom models.": "Az alapértelmezett aréna modell használata az összes modellel. Kattintson a plusz gombra egyéni modellek hozzáadásához.", "Utilize": "Használat", @@ -1174,56 +1174,56 @@ "Valves updated successfully": "Szelepek sikeresen frissítve", "variable": "változó", "variable to have them replaced with clipboard content.": "változó, hogy a vágólap tartalmával helyettesítse őket.", - "Verify Connection": "", + "Verify Connection": "Kapcsolat ellenőrzése", "Version": "Verzió", "Version {{selectedVersion}} of {{totalVersions}}": "{{selectedVersion}}. verzió a {{totalVersions}}-ból", - "View Replies": "", - "View Result from **{{NAME}}**": "", - "Visibility": "", + "View Replies": "Válaszok megtekintése", + "View Result from **{{NAME}}**": "Eredmény megtekintése innen: **{{NAME}}**", + "Visibility": "Láthatóság", "Voice": "Hang", "Voice Input": "Hangbevitel", "Warning": "Figyelmeztetés", "Warning:": "Figyelmeztetés:", - "Warning: Enabling this will allow users to upload arbitrary code on the server.": "", + "Warning: Enabling this will allow users to upload arbitrary code on the server.": "Figyelmeztetés: Ennek engedélyezése lehetővé teszi a felhasználók számára, hogy tetszőleges kódot töltsenek fel a szerverre.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Figyelmeztetés: Ha frissíti vagy megváltoztatja a beágyazási modellt, minden dokumentumot újra kell importálnia.", - "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "", + "Warning: Jupyter execution enables arbitrary code execution, posing severe security risks—proceed with extreme caution.": "Figyelmeztetés: A Jupyter végrehajtás lehetővé teszi a tetszőleges kód végrehajtását, ami súlyos biztonsági kockázatot jelent – óvatosan folytassa.", "Web": "Web", "Web API": "Web API", "Web Search": "Webes keresés", "Web Search Engine": "Webes keresőmotor", - "Web Search in Chat": "", - "Web Search Query Generation": "", + "Web Search in Chat": "Webes keresés a csevegésben", + "Web Search Query Generation": "Webes keresési lekérdezés generálása", "Webhook URL": "Webhook URL", "WebUI Settings": "WebUI beállítások", - "WebUI URL": "", - "WebUI will make requests to \"{{url}}\"": "", - "WebUI will make requests to \"{{url}}/api/chat\"": "", - "WebUI will make requests to \"{{url}}/chat/completions\"": "", - "What are you trying to achieve?": "", - "What are you working on?": "", - "What’s New in": "", - "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "", - "wherever you are": "", + "WebUI URL": "WebUI URL", + "WebUI will make requests to \"{{url}}\"": "A WebUI kéréseket küld a \"{{url}}\" címre", + "WebUI will make requests to \"{{url}}/api/chat\"": "A WebUI kéréseket küld a \"{{url}}/api/chat\" címre", + "WebUI will make requests to \"{{url}}/chat/completions\"": "A WebUI kéréseket küld a \"{{url}}/chat/completions\" címre", + "What are you trying to achieve?": "Mit próbálsz elérni?", + "What are you working on?": "Min dolgozol?", + "What’s New in": "Mi újság a", + "When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "Ha engedélyezve van, a modell valós időben válaszol minden csevegőüzenetre, amint a felhasználó elküldi az üzenetet. Ez a mód hasznos élő csevegőalkalmazásokhoz, de lassabb hardveren befolyásolhatja a teljesítményt.", + "wherever you are": "bárhol is vagy", "Whisper (Local)": "Whisper (helyi)", - "Why?": "", + "Why?": "Miért?", "Widescreen Mode": "Szélesvásznú mód", "Won": "Nyert", - "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "", + "Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "A top-k-val együtt működik. Magasabb érték (pl. 0,95) változatosabb szöveget eredményez, alacsonyabb érték (pl. 0,5) fókuszáltabb és konzervatívabb szöveget generál.", "Workspace": "Munkaterület", - "Workspace Permissions": "", - "Write": "", + "Workspace Permissions": "Munkaterület engedélyek", + "Write": "Írás", "Write a prompt suggestion (e.g. Who are you?)": "Írjon egy prompt javaslatot (pl. Ki vagy te?)", "Write a summary in 50 words that summarizes [topic or keyword].": "Írjon egy 50 szavas összefoglalót a [téma vagy kulcsszó]-ról.", "Write something...": "Írjon valamit...", - "Write your model template content here": "", + "Write your model template content here": "Írja ide a modell sablon tartalmát", "Yesterday": "Tegnap", "You": "Ön", - "You are currently using a trial license. Please contact support to upgrade your license.": "", + "You are currently using a trial license. Please contact support to upgrade your license.": "Jelenleg próbaverziós licencet használ. Kérjük, lépjen kapcsolatba a támogatással a licenc frissítéséhez.", "You can only chat with a maximum of {{maxCount}} file(s) at a time.": "Egyszerre maximum {{maxCount}} fájllal tud csevegni.", "You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Az LLM-ekkel való interakcióit személyre szabhatja emlékek hozzáadásával a lenti 'Kezelés' gomb segítségével, így azok még hasznosabbak és személyre szabottabbak lesznek.", "You cannot upload an empty file.": "Nem tölthet fel üres fájlt.", - "You do not have permission to upload files": "", - "You do not have permission to upload files.": "", + "You do not have permission to upload files": "Nincs jogosultsága fájlok feltöltésére", + "You do not have permission to upload files.": "Nincs jogosultsága fájlok feltöltésére.", "You have no archived conversations.": "Nincsenek archivált beszélgetései.", "You have shared this chat": "Megosztotta ezt a beszélgetést", "You're a helpful assistant.": "Ön egy segítőkész asszisztens.", @@ -1231,6 +1231,6 @@ "Your account status is currently pending activation.": "Fiókja jelenleg aktiválásra vár.", "Your entire contribution will go directly to the plugin developer; Open WebUI does not take any percentage. However, the chosen funding platform might have its own fees.": "A teljes hozzájárulása közvetlenül a bővítmény fejlesztőjéhez kerül; az Open WebUI nem vesz le százalékot. Azonban a választott támogatási platformnak lehetnek saját díjai.", "Youtube": "YouTube", - "Youtube Language": "", - "Youtube Proxy URL": "" + "Youtube Language": "YouTube nyelv", + "Youtube Proxy URL": "YouTube proxy URL" } From bc295546cd1eba97c35a940ce12332d037b68890 Mon Sep 17 00:00:00 2001 From: lucy <154630366+lucyknada@users.noreply.github.com> Date: Thu, 10 Apr 2025 07:23:34 +0200 Subject: [PATCH 061/126] fix #12678 --- backend/open_webui/retrieval/loaders/youtube.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/open_webui/retrieval/loaders/youtube.py b/backend/open_webui/retrieval/loaders/youtube.py index 8eb48488b..f59dd7df5 100644 --- a/backend/open_webui/retrieval/loaders/youtube.py +++ b/backend/open_webui/retrieval/loaders/youtube.py @@ -110,7 +110,7 @@ class YoutubeLoader: transcript = " ".join( map( - lambda transcript_piece: transcript_piece["text"].strip(" "), + lambda transcript_piece: transcript_piece.text.strip(" "), transcript_pieces, ) ) From 3e2a6df1fb016a7084cc69fc0adea69671243da2 Mon Sep 17 00:00:00 2001 From: Youggls Date: Thu, 10 Apr 2025 14:51:44 +0800 Subject: [PATCH 062/126] feat: Add sougou web search API for backend, add config panel in for frontend. --- backend/open_webui/config.py | 12 +++++ backend/open_webui/main.py | 4 ++ backend/open_webui/retrieval/web/sougou.py | 48 +++++++++++++++++++ backend/open_webui/routers/retrieval.py | 25 ++++++++++ backend/requirements.txt | 3 ++ pyproject.toml | 2 + .../admin/Settings/WebSearch.svelte | 28 ++++++++++- src/lib/i18n/locales/en-US/translation.json | 4 ++ src/lib/i18n/locales/zh-CN/translation.json | 4 ++ 9 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 backend/open_webui/retrieval/web/sougou.py diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index bdd6ec874..77e4a763f 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2142,6 +2142,18 @@ PERPLEXITY_API_KEY = PersistentConfig( os.getenv("PERPLEXITY_API_KEY", ""), ) +SOUGOU_API_SID = PersistentConfig( + "SOUGOU_API_SID", + "rag.web.search.sougou_api_sid", + os.getenv("SOUGOU_API_SID", ""), +) + +SOUGOU_API_SK = PersistentConfig( + "SOUGOU_API_SK", + "rag.web.search.sougou_api_sk", + os.getenv("SOUGOU_API_SK", ""), +) + RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig( "RAG_WEB_SEARCH_RESULT_COUNT", "rag.web.search.result_count", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index cc58d5b02..7e36ff173 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -225,6 +225,8 @@ from open_webui.config import ( BRAVE_SEARCH_API_KEY, EXA_API_KEY, PERPLEXITY_API_KEY, + SOUGOU_API_SID, + SOUGOU_API_SK, KAGI_SEARCH_API_KEY, MOJEEK_SEARCH_API_KEY, BOCHA_SEARCH_API_KEY, @@ -652,6 +654,8 @@ app.state.config.BING_SEARCH_V7_ENDPOINT = BING_SEARCH_V7_ENDPOINT app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY app.state.config.EXA_API_KEY = EXA_API_KEY app.state.config.PERPLEXITY_API_KEY = PERPLEXITY_API_KEY +app.state.config.SOUGOU_API_SID = SOUGOU_API_SID +app.state.config.SOUGOU_API_SK = SOUGOU_API_SK app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS diff --git a/backend/open_webui/retrieval/web/sougou.py b/backend/open_webui/retrieval/web/sougou.py new file mode 100644 index 000000000..a0726372c --- /dev/null +++ b/backend/open_webui/retrieval/web/sougou.py @@ -0,0 +1,48 @@ +import logging +import json +from typing import Optional, List + +from tencentcloud.common.common_client import CommonClient +from tencentcloud.common import credential +from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException +from tencentcloud.common.profile.client_profile import ClientProfile +from tencentcloud.common.profile.http_profile import HttpProfile + +from open_webui.retrieval.web.main import SearchResult, get_filtered_results +from open_webui.env import SRC_LOG_LEVELS + +log = logging.getLogger(__name__) +log.setLevel(SRC_LOG_LEVELS["RAG"]) + + +def search_sougou( + sougou_api_sid: str, + sougou_api_sk: str, + query: str, + count: int, + filter_list: Optional[List[str]] = None, +) -> List[SearchResult]: + try: + cred = credential.Credential(sougou_api_sid, sougou_api_sk) + http_profile = HttpProfile() + http_profile.endpoint = "tms.tencentcloudapi.com" + client_profile = ClientProfile() + client_profile.http_profile = http_profile + params = json.dumps({"Query": query, 'Cnt': 20}) + common_client = CommonClient("tms", "2020-12-29", cred, "", profile=client_profile) + results = [ + json.loads(page) for page in common_client.call_json("SearchPro", json.loads(params))["Response"]["Pages"] + ] + sorted_results = sorted(results, key=lambda x: x.get("scour", 0.0), reverse=True) + if filter_list: + sorted_results = get_filtered_results(sorted_results, filter_list) + + return [ + SearchResult( + link=result.get("url"), title=result.get("title"), snippet=result.get("passage") + ) + for result in sorted_results[:count] + ] + except TencentCloudSDKException as err: + log.error(f"Error in Sougou search: {err}") + return [] diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index f31abd9ff..8e1708c65 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -60,6 +60,7 @@ from open_webui.retrieval.web.tavily import search_tavily from open_webui.retrieval.web.bing import search_bing from open_webui.retrieval.web.exa import search_exa from open_webui.retrieval.web.perplexity import search_perplexity +from open_webui.retrieval.web.sougou import search_sougou from open_webui.retrieval.utils import ( get_embedding_function, @@ -411,6 +412,8 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, "exa_api_key": request.app.state.config.EXA_API_KEY, "perplexity_api_key": request.app.state.config.PERPLEXITY_API_KEY, + "sougou_api_sid": request.app.state.config.SOUGOU_API_SID, + "sougou_api_sk": request.app.state.config.SOUGOU_API_SK, "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, @@ -478,6 +481,8 @@ class WebSearchConfig(BaseModel): bing_search_v7_subscription_key: Optional[str] = None exa_api_key: Optional[str] = None perplexity_api_key: Optional[str] = None + sougou_api_sid: Optional[str] = None + sougou_api_sk: Optional[str] = None result_count: Optional[int] = None concurrent_requests: Optional[int] = None trust_env: Optional[bool] = None @@ -640,6 +645,12 @@ async def update_rag_config( request.app.state.config.PERPLEXITY_API_KEY = ( form_data.web.search.perplexity_api_key ) + request.app.state.config.SOUGOU_API_SID = ( + form_data.web.search.sougou_api_sid + ) + request.app.state.config.SOUGOU_API_SK = ( + form_data.web.search.sougou_api_sk + ) request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = ( form_data.web.search.result_count @@ -712,6 +723,8 @@ async def update_rag_config( "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, "exa_api_key": request.app.state.config.EXA_API_KEY, "perplexity_api_key": request.app.state.config.PERPLEXITY_API_KEY, + "sougou_api_sid": request.app.state.config.SOUGOU_API_SID, + "sougou_api_sk": request.app.state.config.SOUGOU_API_SK, "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, @@ -1267,6 +1280,7 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: - TAVILY_API_KEY - EXA_API_KEY - PERPLEXITY_API_KEY + - SOUGOU_API_SID + SOUGOU_API_SK - SEARCHAPI_API_KEY + SEARCHAPI_ENGINE (by default `google`) - SERPAPI_API_KEY + SERPAPI_ENGINE (by default `google`) Args: @@ -1438,6 +1452,17 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, ) + elif engine == 'sougou': + if request.app.state.config.SOUGOU_API_SID and request.app.state.config.SOUGOU_API_SK: + return search_sougou( + request.app.state.config.SOUGOU_API_SID, + request.app.state.config.SOUGOU_API_SK, + query, + request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, + request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + ) + else: + raise Exception("No SOUGOU_API_SID or SOUGOU_API_SK found in environment variables") else: raise Exception("No search engine API key found in environment variables") diff --git a/backend/requirements.txt b/backend/requirements.txt index ad490d00a..670c363ee 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -123,6 +123,9 @@ ldap3==2.9.1 ## Firecrawl firecrawl-py==1.12.0 +# Sougou API SDK(Tencentcloud SDK) +tencentcloud-sdk-python==3.0.1336 + ## Trace opentelemetry-api==1.31.1 opentelemetry-sdk==1.31.1 diff --git a/pyproject.toml b/pyproject.toml index 18e833290..98c072df5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -125,6 +125,8 @@ dependencies = [ "firecrawl-py==1.12.0", + "tencentcloud-sdk-python==3.0.1336", + "gcp-storage-emulator>=2024.8.3", ] readme = "README.md" diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index 5e27274e0..82e61bdc3 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -30,7 +30,8 @@ 'jina', 'bing', 'exa', - 'perplexity' + 'perplexity', + 'sougou' ]; let youtubeLanguage = 'en'; @@ -404,6 +405,31 @@ />
+ {:else if webConfig.search.engine === 'sougou'} +
+
+
+ {$i18n.t('Sougou Search API sID')} +
+ + +
+
+
+
+
+ {$i18n.t('Sougou Search API SK')} +
+ + +
+
{/if} {/if} diff --git a/src/lib/i18n/locales/en-US/translation.json b/src/lib/i18n/locales/en-US/translation.json index 827e09ca2..eb90f905a 100644 --- a/src/lib/i18n/locales/en-US/translation.json +++ b/src/lib/i18n/locales/en-US/translation.json @@ -424,6 +424,8 @@ "Enter Mojeek Search API Key": "", "Enter Number of Steps (e.g. 50)": "", "Enter Perplexity API Key": "", + "Enter Sougou Search API sID": "", + "Enter Sougou Search API SK": "", "Enter proxy URL (e.g. https://user:password@host:port)": "", "Enter reasoning effort": "", "Enter Sampler (e.g. Euler a)": "", @@ -822,6 +824,8 @@ "Permission denied when accessing microphone: {{error}}": "", "Permissions": "", "Perplexity API Key": "", + "Sougou Search API sID": "", + "Sougou Search API SK": "", "Personalization": "", "Pin": "", "Pinned": "", diff --git a/src/lib/i18n/locales/zh-CN/translation.json b/src/lib/i18n/locales/zh-CN/translation.json index 5c6337a54..433ffeb16 100644 --- a/src/lib/i18n/locales/zh-CN/translation.json +++ b/src/lib/i18n/locales/zh-CN/translation.json @@ -424,6 +424,8 @@ "Enter Mojeek Search API Key": "输入 Mojeek Search API 密钥", "Enter Number of Steps (e.g. 50)": "输入步骤数 (Steps) (例如:50)", "Enter Perplexity API Key": "输入 Perplexity API 密钥", + "Enter Sougou Search API sID": "输入搜狗搜索 API 的 Secret ID", + "Enter Sougou Search API SK": "输入搜狗搜索 API 的 Secret Key", "Enter proxy URL (e.g. https://user:password@host:port)": "输入代理 URL (例如:https://用户名:密码@主机名:端口)", "Enter reasoning effort": "设置推理努力", "Enter Sampler (e.g. Euler a)": "输入 Sampler (例如:Euler a)", @@ -822,6 +824,8 @@ "Permission denied when accessing microphone: {{error}}": "申请麦克风权限被拒绝:{{error}}", "Permissions": "权限", "Perplexity API Key": "Perplexity API 密钥", + "Sougou Search API sID": "搜狗搜索 API 的 Secret ID", + "Sougou Search API SK": "搜狗搜索 API 的 Secret Key", "Personalization": "个性化", "Pin": "置顶", "Pinned": "已置顶", From 4731e0d0e35eb44cb7f73a9b72c12fd04b42c2c4 Mon Sep 17 00:00:00 2001 From: Thomas Rehn <271119+tremlin@users.noreply.github.com> Date: Thu, 10 Apr 2025 09:00:51 +0200 Subject: [PATCH 063/126] fix: convert webm to wav for OpenAI transcription endpoint --- backend/open_webui/routers/audio.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/open_webui/routers/audio.py b/backend/open_webui/routers/audio.py index ffb949fea..f29a65358 100644 --- a/backend/open_webui/routers/audio.py +++ b/backend/open_webui/routers/audio.py @@ -83,6 +83,8 @@ def audio_needs_conversion(file_path): return "mp4" elif info.get("format_name") == "ogg": return "ogg" + elif info.get("format_name") == "matroska,webm": + return "webm" return None From de926a060d2c1d0e8f95b9ac1fe143d0ef534728 Mon Sep 17 00:00:00 2001 From: SadmL Date: Thu, 10 Apr 2025 13:17:52 +0300 Subject: [PATCH 064/126] [i18n] Russian locale misspelling fix --- src/lib/i18n/locales/ru-RU/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/i18n/locales/ru-RU/translation.json b/src/lib/i18n/locales/ru-RU/translation.json index 4fd292546..83a738112 100644 --- a/src/lib/i18n/locales/ru-RU/translation.json +++ b/src/lib/i18n/locales/ru-RU/translation.json @@ -1076,7 +1076,7 @@ "This will reset the knowledge base and sync all files. Do you wish to continue?": "Это сбросит базу знаний и синхронизирует все файлы. Хотите продолжить?", "Thorough explanation": "Подробное объяснение", "Thought for {{DURATION}}": "Рассуждаю {{DURATION}}", - "Thought for {{DURATION}} seconds": "Рассуждаю {{DURATION}} секунд(ы)", + "Thought for {{DURATION}} seconds": "Рассуждал {{DURATION}} секунд", "Tika": "Tika", "Tika Server URL required.": "Требуется URL-адрес сервера Tika.", "Tiktoken": "", From 536bc36e362652dc622ba16cb3d1d5d6d1441e84 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 10 Apr 2025 08:42:03 -0700 Subject: [PATCH 065/126] chore: bump duckduckgo --- backend/requirements.txt | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index ad490d00a..07ef21f81 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -98,7 +98,7 @@ pytube==15.0.0 extract_msg pydub -duckduckgo-search~=7.5.5 +duckduckgo-search~=8.0.0 ## Google Drive google-api-python-client diff --git a/pyproject.toml b/pyproject.toml index 18e833290..159716ab2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -104,7 +104,7 @@ dependencies = [ "extract_msg", "pydub", - "duckduckgo-search~=7.5.5", + "duckduckgo-search~=8.0.0", "google-api-python-client", "google-auth-httplib2", From 63e5200e2fd5f0072c19b831de9655159373dc65 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 10 Apr 2025 08:46:12 -0700 Subject: [PATCH 066/126] refac --- backend/open_webui/retrieval/web/sougou.py | 32 +++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/backend/open_webui/retrieval/web/sougou.py b/backend/open_webui/retrieval/web/sougou.py index a0726372c..af7957c4f 100644 --- a/backend/open_webui/retrieval/web/sougou.py +++ b/backend/open_webui/retrieval/web/sougou.py @@ -2,11 +2,6 @@ import logging import json from typing import Optional, List -from tencentcloud.common.common_client import CommonClient -from tencentcloud.common import credential -from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException -from tencentcloud.common.profile.client_profile import ClientProfile -from tencentcloud.common.profile.http_profile import HttpProfile from open_webui.retrieval.web.main import SearchResult, get_filtered_results from open_webui.env import SRC_LOG_LEVELS @@ -22,24 +17,41 @@ def search_sougou( count: int, filter_list: Optional[List[str]] = None, ) -> List[SearchResult]: + from tencentcloud.common.common_client import CommonClient + from tencentcloud.common import credential + from tencentcloud.common.exception.tencent_cloud_sdk_exception import ( + TencentCloudSDKException, + ) + from tencentcloud.common.profile.client_profile import ClientProfile + from tencentcloud.common.profile.http_profile import HttpProfile + try: cred = credential.Credential(sougou_api_sid, sougou_api_sk) http_profile = HttpProfile() http_profile.endpoint = "tms.tencentcloudapi.com" client_profile = ClientProfile() client_profile.http_profile = http_profile - params = json.dumps({"Query": query, 'Cnt': 20}) - common_client = CommonClient("tms", "2020-12-29", cred, "", profile=client_profile) + params = json.dumps({"Query": query, "Cnt": 20}) + common_client = CommonClient( + "tms", "2020-12-29", cred, "", profile=client_profile + ) results = [ - json.loads(page) for page in common_client.call_json("SearchPro", json.loads(params))["Response"]["Pages"] + json.loads(page) + for page in common_client.call_json("SearchPro", json.loads(params))[ + "Response" + ]["Pages"] ] - sorted_results = sorted(results, key=lambda x: x.get("scour", 0.0), reverse=True) + sorted_results = sorted( + results, key=lambda x: x.get("scour", 0.0), reverse=True + ) if filter_list: sorted_results = get_filtered_results(sorted_results, filter_list) return [ SearchResult( - link=result.get("url"), title=result.get("title"), snippet=result.get("passage") + link=result.get("url"), + title=result.get("title"), + snippet=result.get("passage"), ) for result in sorted_results[:count] ] From 0611eb8ac7e7c13b7fcd1dc8256b2e2fa95ec3bc Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 10 Apr 2025 09:15:08 -0700 Subject: [PATCH 067/126] refac: layout load --- src/routes/(app)/+layout.svelte | 102 +++++++++++++++++--------------- 1 file changed, 54 insertions(+), 48 deletions(-) diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte index da38e522d..fd9a33111 100644 --- a/src/routes/(app)/+layout.svelte +++ b/src/routes/(app)/+layout.svelte @@ -45,6 +45,7 @@ import AccountPending from '$lib/components/layout/Overlay/AccountPending.svelte'; import UpdateInfoToast from '$lib/components/layout/UpdateInfoToast.svelte'; import { get } from 'svelte/store'; + import Spinner from '$lib/components/common/Spinner.svelte'; const i18n = getContext('i18n'); @@ -254,65 +255,70 @@
- {#if loaded} - {#if !['user', 'admin'].includes($user?.role)} - - {:else if localDBChats.length > 0} -
-
-
-
-
- Important Update
Action Required for Chat Log Storage -
+ {#if !['user', 'admin'].includes($user?.role)} + + {:else if localDBChats.length > 0} +
+
+
+
+
+ Important Update
Action Required for Chat Log Storage +
-
- {$i18n.t( - "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through" - )} - {$i18n.t('Settings')} > {$i18n.t('Chats')} > {$i18n.t('Import Chats')}. {$i18n.t( - 'This ensures that your valuable conversations are securely saved to your backend database. Thank you!' - )} -
+
+ {$i18n.t( + "Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through" + )} + {$i18n.t('Settings')} > {$i18n.t('Chats')} > {$i18n.t('Import Chats')}. {$i18n.t( + 'This ensures that your valuable conversations are securely saved to your backend database. Thank you!' + )} +
-
- + localDBChats = []; + }} + > + Download & Delete + - -
+
- {/if} +
+ {/if} - + + + {#if loaded} + {:else} +
+ +
{/if}
From f10566f3de52cf85a1cadac390ae841e4bf27cd6 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 10 Apr 2025 09:20:18 -0700 Subject: [PATCH 068/126] feat: allow events from pipelines Co-Authored-By: Anthony Durussel <87324020+anthonydurussel@users.noreply.github.com> --- backend/open_webui/utils/middleware.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/backend/open_webui/utils/middleware.py b/backend/open_webui/utils/middleware.py index 2c6728955..659c0b229 100644 --- a/backend/open_webui/utils/middleware.py +++ b/backend/open_webui/utils/middleware.py @@ -900,13 +900,13 @@ async def process_chat_payload(request, form_data, user, metadata, model): citated_file_idx = {} for _, source in enumerate(sources, 1): if "document" in source: - for doc_context, doc_meta in zip(source["document"], source['metadata']): - file_id = doc_meta.get('file_id') + for doc_context, doc_meta in zip( + source["document"], source["metadata"] + ): + file_id = doc_meta.get("file_id") if file_id not in citated_file_idx: citated_file_idx[file_id] = len(citated_file_idx) + 1 - context_string += ( - f'{doc_context}\n' - ) + context_string += f'{doc_context}\n' context_string = context_string.strip() prompt = get_last_user_message(form_data["messages"]) @@ -1613,6 +1613,9 @@ async def process_chat_response( ) if data: + if "event" in data: + await event_emitter(data.get("event", {})) + if "selected_model_id" in data: model_id = data["selected_model_id"] Chats.upsert_message_to_chat_by_id_and_message_id( From 23dcae7054bab700db5095dc683f1b7d0852aa36 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 10 Apr 2025 10:18:56 -0700 Subject: [PATCH 069/126] refac: selector --- .../chat/ModelSelector/Selector.svelte | 117 ++++++++++-------- 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/src/lib/components/chat/ModelSelector/Selector.svelte b/src/lib/components/chat/ModelSelector/Selector.svelte index 99827c02b..777f2f2d0 100644 --- a/src/lib/components/chat/ModelSelector/Selector.svelte +++ b/src/lib/components/chat/ModelSelector/Selector.svelte @@ -84,47 +84,49 @@ } ); - $: filteredItems = searchValue - ? fuse - .search(searchValue) - .map((e) => { - return e.item; - }) - .filter((item) => { - if (selectedTag === '') { - return true; - } - return (item.model?.tags ?? []).map((tag) => tag.name).includes(selectedTag); - }) - .filter((item) => { - if (selectedConnectionType === '') { - return true; - } else if (selectedConnectionType === 'ollama') { - return item.model?.owned_by === 'ollama'; - } else if (selectedConnectionType === 'openai') { - return item.model?.owned_by === 'openai'; - } else if (selectedConnectionType === 'direct') { - return item.model?.direct; - } - }) - : items - .filter((item) => { - if (selectedTag === '') { - return true; - } - return (item.model?.tags ?? []).map((tag) => tag.name).includes(selectedTag); - }) - .filter((item) => { - if (selectedConnectionType === '') { - return true; - } else if (selectedConnectionType === 'ollama') { - return item.model?.owned_by === 'ollama'; - } else if (selectedConnectionType === 'openai') { - return item.model?.owned_by === 'openai'; - } else if (selectedConnectionType === 'direct') { - return item.model?.direct; - } - }); + $: filteredItems = ( + searchValue + ? fuse + .search(searchValue) + .map((e) => { + return e.item; + }) + .filter((item) => { + if (selectedTag === '') { + return true; + } + return (item.model?.tags ?? []).map((tag) => tag.name).includes(selectedTag); + }) + .filter((item) => { + if (selectedConnectionType === '') { + return true; + } else if (selectedConnectionType === 'ollama') { + return item.model?.owned_by === 'ollama'; + } else if (selectedConnectionType === 'openai') { + return item.model?.owned_by === 'openai'; + } else if (selectedConnectionType === 'direct') { + return item.model?.direct; + } + }) + : items + .filter((item) => { + if (selectedTag === '') { + return true; + } + return (item.model?.tags ?? []).map((tag) => tag.name).includes(selectedTag); + }) + .filter((item) => { + if (selectedConnectionType === '') { + return true; + } else if (selectedConnectionType === 'ollama') { + return item.model?.owned_by === 'ollama'; + } else if (selectedConnectionType === 'openai') { + return item.model?.owned_by === 'openai'; + } else if (selectedConnectionType === 'direct') { + return item.model?.direct; + } + }) + ).filter((item) => !(item.model?.info?.meta?.hidden ?? false)); $: if (selectedTag || selectedConnectionType) { resetView(); @@ -282,7 +284,10 @@ ollamaVersion = await getOllamaVersion(localStorage.token).catch((error) => false); if (items) { - tags = items.flatMap((item) => item.model?.tags ?? []).map((tag) => tag.name); + tags = items + .filter((item) => !(item.model?.info?.meta?.hidden ?? false)) + .flatMap((item) => item.model?.tags ?? []) + .map((tag) => tag.name); // Remove duplicates and sort tags = Array.from(new Set(tags)).sort((a, b) => a.localeCompare(b)); @@ -388,18 +393,20 @@ class="flex gap-1 w-fit text-center text-sm font-medium rounded-full bg-transparent px-1.5 pb-0.5" bind:this={tagsContainerElement} > - + {#if (items.find((item) => item.model?.owned_by === 'ollama') && items.find((item) => item.model?.owned_by === 'openai')) || items.find((item) => item.model?.direct) || tags.length > 0} + + {/if} {#if items.find((item) => item.model?.owned_by === 'ollama') && items.find((item) => item.model?.owned_by === 'openai')}
{/if} -
+
{#if tags && items.filter((item) => !(item.model?.info?.meta?.hidden ?? false)).length > 0}
{#if showTemporaryChatControl} -
- -
+
+
+
+
+ {$i18n.t('Detect Artifacts Automatically')} +
+ + +
+
+
From 3f71929a692ec51eb963776a2bb566dc754f9407 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 10 Apr 2025 10:46:44 -0700 Subject: [PATCH 074/126] refac: styling --- src/lib/components/chat/MessageInput.svelte | 29 +++++++++------------ 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/src/lib/components/chat/MessageInput.svelte b/src/lib/components/chat/MessageInput.svelte index 0f42985a5..a0ee6aded 100644 --- a/src/lib/components/chat/MessageInput.svelte +++ b/src/lib/components/chat/MessageInput.svelte @@ -1102,7 +1102,7 @@ -
+
{#if toolServers.length + selectedToolIds.length > 0} (webSearchEnabled = !webSearchEnabled)} type="button" - class="px-1.5 @xl:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {webSearchEnabled || + class="px-1.5 @xl:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden border {webSearchEnabled || ($settings?.webSearch ?? false) === 'always' - ? 'bg-blue-100 dark:bg-blue-500/20 text-blue-500 dark:text-blue-400' - : 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800'}" + ? 'bg-blue-100 dark:bg-blue-500/20 border-blue-400/20 text-blue-500 dark:text-blue-400' + : 'bg-transparent border-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800'}" > (imageGenerationEnabled = !imageGenerationEnabled)} type="button" - class="px-1.5 @xl:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {imageGenerationEnabled - ? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400' - : 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}" + class="px-1.5 @xl:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden border {imageGenerationEnabled + ? 'bg-gray-50 dark:bg-gray-400/10 border-gray-100 dark:border-gray-700 text-gray-600 dark:text-gray-400' + : 'bg-transparent border-transparent text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 '}" > (codeInterpreterEnabled = !codeInterpreterEnabled)} type="button" - class="px-1.5 @xl:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden {codeInterpreterEnabled - ? 'bg-gray-100 dark:bg-gray-500/20 text-gray-600 dark:text-gray-400' - : 'bg-transparent text-gray-600 dark:text-gray-300 border-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800 '}" + class="px-1.5 @xl:px-2.5 py-1.5 flex gap-1.5 items-center text-sm rounded-full font-medium transition-colors duration-300 focus:outline-hidden max-w-full overflow-hidden border {codeInterpreterEnabled + ? 'bg-gray-50 dark:bg-gray-400/10 border-gray-100 dark:border-gray-700 text-gray-600 dark:text-gray-400 ' + : 'bg-transparent border-transparent text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 '}" > {/each} @@ -157,7 +165,7 @@
{/if}
- {decodeURIComponent(citation.source.name)} + {decodeString(citation.source.name)}
{/each} @@ -194,7 +202,7 @@
{/if}
- {decodeURIComponent(citation.source.name)} + {decodeString(citation.source.name)}
{/each} diff --git a/src/lib/components/chat/Messages/CitationsModal.svelte b/src/lib/components/chat/Messages/CitationsModal.svelte index c77a8193b..174d80c4f 100644 --- a/src/lib/components/chat/Messages/CitationsModal.svelte +++ b/src/lib/components/chat/Messages/CitationsModal.svelte @@ -45,6 +45,14 @@ ); } } + + const decodeString = (str: string) => { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + }; @@ -99,7 +107,7 @@ : `#`} target="_blank" > - {decodeURIComponent(document?.metadata?.name ?? document.source.name)} + {decodeString(document?.metadata?.name ?? document.source.name)} {#if document?.metadata?.page} diff --git a/src/lib/components/common/FileItem.svelte b/src/lib/components/common/FileItem.svelte index 772b07858..fda00046a 100644 --- a/src/lib/components/common/FileItem.svelte +++ b/src/lib/components/common/FileItem.svelte @@ -28,6 +28,14 @@ import { deleteFileById } from '$lib/apis/files'; let showModal = false; + + const decodeString = (str: string) => { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + }; {#if item} @@ -82,7 +90,7 @@ {#if !small}
- {decodeURIComponent(name)} + {decodeString(name)}
@@ -101,11 +109,7 @@
{:else} - +
{#if loading} @@ -113,7 +117,7 @@
{/if} -
{decodeURIComponent(name)}
+
{decodeString(name)}
{formatFileSize(size)}
diff --git a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte index c6f47e8de..dc0e354ec 100644 --- a/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte +++ b/src/lib/components/workspace/Knowledge/KnowledgeBase.svelte @@ -547,6 +547,14 @@ dropZone?.removeEventListener('drop', onDrop); dropZone?.removeEventListener('dragleave', onDragLeave); }); + + const decodeString = (str: string) => { + try { + return decodeURIComponent(str); + } catch (e) { + return str; + } + }; {#if dragged} @@ -698,7 +706,7 @@ href={selectedFile.id ? `/api/v1/files/${selectedFile.id}/content` : '#'} target="_blank" > - {decodeURIComponent(selectedFile?.meta?.name)} + {decodeString(selectedFile?.meta?.name)}
From 30d02c638c8a51449da21c09c830245232e6c0c1 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 11 Apr 2025 15:34:21 -0700 Subject: [PATCH 090/126] refac: banners --- src/lib/components/chat/Chat.svelte | 50 +---- src/lib/components/chat/Navbar.svelte | 281 +++++++++++++++----------- 2 files changed, 169 insertions(+), 162 deletions(-) diff --git a/src/lib/components/chat/Chat.svelte b/src/lib/components/chat/Chat.svelte index cbd6a72c4..4f40c6b13 100644 --- a/src/lib/components/chat/Chat.svelte +++ b/src/lib/components/chat/Chat.svelte @@ -1957,61 +1957,13 @@ timestamp: Date.now() } }} + {history} title={$chatTitle} bind:selectedModels shareEnabled={!!history.currentId} {initNewChat} /> - {#if !history.currentId && !$chatId && selectedModels.length <= 1 && ($banners.length > 0 || ($config?.license_metadata?.type ?? null) === 'trial' || (($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats))} -
-
- {#if ($config?.license_metadata?.type ?? null) === 'trial'} - - {/if} - - {#if ($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats} - - {/if} - - {#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner} - { - const bannerId = e.detail; - - localStorage.setItem( - 'dismissedBannerIds', - JSON.stringify( - [ - bannerId, - ...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]') - ].filter((id) => $banners.find((b) => b.id === id)) - ) - ); - }} - /> - {/each} -
-
- {/if} -
{#if $settings?.landingPageMode === 'chat' || createMessagesList(history, history.currentId).length > 0}
-
+ + {#if !history.currentId && !$chatId && ($banners.length > 0 || ($config?.license_metadata?.type ?? null) === 'trial' || (($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats))} +
+
+ {#if ($config?.license_metadata?.type ?? null) === 'trial'} + + {/if} + + {#if ($config?.license_metadata?.seats ?? null) !== null && $config?.user_count > $config?.license_metadata?.seats} + + {/if} + + {#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner} + { + const bannerId = e.detail; + + localStorage.setItem( + 'dismissedBannerIds', + JSON.stringify( + [ + bannerId, + ...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]') + ].filter((id) => $banners.find((b) => b.id === id)) + ) + ); + }} + /> + {/each} +
+
+ {/if} From 5eac5960efe332e113359df9516c5fa7f1eb0da0 Mon Sep 17 00:00:00 2001 From: tth37 Date: Sat, 12 Apr 2025 17:13:30 +0800 Subject: [PATCH 091/126] feat: Add frontend configuration for web loader --- backend/open_webui/config.py | 36 +- backend/open_webui/routers/retrieval.py | 150 ++++--- .../admin/Settings/WebSearch.svelte | 370 ++++++++++++------ 3 files changed, 361 insertions(+), 195 deletions(-) diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 9f5395154..635151c7e 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -2087,18 +2087,6 @@ SERPLY_API_KEY = PersistentConfig( os.getenv("SERPLY_API_KEY", ""), ) -TAVILY_API_KEY = PersistentConfig( - "TAVILY_API_KEY", - "rag.web.search.tavily_api_key", - os.getenv("TAVILY_API_KEY", ""), -) - -TAVILY_EXTRACT_DEPTH = PersistentConfig( - "TAVILY_EXTRACT_DEPTH", - "rag.web.search.tavily_extract_depth", - os.getenv("TAVILY_EXTRACT_DEPTH", "basic"), -) - JINA_API_KEY = PersistentConfig( "JINA_API_KEY", "rag.web.search.jina_api_key", @@ -2193,28 +2181,40 @@ RAG_WEB_SEARCH_TRUST_ENV = PersistentConfig( PLAYWRIGHT_WS_URI = PersistentConfig( "PLAYWRIGHT_WS_URI", - "rag.web.loader.engine.playwright.ws.uri", - os.environ.get("PLAYWRIGHT_WS_URI", None), + "rag.web.loader.playwright_ws_uri", + os.environ.get("PLAYWRIGHT_WS_URI", ""), ) PLAYWRIGHT_TIMEOUT = PersistentConfig( "PLAYWRIGHT_TIMEOUT", - "rag.web.loader.engine.playwright.timeout", - int(os.environ.get("PLAYWRIGHT_TIMEOUT", "10")), + "rag.web.loader.playwright_timeout", + int(os.environ.get("PLAYWRIGHT_TIMEOUT", "10000")), ) FIRECRAWL_API_KEY = PersistentConfig( "FIRECRAWL_API_KEY", - "firecrawl.api_key", + "rag.web.loader.firecrawl_api_key", os.environ.get("FIRECRAWL_API_KEY", ""), ) FIRECRAWL_API_BASE_URL = PersistentConfig( "FIRECRAWL_API_BASE_URL", - "firecrawl.api_url", + "rag.web.loader.firecrawl_api_url", os.environ.get("FIRECRAWL_API_BASE_URL", "https://api.firecrawl.dev"), ) +TAVILY_API_KEY = PersistentConfig( + "TAVILY_API_KEY", + "rag.web.loader.tavily_api_key", + os.getenv("TAVILY_API_KEY", ""), +) + +TAVILY_EXTRACT_DEPTH = PersistentConfig( + "TAVILY_EXTRACT_DEPTH", + "rag.web.loader.tavily_extract_depth", + os.getenv("TAVILY_EXTRACT_DEPTH", "basic"), +) + #################################### # Images #################################### diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index 8e1708c65..d00e303f1 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -378,18 +378,9 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "max_size": request.app.state.config.FILE_MAX_SIZE, "max_count": request.app.state.config.FILE_MAX_COUNT, }, - "youtube": { - "language": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, - "translation": request.app.state.YOUTUBE_LOADER_TRANSLATION, - "proxy_url": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, - }, "web": { - "ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "ENABLE_RAG_WEB_SEARCH": request.app.state.config.ENABLE_RAG_WEB_SEARCH, "search": { - "enabled": request.app.state.config.ENABLE_RAG_WEB_SEARCH, - "drive": request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION, - "onedrive": request.app.state.config.ENABLE_ONEDRIVE_INTEGRATION, "engine": request.app.state.config.RAG_WEB_SEARCH_ENGINE, "searxng_query_url": request.app.state.config.SEARXNG_QUERY_URL, "google_pse_api_key": request.app.state.config.GOOGLE_PSE_API_KEY, @@ -415,10 +406,26 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "sougou_api_sid": request.app.state.config.SOUGOU_API_SID, "sougou_api_sk": request.app.state.config.SOUGOU_API_SK, "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, "domain_filter_list": request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, }, + "loader": { + "engine": request.app.state.config.RAG_WEB_LOADER_ENGINE, + "enable_ssl_verification": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, + "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, + "bypass_embedding_and_retrieval": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "playwright_ws_uri": request.app.state.config.PLAYWRIGHT_WS_URI, + "playwright_timeout": request.app.state.config.PLAYWRIGHT_TIMEOUT, + "firecrawl_api_key": request.app.state.config.FIRECRAWL_API_KEY, + "firecrawl_api_base_url": request.app.state.config.FIRECRAWL_API_BASE_URL, + "tavily_api_key": request.app.state.config.TAVILY_API_KEY, + "tavily_extract_depth": request.app.state.config.TAVILY_EXTRACT_DEPTH, + "youtube": { + "language": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, + "proxy_url": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, + "translation": request.app.state.YOUTUBE_LOADER_TRANSLATION, + }, + }, }, } @@ -458,7 +465,6 @@ class YoutubeLoaderConfig(BaseModel): class WebSearchConfig(BaseModel): - enabled: bool engine: Optional[str] = None searxng_query_url: Optional[str] = None google_pse_api_key: Optional[str] = None @@ -485,14 +491,27 @@ class WebSearchConfig(BaseModel): sougou_api_sk: Optional[str] = None result_count: Optional[int] = None concurrent_requests: Optional[int] = None - trust_env: Optional[bool] = None domain_filter_list: Optional[List[str]] = [] +class WebLoaderConfig(BaseModel): + engine: Optional[str] = None + enable_ssl_verification: Optional[bool] = None + trust_env: Optional[bool] = None + bypass_embedding_and_retrieval: Optional[bool] = None + playwright_ws_uri: Optional[str] = None + playwright_timeout: Optional[int] = None + firecrawl_api_key: Optional[str] = None + firecrawl_api_base_url: Optional[str] = None + tavily_api_key: Optional[str] = None + tavily_extract_depth: Optional[str] = None + youtube: Optional[YoutubeLoaderConfig] = None + + class WebConfig(BaseModel): + ENABLE_RAG_WEB_SEARCH: Optional[bool] = None search: WebSearchConfig - ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION: Optional[bool] = None - BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL: Optional[bool] = None + loader: WebLoaderConfig class ConfigUpdateForm(BaseModel): @@ -504,7 +523,6 @@ class ConfigUpdateForm(BaseModel): file: Optional[FileConfig] = None content_extraction: Optional[ContentExtractionConfig] = None chunk: Optional[ChunkParamUpdateForm] = None - youtube: Optional[YoutubeLoaderConfig] = None web: Optional[WebConfig] = None @@ -576,24 +594,12 @@ async def update_rag_config( request.app.state.config.CHUNK_SIZE = form_data.chunk.chunk_size request.app.state.config.CHUNK_OVERLAP = form_data.chunk.chunk_overlap - if form_data.youtube is not None: - request.app.state.config.YOUTUBE_LOADER_LANGUAGE = form_data.youtube.language - request.app.state.config.YOUTUBE_LOADER_PROXY_URL = form_data.youtube.proxy_url - request.app.state.YOUTUBE_LOADER_TRANSLATION = form_data.youtube.translation - if form_data.web is not None: - request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = ( - # Note: When UI "Bypass SSL verification for Websites"=True then ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION=False - form_data.web.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION + request.app.state.config.ENABLE_RAG_WEB_SEARCH = ( + form_data.web.ENABLE_RAG_WEB_SEARCH ) - request.app.state.config.ENABLE_RAG_WEB_SEARCH = form_data.web.search.enabled request.app.state.config.RAG_WEB_SEARCH_ENGINE = form_data.web.search.engine - - request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ( - form_data.web.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL - ) - request.app.state.config.SEARXNG_QUERY_URL = ( form_data.web.search.searxng_query_url ) @@ -628,10 +634,8 @@ async def update_rag_config( request.app.state.config.SEARCHAPI_ENGINE = ( form_data.web.search.searchapi_engine ) - request.app.state.config.SERPAPI_API_KEY = form_data.web.search.serpapi_api_key request.app.state.config.SERPAPI_ENGINE = form_data.web.search.serpapi_engine - request.app.state.config.JINA_API_KEY = form_data.web.search.jina_api_key request.app.state.config.BING_SEARCH_V7_ENDPOINT = ( form_data.web.search.bing_search_v7_endpoint @@ -639,32 +643,59 @@ async def update_rag_config( request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = ( form_data.web.search.bing_search_v7_subscription_key ) - request.app.state.config.EXA_API_KEY = form_data.web.search.exa_api_key - request.app.state.config.PERPLEXITY_API_KEY = ( form_data.web.search.perplexity_api_key ) - request.app.state.config.SOUGOU_API_SID = ( - form_data.web.search.sougou_api_sid - ) - request.app.state.config.SOUGOU_API_SK = ( - form_data.web.search.sougou_api_sk - ) - + request.app.state.config.SOUGOU_API_SID = form_data.web.search.sougou_api_sid + request.app.state.config.SOUGOU_API_SK = form_data.web.search.sougou_api_sk request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = ( form_data.web.search.result_count ) request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = ( form_data.web.search.concurrent_requests ) - request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV = ( - form_data.web.search.trust_env - ) request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = ( form_data.web.search.domain_filter_list ) + request.app.state.config.RAG_WEB_LOADER_ENGINE = form_data.web.loader.engine + request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = ( + # Note: When UI "Bypass SSL verification for Websites"=True then ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION=False + form_data.web.loader.enable_ssl_verification + ) + request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV = ( + form_data.web.loader.trust_env + ) + request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ( + form_data.web.loader.bypass_embedding_and_retrieval + ) + request.app.state.config.PLAYWRIGHT_WS_URI = ( + form_data.web.loader.playwright_ws_uri + ) + request.app.state.config.PLAYWRIGHT_TIMEOUT = ( + form_data.web.loader.playwright_timeout + ) + request.app.state.config.FIRECRAWL_API_KEY = ( + form_data.web.loader.firecrawl_api_key + ) + request.app.state.config.FIRECRAWL_API_BASE_URL = ( + form_data.web.loader.firecrawl_api_base_url + ) + request.app.state.config.TAVILY_API_KEY = form_data.web.loader.tavily_api_key + request.app.state.config.TAVILY_EXTRACT_DEPTH = ( + form_data.web.loader.tavily_extract_depth + ) + request.app.state.config.YOUTUBE_LOADER_LANGUAGE = ( + form_data.web.loader.youtube.language + ) + request.app.state.config.YOUTUBE_LOADER_PROXY_URL = ( + form_data.web.loader.youtube.proxy_url + ) + request.app.state.YOUTUBE_LOADER_TRANSLATION = ( + form_data.web.loader.youtube.translation + ) + return { "status": True, "pdf_extract_images": request.app.state.config.PDF_EXTRACT_IMAGES, @@ -691,16 +722,9 @@ async def update_rag_config( "chunk_size": request.app.state.config.CHUNK_SIZE, "chunk_overlap": request.app.state.config.CHUNK_OVERLAP, }, - "youtube": { - "language": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, - "proxy_url": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, - "translation": request.app.state.YOUTUBE_LOADER_TRANSLATION, - }, "web": { - "ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "ENABLE_RAG_WEB_SEARCH": request.app.state.config.ENABLE_RAG_WEB_SEARCH, "search": { - "enabled": request.app.state.config.ENABLE_RAG_WEB_SEARCH, "engine": request.app.state.config.RAG_WEB_SEARCH_ENGINE, "searxng_query_url": request.app.state.config.SEARXNG_QUERY_URL, "google_pse_api_key": request.app.state.config.GOOGLE_PSE_API_KEY, @@ -713,11 +737,11 @@ async def update_rag_config( "serpstack_https": request.app.state.config.SERPSTACK_HTTPS, "serper_api_key": request.app.state.config.SERPER_API_KEY, "serply_api_key": request.app.state.config.SERPLY_API_KEY, - "serachapi_api_key": request.app.state.config.SEARCHAPI_API_KEY, + "tavily_api_key": request.app.state.config.TAVILY_API_KEY, + "searchapi_api_key": request.app.state.config.SEARCHAPI_API_KEY, "searchapi_engine": request.app.state.config.SEARCHAPI_ENGINE, "serpapi_api_key": request.app.state.config.SERPAPI_API_KEY, "serpapi_engine": request.app.state.config.SERPAPI_ENGINE, - "tavily_api_key": request.app.state.config.TAVILY_API_KEY, "jina_api_key": request.app.state.config.JINA_API_KEY, "bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT, "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, @@ -727,9 +751,25 @@ async def update_rag_config( "sougou_api_sk": request.app.state.config.SOUGOU_API_SK, "result_count": request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, "concurrent_requests": request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, - "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, "domain_filter_list": request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, }, + "loader": { + "engine": request.app.state.config.RAG_WEB_LOADER_ENGINE, + "enable_ssl_verification": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, + "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, + "bypass_embedding_and_retrieval": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "playwright_ws_uri": request.app.state.config.PLAYWRIGHT_WS_URI, + "playwright_timeout": request.app.state.config.PLAYWRIGHT_TIMEOUT, + "firecrawl_api_key": request.app.state.config.FIRECRAWL_API_KEY, + "firecrawl_api_base_url": request.app.state.config.FIRECRAWL_API_BASE_URL, + "tavily_api_key": request.app.state.config.TAVILY_API_KEY, + "tavily_extract_depth": request.app.state.config.TAVILY_EXTRACT_DEPTH, + "youtube": { + "language": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, + "proxy_url": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, + "translation": request.app.state.YOUTUBE_LOADER_TRANSLATION, + }, + }, }, } diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index 82e61bdc3..32dfe02fa 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -13,6 +13,11 @@ export let saveHandler: Function; let webConfig = null; + + let bypass_ssl_verification = null; + let tavily_api_key = null; + let youtube_language = null; + let webSearchEngines = [ 'searxng', 'google_pse', @@ -33,10 +38,7 @@ 'perplexity', 'sougou' ]; - - let youtubeLanguage = 'en'; - let youtubeTranslation = null; - let youtubeProxyUrl = ''; + let webLoaderEngines = ['safe_web', 'playwright', 'firecrawl', 'tavily']; const submitHandler = async () => { // Convert domain filter string to array before sending @@ -49,16 +51,20 @@ webConfig.search.domain_filter_list = []; } + // Set the enable_ssl_verification flag based on the switch state + webConfig.loader.enable_ssl_verification = !bypass_ssl_verification; + + // Set shared tavily_api_key + webConfig.search.tavily_api_key = tavily_api_key; + webConfig.loader.tavily_api_key = tavily_api_key; + webConfig.loader.youtube.language = youtube_language.split(',').map((lang) => lang.trim()); + const res = await updateRAGConfig(localStorage.token, { - web: webConfig, - youtube: { - language: youtubeLanguage.split(',').map((lang) => lang.trim()), - translation: youtubeTranslation, - proxy_url: youtubeProxyUrl - } + web: webConfig }); webConfig.search.domain_filter_list = webConfig.search.domain_filter_list.join(', '); + youtube_language = webConfig.loader.youtube.language.join(', '); }; onMount(async () => { @@ -70,10 +76,9 @@ 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; - youtubeProxyUrl = res.youtube.proxy_url; + bypass_ssl_verification = !webConfig.loader.enable_ssl_verification; + tavily_api_key = webConfig.search.tavily_api_key || webConfig.loader.tavily_api_key; + youtube_language = webConfig.loader.youtube.language.join(', '); } }); @@ -95,10 +100,10 @@
- {$i18n.t('Web Search')} + {$i18n.t('Enable Web Search')}
- +
@@ -197,7 +202,6 @@ bind:value={webConfig.search.kagi_search_api_key} />
- .
{:else if webConfig.search.engine === 'mojeek'}
@@ -333,7 +337,7 @@
@@ -405,135 +409,208 @@ />
- {:else if webConfig.search.engine === 'sougou'} -
-
-
- {$i18n.t('Sougou Search API sID')} -
- - + {:else if webConfig.search.engine === 'sougou'} +
+
+
+ {$i18n.t('Sougou Search API sID')}
+ +
-
-
-
- {$i18n.t('Sougou Search API SK')} -
- - +
+
+
+
+ {$i18n.t('Sougou Search API SK')}
+ +
+
{/if} {/if} - {#if webConfig.search.enabled} -
-
-
-
- {$i18n.t('Search Result Count')} -
- - +
+
+
+
+ {$i18n.t('Search Result Count')}
-
-
- {$i18n.t('Concurrent Requests')} -
+ +
- +
+
+ {$i18n.t('Concurrent Requests')}
+ +
- -
-
- {$i18n.t('Domain Filter List')} -
- - -
- {/if} - -
-
- - {$i18n.t('Bypass Embedding and Retrieval')} - -
-
- - - -
-
-
- {$i18n.t('Trust Proxy Environment')} +
+
+ {$i18n.t('Domain Filter List')}
-
- - - -
-
-
-
+ +
+
{$i18n.t('Loader')}

- {$i18n.t('Bypass SSL verification for Websites')} + {$i18n.t('Web Loader Engine')}
- +
+ {#if webConfig.loader.engine !== ''} + {#if webConfig.loader.engine === 'playwright'} +
+
+
+ {$i18n.t('Playwright WebSocket URL')} +
+ +
+
+ +
+
+
+ +
+
+ {$i18n.t('Playwright Timeout (ms)')} +
+ +
+
+ +
+
+
+
+ {:else if webConfig.loader.engine === 'firecrawl'} +
+
+
+ {$i18n.t('Firecrawl API Base URL')} +
+ +
+
+ +
+
+
+ +
+
+ {$i18n.t('Firecrawl API Key')} +
+ + +
+
+ {:else if webConfig.loader.engine === 'tavily'} +
+
+
+ {$i18n.t('Tavily Extract Depth')} +
+ +
+
+ +
+
+
+ + {#if webConfig.search.engine !== 'tavily'} +
+
+ {$i18n.t('Tavily API Key')} +
+ + +
+ {/if} +
+ {/if} + {/if} + +
+
{$i18n.t('Youtube Language')} @@ -543,7 +620,7 @@ class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden" type="text" placeholder={$i18n.t('Enter language codes')} - bind:value={youtubeLanguage} + bind:value={youtube_language} autocomplete="off" />
@@ -555,14 +632,63 @@
+ +
+ +
+
+ {$i18n.t('Bypass SSL verification for Websites')} +
+
+ +
+
+ +
+
+ {$i18n.t('Trust Proxy Environment')} +
+
+ + + +
+
+ +
+
+ + {$i18n.t('Bypass Embedding and Retrieval')} + +
+
+ + + +
+
{/if} From c6755f9151fe10295e25bab3212f4756ac675458 Mon Sep 17 00:00:00 2001 From: Jan Kessler Date: Sat, 12 Apr 2025 18:48:07 +0200 Subject: [PATCH 092/126] bump python-socketio to 5.13.0 (to support Redis Sentinel natively) --- backend/requirements.txt | 2 +- pyproject.toml | 2 +- uv.lock | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/backend/requirements.txt b/backend/requirements.txt index dd7c85932..02e0babae 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -3,7 +3,7 @@ uvicorn[standard]==0.34.0 pydantic==2.10.6 python-multipart==0.0.20 -python-socketio==5.11.3 +python-socketio==5.13.0 python-jose==3.4.0 passlib[bcrypt]==1.7.4 diff --git a/pyproject.toml b/pyproject.toml index 2e8537a77..5be1baf64 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ dependencies = [ "pydantic==2.10.6", "python-multipart==0.0.18", - "python-socketio==5.11.3", + "python-socketio==5.13.0", "python-jose==3.4.0", "passlib[bcrypt]==1.7.4", diff --git a/uv.lock b/uv.lock index ab2e57ae4..557849959 100644 --- a/uv.lock +++ b/uv.lock @@ -2966,7 +2966,7 @@ requires-dist = [ { name = "python-jose", specifier = "==3.3.0" }, { name = "python-multipart", specifier = "==0.0.18" }, { name = "python-pptx", specifier = "==1.0.0" }, - { name = "python-socketio", specifier = "==5.11.3" }, + { name = "python-socketio", specifier = "==5.13.0" }, { name = "pytube", specifier = "==15.0.0" }, { name = "pyxlsb", specifier = "==1.0.10" }, { name = "qdrant-client", specifier = "~=1.12.0" }, @@ -4073,15 +4073,15 @@ wheels = [ [[package]] name = "python-socketio" -version = "5.11.3" +version = "5.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bidict" }, { name = "python-engineio" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1e/74/b1e8787cea757e1f533a7878e94f929679ef7e07a2aaf44de6b71065b1f2/python_socketio-5.11.3.tar.gz", hash = "sha256:194af8cdbb7b0768c2e807ba76c7abc288eb5bb85559b7cddee51a6bc7a65737", size = 117702 } +sdist = { url = "https://files.pythonhosted.org/packages/21/1a/396d50ccf06ee539fa758ce5623b59a9cb27637fc4b2dc07ed08bf495e77/python_socketio-5.13.0.tar.gz", hash = "sha256:ac4e19a0302ae812e23b712ec8b6427ca0521f7c582d6abb096e36e24a263029", size = 121125 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/59/5ee858d5736594d75385b9a8c0f65af6eca5da2b359ed3fb6a7486526399/python_socketio-5.11.3-py3-none-any.whl", hash = "sha256:2a923a831ff70664b7c502df093c423eb6aa93c1ce68b8319e840227a26d8b69", size = 76180 }, + { url = "https://files.pythonhosted.org/packages/3c/32/b4fb8585d1be0f68bde7e110dffbcf354915f77ad8c778563f0ad9655c02/python_socketio-5.13.0-py3-none-any.whl", hash = "sha256:51f68d6499f2df8524668c24bcec13ba1414117cfb3a90115c559b601ab10caf", size = 77800 }, ] [[package]] From bdef1001ac0ff4003dc7e1fdfce4ccf4b16a80ab Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 12 Apr 2025 15:10:43 -0700 Subject: [PATCH 093/126] refac --- backend/open_webui/models/memories.py | 5 +++-- backend/open_webui/routers/memories.py | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/models/memories.py b/backend/open_webui/models/memories.py index c8dae9726..8b10a77cf 100644 --- a/backend/open_webui/models/memories.py +++ b/backend/open_webui/models/memories.py @@ -63,14 +63,15 @@ class MemoriesTable: else: return None - def update_memory_by_id( + def update_memory_by_id_and_user_id( self, id: str, + user_id: str, content: str, ) -> Optional[MemoryModel]: with get_db() as db: try: - db.query(Memory).filter_by(id=id).update( + db.query(Memory).filter_by(id=id, user_id=user_id).update( {"content": content, "updated_at": int(time.time())} ) db.commit() diff --git a/backend/open_webui/routers/memories.py b/backend/open_webui/routers/memories.py index e660ef852..6d54c9c17 100644 --- a/backend/open_webui/routers/memories.py +++ b/backend/open_webui/routers/memories.py @@ -153,7 +153,9 @@ async def update_memory_by_id( form_data: MemoryUpdateModel, user=Depends(get_verified_user), ): - memory = Memories.update_memory_by_id(memory_id, form_data.content) + memory = Memories.update_memory_by_id_and_user_id( + memory_id, user.id, form_data.content + ) if memory is None: raise HTTPException(status_code=404, detail="Memory not found") From c3497da5dd5a61f0e75e2a0bfdcc70e9e0cdaa8a Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 12 Apr 2025 15:11:03 -0700 Subject: [PATCH 094/126] enh: only copy text message content --- src/lib/components/chat/Messages/ResponseMessage.svelte | 5 ++++- src/lib/utils/index.ts | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/lib/components/chat/Messages/ResponseMessage.svelte b/src/lib/components/chat/Messages/ResponseMessage.svelte index f3c5c306e..5d6a1c3a8 100644 --- a/src/lib/components/chat/Messages/ResponseMessage.svelte +++ b/src/lib/components/chat/Messages/ResponseMessage.svelte @@ -24,7 +24,9 @@ getMessageContentParts, sanitizeResponseContent, createMessagesList, - formatDate + formatDate, + removeDetails, + removeAllDetails } from '$lib/utils'; import { WEBUI_BASE_URL } from '$lib/constants'; @@ -152,6 +154,7 @@ let showRateComment = false; const copyToClipboard = async (text) => { + text = removeAllDetails(text); const res = await _copyToClipboard(text); if (res) { toast.success($i18n.t('Copying to clipboard was successful!')); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index bcf39f76d..ffcd6e27a 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -683,6 +683,11 @@ export const removeDetails = (content, types) => { return content; }; +export const removeAllDetails = (content) => { + content = content.replace(/]*>.*?<\/details>/gis, ''); + return content; +}; + export const processDetails = (content) => { content = removeDetails(content, ['reasoning', 'code_interpreter']); From 48a23ce3fe06ca62faa7c1a19c95229126ad2b91 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 12 Apr 2025 16:33:36 -0700 Subject: [PATCH 095/126] refac: web/rag config --- backend/open_webui/config.py | 120 +- backend/open_webui/main.py | 41 +- backend/open_webui/retrieval/web/utils.py | 48 +- backend/open_webui/routers/retrieval.py | 873 ++++++------ backend/start.sh | 4 +- backend/start_windows.bat | 4 +- docker-compose.playwright.yaml | 4 +- src/lib/apis/retrieval/index.ts | 33 +- .../admin/Settings/Documents.svelte | 1206 ++++++++--------- .../admin/Settings/WebSearch.svelte | 540 ++++---- src/lib/utils/rag/index.ts | 24 - 11 files changed, 1367 insertions(+), 1530 deletions(-) delete mode 100644 src/lib/utils/rag/index.ts diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 635151c7e..e13ace668 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -201,7 +201,10 @@ def save_config(config): T = TypeVar("T") -ENABLE_PERSISTENT_CONFIG = os.environ.get("ENABLE_PERSISTENT_CONFIG", "True").lower() == "true" +ENABLE_PERSISTENT_CONFIG = ( + os.environ.get("ENABLE_PERSISTENT_CONFIG", "True").lower() == "true" +) + class PersistentConfig(Generic[T]): def __init__(self, env_name: str, config_path: str, env_value: T): @@ -612,10 +615,16 @@ def load_oauth_providers(): "scope": OAUTH_SCOPES.value, } - if OAUTH_CODE_CHALLENGE_METHOD.value and OAUTH_CODE_CHALLENGE_METHOD.value == "S256": + if ( + OAUTH_CODE_CHALLENGE_METHOD.value + and OAUTH_CODE_CHALLENGE_METHOD.value == "S256" + ): client_kwargs["code_challenge_method"] = "S256" elif OAUTH_CODE_CHALLENGE_METHOD.value: - raise Exception('Code challenge methods other than "%s" not supported. Given: "%s"' % ("S256", OAUTH_CODE_CHALLENGE_METHOD.value)) + raise Exception( + 'Code challenge methods other than "%s" not supported. Given: "%s"' + % ("S256", OAUTH_CODE_CHALLENGE_METHOD.value) + ) client.register( name="oidc", @@ -1820,12 +1829,6 @@ RAG_FILE_MAX_SIZE = PersistentConfig( ), ) -ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = PersistentConfig( - "ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION", - "rag.enable_web_loader_ssl_verification", - os.environ.get("ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION", "True").lower() == "true", -) - RAG_EMBEDDING_ENGINE = PersistentConfig( "RAG_EMBEDDING_ENGINE", "rag.embedding_engine", @@ -1990,16 +1993,20 @@ YOUTUBE_LOADER_PROXY_URL = PersistentConfig( ) -ENABLE_RAG_WEB_SEARCH = PersistentConfig( - "ENABLE_RAG_WEB_SEARCH", +#################################### +# Web Search (RAG) +#################################### + +ENABLE_WEB_SEARCH = PersistentConfig( + "ENABLE_WEB_SEARCH", "rag.web.search.enable", - os.getenv("ENABLE_RAG_WEB_SEARCH", "False").lower() == "true", + os.getenv("ENABLE_WEB_SEARCH", "False").lower() == "true", ) -RAG_WEB_SEARCH_ENGINE = PersistentConfig( - "RAG_WEB_SEARCH_ENGINE", +WEB_SEARCH_ENGINE = PersistentConfig( + "WEB_SEARCH_ENGINE", "rag.web.search.engine", - os.getenv("RAG_WEB_SEARCH_ENGINE", ""), + os.getenv("WEB_SEARCH_ENGINE", ""), ) BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig( @@ -2008,10 +2015,18 @@ BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = PersistentConfig( os.getenv("BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL", "False").lower() == "true", ) + +WEB_SEARCH_RESULT_COUNT = PersistentConfig( + "WEB_SEARCH_RESULT_COUNT", + "rag.web.search.result_count", + int(os.getenv("WEB_SEARCH_RESULT_COUNT", "3")), +) + + # You can provide a list of your own websites to filter after performing a web search. # 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", +WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig( + "WEB_SEARCH_DOMAIN_FILTER_LIST", "rag.web.search.domain.filter_list", [ # "wikipedia.com", @@ -2020,6 +2035,30 @@ RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = PersistentConfig( ], ) +WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig( + "WEB_SEARCH_CONCURRENT_REQUESTS", + "rag.web.search.concurrent_requests", + int(os.getenv("WEB_SEARCH_CONCURRENT_REQUESTS", "10")), +) + +WEB_LOADER_ENGINE = PersistentConfig( + "WEB_LOADER_ENGINE", + "rag.web.loader.engine", + os.environ.get("WEB_LOADER_ENGINE", ""), +) + +ENABLE_WEB_LOADER_SSL_VERIFICATION = PersistentConfig( + "ENABLE_WEB_LOADER_SSL_VERIFICATION", + "rag.web.loader.ssl_verification", + os.environ.get("ENABLE_WEB_LOADER_SSL_VERIFICATION", "True").lower() == "true", +) + +WEB_SEARCH_TRUST_ENV = PersistentConfig( + "WEB_SEARCH_TRUST_ENV", + "rag.web.search.trust_env", + os.getenv("WEB_SEARCH_TRUST_ENV", "False").lower() == "true", +) + SEARXNG_QUERY_URL = PersistentConfig( "SEARXNG_QUERY_URL", @@ -2155,34 +2194,22 @@ SOUGOU_API_SK = PersistentConfig( os.getenv("SOUGOU_API_SK", ""), ) -RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig( - "RAG_WEB_SEARCH_RESULT_COUNT", - "rag.web.search.result_count", - int(os.getenv("RAG_WEB_SEARCH_RESULT_COUNT", "3")), +TAVILY_API_KEY = PersistentConfig( + "TAVILY_API_KEY", + "rag.web.search.tavily_api_key", + os.getenv("TAVILY_API_KEY", ""), ) -RAG_WEB_SEARCH_CONCURRENT_REQUESTS = PersistentConfig( - "RAG_WEB_SEARCH_CONCURRENT_REQUESTS", - "rag.web.search.concurrent_requests", - int(os.getenv("RAG_WEB_SEARCH_CONCURRENT_REQUESTS", "10")), +TAVILY_EXTRACT_DEPTH = PersistentConfig( + "TAVILY_EXTRACT_DEPTH", + "rag.web.search.tavily_extract_depth", + os.getenv("TAVILY_EXTRACT_DEPTH", "basic"), ) -RAG_WEB_LOADER_ENGINE = PersistentConfig( - "RAG_WEB_LOADER_ENGINE", - "rag.web.loader.engine", - os.environ.get("RAG_WEB_LOADER_ENGINE", "safe_web"), -) - -RAG_WEB_SEARCH_TRUST_ENV = PersistentConfig( - "RAG_WEB_SEARCH_TRUST_ENV", - "rag.web.search.trust_env", - os.getenv("RAG_WEB_SEARCH_TRUST_ENV", "False").lower() == "true", -) - -PLAYWRIGHT_WS_URI = PersistentConfig( - "PLAYWRIGHT_WS_URI", - "rag.web.loader.playwright_ws_uri", - os.environ.get("PLAYWRIGHT_WS_URI", ""), +PLAYWRIGHT_WS_URL = PersistentConfig( + "PLAYWRIGHT_WS_URL", + "rag.web.loader.PLAYWRIGHT_WS_URL", + os.environ.get("PLAYWRIGHT_WS_URL", ""), ) PLAYWRIGHT_TIMEOUT = PersistentConfig( @@ -2203,17 +2230,6 @@ FIRECRAWL_API_BASE_URL = PersistentConfig( os.environ.get("FIRECRAWL_API_BASE_URL", "https://api.firecrawl.dev"), ) -TAVILY_API_KEY = PersistentConfig( - "TAVILY_API_KEY", - "rag.web.loader.tavily_api_key", - os.getenv("TAVILY_API_KEY", ""), -) - -TAVILY_EXTRACT_DEPTH = PersistentConfig( - "TAVILY_EXTRACT_DEPTH", - "rag.web.loader.tavily_extract_depth", - os.getenv("TAVILY_EXTRACT_DEPTH", "basic"), -) #################################### # Images diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 8095affac..e95de90a5 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -160,11 +160,11 @@ from open_webui.config import ( AUDIO_TTS_VOICE, AUDIO_TTS_AZURE_SPEECH_REGION, AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT, - PLAYWRIGHT_WS_URI, + PLAYWRIGHT_WS_URL, PLAYWRIGHT_TIMEOUT, FIRECRAWL_API_BASE_URL, FIRECRAWL_API_KEY, - RAG_WEB_LOADER_ENGINE, + WEB_LOADER_ENGINE, WHISPER_MODEL, DEEPGRAM_API_KEY, WHISPER_MODEL_AUTO_UPDATE, @@ -205,12 +205,13 @@ from open_webui.config import ( YOUTUBE_LOADER_LANGUAGE, YOUTUBE_LOADER_PROXY_URL, # Retrieval (Web Search) - RAG_WEB_SEARCH_ENGINE, + ENABLE_WEB_SEARCH, + WEB_SEARCH_ENGINE, BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, - RAG_WEB_SEARCH_RESULT_COUNT, - RAG_WEB_SEARCH_CONCURRENT_REQUESTS, - RAG_WEB_SEARCH_TRUST_ENV, - RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + WEB_SEARCH_RESULT_COUNT, + WEB_SEARCH_CONCURRENT_REQUESTS, + WEB_SEARCH_TRUST_ENV, + WEB_SEARCH_DOMAIN_FILTER_LIST, JINA_API_KEY, SEARCHAPI_API_KEY, SEARCHAPI_ENGINE, @@ -240,8 +241,7 @@ from open_webui.config import ( ONEDRIVE_CLIENT_ID, ENABLE_RAG_HYBRID_SEARCH, ENABLE_RAG_LOCAL_WEB_FETCH, - ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - ENABLE_RAG_WEB_SEARCH, + ENABLE_WEB_LOADER_SSL_VERIFICATION, ENABLE_GOOGLE_DRIVE_INTEGRATION, ENABLE_ONEDRIVE_INTEGRATION, UPLOAD_DIR, @@ -594,9 +594,7 @@ app.state.config.FILE_MAX_COUNT = RAG_FILE_MAX_COUNT app.state.config.RAG_FULL_CONTEXT = RAG_FULL_CONTEXT app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL = BYPASS_EMBEDDING_AND_RETRIEVAL app.state.config.ENABLE_RAG_HYBRID_SEARCH = ENABLE_RAG_HYBRID_SEARCH -app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = ( - ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION -) +app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION = ENABLE_WEB_LOADER_SSL_VERIFICATION app.state.config.CONTENT_EXTRACTION_ENGINE = CONTENT_EXTRACTION_ENGINE app.state.config.TIKA_SERVER_URL = TIKA_SERVER_URL @@ -629,12 +627,16 @@ app.state.config.YOUTUBE_LOADER_LANGUAGE = YOUTUBE_LOADER_LANGUAGE app.state.config.YOUTUBE_LOADER_PROXY_URL = YOUTUBE_LOADER_PROXY_URL -app.state.config.ENABLE_RAG_WEB_SEARCH = ENABLE_RAG_WEB_SEARCH -app.state.config.RAG_WEB_SEARCH_ENGINE = RAG_WEB_SEARCH_ENGINE +app.state.config.ENABLE_WEB_SEARCH = ENABLE_WEB_SEARCH +app.state.config.WEB_SEARCH_ENGINE = WEB_SEARCH_ENGINE +app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST = WEB_SEARCH_DOMAIN_FILTER_LIST +app.state.config.WEB_SEARCH_RESULT_COUNT = WEB_SEARCH_RESULT_COUNT +app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS = WEB_SEARCH_CONCURRENT_REQUESTS +app.state.config.WEB_LOADER_ENGINE = WEB_LOADER_ENGINE +app.state.config.WEB_SEARCH_TRUST_ENV = WEB_SEARCH_TRUST_ENV app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ( BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL ) -app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST = RAG_WEB_SEARCH_DOMAIN_FILTER_LIST app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION = ENABLE_GOOGLE_DRIVE_INTEGRATION app.state.config.ENABLE_ONEDRIVE_INTEGRATION = ENABLE_ONEDRIVE_INTEGRATION @@ -662,11 +664,8 @@ app.state.config.PERPLEXITY_API_KEY = PERPLEXITY_API_KEY app.state.config.SOUGOU_API_SID = SOUGOU_API_SID app.state.config.SOUGOU_API_SK = SOUGOU_API_SK -app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT -app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS -app.state.config.RAG_WEB_LOADER_ENGINE = RAG_WEB_LOADER_ENGINE -app.state.config.RAG_WEB_SEARCH_TRUST_ENV = RAG_WEB_SEARCH_TRUST_ENV -app.state.config.PLAYWRIGHT_WS_URI = PLAYWRIGHT_WS_URI + +app.state.config.PLAYWRIGHT_WS_URL = PLAYWRIGHT_WS_URL app.state.config.PLAYWRIGHT_TIMEOUT = PLAYWRIGHT_TIMEOUT app.state.config.FIRECRAWL_API_BASE_URL = FIRECRAWL_API_BASE_URL app.state.config.FIRECRAWL_API_KEY = FIRECRAWL_API_KEY @@ -1261,7 +1260,7 @@ async def get_app_config(request: Request): { "enable_direct_connections": app.state.config.ENABLE_DIRECT_CONNECTIONS, "enable_channels": app.state.config.ENABLE_CHANNELS, - "enable_web_search": app.state.config.ENABLE_RAG_WEB_SEARCH, + "enable_web_search": app.state.config.ENABLE_WEB_SEARCH, "enable_code_execution": app.state.config.ENABLE_CODE_EXECUTION, "enable_code_interpreter": app.state.config.ENABLE_CODE_INTERPRETER, "enable_image_generation": app.state.config.ENABLE_IMAGE_GENERATION, diff --git a/backend/open_webui/retrieval/web/utils.py b/backend/open_webui/retrieval/web/utils.py index 942cb8483..718cfe52f 100644 --- a/backend/open_webui/retrieval/web/utils.py +++ b/backend/open_webui/retrieval/web/utils.py @@ -28,9 +28,9 @@ from open_webui.retrieval.loaders.tavily import TavilyLoader from open_webui.constants import ERROR_MESSAGES from open_webui.config import ( ENABLE_RAG_LOCAL_WEB_FETCH, - PLAYWRIGHT_WS_URI, + PLAYWRIGHT_WS_URL, PLAYWRIGHT_TIMEOUT, - RAG_WEB_LOADER_ENGINE, + WEB_LOADER_ENGINE, FIRECRAWL_API_BASE_URL, FIRECRAWL_API_KEY, TAVILY_API_KEY, @@ -584,13 +584,6 @@ class SafeWebBaseLoader(WebBaseLoader): return [document async for document in self.alazy_load()] -RAG_WEB_LOADER_ENGINES = defaultdict(lambda: SafeWebBaseLoader) -RAG_WEB_LOADER_ENGINES["playwright"] = SafePlaywrightURLLoader -RAG_WEB_LOADER_ENGINES["safe_web"] = SafeWebBaseLoader -RAG_WEB_LOADER_ENGINES["firecrawl"] = SafeFireCrawlLoader -RAG_WEB_LOADER_ENGINES["tavily"] = SafeTavilyLoader - - def get_web_loader( urls: Union[str, Sequence[str]], verify_ssl: bool = True, @@ -608,27 +601,36 @@ def get_web_loader( "trust_env": trust_env, } - if RAG_WEB_LOADER_ENGINE.value == "playwright": + if WEB_LOADER_ENGINE.value == "" or WEB_LOADER_ENGINE.value == "safe_web": + WebLoaderClass = SafeWebBaseLoader + if WEB_LOADER_ENGINE.value == "playwright": + WebLoaderClass = SafePlaywrightURLLoader web_loader_args["playwright_timeout"] = PLAYWRIGHT_TIMEOUT.value * 1000 - if PLAYWRIGHT_WS_URI.value: - web_loader_args["playwright_ws_url"] = PLAYWRIGHT_WS_URI.value + if PLAYWRIGHT_WS_URL.value: + web_loader_args["playwright_ws_url"] = PLAYWRIGHT_WS_URL.value - if RAG_WEB_LOADER_ENGINE.value == "firecrawl": + if WEB_LOADER_ENGINE.value == "firecrawl": + WebLoaderClass = SafeFireCrawlLoader web_loader_args["api_key"] = FIRECRAWL_API_KEY.value web_loader_args["api_url"] = FIRECRAWL_API_BASE_URL.value - if RAG_WEB_LOADER_ENGINE.value == "tavily": + if WEB_LOADER_ENGINE.value == "tavily": + WebLoaderClass = SafeTavilyLoader web_loader_args["api_key"] = TAVILY_API_KEY.value web_loader_args["extract_depth"] = TAVILY_EXTRACT_DEPTH.value - # Create the appropriate WebLoader based on the configuration - WebLoaderClass = RAG_WEB_LOADER_ENGINES[RAG_WEB_LOADER_ENGINE.value] - web_loader = WebLoaderClass(**web_loader_args) + if WebLoaderClass: + web_loader = WebLoaderClass(**web_loader_args) - log.debug( - "Using RAG_WEB_LOADER_ENGINE %s for %s URLs", - web_loader.__class__.__name__, - len(safe_urls), - ) + log.debug( + "Using WEB_LOADER_ENGINE %s for %s URLs", + web_loader.__class__.__name__, + len(safe_urls), + ) - return web_loader + return web_loader + else: + raise ValueError( + f"Invalid WEB_LOADER_ENGINE: {WEB_LOADER_ENGINE.value}. " + "Please set it to 'safe_web', 'playwright', 'firecrawl', or 'tavily'." + ) diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index d00e303f1..accb21d32 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -352,482 +352,432 @@ async def update_reranking_config( async def get_rag_config(request: Request, user=Depends(get_admin_user)): return { "status": True, - "pdf_extract_images": request.app.state.config.PDF_EXTRACT_IMAGES, - "RAG_FULL_CONTEXT": request.app.state.config.RAG_FULL_CONTEXT, + # RAG settings + "TEMPLATE": request.app.state.config.RAG_TEMPLATE, + "TOP_K": request.app.state.config.TOP_K, "BYPASS_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL, - "enable_google_drive_integration": request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION, - "enable_onedrive_integration": request.app.state.config.ENABLE_ONEDRIVE_INTEGRATION, - "content_extraction": { - "engine": request.app.state.config.CONTENT_EXTRACTION_ENGINE, - "tika_server_url": request.app.state.config.TIKA_SERVER_URL, - "docling_server_url": request.app.state.config.DOCLING_SERVER_URL, - "document_intelligence_config": { - "endpoint": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT, - "key": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY, - }, - "mistral_ocr_config": { - "api_key": request.app.state.config.MISTRAL_OCR_API_KEY, - }, - }, - "chunk": { - "text_splitter": request.app.state.config.TEXT_SPLITTER, - "chunk_size": request.app.state.config.CHUNK_SIZE, - "chunk_overlap": request.app.state.config.CHUNK_OVERLAP, - }, - "file": { - "max_size": request.app.state.config.FILE_MAX_SIZE, - "max_count": request.app.state.config.FILE_MAX_COUNT, - }, + "RAG_FULL_CONTEXT": request.app.state.config.RAG_FULL_CONTEXT, + # Hybrid search settings + "ENABLE_RAG_HYBRID_SEARCH": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, + "TOP_K_RERANKER": request.app.state.config.TOP_K_RERANKER, + "RELEVANCE_THRESHOLD": request.app.state.config.RELEVANCE_THRESHOLD, + # Content extraction settings + "CONTENT_EXTRACTION_ENGINE": request.app.state.config.CONTENT_EXTRACTION_ENGINE, + "PDF_EXTRACT_IMAGES": request.app.state.config.PDF_EXTRACT_IMAGES, + "TIKA_SERVER_URL": request.app.state.config.TIKA_SERVER_URL, + "DOCLING_SERVER_URL": request.app.state.config.DOCLING_SERVER_URL, + "DOCUMENT_INTELLIGENCE_ENDPOINT": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT, + "DOCUMENT_INTELLIGENCE_KEY": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY, + "MISTRAL_OCR_API_KEY": request.app.state.config.MISTRAL_OCR_API_KEY, + # Chunking settings + "TEXT_SPLITTER": request.app.state.config.TEXT_SPLITTER, + "CHUNK_SIZE": request.app.state.config.CHUNK_SIZE, + "CHUNK_OVERLAP": request.app.state.config.CHUNK_OVERLAP, + # File upload settings + "FILE_MAX_SIZE": request.app.state.config.FILE_MAX_SIZE, + "FILE_MAX_COUNT": request.app.state.config.FILE_MAX_COUNT, + # Integration settings + "ENABLE_GOOGLE_DRIVE_INTEGRATION": request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION, + "ENABLE_ONEDRIVE_INTEGRATION": request.app.state.config.ENABLE_ONEDRIVE_INTEGRATION, + # Web search settings "web": { - "ENABLE_RAG_WEB_SEARCH": request.app.state.config.ENABLE_RAG_WEB_SEARCH, - "search": { - "engine": request.app.state.config.RAG_WEB_SEARCH_ENGINE, - "searxng_query_url": request.app.state.config.SEARXNG_QUERY_URL, - "google_pse_api_key": request.app.state.config.GOOGLE_PSE_API_KEY, - "google_pse_engine_id": request.app.state.config.GOOGLE_PSE_ENGINE_ID, - "brave_search_api_key": request.app.state.config.BRAVE_SEARCH_API_KEY, - "kagi_search_api_key": request.app.state.config.KAGI_SEARCH_API_KEY, - "mojeek_search_api_key": request.app.state.config.MOJEEK_SEARCH_API_KEY, - "bocha_search_api_key": request.app.state.config.BOCHA_SEARCH_API_KEY, - "serpstack_api_key": request.app.state.config.SERPSTACK_API_KEY, - "serpstack_https": request.app.state.config.SERPSTACK_HTTPS, - "serper_api_key": request.app.state.config.SERPER_API_KEY, - "serply_api_key": request.app.state.config.SERPLY_API_KEY, - "tavily_api_key": request.app.state.config.TAVILY_API_KEY, - "searchapi_api_key": request.app.state.config.SEARCHAPI_API_KEY, - "searchapi_engine": request.app.state.config.SEARCHAPI_ENGINE, - "serpapi_api_key": request.app.state.config.SERPAPI_API_KEY, - "serpapi_engine": request.app.state.config.SERPAPI_ENGINE, - "jina_api_key": request.app.state.config.JINA_API_KEY, - "bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT, - "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, - "exa_api_key": request.app.state.config.EXA_API_KEY, - "perplexity_api_key": request.app.state.config.PERPLEXITY_API_KEY, - "sougou_api_sid": request.app.state.config.SOUGOU_API_SID, - "sougou_api_sk": request.app.state.config.SOUGOU_API_SK, - "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, - }, - "loader": { - "engine": request.app.state.config.RAG_WEB_LOADER_ENGINE, - "enable_ssl_verification": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, - "bypass_embedding_and_retrieval": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, - "playwright_ws_uri": request.app.state.config.PLAYWRIGHT_WS_URI, - "playwright_timeout": request.app.state.config.PLAYWRIGHT_TIMEOUT, - "firecrawl_api_key": request.app.state.config.FIRECRAWL_API_KEY, - "firecrawl_api_base_url": request.app.state.config.FIRECRAWL_API_BASE_URL, - "tavily_api_key": request.app.state.config.TAVILY_API_KEY, - "tavily_extract_depth": request.app.state.config.TAVILY_EXTRACT_DEPTH, - "youtube": { - "language": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, - "proxy_url": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, - "translation": request.app.state.YOUTUBE_LOADER_TRANSLATION, - }, - }, + "ENABLE_WEB_SEARCH": request.app.state.config.ENABLE_WEB_SEARCH, + "WEB_SEARCH_ENGINE": request.app.state.config.WEB_SEARCH_ENGINE, + "WEB_SEARCH_TRUST_ENV": request.app.state.config.WEB_SEARCH_TRUST_ENV, + "WEB_SEARCH_RESULT_COUNT": request.app.state.config.WEB_SEARCH_RESULT_COUNT, + "WEB_SEARCH_CONCURRENT_REQUESTS": request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, + "WEB_SEARCH_DOMAIN_FILTER_LIST": request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, + "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "SEARXNG_QUERY_URL": request.app.state.config.SEARXNG_QUERY_URL, + "GOOGLE_PSE_API_KEY": request.app.state.config.GOOGLE_PSE_API_KEY, + "GOOGLE_PSE_ENGINE_ID": request.app.state.config.GOOGLE_PSE_ENGINE_ID, + "BRAVE_SEARCH_API_KEY": request.app.state.config.BRAVE_SEARCH_API_KEY, + "KAGI_SEARCH_API_KEY": request.app.state.config.KAGI_SEARCH_API_KEY, + "MOJEEK_SEARCH_API_KEY": request.app.state.config.MOJEEK_SEARCH_API_KEY, + "BOCHA_SEARCH_API_KEY": request.app.state.config.BOCHA_SEARCH_API_KEY, + "SERPSTACK_API_KEY": request.app.state.config.SERPSTACK_API_KEY, + "SERPSTACK_HTTPS": request.app.state.config.SERPSTACK_HTTPS, + "SERPER_API_KEY": request.app.state.config.SERPER_API_KEY, + "SERPLY_API_KEY": request.app.state.config.SERPLY_API_KEY, + "TAVILY_API_KEY": request.app.state.config.TAVILY_API_KEY, + "SEARCHAPI_API_KEY": request.app.state.config.SEARCHAPI_API_KEY, + "SEARCHAPI_ENGINE": request.app.state.config.SEARCHAPI_ENGINE, + "SERPAPI_API_KEY": request.app.state.config.SERPAPI_API_KEY, + "SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE, + "JINA_API_KEY": request.app.state.config.JINA_API_KEY, + "BING_SEARCH_V7_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT, + "BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, + "EXA_API_KEY": request.app.state.config.EXA_API_KEY, + "PERPLEXITY_API_KEY": request.app.state.config.PERPLEXITY_API_KEY, + "SOUGOU_API_SID": request.app.state.config.SOUGOU_API_SID, + "SOUGOU_API_SK": request.app.state.config.SOUGOU_API_SK, + "WEB_LOADER_ENGINE": request.app.state.config.WEB_LOADER_ENGINE, + "ENABLE_WEB_LOADER_SSL_VERIFICATION": request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, + "PLAYWRIGHT_WS_URL": request.app.state.config.PLAYWRIGHT_WS_URL, + "PLAYWRIGHT_TIMEOUT": request.app.state.config.PLAYWRIGHT_TIMEOUT, + "FIRECRAWL_API_KEY": request.app.state.config.FIRECRAWL_API_KEY, + "FIRECRAWL_API_BASE_URL": request.app.state.config.FIRECRAWL_API_BASE_URL, + "TAVILY_EXTRACT_DEPTH": request.app.state.config.TAVILY_EXTRACT_DEPTH, + "YOUTUBE_LOADER_LANGUAGE": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, + "YOUTUBE_LOADER_PROXY_URL": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, + "YOUTUBE_LOADER_TRANSLATION": request.app.state.YOUTUBE_LOADER_TRANSLATION, }, } -class FileConfig(BaseModel): - max_size: Optional[int] = None - max_count: Optional[int] = None - - -class DocumentIntelligenceConfigForm(BaseModel): - endpoint: str - key: str - - -class MistralOCRConfigForm(BaseModel): - api_key: str - - -class ContentExtractionConfig(BaseModel): - engine: str = "" - tika_server_url: Optional[str] = None - docling_server_url: Optional[str] = None - document_intelligence_config: Optional[DocumentIntelligenceConfigForm] = None - mistral_ocr_config: Optional[MistralOCRConfigForm] = None - - -class ChunkParamUpdateForm(BaseModel): - text_splitter: Optional[str] = None - chunk_size: int - chunk_overlap: int - - -class YoutubeLoaderConfig(BaseModel): - language: list[str] - translation: Optional[str] = None - proxy_url: str = "" - - -class WebSearchConfig(BaseModel): - engine: Optional[str] = None - searxng_query_url: Optional[str] = None - google_pse_api_key: Optional[str] = None - google_pse_engine_id: Optional[str] = None - brave_search_api_key: Optional[str] = None - kagi_search_api_key: Optional[str] = None - mojeek_search_api_key: Optional[str] = None - bocha_search_api_key: Optional[str] = None - serpstack_api_key: Optional[str] = None - serpstack_https: Optional[bool] = None - serper_api_key: Optional[str] = None - serply_api_key: Optional[str] = None - tavily_api_key: Optional[str] = None - searchapi_api_key: Optional[str] = None - searchapi_engine: Optional[str] = None - serpapi_api_key: Optional[str] = None - serpapi_engine: Optional[str] = None - jina_api_key: Optional[str] = None - bing_search_v7_endpoint: Optional[str] = None - bing_search_v7_subscription_key: Optional[str] = None - exa_api_key: Optional[str] = None - perplexity_api_key: Optional[str] = None - sougou_api_sid: Optional[str] = None - sougou_api_sk: Optional[str] = None - result_count: Optional[int] = None - concurrent_requests: Optional[int] = None - domain_filter_list: Optional[List[str]] = [] - - -class WebLoaderConfig(BaseModel): - engine: Optional[str] = None - enable_ssl_verification: Optional[bool] = None - trust_env: Optional[bool] = None - bypass_embedding_and_retrieval: Optional[bool] = None - playwright_ws_uri: Optional[str] = None - playwright_timeout: Optional[int] = None - firecrawl_api_key: Optional[str] = None - firecrawl_api_base_url: Optional[str] = None - tavily_api_key: Optional[str] = None - tavily_extract_depth: Optional[str] = None - youtube: Optional[YoutubeLoaderConfig] = None - - class WebConfig(BaseModel): - ENABLE_RAG_WEB_SEARCH: Optional[bool] = None - search: WebSearchConfig - loader: WebLoaderConfig + ENABLE_WEB_SEARCH: Optional[bool] = None + WEB_SEARCH_ENGINE: Optional[str] = None + WEB_SEARCH_TRUST_ENV: Optional[bool] = None + WEB_SEARCH_RESULT_COUNT: Optional[int] = None + WEB_SEARCH_CONCURRENT_REQUESTS: Optional[int] = None + WEB_SEARCH_DOMAIN_FILTER_LIST: Optional[List[str]] = [] + BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL: Optional[bool] = None + SEARXNG_QUERY_URL: Optional[str] = None + GOOGLE_PSE_API_KEY: Optional[str] = None + GOOGLE_PSE_ENGINE_ID: Optional[str] = None + BRAVE_SEARCH_API_KEY: Optional[str] = None + KAGI_SEARCH_API_KEY: Optional[str] = None + MOJEEK_SEARCH_API_KEY: Optional[str] = None + BOCHA_SEARCH_API_KEY: Optional[str] = None + SERPSTACK_API_KEY: Optional[str] = None + SERPSTACK_HTTPS: Optional[bool] = None + SERPER_API_KEY: Optional[str] = None + SERPLY_API_KEY: Optional[str] = None + TAVILY_API_KEY: Optional[str] = None + SEARCHAPI_API_KEY: Optional[str] = None + SEARCHAPI_ENGINE: Optional[str] = None + SERPAPI_API_KEY: Optional[str] = None + SERPAPI_ENGINE: Optional[str] = None + JINA_API_KEY: Optional[str] = None + BING_SEARCH_V7_ENDPOINT: Optional[str] = None + BING_SEARCH_V7_SUBSCRIPTION_KEY: Optional[str] = None + EXA_API_KEY: Optional[str] = None + PERPLEXITY_API_KEY: Optional[str] = None + SOUGOU_API_SID: Optional[str] = None + SOUGOU_API_SK: Optional[str] = None + WEB_LOADER_ENGINE: Optional[str] = None + ENABLE_WEB_LOADER_SSL_VERIFICATION: Optional[bool] = None + PLAYWRIGHT_WS_URL: Optional[str] = None + PLAYWRIGHT_TIMEOUT: Optional[int] = None + FIRECRAWL_API_KEY: Optional[str] = None + FIRECRAWL_API_BASE_URL: Optional[str] = None + TAVILY_EXTRACT_DEPTH: Optional[str] = None + YOUTUBE_LOADER_LANGUAGE: Optional[List[str]] = None + YOUTUBE_LOADER_PROXY_URL: Optional[str] = None + YOUTUBE_LOADER_TRANSLATION: Optional[str] = None -class ConfigUpdateForm(BaseModel): - RAG_FULL_CONTEXT: Optional[bool] = None +class ConfigForm(BaseModel): + # RAG settings + TEMPLATE: Optional[str] = None + TOP_K: Optional[int] = None BYPASS_EMBEDDING_AND_RETRIEVAL: Optional[bool] = None - pdf_extract_images: Optional[bool] = None - enable_google_drive_integration: Optional[bool] = None - enable_onedrive_integration: Optional[bool] = None - file: Optional[FileConfig] = None - content_extraction: Optional[ContentExtractionConfig] = None - chunk: Optional[ChunkParamUpdateForm] = None + RAG_FULL_CONTEXT: Optional[bool] = None + + # Hybrid search settings + ENABLE_RAG_HYBRID_SEARCH: Optional[bool] = None + TOP_K_RERANKER: Optional[int] = None + RELEVANCE_THRESHOLD: Optional[float] = None + + # Content extraction settings + CONTENT_EXTRACTION_ENGINE: Optional[str] = None + PDF_EXTRACT_IMAGES: Optional[bool] = None + TIKA_SERVER_URL: Optional[str] = None + DOCLING_SERVER_URL: Optional[str] = None + DOCUMENT_INTELLIGENCE_ENDPOINT: Optional[str] = None + DOCUMENT_INTELLIGENCE_KEY: Optional[str] = None + MISTRAL_OCR_API_KEY: Optional[str] = None + + # Chunking settings + TEXT_SPLITTER: Optional[str] = None + CHUNK_SIZE: Optional[int] = None + CHUNK_OVERLAP: Optional[int] = None + + # File upload settings + FILE_MAX_SIZE: Optional[int] = None + FILE_MAX_COUNT: Optional[int] = None + + # Integration settings + ENABLE_GOOGLE_DRIVE_INTEGRATION: Optional[bool] = None + ENABLE_ONEDRIVE_INTEGRATION: Optional[bool] = None + + # Web search settings web: Optional[WebConfig] = None @router.post("/config/update") async def update_rag_config( - request: Request, form_data: ConfigUpdateForm, user=Depends(get_admin_user) + request: Request, form_data: ConfigForm, user=Depends(get_admin_user) ): - request.app.state.config.PDF_EXTRACT_IMAGES = ( - form_data.pdf_extract_images - if form_data.pdf_extract_images is not None - else request.app.state.config.PDF_EXTRACT_IMAGES + # RAG settings + request.app.state.config.RAG_TEMPLATE = ( + form_data.TEMPLATE + if form_data.TEMPLATE is not None + else request.app.state.config.RAG_TEMPLATE + ) + request.app.state.config.TOP_K = ( + form_data.TOP_K + if form_data.TOP_K is not None + else request.app.state.config.TOP_K + ) + request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL = ( + form_data.BYPASS_EMBEDDING_AND_RETRIEVAL + if form_data.BYPASS_EMBEDDING_AND_RETRIEVAL is not None + else request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL ) - request.app.state.config.RAG_FULL_CONTEXT = ( form_data.RAG_FULL_CONTEXT if form_data.RAG_FULL_CONTEXT is not None else request.app.state.config.RAG_FULL_CONTEXT ) - request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL = ( - form_data.BYPASS_EMBEDDING_AND_RETRIEVAL - if form_data.BYPASS_EMBEDDING_AND_RETRIEVAL is not None - else request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL + # Hybrid search settings + request.app.state.config.ENABLE_RAG_HYBRID_SEARCH = ( + form_data.ENABLE_RAG_HYBRID_SEARCH + if form_data.ENABLE_RAG_HYBRID_SEARCH is not None + else request.app.state.config.ENABLE_RAG_HYBRID_SEARCH + ) + # Free up memory if hybrid search is disabled + if not request.app.state.config.ENABLE_RAG_HYBRID_SEARCH: + request.app.state.rf = None + + request.app.state.config.TOP_K_RERANKER = ( + form_data.TOP_K_RERANKER + if form_data.TOP_K_RERANKER is not None + else request.app.state.config.TOP_K_RERANKER + ) + request.app.state.config.RELEVANCE_THRESHOLD = ( + form_data.RELEVANCE_THRESHOLD + if form_data.RELEVANCE_THRESHOLD is not None + else request.app.state.config.RELEVANCE_THRESHOLD ) + # Content extraction settings + request.app.state.config.CONTENT_EXTRACTION_ENGINE = ( + form_data.CONTENT_EXTRACTION_ENGINE + if form_data.CONTENT_EXTRACTION_ENGINE is not None + else request.app.state.config.CONTENT_EXTRACTION_ENGINE + ) + request.app.state.config.PDF_EXTRACT_IMAGES = ( + form_data.PDF_EXTRACT_IMAGES + if form_data.PDF_EXTRACT_IMAGES is not None + else request.app.state.config.PDF_EXTRACT_IMAGES + ) + request.app.state.config.TIKA_SERVER_URL = ( + form_data.TIKA_SERVER_URL + if form_data.TIKA_SERVER_URL is not None + else request.app.state.config.TIKA_SERVER_URL + ) + request.app.state.config.DOCLING_SERVER_URL = ( + form_data.DOCLING_SERVER_URL + if form_data.DOCLING_SERVER_URL is not None + else request.app.state.config.DOCLING_SERVER_URL + ) + request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT = ( + form_data.DOCUMENT_INTELLIGENCE_ENDPOINT + if form_data.DOCUMENT_INTELLIGENCE_ENDPOINT is not None + else request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT + ) + request.app.state.config.DOCUMENT_INTELLIGENCE_KEY = ( + form_data.DOCUMENT_INTELLIGENCE_KEY + if form_data.DOCUMENT_INTELLIGENCE_KEY is not None + else request.app.state.config.DOCUMENT_INTELLIGENCE_KEY + ) + request.app.state.config.MISTRAL_OCR_API_KEY = ( + form_data.MISTRAL_OCR_API_KEY + if form_data.MISTRAL_OCR_API_KEY is not None + else request.app.state.config.MISTRAL_OCR_API_KEY + ) + + # Chunking settings + request.app.state.config.TEXT_SPLITTER = ( + form_data.TEXT_SPLITTER + if form_data.TEXT_SPLITTER is not None + else request.app.state.config.TEXT_SPLITTER + ) + request.app.state.config.CHUNK_SIZE = ( + form_data.CHUNK_SIZE + if form_data.CHUNK_SIZE is not None + else request.app.state.config.CHUNK_SIZE + ) + request.app.state.config.CHUNK_OVERLAP = ( + form_data.CHUNK_OVERLAP + if form_data.CHUNK_OVERLAP is not None + else request.app.state.config.CHUNK_OVERLAP + ) + + # File upload settings + request.app.state.config.FILE_MAX_SIZE = ( + form_data.FILE_MAX_SIZE + if form_data.FILE_MAX_SIZE is not None + else request.app.state.config.FILE_MAX_SIZE + ) + request.app.state.config.FILE_MAX_COUNT = ( + form_data.FILE_MAX_COUNT + if form_data.FILE_MAX_COUNT is not None + else request.app.state.config.FILE_MAX_COUNT + ) + + # Integration settings request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION = ( form_data.enable_google_drive_integration if form_data.enable_google_drive_integration is not None else request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION ) - request.app.state.config.ENABLE_ONEDRIVE_INTEGRATION = ( - form_data.enable_onedrive_integration - if form_data.enable_onedrive_integration is not None + form_data.ENABLE_ONEDRIVE_INTEGRATION + if form_data.ENABLE_ONEDRIVE_INTEGRATION is not None else request.app.state.config.ENABLE_ONEDRIVE_INTEGRATION ) - if form_data.file is not None: - request.app.state.config.FILE_MAX_SIZE = form_data.file.max_size - request.app.state.config.FILE_MAX_COUNT = form_data.file.max_count - - if form_data.content_extraction is not None: - log.info( - f"Updating content extraction: {request.app.state.config.CONTENT_EXTRACTION_ENGINE} to {form_data.content_extraction.engine}" - ) - request.app.state.config.CONTENT_EXTRACTION_ENGINE = ( - form_data.content_extraction.engine - ) - request.app.state.config.TIKA_SERVER_URL = ( - form_data.content_extraction.tika_server_url - ) - request.app.state.config.DOCLING_SERVER_URL = ( - form_data.content_extraction.docling_server_url - ) - if form_data.content_extraction.document_intelligence_config is not None: - request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT = ( - form_data.content_extraction.document_intelligence_config.endpoint - ) - request.app.state.config.DOCUMENT_INTELLIGENCE_KEY = ( - form_data.content_extraction.document_intelligence_config.key - ) - if form_data.content_extraction.mistral_ocr_config is not None: - request.app.state.config.MISTRAL_OCR_API_KEY = ( - form_data.content_extraction.mistral_ocr_config.api_key - ) - - if form_data.chunk is not None: - request.app.state.config.TEXT_SPLITTER = form_data.chunk.text_splitter - request.app.state.config.CHUNK_SIZE = form_data.chunk.chunk_size - request.app.state.config.CHUNK_OVERLAP = form_data.chunk.chunk_overlap - if form_data.web is not None: - request.app.state.config.ENABLE_RAG_WEB_SEARCH = ( - form_data.web.ENABLE_RAG_WEB_SEARCH + # Web search settings + request.app.state.config.ENABLE_WEB_SEARCH = form_data.web.ENABLE_WEB_SEARCH + request.app.state.config.WEB_SEARCH_ENGINE = form_data.web.WEB_SEARCH_ENGINE + request.app.state.config.WEB_SEARCH_TRUST_ENV = ( + form_data.web.WEB_SEARCH_TRUST_ENV ) - - request.app.state.config.RAG_WEB_SEARCH_ENGINE = form_data.web.search.engine - request.app.state.config.SEARXNG_QUERY_URL = ( - form_data.web.search.searxng_query_url + request.app.state.config.WEB_SEARCH_RESULT_COUNT = ( + form_data.web.WEB_SEARCH_RESULT_COUNT ) - request.app.state.config.GOOGLE_PSE_API_KEY = ( - form_data.web.search.google_pse_api_key + request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS = ( + form_data.web.WEB_SEARCH_CONCURRENT_REQUESTS ) - request.app.state.config.GOOGLE_PSE_ENGINE_ID = ( - form_data.web.search.google_pse_engine_id - ) - request.app.state.config.BRAVE_SEARCH_API_KEY = ( - form_data.web.search.brave_search_api_key - ) - request.app.state.config.KAGI_SEARCH_API_KEY = ( - form_data.web.search.kagi_search_api_key - ) - request.app.state.config.MOJEEK_SEARCH_API_KEY = ( - form_data.web.search.mojeek_search_api_key - ) - request.app.state.config.BOCHA_SEARCH_API_KEY = ( - form_data.web.search.bocha_search_api_key - ) - request.app.state.config.SERPSTACK_API_KEY = ( - form_data.web.search.serpstack_api_key - ) - request.app.state.config.SERPSTACK_HTTPS = form_data.web.search.serpstack_https - request.app.state.config.SERPER_API_KEY = form_data.web.search.serper_api_key - request.app.state.config.SERPLY_API_KEY = form_data.web.search.serply_api_key - request.app.state.config.TAVILY_API_KEY = form_data.web.search.tavily_api_key - request.app.state.config.SEARCHAPI_API_KEY = ( - form_data.web.search.searchapi_api_key - ) - request.app.state.config.SEARCHAPI_ENGINE = ( - form_data.web.search.searchapi_engine - ) - request.app.state.config.SERPAPI_API_KEY = form_data.web.search.serpapi_api_key - request.app.state.config.SERPAPI_ENGINE = form_data.web.search.serpapi_engine - request.app.state.config.JINA_API_KEY = form_data.web.search.jina_api_key - request.app.state.config.BING_SEARCH_V7_ENDPOINT = ( - form_data.web.search.bing_search_v7_endpoint - ) - request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = ( - form_data.web.search.bing_search_v7_subscription_key - ) - request.app.state.config.EXA_API_KEY = form_data.web.search.exa_api_key - request.app.state.config.PERPLEXITY_API_KEY = ( - form_data.web.search.perplexity_api_key - ) - request.app.state.config.SOUGOU_API_SID = form_data.web.search.sougou_api_sid - request.app.state.config.SOUGOU_API_SK = form_data.web.search.sougou_api_sk - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = ( - form_data.web.search.result_count - ) - 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 - ) - - request.app.state.config.RAG_WEB_LOADER_ENGINE = form_data.web.loader.engine - request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION = ( - # Note: When UI "Bypass SSL verification for Websites"=True then ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION=False - form_data.web.loader.enable_ssl_verification - ) - request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV = ( - form_data.web.loader.trust_env + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST = ( + form_data.web.WEB_SEARCH_DOMAIN_FILTER_LIST ) request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL = ( - form_data.web.loader.bypass_embedding_and_retrieval + form_data.web.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL ) - request.app.state.config.PLAYWRIGHT_WS_URI = ( - form_data.web.loader.playwright_ws_uri + request.app.state.config.SEARXNG_QUERY_URL = form_data.web.SEARXNG_QUERY_URL + request.app.state.config.GOOGLE_PSE_API_KEY = form_data.web.GOOGLE_PSE_API_KEY + request.app.state.config.GOOGLE_PSE_ENGINE_ID = ( + form_data.web.GOOGLE_PSE_ENGINE_ID ) - request.app.state.config.PLAYWRIGHT_TIMEOUT = ( - form_data.web.loader.playwright_timeout + request.app.state.config.BRAVE_SEARCH_API_KEY = ( + form_data.web.BRAVE_SEARCH_API_KEY ) - request.app.state.config.FIRECRAWL_API_KEY = ( - form_data.web.loader.firecrawl_api_key + request.app.state.config.KAGI_SEARCH_API_KEY = form_data.web.KAGI_SEARCH_API_KEY + request.app.state.config.MOJEEK_SEARCH_API_KEY = ( + form_data.web.MOJEEK_SEARCH_API_KEY ) + request.app.state.config.BOCHA_SEARCH_API_KEY = ( + form_data.web.BOCHA_SEARCH_API_KEY + ) + request.app.state.config.SERPSTACK_API_KEY = form_data.web.SERPSTACK_API_KEY + request.app.state.config.SERPSTACK_HTTPS = form_data.web.SERPSTACK_HTTPS + request.app.state.config.SERPER_API_KEY = form_data.web.SERPER_API_KEY + request.app.state.config.SERPLY_API_KEY = form_data.web.SERPLY_API_KEY + request.app.state.config.TAVILY_API_KEY = form_data.web.TAVILY_API_KEY + request.app.state.config.SEARCHAPI_API_KEY = form_data.web.SEARCHAPI_API_KEY + request.app.state.config.SEARCHAPI_ENGINE = form_data.web.SEARCHAPI_ENGINE + request.app.state.config.SERPAPI_API_KEY = form_data.web.SERPAPI_API_KEY + request.app.state.config.SERPAPI_ENGINE = form_data.web.SERPAPI_ENGINE + request.app.state.config.JINA_API_KEY = form_data.web.JINA_API_KEY + request.app.state.config.BING_SEARCH_V7_ENDPOINT = ( + form_data.web.BING_SEARCH_V7_ENDPOINT + ) + request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = ( + form_data.web.BING_SEARCH_V7_SUBSCRIPTION_KEY + ) + request.app.state.config.EXA_API_KEY = form_data.web.EXA_API_KEY + request.app.state.config.PERPLEXITY_API_KEY = form_data.web.PERPLEXITY_API_KEY + request.app.state.config.SOUGOU_API_SID = form_data.web.SOUGOU_API_SID + request.app.state.config.SOUGOU_API_SK = form_data.web.SOUGOU_API_SK + + # Web loader settings + request.app.state.config.WEB_LOADER_ENGINE = form_data.web.WEB_LOADER_ENGINE + request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION = ( + form_data.web.ENABLE_WEB_LOADER_SSL_VERIFICATION + ) + request.app.state.config.PLAYWRIGHT_WS_URL = form_data.web.PLAYWRIGHT_WS_URL + request.app.state.config.PLAYWRIGHT_TIMEOUT = form_data.web.PLAYWRIGHT_TIMEOUT + request.app.state.config.FIRECRAWL_API_KEY = form_data.web.FIRECRAWL_API_KEY request.app.state.config.FIRECRAWL_API_BASE_URL = ( - form_data.web.loader.firecrawl_api_base_url + form_data.web.FIRECRAWL_API_BASE_URL ) - request.app.state.config.TAVILY_API_KEY = form_data.web.loader.tavily_api_key request.app.state.config.TAVILY_EXTRACT_DEPTH = ( - form_data.web.loader.tavily_extract_depth + form_data.web.TAVILY_EXTRACT_DEPTH ) request.app.state.config.YOUTUBE_LOADER_LANGUAGE = ( - form_data.web.loader.youtube.language + form_data.web.YOUTUBE_LOADER_LANGUAGE ) request.app.state.config.YOUTUBE_LOADER_PROXY_URL = ( - form_data.web.loader.youtube.proxy_url + form_data.web.YOUTUBE_LOADER_PROXY_URL ) - request.app.state.YOUTUBE_LOADER_TRANSLATION = ( - form_data.web.loader.youtube.translation + request.app.state.config.YOUTUBE_LOADER_TRANSLATION = ( + form_data.web.YOUTUBE_LOADER_TRANSLATION ) return { "status": True, - "pdf_extract_images": request.app.state.config.PDF_EXTRACT_IMAGES, - "RAG_FULL_CONTEXT": request.app.state.config.RAG_FULL_CONTEXT, "BYPASS_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_EMBEDDING_AND_RETRIEVAL, - "file": { - "max_size": request.app.state.config.FILE_MAX_SIZE, - "max_count": request.app.state.config.FILE_MAX_COUNT, - }, - "content_extraction": { - "engine": request.app.state.config.CONTENT_EXTRACTION_ENGINE, - "tika_server_url": request.app.state.config.TIKA_SERVER_URL, - "docling_server_url": request.app.state.config.DOCLING_SERVER_URL, - "document_intelligence_config": { - "endpoint": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT, - "key": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY, - }, - "mistral_ocr_config": { - "api_key": request.app.state.config.MISTRAL_OCR_API_KEY, - }, - }, - "chunk": { - "text_splitter": request.app.state.config.TEXT_SPLITTER, - "chunk_size": request.app.state.config.CHUNK_SIZE, - "chunk_overlap": request.app.state.config.CHUNK_OVERLAP, - }, + "RAG_FULL_CONTEXT": request.app.state.config.RAG_FULL_CONTEXT, + # Content extraction settings + "CONTENT_EXTRACTION_ENGINE": request.app.state.config.CONTENT_EXTRACTION_ENGINE, + "PDF_EXTRACT_IMAGES": request.app.state.config.PDF_EXTRACT_IMAGES, + "TIKA_SERVER_URL": request.app.state.config.TIKA_SERVER_URL, + "DOCLING_SERVER_URL": request.app.state.config.DOCLING_SERVER_URL, + "DOCUMENT_INTELLIGENCE_ENDPOINT": request.app.state.config.DOCUMENT_INTELLIGENCE_ENDPOINT, + "DOCUMENT_INTELLIGENCE_KEY": request.app.state.config.DOCUMENT_INTELLIGENCE_KEY, + "MISTRAL_OCR_API_KEY": request.app.state.config.MISTRAL_OCR_API_KEY, + # Chunking settings + "TEXT_SPLITTER": request.app.state.config.TEXT_SPLITTER, + "CHUNK_SIZE": request.app.state.config.CHUNK_SIZE, + "CHUNK_OVERLAP": request.app.state.config.CHUNK_OVERLAP, + # File upload settings + "FILE_MAX_SIZE": request.app.state.config.FILE_MAX_SIZE, + "FILE_MAX_COUNT": request.app.state.config.FILE_MAX_COUNT, + # Integration settings + "ENABLE_GOOGLE_DRIVE_INTEGRATION": request.app.state.config.ENABLE_GOOGLE_DRIVE_INTEGRATION, + "ENABLE_ONEDRIVE_INTEGRATION": request.app.state.config.ENABLE_ONEDRIVE_INTEGRATION, + # Web search settings "web": { - "ENABLE_RAG_WEB_SEARCH": request.app.state.config.ENABLE_RAG_WEB_SEARCH, - "search": { - "engine": request.app.state.config.RAG_WEB_SEARCH_ENGINE, - "searxng_query_url": request.app.state.config.SEARXNG_QUERY_URL, - "google_pse_api_key": request.app.state.config.GOOGLE_PSE_API_KEY, - "google_pse_engine_id": request.app.state.config.GOOGLE_PSE_ENGINE_ID, - "brave_search_api_key": request.app.state.config.BRAVE_SEARCH_API_KEY, - "kagi_search_api_key": request.app.state.config.KAGI_SEARCH_API_KEY, - "mojeek_search_api_key": request.app.state.config.MOJEEK_SEARCH_API_KEY, - "bocha_search_api_key": request.app.state.config.BOCHA_SEARCH_API_KEY, - "serpstack_api_key": request.app.state.config.SERPSTACK_API_KEY, - "serpstack_https": request.app.state.config.SERPSTACK_HTTPS, - "serper_api_key": request.app.state.config.SERPER_API_KEY, - "serply_api_key": request.app.state.config.SERPLY_API_KEY, - "tavily_api_key": request.app.state.config.TAVILY_API_KEY, - "searchapi_api_key": request.app.state.config.SEARCHAPI_API_KEY, - "searchapi_engine": request.app.state.config.SEARCHAPI_ENGINE, - "serpapi_api_key": request.app.state.config.SERPAPI_API_KEY, - "serpapi_engine": request.app.state.config.SERPAPI_ENGINE, - "jina_api_key": request.app.state.config.JINA_API_KEY, - "bing_search_v7_endpoint": request.app.state.config.BING_SEARCH_V7_ENDPOINT, - "bing_search_v7_subscription_key": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, - "exa_api_key": request.app.state.config.EXA_API_KEY, - "perplexity_api_key": request.app.state.config.PERPLEXITY_API_KEY, - "sougou_api_sid": request.app.state.config.SOUGOU_API_SID, - "sougou_api_sk": request.app.state.config.SOUGOU_API_SK, - "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, - }, - "loader": { - "engine": request.app.state.config.RAG_WEB_LOADER_ENGINE, - "enable_ssl_verification": request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - "trust_env": request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, - "bypass_embedding_and_retrieval": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, - "playwright_ws_uri": request.app.state.config.PLAYWRIGHT_WS_URI, - "playwright_timeout": request.app.state.config.PLAYWRIGHT_TIMEOUT, - "firecrawl_api_key": request.app.state.config.FIRECRAWL_API_KEY, - "firecrawl_api_base_url": request.app.state.config.FIRECRAWL_API_BASE_URL, - "tavily_api_key": request.app.state.config.TAVILY_API_KEY, - "tavily_extract_depth": request.app.state.config.TAVILY_EXTRACT_DEPTH, - "youtube": { - "language": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, - "proxy_url": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, - "translation": request.app.state.YOUTUBE_LOADER_TRANSLATION, - }, - }, + "ENABLE_WEB_SEARCH": request.app.state.config.ENABLE_WEB_SEARCH, + "WEB_SEARCH_ENGINE": request.app.state.config.WEB_SEARCH_ENGINE, + "WEB_SEARCH_TRUST_ENV": request.app.state.config.WEB_SEARCH_TRUST_ENV, + "WEB_SEARCH_RESULT_COUNT": request.app.state.config.WEB_SEARCH_RESULT_COUNT, + "WEB_SEARCH_CONCURRENT_REQUESTS": request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, + "WEB_SEARCH_DOMAIN_FILTER_LIST": request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, + "BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL": request.app.state.config.BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + "SEARXNG_QUERY_URL": request.app.state.config.SEARXNG_QUERY_URL, + "GOOGLE_PSE_API_KEY": request.app.state.config.GOOGLE_PSE_API_KEY, + "GOOGLE_PSE_ENGINE_ID": request.app.state.config.GOOGLE_PSE_ENGINE_ID, + "BRAVE_SEARCH_API_KEY": request.app.state.config.BRAVE_SEARCH_API_KEY, + "KAGI_SEARCH_API_KEY": request.app.state.config.KAGI_SEARCH_API_KEY, + "MOJEEK_SEARCH_API_KEY": request.app.state.config.MOJEEK_SEARCH_API_KEY, + "BOCHA_SEARCH_API_KEY": request.app.state.config.BOCHA_SEARCH_API_KEY, + "SERPSTACK_API_KEY": request.app.state.config.SERPSTACK_API_KEY, + "SERPSTACK_HTTPS": request.app.state.config.SERPSTACK_HTTPS, + "SERPER_API_KEY": request.app.state.config.SERPER_API_KEY, + "SERPLY_API_KEY": request.app.state.config.SERPLY_API_KEY, + "TAVILY_API_KEY": request.app.state.config.TAVILY_API_KEY, + "SEARCHAPI_API_KEY": request.app.state.config.SEARCHAPI_API_KEY, + "SEARCHAPI_ENGINE": request.app.state.config.SEARCHAPI_ENGINE, + "SERPAPI_API_KEY": request.app.state.config.SERPAPI_API_KEY, + "SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE, + "JINA_API_KEY": request.app.state.config.JINA_API_KEY, + "BING_SEARCH_V7_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT, + "BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, + "EXA_API_KEY": request.app.state.config.EXA_API_KEY, + "PERPLEXITY_API_KEY": request.app.state.config.PERPLEXITY_API_KEY, + "SOUGOU_API_SID": request.app.state.config.SOUGOU_API_SID, + "SOUGOU_API_SK": request.app.state.config.SOUGOU_API_SK, + "WEB_LOADER_ENGINE": request.app.state.config.WEB_LOADER_ENGINE, + "ENABLE_WEB_LOADER_SSL_VERIFICATION": request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, + "PLAYWRIGHT_WS_URL": request.app.state.config.PLAYWRIGHT_WS_URL, + "PLAYWRIGHT_TIMEOUT": request.app.state.config.PLAYWRIGHT_TIMEOUT, + "FIRECRAWL_API_KEY": request.app.state.config.FIRECRAWL_API_KEY, + "FIRECRAWL_API_BASE_URL": request.app.state.config.FIRECRAWL_API_BASE_URL, + "TAVILY_EXTRACT_DEPTH": request.app.state.config.TAVILY_EXTRACT_DEPTH, + "YOUTUBE_LOADER_LANGUAGE": request.app.state.config.YOUTUBE_LOADER_LANGUAGE, + "YOUTUBE_LOADER_PROXY_URL": request.app.state.config.YOUTUBE_LOADER_PROXY_URL, + "YOUTUBE_LOADER_TRANSLATION": request.app.state.YOUTUBE_LOADER_TRANSLATION, }, } -@router.get("/template") -async def get_rag_template(request: Request, user=Depends(get_verified_user)): - return { - "status": True, - "template": request.app.state.config.RAG_TEMPLATE, - } - - -@router.get("/query/settings") -async def get_query_settings(request: Request, user=Depends(get_admin_user)): - return { - "status": True, - "template": request.app.state.config.RAG_TEMPLATE, - "k": request.app.state.config.TOP_K, - "k_reranker": request.app.state.config.TOP_K_RERANKER, - "r": request.app.state.config.RELEVANCE_THRESHOLD, - "hybrid": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, - } - - -class QuerySettingsForm(BaseModel): - k: Optional[int] = None - k_reranker: Optional[int] = None - r: Optional[float] = None - template: Optional[str] = None - hybrid: Optional[bool] = None - - -@router.post("/query/settings/update") -async def update_query_settings( - request: Request, form_data: QuerySettingsForm, user=Depends(get_admin_user) -): - request.app.state.config.RAG_TEMPLATE = form_data.template - request.app.state.config.TOP_K = form_data.k if form_data.k else 4 - request.app.state.config.TOP_K_RERANKER = form_data.k_reranker or 4 - request.app.state.config.RELEVANCE_THRESHOLD = form_data.r if form_data.r else 0.0 - - request.app.state.config.ENABLE_RAG_HYBRID_SEARCH = ( - form_data.hybrid if form_data.hybrid else False - ) - - if not request.app.state.config.ENABLE_RAG_HYBRID_SEARCH: - request.app.state.rf = None - - return { - "status": True, - "template": request.app.state.config.RAG_TEMPLATE, - "k": request.app.state.config.TOP_K, - "k_reranker": request.app.state.config.TOP_K_RERANKER, - "r": request.app.state.config.RELEVANCE_THRESHOLD, - "hybrid": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH, - } - - #################################### # # Document process and retrieval @@ -1268,8 +1218,8 @@ def process_web( loader = get_web_loader( form_data.url, - verify_ssl=request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - requests_per_second=request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, + verify_ssl=request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, + requests_per_second=request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, ) docs = loader.load() content = " ".join([doc.page_content for doc in docs]) @@ -1333,8 +1283,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_searxng( request.app.state.config.SEARXNG_QUERY_URL, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No SEARXNG_QUERY_URL found in environment variables") @@ -1347,8 +1297,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: request.app.state.config.GOOGLE_PSE_API_KEY, request.app.state.config.GOOGLE_PSE_ENGINE_ID, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception( @@ -1359,8 +1309,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_brave( request.app.state.config.BRAVE_SEARCH_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No BRAVE_SEARCH_API_KEY found in environment variables") @@ -1369,8 +1319,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_kagi( request.app.state.config.KAGI_SEARCH_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No KAGI_SEARCH_API_KEY found in environment variables") @@ -1379,8 +1329,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_mojeek( request.app.state.config.MOJEEK_SEARCH_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No MOJEEK_SEARCH_API_KEY found in environment variables") @@ -1389,8 +1339,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_bocha( request.app.state.config.BOCHA_SEARCH_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No BOCHA_SEARCH_API_KEY found in environment variables") @@ -1399,8 +1349,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_serpstack( request.app.state.config.SERPSTACK_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, https_enabled=request.app.state.config.SERPSTACK_HTTPS, ) else: @@ -1410,8 +1360,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_serper( request.app.state.config.SERPER_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No SERPER_API_KEY found in environment variables") @@ -1420,24 +1370,24 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_serply( request.app.state.config.SERPLY_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No SERPLY_API_KEY found in environment variables") elif engine == "duckduckgo": return search_duckduckgo( query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) elif engine == "tavily": if request.app.state.config.TAVILY_API_KEY: return search_tavily( request.app.state.config.TAVILY_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No TAVILY_API_KEY found in environment variables") @@ -1447,8 +1397,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: request.app.state.config.SEARCHAPI_API_KEY, request.app.state.config.SEARCHAPI_ENGINE, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No SEARCHAPI_API_KEY found in environment variables") @@ -1458,8 +1408,8 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: request.app.state.config.SERPAPI_API_KEY, request.app.state.config.SERPAPI_ENGINE, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: raise Exception("No SERPAPI_API_KEY found in environment variables") @@ -1467,7 +1417,7 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: return search_jina( request.app.state.config.JINA_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, ) elif engine == "bing": return search_bing( @@ -1475,34 +1425,39 @@ def search_web(request: Request, engine: str, query: str) -> list[SearchResult]: request.app.state.config.BING_SEARCH_V7_ENDPOINT, str(DEFAULT_LOCALE), query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) elif engine == "exa": return search_exa( request.app.state.config.EXA_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) elif engine == "perplexity": return search_perplexity( request.app.state.config.PERPLEXITY_API_KEY, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) - elif engine == 'sougou': - if request.app.state.config.SOUGOU_API_SID and request.app.state.config.SOUGOU_API_SK: + elif engine == "sougou": + if ( + request.app.state.config.SOUGOU_API_SID + and request.app.state.config.SOUGOU_API_SK + ): return search_sougou( request.app.state.config.SOUGOU_API_SID, request.app.state.config.SOUGOU_API_SK, query, - request.app.state.config.RAG_WEB_SEARCH_RESULT_COUNT, - request.app.state.config.RAG_WEB_SEARCH_DOMAIN_FILTER_LIST, + request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.WEB_SEARCH_DOMAIN_FILTER_LIST, ) else: - raise Exception("No SOUGOU_API_SID or SOUGOU_API_SK found in environment variables") + raise Exception( + "No SOUGOU_API_SID or SOUGOU_API_SK found in environment variables" + ) else: raise Exception("No search engine API key found in environment variables") @@ -1513,10 +1468,10 @@ async def process_web_search( ): try: logging.info( - f"trying to web search with {request.app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query}" + f"trying to web search with {request.app.state.config.WEB_SEARCH_ENGINE, form_data.query}" ) web_results = search_web( - request, request.app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query + request, request.app.state.config.WEB_SEARCH_ENGINE, form_data.query ) except Exception as e: log.exception(e) @@ -1532,9 +1487,9 @@ async def process_web_search( urls = [result.link for result in web_results] loader = get_web_loader( urls, - verify_ssl=request.app.state.config.ENABLE_RAG_WEB_LOADER_SSL_VERIFICATION, - requests_per_second=request.app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS, - trust_env=request.app.state.config.RAG_WEB_SEARCH_TRUST_ENV, + verify_ssl=request.app.state.config.ENABLE_WEB_LOADER_SSL_VERIFICATION, + requests_per_second=request.app.state.config.WEB_SEARCH_CONCURRENT_REQUESTS, + trust_env=request.app.state.config.WEB_SEARCH_TRUST_ENV, ) docs = await loader.aload() urls = [ diff --git a/backend/start.sh b/backend/start.sh index b9a30fd3d..4588e4c34 100755 --- a/backend/start.sh +++ b/backend/start.sh @@ -4,8 +4,8 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) cd "$SCRIPT_DIR" || exit # Add conditional Playwright browser installation -if [[ "${RAG_WEB_LOADER_ENGINE,,}" == "playwright" ]]; then - if [[ -z "${PLAYWRIGHT_WS_URI}" ]]; then +if [[ "${WEB_LOADER_ENGINE,,}" == "playwright" ]]; then + if [[ -z "${PLAYWRIGHT_WS_URL}" ]]; then echo "Installing Playwright browsers..." playwright install chromium playwright install-deps chromium diff --git a/backend/start_windows.bat b/backend/start_windows.bat index 661ecc494..8d9aae3ac 100644 --- a/backend/start_windows.bat +++ b/backend/start_windows.bat @@ -7,8 +7,8 @@ SET "SCRIPT_DIR=%~dp0" cd /d "%SCRIPT_DIR%" || exit /b :: Add conditional Playwright browser installation -IF /I "%RAG_WEB_LOADER_ENGINE%" == "playwright" ( - IF "%PLAYWRIGHT_WS_URI%" == "" ( +IF /I "%WEB_LOADER_ENGINE%" == "playwright" ( + IF "%PLAYWRIGHT_WS_URL%" == "" ( echo Installing Playwright browsers... playwright install chromium playwright install-deps chromium diff --git a/docker-compose.playwright.yaml b/docker-compose.playwright.yaml index fe570bed0..fa2b49ff9 100644 --- a/docker-compose.playwright.yaml +++ b/docker-compose.playwright.yaml @@ -6,5 +6,5 @@ services: open-webui: environment: - - 'RAG_WEB_LOADER_ENGINE=playwright' - - 'PLAYWRIGHT_WS_URI=ws://playwright:3000' \ No newline at end of file + - 'WEB_LOADER_ENGINE=playwright' + - 'PLAYWRIGHT_WS_URL=ws://playwright:3000' diff --git a/src/lib/apis/retrieval/index.ts b/src/lib/apis/retrieval/index.ts index 31317fe0b..f4b937b68 100644 --- a/src/lib/apis/retrieval/index.ts +++ b/src/lib/apis/retrieval/index.ts @@ -50,9 +50,9 @@ type YoutubeConfigForm = { }; type RAGConfigForm = { - pdf_extract_images?: boolean; - enable_google_drive_integration?: boolean; - enable_onedrive_integration?: boolean; + PDF_EXTRACT_IMAGES?: boolean; + ENABLE_GOOGLE_DRIVE_INTEGRATION?: boolean; + ENABLE_ONEDRIVE_INTEGRATION?: boolean; chunk?: ChunkConfigForm; content_extraction?: ContentExtractConfigForm; web_loader_ssl_verification?: boolean; @@ -89,33 +89,6 @@ export const updateRAGConfig = async (token: string, payload: RAGConfigForm) => return res; }; -export const getRAGTemplate = async (token: string) => { - let error = null; - - const res = await fetch(`${RETRIEVAL_API_BASE_URL}/template`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${token}` - } - }) - .then(async (res) => { - if (!res.ok) throw await res.json(); - return res.json(); - }) - .catch((err) => { - console.log(err); - error = err.detail; - return null; - }); - - if (error) { - throw error; - } - - return res?.template ?? ''; -}; - export const getQuerySettings = async (token: string) => { let error = null; diff --git a/src/lib/components/admin/Settings/Documents.svelte b/src/lib/components/admin/Settings/Documents.svelte index 97c62c6a4..2047a07e7 100644 --- a/src/lib/components/admin/Settings/Documents.svelte +++ b/src/lib/components/admin/Settings/Documents.svelte @@ -17,8 +17,8 @@ updateRAGConfig } from '$lib/apis/retrieval'; - import { reindexKnowledgeFiles} from '$lib/apis/knowledge'; - import { deleteAllFiles } from '$lib/apis/files'; + import { reindexKnowledgeFiles } from '$lib/apis/knowledge'; + import { deleteAllFiles } from '$lib/apis/files'; import ResetUploadDirConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; import ResetVectorDBConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; @@ -27,6 +27,7 @@ import Tooltip from '$lib/components/common/Tooltip.svelte'; import Switch from '$lib/components/common/Switch.svelte'; import Textarea from '$lib/components/common/Textarea.svelte'; + import Spinner from '$lib/components/common/Spinner.svelte'; const i18n = getContext('i18n'); @@ -42,31 +43,6 @@ let embeddingBatchSize = 1; let rerankingModel = ''; - let fileMaxSize = null; - let fileMaxCount = null; - - let contentExtractionEngine = 'default'; - let tikaServerUrl = ''; - let showTikaServerUrl = false; - let doclingServerUrl = ''; - let showDoclingServerUrl = false; - let documentIntelligenceEndpoint = ''; - let documentIntelligenceKey = ''; - let showDocumentIntelligenceConfig = false; - let mistralApiKey = ''; - let showMistralOcrConfig = false; - - let textSplitter = ''; - let chunkSize = 0; - let chunkOverlap = 0; - let pdfExtractImages = true; - - let RAG_FULL_CONTEXT = false; - let BYPASS_EMBEDDING_AND_RETRIEVAL = false; - - let enableGoogleDriveIntegration = false; - let enableOneDriveIntegration = false; - let OpenAIUrl = ''; let OpenAIKey = ''; @@ -81,6 +57,8 @@ hybrid: false }; + let RAGConfig = null; + const embeddingModelUpdateHandler = async () => { if (embeddingEngine === '' && embeddingModel.split('/').length - 1 > 1) { toast.error( @@ -175,65 +153,40 @@ }; const submitHandler = async () => { - if (contentExtractionEngine === 'tika' && tikaServerUrl === '') { + if (RAGConfig.CONTENT_EXTRACTION_ENGINE === 'tika' && RAGConfig.TIKA_SERVER_URL === '') { toast.error($i18n.t('Tika Server URL required.')); return; } - if (contentExtractionEngine === 'docling' && doclingServerUrl === '') { + if (RAGConfig.CONTENT_EXTRACTION_ENGINE === 'docling' && RAGConfig.DOCLING_SERVER_URL === '') { toast.error($i18n.t('Docling Server URL required.')); return; } + if ( - contentExtractionEngine === 'document_intelligence' && - (documentIntelligenceEndpoint === '' || documentIntelligenceKey === '') + RAGConfig.CONTENT_EXTRACTION_ENGINE === 'document_intelligence' && + (RAGConfig.DOCUMENT_INTELLIGENCE_ENDPOINT === '' || + RAGConfig.DOCUMENT_INTELLIGENCE_KEY === '') ) { toast.error($i18n.t('Document Intelligence endpoint and key required.')); return; } - if (contentExtractionEngine === 'mistral_ocr' && mistralApiKey === '') { + if ( + RAGConfig.CONTENT_EXTRACTION_ENGINE === 'mistral_ocr' && + RAGConfig.MISTRAL_OCR_API_KEY === '' + ) { toast.error($i18n.t('Mistral OCR API Key required.')); return; } - if (!BYPASS_EMBEDDING_AND_RETRIEVAL) { + if (!RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL) { await embeddingModelUpdateHandler(); - if (querySettings.hybrid) { + if (RAGConfig.ENABLE_RAG_HYBRID_SEARCH) { await rerankingModelUpdateHandler(); } } - const res = await updateRAGConfig(localStorage.token, { - pdf_extract_images: pdfExtractImages, - enable_google_drive_integration: enableGoogleDriveIntegration, - enable_onedrive_integration: enableOneDriveIntegration, - file: { - max_size: fileMaxSize === '' ? null : fileMaxSize, - max_count: fileMaxCount === '' ? null : fileMaxCount - }, - RAG_FULL_CONTEXT: RAG_FULL_CONTEXT, - BYPASS_EMBEDDING_AND_RETRIEVAL: BYPASS_EMBEDDING_AND_RETRIEVAL, - chunk: { - text_splitter: textSplitter, - chunk_overlap: chunkOverlap, - chunk_size: chunkSize - }, - content_extraction: { - engine: contentExtractionEngine, - tika_server_url: tikaServerUrl, - docling_server_url: doclingServerUrl, - document_intelligence_config: { - key: documentIntelligenceKey, - endpoint: documentIntelligenceEndpoint - }, - mistral_ocr_config: { - api_key: mistralApiKey - } - } - }); - - await updateQuerySettings(localStorage.token, querySettings); - + const res = await updateRAGConfig(localStorage.token, RAGConfig); dispatch('save'); }; @@ -261,46 +214,11 @@ } }; - const toggleHybridSearch = async () => { - querySettings = await updateQuerySettings(localStorage.token, querySettings); - }; - onMount(async () => { await setEmbeddingConfig(); await setRerankingConfig(); - querySettings = await getQuerySettings(localStorage.token); - - const res = await getRAGConfig(localStorage.token); - - if (res) { - pdfExtractImages = res.pdf_extract_images; - - textSplitter = res.chunk.text_splitter; - chunkSize = res.chunk.chunk_size; - chunkOverlap = res.chunk.chunk_overlap; - - RAG_FULL_CONTEXT = res.RAG_FULL_CONTEXT; - BYPASS_EMBEDDING_AND_RETRIEVAL = res.BYPASS_EMBEDDING_AND_RETRIEVAL; - - contentExtractionEngine = res.content_extraction.engine; - tikaServerUrl = res.content_extraction.tika_server_url; - doclingServerUrl = res.content_extraction.docling_server_url; - - showTikaServerUrl = contentExtractionEngine === 'tika'; - showDoclingServerUrl = contentExtractionEngine === 'docling'; - documentIntelligenceEndpoint = res.content_extraction.document_intelligence_config.endpoint; - documentIntelligenceKey = res.content_extraction.document_intelligence_config.key; - showDocumentIntelligenceConfig = contentExtractionEngine === 'document_intelligence'; - mistralApiKey = res.content_extraction.mistral_ocr_config.api_key; - showMistralOcrConfig = contentExtractionEngine === 'mistral_ocr'; - - fileMaxSize = res?.file.max_size ?? ''; - fileMaxCount = res?.file.max_count ?? ''; - - enableGoogleDriveIntegration = res.enable_google_drive_integration; - enableOneDriveIntegration = res.enable_onedrive_integration; - } + RAGConfig = await getRAGConfig(localStorage.token); }); @@ -332,7 +250,6 @@ }} /> - { @@ -353,339 +270,93 @@ submitHandler(); }} > -
-
-
-
{$i18n.t('General')}
- -
- -
-
-
- {$i18n.t('Content Extraction Engine')} -
-
- -
-
- {#if contentExtractionEngine === 'tika'} -
-
- -
-
- {:else if contentExtractionEngine === 'docling'} -
- -
- {:else if contentExtractionEngine === 'document_intelligence'} -
- - -
- {:else if contentExtractionEngine === 'mistral_ocr'} -
- -
- {/if} -
- - {#if contentExtractionEngine === ''} -
-
- {$i18n.t('PDF Extract Images (OCR)')} -
-
- -
-
- {/if} - -
-
- - {$i18n.t('Bypass Embedding and Retrieval')} - -
-
- - - -
-
- - {#if !BYPASS_EMBEDDING_AND_RETRIEVAL} -
-
{$i18n.t('Text Splitter')}
-
- -
-
- -
-
-
-
- {$i18n.t('Chunk Size')} -
-
- -
-
- -
-
- {$i18n.t('Chunk Overlap')} -
- -
- -
-
-
-
- {/if} -
- - {#if !BYPASS_EMBEDDING_AND_RETRIEVAL} + {#if RAGConfig} +
+
-
{$i18n.t('Embedding')}
+
{$i18n.t('General')}

-
+
-
- {$i18n.t('Embedding Model Engine')} +
+ {$i18n.t('Content Extraction Engine')}
-
+
- {#if embeddingEngine === 'openai'} -
- - - + {#if RAGConfig.CONTENT_EXTRACTION_ENGINE === ''} +
+
+
+ {$i18n.t('PDF Extract Images (OCR)')} +
+
+ +
+
- {:else if embeddingEngine === 'ollama'} + {:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'tika'} +
+
+ +
+
+ {:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'docling'} +
+ +
+ {:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'document_intelligence'}
- +
+ {:else if RAGConfig.CONTENT_EXTRACTION_ENGINE === 'mistral_ocr'} +
+
{/if}
-
-
{$i18n.t('Embedding Model')}
- -
- {#if embeddingEngine === 'ollama'} -
-
- -
-
- {:else} -
-
- -
- - {#if embeddingEngine === ''} - - {/if} -
- {/if} -
- -
- {$i18n.t( - 'Warning: If you update or change your embedding model, you will need to re-import all documents.' - )} -
-
- - {#if embeddingEngine === 'ollama' || embeddingEngine === 'openai'} -
-
{$i18n.t('Embedding Batch Size')}
- -
- -
-
- {/if} -
- -
-
{$i18n.t('Retrieval')}
- -
-
-
{$i18n.t('Full Context Mode')}
+
+ + {$i18n.t('Bypass Embedding and Retrieval')} + +
- +
- {#if !RAG_FULL_CONTEXT} + {#if !RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL}
-
{$i18n.t('Hybrid Search')}
+
{$i18n.t('Text Splitter')}
- { - toggleHybridSearch(); - }} - /> +
- {#if querySettings.hybrid === true} -
-
{$i18n.t('Reranking Model')}
+
+
+
+
+ {$i18n.t('Chunk Size')} +
+
+ +
+
-
+
+
+ {$i18n.t('Chunk Overlap')} +
+ +
+ +
+
+
+
+ {/if} +
+ + {#if !RAGConfig.BYPASS_EMBEDDING_AND_RETRIEVAL} +
+
{$i18n.t('Embedding')}
+ +
+ +
+
+
+ {$i18n.t('Embedding Model Engine')} +
+
+ +
+
+ + {#if embeddingEngine === 'openai'} +
+ + + +
+ {:else if embeddingEngine === 'ollama'} +
+ + + +
+ {/if} +
+ +
+
{$i18n.t('Embedding Model')}
+ +
+ {#if embeddingEngine === 'ollama'}
+
+
+ {:else} +
+
+
- + {/if} + + {/if}
-
+ {/if}
- {/if} -
-
{$i18n.t('Top K')}
-
- +
+ {$i18n.t( + 'Warning: If you update or change your embedding model, you will need to re-import all documents.' + )}
- {#if querySettings.hybrid === true} -
-
{$i18n.t('Top K Reranker')}
+ {#if embeddingEngine === 'ollama' || embeddingEngine === 'openai'} +
+
+ {$i18n.t('Embedding Batch Size')} +
+ +
+ +
+
+ {/if} +
+ +
+
{$i18n.t('Retrieval')}
+ +
+ +
+
{$i18n.t('Full Context Mode')}
+
+ + + +
+
+ + {#if !RAGConfig.RAG_FULL_CONTEXT} +
+
{$i18n.t('Hybrid Search')}
+
+ { + submitHandler(); + }} + /> +
+
+ + {#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true} +
+
{$i18n.t('Reranking Model')}
+ +
+
+
+ +
+ +
+
+
+ {/if} + +
+
{$i18n.t('Top K')}
- {/if} - {#if querySettings.hybrid === true} -
-
-
{$i18n.t('Minimum Score')}
+ {#if RAGConfig.ENABLE_RAG_HYBRID_SEARCH === true} +
+
{$i18n.t('Top K Reranker')}
-
- {$i18n.t( - 'Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.' - )} -
-
- {/if} - {/if} + {/if} -
-
{$i18n.t('RAG Template')}
-
- -