Skip to content
Merged

Dev #266

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
7498818
refac
tjbck Feb 18, 2026
49c3623
refac
tjbck Feb 18, 2026
e9d8525
refac
tjbck Feb 18, 2026
a0195cd
refac
tjbck Feb 18, 2026
990c638
refac
tjbck Feb 18, 2026
8a7f698
refac
tjbck Feb 18, 2026
9b55343
refac
tjbck Feb 18, 2026
094ed0b
fix: prompts delete
tjbck Feb 18, 2026
3dd44c4
refac
tjbck Feb 18, 2026
f872a17
refac
tjbck Feb 19, 2026
af5661c
Merge pull request #21485 from Classic298/claude/fix-mcp-ssl-check-0janH
Classic298 Feb 19, 2026
5624632
fix: apply AIOHTTP_CLIENT_TIMEOUT to embeddings endpoint (#21558)
exxocism Feb 19, 2026
8bfab32
refac
tjbck Feb 19, 2026
2f1344d
Update translation.json (#21602)
Kungs-Fr Feb 19, 2026
27c76c6
fix: clamp SCIM pagination args instead of rejecting them (#21577)
monteithpj Feb 19, 2026
35763a3
Optimize shared chats list to use column projection (#163) (#21614)
Classic298 Feb 19, 2026
723185c
refac
tjbck Feb 19, 2026
4bef69c
refac
tjbck Feb 19, 2026
139f02a
refac
tjbck Feb 19, 2026
ff83703
Update iframe sandbox attributes based on settings (#21529)
Classic298 Feb 19, 2026
1dfe546
i18n: pt-BR - add translations for newly added UI items + consistency…
joaoback Feb 19, 2026
12bea8c
i18n: improve Chinese translation (#21530)
ShirasawaSama Feb 19, 2026
6ac5932
refac
tjbck Feb 19, 2026
91a0301
refac
tjbck Feb 19, 2026
0a700aa
refac
tjbck Feb 19, 2026
43eb235
Update fi-FI translation.json (#21538)
Kylapaallikko Feb 19, 2026
c5c31ab
fix: respect BYPASS_ADMIN_ACCESS_CONTROL in file list/search endpoint…
Classic298 Feb 19, 2026
326599b
Fix O(n²) performance in get_message_list by replacing insert(0) with…
Classic298 Feb 19, 2026
6d67ac3
fix: correct unpacking order of distances, documents, and metadatas i…
VasilyLebedev123 Feb 19, 2026
3db6d49
Query title column directly in get_chat_title_by_id instead of loadin…
Classic298 Feb 19, 2026
9950cc8
fix(i18n): correct French typo "Analtique" → "Analytique" (#21512)
fchevallieratecna Feb 19, 2026
d664922
Avoid loading full chat JSON blob for pinned/archived/shared list end…
Classic298 Feb 19, 2026
8c485b2
refac
tjbck Feb 19, 2026
2a80454
refac
tjbck Feb 19, 2026
f5e5632
fix(chat): prevent stuck drop overlay when dragging outside window in…
silentoplayz Feb 20, 2026
ae05586
refac: oauth session management
tjbck Feb 20, 2026
092a358
refac
tjbck Feb 20, 2026
d650c98
fix: resolve backend execution deadlock when syncing stats with cycli…
silentoplayz Feb 21, 2026
ac62011
fix group search (#21691)
Classic298 Feb 21, 2026
4228bf7
fix: gate model default features on global config and user permission…
Classic298 Feb 21, 2026
a9312d2
refac
tjbck Feb 21, 2026
b1dc58d
feat: add sortable columns to groups admin panel (#21692)
Classic298 Feb 21, 2026
10c13b6
refac
tjbck Feb 21, 2026
8265422
refac
tjbck Feb 21, 2026
6d8a6e6
fix(model-selector): resolve virtual scroll bug when typing quickly (…
silentoplayz Feb 21, 2026
3242dad
refac
tjbck Feb 21, 2026
5522b91
fix(ui): align profile dropdown items and prevent phantom synthetic d…
silentoplayz Feb 21, 2026
5d4547f
enh: RAG_EMBEDDING_CONCURRENT_REQUESTS
tjbck Feb 21, 2026
9f7dd31
feat: scroll to rich ui once rendered (#21698)
Classic298 Feb 21, 2026
7e42d72
refac
tjbck Feb 21, 2026
8c713a1
fix(backend): catch 404 http exceptions before generalized exception …
silentoplayz Feb 21, 2026
d247adb
feat: add citation sources for fetch_url tool results (#21669)
Classic298 Feb 21, 2026
5759917
feat: Adding You.com as a web search provider (#21599)
lazariv Feb 21, 2026
45e23c3
perf: eliminate 2 redundant full chat deserialization on every messag…
Classic298 Feb 21, 2026
35598b8
enh: ENABLE_ADMIN_ANALYTICS
tjbck Feb 21, 2026
4b9f821
enh: OAUTH_GROUP_DEFAULT_SHARE
tjbck Feb 21, 2026
4c94f5d
refac
tjbck Feb 21, 2026
bc482b9
refac
tjbck Feb 21, 2026
ff7f38d
refac
tjbck Feb 21, 2026
1ad3656
refac
tjbck Feb 21, 2026
c2172e4
fix(ui): prevent drag-and-drop ghost cursors and text highlighting on…
silentoplayz Feb 21, 2026
c114fd6
refac
tjbck Feb 21, 2026
631e30e
refac
tjbck Feb 21, 2026
a0c82c8
fix: race condition in signup allows multiple admin accounts (#21631)
theeggorchicken Feb 21, 2026
96ca47a
fix(ui): prevent text-selection ghost dragging on playground navigati…
silentoplayz Feb 21, 2026
914c7ba
refac: groups ui
tjbck Feb 21, 2026
b559606
refac
tjbck Feb 21, 2026
08f1c82
fix(a11y): improve model selector accessibility with proper listbox/o…
Classic298 Feb 21, 2026
74e771f
fix(a11y): add aria-hidden to all decorative SVG icon components (#21…
Classic298 Feb 21, 2026
b48594a
refac
tjbck Feb 21, 2026
2d5ebf9
Update README.md (#21735)
Classic298 Feb 22, 2026
7043751
I18n: improve Chinese translation (#21741)
ShirasawaSama Feb 22, 2026
bf0fb1c
fix(a11y): add aria-labels to chat core components (#21709)
Classic298 Feb 22, 2026
a0dbd41
fix(a11y): improve accessibility of top-level auth and onboarding com…
Classic298 Feb 22, 2026
f95cff0
fix(ui): replace static dropdown backgrounds with transparent mapping…
silentoplayz Feb 22, 2026
713fe1a
fix(ui): prevent avatar alt-text overlap on failed image loads (#21730)
silentoplayz Feb 22, 2026
75c5d9b
fix(ui): hide clone button in model menu for models disabled by admin…
silentoplayz Feb 22, 2026
2ef5597
fix: reset taskIds and messageQueue on new chat (#21731)
Classic298 Feb 22, 2026
1542dad
fix(a11y): enhance accessibility for admin user components (#21717)
Classic298 Feb 22, 2026
16e567d
fix(a11y): enhance accessibility for chat settings components (#21715)
Classic298 Feb 22, 2026
d016cc5
feat: convert admin settings menu tabs to native anchor tags for new-…
silentoplayz Feb 22, 2026
2beeeb9
fix(a11y): add aria-labels to chat message components (#21708)
Classic298 Feb 22, 2026
1f47418
refac
tjbck Feb 22, 2026
e0087ac
fix: model fallback routing for all model types and default model sel…
Classic298 Feb 22, 2026
5b9efee
fix(a11y): add aria-labels and structural elements to workspace compo…
Classic298 Feb 22, 2026
c0096b2
fix: explicitly disable dragging and text selection inside dropdown m…
silentoplayz Feb 22, 2026
29217cb
refac
tjbck Feb 22, 2026
ad9fbfc
refac
tjbck Feb 22, 2026
3c54863
refac
tjbck Feb 22, 2026
32aabe6
refac
tjbck Feb 22, 2026
c341f97
feat: default model metadata & params
tjbck Feb 22, 2026
f651809
refac
tjbck Feb 22, 2026
30a13b9
refac: ollama str think support
tjbck Feb 22, 2026
0ca2e46
refac
tjbck Feb 22, 2026
1cd2637
refac
tjbck Feb 22, 2026
0185f33
refac
tjbck Feb 22, 2026
bab64c9
refac
tjbck Feb 22, 2026
3ad2ea6
refac
tjbck Feb 22, 2026
9e81e1d
feat: add LOG_FORMAT=json for structured JSON logging (#21747)
goto1134 Feb 22, 2026
342aa84
refac
tjbck Feb 22, 2026
becac2b
refac
tjbck Feb 22, 2026
053a336
refac
tjbck Feb 22, 2026
d1b39da
changelog: yeah (#21575)
Classic298 Feb 22, 2026
4b3543d
fix(ui): allow empty LDAP Application DN value and password in Genera…
j-frei Feb 22, 2026
8f0658e
fix: payload tools handling
tjbck Feb 22, 2026
6eba27e
refac
tjbck Feb 23, 2026
8c127a4
fix(ui): make folder menu text non-highlightable (#21753)
silentoplayz Feb 23, 2026
4853ede
refac
tjbck Feb 23, 2026
e61406c
refac
tjbck Feb 23, 2026
824eeba
refac
tjbck Feb 23, 2026
d9fd2a3
refac
tjbck Feb 23, 2026
f6bd54f
refac
tjbck Feb 23, 2026
39e5422
refac
tjbck Feb 23, 2026
e7848ec
feat(ui): update admin users and evaluations sidebars to leverage nat…
silentoplayz Feb 23, 2026
2558fe1
refac
tjbck Feb 23, 2026
c035ff7
refac
tjbck Feb 23, 2026
49a1b37
fix(ui): prevent highlighting of text in chat integrations menu (#21758)
silentoplayz Feb 23, 2026
238e9da
fix(ui): prevent highlighting and dragging of text in admin settings …
silentoplayz Feb 23, 2026
a8a3098
fix(ui): apply select-none to remaining dropdown menus globally to pr…
silentoplayz Feb 23, 2026
aa649be
Chore: Changelog updates (#21754)
Classic298 Feb 23, 2026
424dba4
refac
tjbck Feb 23, 2026
9044abf
chore: format
tjbck Feb 23, 2026
1d3d3b2
refac
tjbck Feb 23, 2026
1792f66
refac
tjbck Feb 23, 2026
2ed3055
Merge pull request #21618 from open-webui/dev
tjbck Feb 23, 2026
895c805
feat: dictation toggle
tjbck Feb 23, 2026
95bde94
refac
tjbck Feb 23, 2026
ffcf97e
chore: bump
tjbck Feb 23, 2026
55c4891
doc: changelog
tjbck Feb 23, 2026
1ac3dd4
Merge pull request #21773 from open-webui/dev
tjbck Feb 23, 2026
fc9254b
Merge remote-tracking branch 'openwebui/main' into dev
OrenZhang Feb 24, 2026
c8c45f3
chore(repo): merge from remote
OrenZhang Feb 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
103 changes: 103 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions CHANGELOG_EXTRA.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.8.5.1] - 2026.02.24

### Changed

- 合并官方 0.8.5 改动

## [0.8.3.1] - 2026.02.19

### Changed
Expand Down
48 changes: 48 additions & 0 deletions backend/open_webui/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -548,6 +548,21 @@ def __getattr__(self, key):
os.environ.get("ENABLE_OAUTH_GROUP_CREATION", "False").lower() == "true",
)


oauth_group_default_share = (
os.environ.get("OAUTH_GROUP_DEFAULT_SHARE", "true").strip().lower()
)
OAUTH_GROUP_DEFAULT_SHARE = PersistentConfig(
"OAUTH_GROUP_DEFAULT_SHARE",
"oauth.group_default_share",
(
"members"
if oauth_group_default_share == "members"
else oauth_group_default_share == "true"
),
)


OAUTH_BLOCKED_GROUPS = PersistentConfig(
"OAUTH_BLOCKED_GROUPS",
"oauth.blocked_groups",
Expand Down Expand Up @@ -1221,6 +1236,18 @@ def reachable(host: str, port: int) -> bool:
[],
)

DEFAULT_MODEL_METADATA = PersistentConfig(
"DEFAULT_MODEL_METADATA",
"models.default_metadata",
{},
)

DEFAULT_MODEL_PARAMS = PersistentConfig(
"DEFAULT_MODEL_PARAMS",
"models.default_params",
{},
)

DEFAULT_USER_ROLE = PersistentConfig(
"DEFAULT_USER_ROLE",
"ui.default_user_role",
Expand Down Expand Up @@ -1394,6 +1421,10 @@ def reachable(host: str, port: int) -> bool:
os.environ.get("USER_PERMISSIONS_CHAT_FILE_UPLOAD", "True").lower() == "true"
)

USER_PERMISSIONS_CHAT_WEB_UPLOAD = (
os.environ.get("USER_PERMISSIONS_CHAT_WEB_UPLOAD", "True").lower() == "true"
)

USER_PERMISSIONS_CHAT_DELETE = (
os.environ.get("USER_PERMISSIONS_CHAT_DELETE", "True").lower() == "true"
)
Expand Down Expand Up @@ -1529,6 +1560,7 @@ def reachable(host: str, port: int) -> bool:
"system_prompt": USER_PERMISSIONS_CHAT_SYSTEM_PROMPT,
"params": USER_PERMISSIONS_CHAT_PARAMS,
"file_upload": USER_PERMISSIONS_CHAT_FILE_UPLOAD,
"web_upload": USER_PERMISSIONS_CHAT_WEB_UPLOAD,
"delete": USER_PERMISSIONS_CHAT_DELETE,
"delete_message": USER_PERMISSIONS_CHAT_DELETE_MESSAGE,
"continue_response": USER_PERMISSIONS_CHAT_CONTINUE_RESPONSE,
Expand Down Expand Up @@ -1641,6 +1673,10 @@ def reachable(host: str, port: int) -> bool:
os.environ.get("ENABLE_ADMIN_CHAT_ACCESS", "True").lower() == "true"
)

ENABLE_ADMIN_ANALYTICS = (
os.environ.get("ENABLE_ADMIN_ANALYTICS", "True").lower() == "true"
)

ENABLE_COMMUNITY_SHARING = PersistentConfig(
"ENABLE_COMMUNITY_SHARING",
"ui.enable_community_sharing",
Expand Down Expand Up @@ -2848,6 +2884,12 @@ class BannerModel(BaseModel):
os.environ.get("ENABLE_ASYNC_EMBEDDING", "True").lower() == "true",
)

RAG_EMBEDDING_CONCURRENT_REQUESTS = PersistentConfig(
"RAG_EMBEDDING_CONCURRENT_REQUESTS",
"rag.embedding_concurrent_requests",
int(os.getenv("RAG_EMBEDDING_CONCURRENT_REQUESTS", "0")),
)

RAG_EMBEDDING_QUERY_PREFIX = os.environ.get("RAG_EMBEDDING_QUERY_PREFIX", None)

RAG_EMBEDDING_CONTENT_PREFIX = os.environ.get("RAG_EMBEDDING_CONTENT_PREFIX", None)
Expand Down Expand Up @@ -3416,6 +3458,12 @@ class BannerModel(BaseModel):
os.environ.get("YANDEX_WEB_SEARCH_CONFIG", ""),
)

YOUCOM_API_KEY = PersistentConfig(
"YOUCOM_API_KEY",
"rag.web.search.youcom_api_key",
os.environ.get("YOUCOM_API_KEY", ""),
)

####################################
# Images
####################################
Expand Down
56 changes: 55 additions & 1 deletion backend/open_webui/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import pkgutil
import sys
import shutil
import traceback
from datetime import datetime, timezone
from typing import Any
from uuid import uuid4
from pathlib import Path
from cryptography.hazmat.primitives import serialization
Expand Down Expand Up @@ -72,9 +75,51 @@
# LOGGING
####################################

_LEVEL_MAP = {
"DEBUG": "debug",
"INFO": "info",
"WARNING": "warn",
"ERROR": "error",
"CRITICAL": "fatal",
}


class JSONFormatter(logging.Formatter):
"""Format log records as single-line JSON objects for structured logging."""

def format(self, record: logging.LogRecord) -> str:
log_entry: dict[str, Any] = {
"ts": datetime.fromtimestamp(record.created, tz=timezone.utc).isoformat(
timespec="milliseconds"
),
"level": _LEVEL_MAP.get(record.levelname, record.levelname.lower()),
"msg": record.getMessage(),
"caller": record.name,
}

if record.exc_info and record.exc_info[0] is not None:
log_entry["error"] = "".join(
traceback.format_exception(*record.exc_info)
).rstrip()
elif record.exc_text:
log_entry["error"] = record.exc_text

if record.stack_info:
log_entry["stacktrace"] = record.stack_info

return json.dumps(log_entry, ensure_ascii=False, default=str)


LOG_FORMAT = os.environ.get("LOG_FORMAT", "").lower()

GLOBAL_LOG_LEVEL = os.environ.get("GLOBAL_LOG_LEVEL", "").upper()
if GLOBAL_LOG_LEVEL in logging.getLevelNamesMapping():
logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True)
if LOG_FORMAT == "json":
_handler = logging.StreamHandler(sys.stdout)
_handler.setFormatter(JSONFormatter())
logging.basicConfig(handlers=[_handler], level=GLOBAL_LOG_LEVEL, force=True)
else:
logging.basicConfig(stream=sys.stdout, level=GLOBAL_LOG_LEVEL, force=True)
else:
GLOBAL_LOG_LEVEL = "INFO"

Expand Down Expand Up @@ -559,6 +604,10 @@ def parse_section(section):
"OAUTH_SESSION_TOKEN_ENCRYPTION_KEY", WEBUI_SECRET_KEY
)

# Maximum number of concurrent OAuth sessions per user per provider
# This prevents unbounded session growth while allowing multi-device usage
OAUTH_MAX_SESSIONS_PER_USER = int(os.environ.get("OAUTH_MAX_SESSIONS_PER_USER", "10"))

# Token Exchange Configuration
# Allows external apps to exchange OAuth tokens for OpenWebUI tokens
ENABLE_OAUTH_TOKEN_EXCHANGE = (
Expand Down Expand Up @@ -984,6 +1033,11 @@ def parse_section(section):
# TOOLS/FUNCTIONS PIP OPTIONS
####################################

ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS = (
os.environ.get("ENABLE_PIP_INSTALL_FRONTMATTER_REQUIREMENTS", "True").lower()
== "true"
)

PIP_OPTIONS = os.getenv("PIP_OPTIONS", "").split()
PIP_PACKAGE_INDEX_OPTIONS = os.getenv("PIP_PACKAGE_INDEX_OPTIONS", "").split()

Expand Down
Loading
Loading