From 4e64c3eca9c29d30253b6f740170ada38343fd6e Mon Sep 17 00:00:00 2001 From: Mostafa Ahangarha Date: Fri, 1 Aug 2025 00:33:09 +0330 Subject: [PATCH 01/10] Update fa translation Fix a mistake in translation --- src/lib/i18n/locales/fa-IR/translation.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/i18n/locales/fa-IR/translation.json b/src/lib/i18n/locales/fa-IR/translation.json index fd19b846a0..a4b0ef3a0d 100644 --- a/src/lib/i18n/locales/fa-IR/translation.json +++ b/src/lib/i18n/locales/fa-IR/translation.json @@ -1072,7 +1072,7 @@ "Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "به خود به عنوان \"کاربر\" اشاره کنید (مثلاً، \"کاربر در حال یادگیری اسپانیایی است\")", "References from": "مراجع از", "Refused when it shouldn't have": "رد شده زمانی که باید نباشد", - "Regenerate": "ری\u200cسازی", + "Regenerate": "تولید مجدد", "Reindex": "فهرست\u200cبندی مجدد", "Reindex Knowledge Base Vectors": "فهرست\u200cبندی مجدد بردارهای پایگاه دانش", "Release Notes": "یادداشت\u200cهای انتشار", From 293cdb810e2efaa776c17f730f237f58624e97e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 02:25:17 +0000 Subject: [PATCH 02/10] chore(deps): bump authlib from 1.4.1 to 1.6.1 in /backend Bumps [authlib](https://github.com/authlib/authlib) from 1.4.1 to 1.6.1. - [Release notes](https://github.com/authlib/authlib/releases) - [Changelog](https://github.com/authlib/authlib/blob/main/docs/changelog.rst) - [Commits](https://github.com/authlib/authlib/compare/v1.4.1...v1.6.1) --- updated-dependencies: - dependency-name: authlib dependency-version: 1.6.1 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 d48ed8d9c8..7394619755 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -97,7 +97,7 @@ onnxruntime==1.20.1 faster-whisper==1.1.1 PyJWT[crypto]==2.10.1 -authlib==1.4.1 +authlib==1.6.1 black==25.1.0 langfuse==2.44.0 From 4b0bf3130b56941a884f9ed21544150719a98985 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 02:25:33 +0000 Subject: [PATCH 03/10] chore(deps): bump markdown from 3.7 to 3.8.2 in /backend Bumps [markdown](https://github.com/Python-Markdown/markdown) from 3.7 to 3.8.2. - [Release notes](https://github.com/Python-Markdown/markdown/releases) - [Changelog](https://github.com/Python-Markdown/markdown/blob/master/docs/changelog.md) - [Commits](https://github.com/Python-Markdown/markdown/compare/3.7...3.8.2) --- updated-dependencies: - dependency-name: markdown dependency-version: 3.8.2 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 d48ed8d9c8..68cfccf0f0 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -75,7 +75,7 @@ docx2txt==0.8 python-pptx==1.0.2 unstructured==0.16.17 nltk==3.9.1 -Markdown==3.7 +Markdown==3.8.2 pypandoc==1.15 pandas==2.2.3 openpyxl==3.1.5 From aee68aedb2fe1b88516e1c5294a1348b1e2c7dfb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 02:26:25 +0000 Subject: [PATCH 04/10] chore(deps): bump fake-useragent from 2.1.0 to 2.2.0 in /backend Bumps [fake-useragent](https://github.com/fake-useragent/fake-useragent) from 2.1.0 to 2.2.0. - [Release notes](https://github.com/fake-useragent/fake-useragent/releases) - [Commits](https://github.com/fake-useragent/fake-useragent/compare/2.1.0...2.2.0) --- updated-dependencies: - dependency-name: fake-useragent dependency-version: 2.2.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 d48ed8d9c8..6750f17ddd 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -49,7 +49,7 @@ tiktoken langchain==0.3.26 langchain-community==0.3.26 -fake-useragent==2.1.0 +fake-useragent==2.2.0 chromadb==0.6.3 posthog==5.4.0 pymilvus==2.5.0 From fce486fe301d35f2a3a38eac38240f0d3f2a069e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 02:26:36 +0000 Subject: [PATCH 05/10] chore(deps): bump aiohttp from 3.11.11 to 3.12.15 in /backend --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.12.15 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 d48ed8d9c8..44ac23d7ad 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -9,7 +9,7 @@ passlib[bcrypt]==1.7.4 cryptography requests==2.32.4 -aiohttp==3.11.11 +aiohttp==3.12.15 async-timeout aiocache aiofiles From 3098471a8af0a51172856cbb139a60d38554ffb6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 02:27:15 +0000 Subject: [PATCH 06/10] chore(deps): bump google-genai from 1.15.0 to 1.28.0 in /backend Bumps [google-genai](https://github.com/googleapis/python-genai) from 1.15.0 to 1.28.0. - [Release notes](https://github.com/googleapis/python-genai/releases) - [Changelog](https://github.com/googleapis/python-genai/blob/main/CHANGELOG.md) - [Commits](https://github.com/googleapis/python-genai/compare/v1.15.0...v1.28.0) --- updated-dependencies: - dependency-name: google-genai dependency-version: 1.28.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 d48ed8d9c8..70fa19405f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -42,7 +42,7 @@ asgiref==3.8.1 # AI libraries openai anthropic -google-genai==1.15.0 +google-genai==1.28.0 google-generativeai==0.8.5 tiktoken From d4f70830d10c75c35ac6e79e19b949d0b809dcd3 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 1 Aug 2025 14:07:11 +0400 Subject: [PATCH 07/10] refac: markdown br rendering --- src/lib/components/chat/Messages/Markdown/HTMLToken.svelte | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte b/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte index d246bb36d9..13bee6e111 100644 --- a/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte +++ b/src/lib/components/chat/Messages/Markdown/HTMLToken.svelte @@ -122,6 +122,11 @@ {:else if token.text.includes(` {:else} - {token.text} + {@const br = token.text.match(//)} + {#if br} +
+ {:else} + {token.text} + {/if} {/if} {/if} From 994170b4820eebe03c8ea7a0dc5067e82906f1ec Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Fri, 1 Aug 2025 18:17:09 +0400 Subject: [PATCH 08/10] refac --- src/lib/components/layout/Sidebar.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/components/layout/Sidebar.svelte b/src/lib/components/layout/Sidebar.svelte index 77c912d7b2..9fde6f6735 100644 --- a/src/lib/components/layout/Sidebar.svelte +++ b/src/lib/components/layout/Sidebar.svelte @@ -82,7 +82,7 @@ const initPinnedModelsSortable = () => { const pinnedModelsList = document.getElementById('pinned-models-list'); - if (pinnedModelsList) { + if (pinnedModelsList && !$mobile) { new Sortable(pinnedModelsList, { animation: 150, onUpdate: async (event) => { From a679fb3f456dca47fa374186c78d45f34a21032d Mon Sep 17 00:00:00 2001 From: expruc Date: Sat, 2 Aug 2025 11:30:34 +0300 Subject: [PATCH 09/10] split otel metrics from general otel configuration --- backend/open_webui/env.py | 17 ++++++ backend/open_webui/utils/telemetry/metrics.py | 58 ++++++++++++++----- backend/open_webui/utils/telemetry/setup.py | 9 +-- 3 files changed, 65 insertions(+), 19 deletions(-) diff --git a/backend/open_webui/env.py b/backend/open_webui/env.py index 8cddfc6b08..b4b2a38a06 100644 --- a/backend/open_webui/env.py +++ b/backend/open_webui/env.py @@ -643,12 +643,19 @@ AUDIT_EXCLUDED_PATHS = [path.lstrip("/") for path in AUDIT_EXCLUDED_PATHS] ENABLE_OTEL = os.environ.get("ENABLE_OTEL", "False").lower() == "true" ENABLE_OTEL_METRICS = os.environ.get("ENABLE_OTEL_METRICS", "False").lower() == "true" + OTEL_EXPORTER_OTLP_ENDPOINT = os.environ.get( "OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317" ) +OTEL_METRICS_EXPORTER_OTLP_ENDPOINT = os.environ.get( + "OTEL_METRICS_EXPORTER_OTLP_ENDPOINT", OTEL_EXPORTER_OTLP_ENDPOINT +) OTEL_EXPORTER_OTLP_INSECURE = ( os.environ.get("OTEL_EXPORTER_OTLP_INSECURE", "False").lower() == "true" ) +OTEL_METRICS_EXPORTER_OTLP_INSECURE = ( + os.environ.get("OTEL_METRICS_EXPORTER_OTLP_INSECURE", "False").lower() == "true" +) OTEL_SERVICE_NAME = os.environ.get("OTEL_SERVICE_NAME", "open-webui") OTEL_RESOURCE_ATTRIBUTES = os.environ.get( "OTEL_RESOURCE_ATTRIBUTES", "" @@ -659,11 +666,21 @@ OTEL_TRACES_SAMPLER = os.environ.get( OTEL_BASIC_AUTH_USERNAME = os.environ.get("OTEL_BASIC_AUTH_USERNAME", "") OTEL_BASIC_AUTH_PASSWORD = os.environ.get("OTEL_BASIC_AUTH_PASSWORD", "") +OTEL_METRICS_BASIC_AUTH_USERNAME = os.environ.get( + "OTEL_METRICS_BASIC_AUTH_USERNAME", OTEL_BASIC_AUTH_USERNAME +) +OTEL_METRICS_BASIC_AUTH_PASSWORD = os.environ.get( + "OTEL_METRICS_BASIC_AUTH_PASSWORD", OTEL_BASIC_AUTH_PASSWORD +) OTEL_OTLP_SPAN_EXPORTER = os.environ.get( "OTEL_OTLP_SPAN_EXPORTER", "grpc" ).lower() # grpc or http +OTEL_METRICS_OTLP_SPAN_EXPORTER = os.environ.get( + "OTEL_METRICS_OTLP_SPAN_EXPORTER", OTEL_OTLP_SPAN_EXPORTER +).lower() # grpc or http + #################################### # TOOLS/FUNCTIONS PIP OPTIONS diff --git a/backend/open_webui/utils/telemetry/metrics.py b/backend/open_webui/utils/telemetry/metrics.py index f3e82c7dab..75c13ccc0a 100644 --- a/backend/open_webui/utils/telemetry/metrics.py +++ b/backend/open_webui/utils/telemetry/metrics.py @@ -19,37 +19,69 @@ from __future__ import annotations import time from typing import Dict, List, Sequence, Any +from base64 import b64encode from fastapi import FastAPI, Request from opentelemetry import metrics from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import ( OTLPMetricExporter, ) + +from opentelemetry.exporter.otlp.proto.http.metric_exporter import ( + OTLPMetricExporter as OTLPHttpMetricExporter, +) from opentelemetry.sdk.metrics import MeterProvider from opentelemetry.sdk.metrics.view import View from opentelemetry.sdk.metrics.export import ( PeriodicExportingMetricReader, ) -from opentelemetry.sdk.resources import SERVICE_NAME, Resource - -from open_webui.env import OTEL_SERVICE_NAME, OTEL_EXPORTER_OTLP_ENDPOINT +from opentelemetry.sdk.resources import Resource +from open_webui.env import ( + OTEL_SERVICE_NAME, + OTEL_METRICS_EXPORTER_OTLP_ENDPOINT, + OTEL_METRICS_BASIC_AUTH_USERNAME, + OTEL_METRICS_BASIC_AUTH_PASSWORD, + OTEL_METRICS_OTLP_SPAN_EXPORTER, + OTEL_METRICS_EXPORTER_OTLP_INSECURE, +) from open_webui.socket.main import get_active_user_ids from open_webui.models.users import Users _EXPORT_INTERVAL_MILLIS = 10_000 # 10 seconds -def _build_meter_provider() -> MeterProvider: +def _build_meter_provider(resource: Resource) -> MeterProvider: """Return a configured MeterProvider.""" + headers = [] + if OTEL_METRICS_BASIC_AUTH_USERNAME and OTEL_METRICS_BASIC_AUTH_PASSWORD: + auth_string = ( + f"{OTEL_METRICS_BASIC_AUTH_USERNAME}:{OTEL_METRICS_BASIC_AUTH_PASSWORD}" + ) + auth_header = b64encode(auth_string.encode()).decode() + headers = [("authorization", f"Basic {auth_header}")] # Periodic reader pushes metrics over OTLP/gRPC to collector - readers: List[PeriodicExportingMetricReader] = [ - PeriodicExportingMetricReader( - OTLPMetricExporter(endpoint=OTEL_EXPORTER_OTLP_ENDPOINT), - export_interval_millis=_EXPORT_INTERVAL_MILLIS, - ) - ] + if OTEL_METRICS_OTLP_SPAN_EXPORTER == "http": + readers: List[PeriodicExportingMetricReader] = [ + PeriodicExportingMetricReader( + OTLPHttpMetricExporter( + endpoint=OTEL_METRICS_EXPORTER_OTLP_ENDPOINT, headers=headers + ), + export_interval_millis=_EXPORT_INTERVAL_MILLIS, + ) + ] + else: + readers: List[PeriodicExportingMetricReader] = [ + PeriodicExportingMetricReader( + OTLPMetricExporter( + endpoint=OTEL_METRICS_EXPORTER_OTLP_ENDPOINT, + insecure=OTEL_METRICS_EXPORTER_OTLP_INSECURE, + headers=headers, + ), + export_interval_millis=_EXPORT_INTERVAL_MILLIS, + ) + ] # Optional view to limit cardinality: drop user-agent etc. views: List[View] = [ @@ -70,17 +102,17 @@ def _build_meter_provider() -> MeterProvider: ] provider = MeterProvider( - resource=Resource.create({SERVICE_NAME: OTEL_SERVICE_NAME}), + resource=resource, metric_readers=list(readers), views=views, ) return provider -def setup_metrics(app: FastAPI) -> None: +def setup_metrics(app: FastAPI, resource: Resource) -> None: """Attach OTel metrics middleware to *app* and initialise provider.""" - metrics.set_meter_provider(_build_meter_provider()) + metrics.set_meter_provider(_build_meter_provider(resource)) meter = metrics.get_meter(__name__) # Instruments diff --git a/backend/open_webui/utils/telemetry/setup.py b/backend/open_webui/utils/telemetry/setup.py index 80beec0bbb..cd1f45ea6a 100644 --- a/backend/open_webui/utils/telemetry/setup.py +++ b/backend/open_webui/utils/telemetry/setup.py @@ -26,11 +26,8 @@ from open_webui.env import ( def setup(app: FastAPI, db_engine: Engine): # set up trace - trace.set_tracer_provider( - TracerProvider( - resource=Resource.create(attributes={SERVICE_NAME: OTEL_SERVICE_NAME}) - ) - ) + resource = Resource.create(attributes={SERVICE_NAME: OTEL_SERVICE_NAME}) + trace.set_tracer_provider(TracerProvider(resource=resource)) # Add basic auth header only if both username and password are not empty headers = [] @@ -56,4 +53,4 @@ def setup(app: FastAPI, db_engine: Engine): # set up metrics only if enabled if ENABLE_OTEL_METRICS: - setup_metrics(app) + setup_metrics(app, resource) From 446f4ee5a84858755305115c159296a80ff6ef95 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Sat, 2 Aug 2025 13:59:07 +0400 Subject: [PATCH 10/10] refac --- backend/open_webui/utils/tools.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/open_webui/utils/tools.py b/backend/open_webui/utils/tools.py index abbac4c544..bd5be1f8e3 100644 --- a/backend/open_webui/utils/tools.py +++ b/backend/open_webui/utils/tools.py @@ -520,6 +520,8 @@ async def get_tool_servers_data( openapi_data = response.get("openapi", {}) if info and isinstance(openapi_data, dict): + openapi_data["info"] = openapi_data.get("info", {}) + if "name" in info: openapi_data["info"]["title"] = info.get("name", "Tool Server")