Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
111 commits
Select commit Hold shift + click to select a range
15bd504
fix: fixed the hover effect for the MessageInput Integrations button
ShirasawaSama Sep 26, 2025
e7ccaf6
Fix: milvus error because the limit set to None by default
google-labs-jules[bot] Sep 26, 2025
123dbf1
feat: Add DISKANN index type support for Milvus
google-labs-jules[bot] Sep 26, 2025
b550d78
Merge branch 'open-webui:main' into fix-milvus-limit-error
Classic298 Sep 26, 2025
9e3d540
Merge branch 'open-webui:main' into feat-milvus-diskann-support
Classic298 Sep 26, 2025
42faa63
fix: show error message when the uploading file is modified
ShirasawaSama Sep 26, 2025
90a5b3b
fix: 'Set as default'
silentoplayz Sep 26, 2025
36da2b0
Update translation.json (pt-BR)
joaoback Sep 26, 2025
d126c23
Merge pull request #17783 from joaoback/patch-10
tjbck Sep 26, 2025
ac6292b
Fix: truncate long model tags with a character limit
silentoplayz Sep 26, 2025
a97cdc0
Merge pull request #17791 from silentoplayz/truncate-models-tag
tjbck Sep 26, 2025
acdafcd
Merge pull request #17777 from ShirasawaSama/patch-33
tjbck Sep 26, 2025
af6a25e
Merge pull request #17769 from Classic298/fix-milvus-limit-error
tjbck Sep 26, 2025
b516431
fix: truncate long filter tags in model selector and prevent wrapping
silentoplayz Sep 26, 2025
dcb0933
Update German translations in translation.json
SZegotaM Sep 26, 2025
f8a3ed2
Merge pull request #17770 from Classic298/feat-milvus-diskann-support
tjbck Sep 26, 2025
0431ad9
refac: get_discovery_urls
tjbck Sep 26, 2025
9b86932
Merge pull request #17797 from SZegotaM/dev
tjbck Sep 26, 2025
a80d524
Merge pull request #17796 from silentoplayz/truncate-selector-tags
tjbck Sep 26, 2025
ac08529
refac
tjbck Sep 26, 2025
99d7773
refac: styling
tjbck Sep 26, 2025
6807832
refac/fix: tool response header type check
tjbck Sep 26, 2025
41e4e73
feat: add permission toggle for public sharing of notes
google-labs-jules[bot] Sep 26, 2025
cda4c95
fix: default tool calling
tjbck Sep 26, 2025
4997ef2
refac
tjbck Sep 26, 2025
d10b518
Merge pull request #17801 from Classic298/feature/notes-public-sharin…
tjbck Sep 26, 2025
b8c3e5e
refac
tjbck Sep 26, 2025
a1829f6
refac: styling
tjbck Sep 26, 2025
5765a87
Merge pull request #17779 from silentoplayz/fix-set-as-default
tjbck Sep 26, 2025
807a8be
Merge pull request #17767 from ShirasawaSama/patch-31
tjbck Sep 26, 2025
16cf973
fix: truncate long usernames in UI
silentoplayz Sep 26, 2025
b778482
refac: user valves
tjbck Sep 26, 2025
1de5827
Merge pull request #17805 from silentoplayz/fix-username-truncation
tjbck Sep 26, 2025
54beeea
refac: tools
tjbck Sep 27, 2025
c80bb31
refac/enh: folder optimization
tjbck Sep 27, 2025
a05dab6
refac
tjbck Sep 27, 2025
bad7d69
feat/enh: external tool server manual JSON spec
tjbck Sep 27, 2025
d1a6c6b
refac
tjbck Sep 27, 2025
23f62a7
enh: tool server import/export
tjbck Sep 27, 2025
45e1c72
refac
tjbck Sep 27, 2025
e62f2b3
fix: truncate more long names in delete confirmation modals
silentoplayz Sep 27, 2025
d7c54d9
refac
tjbck Sep 27, 2025
1a18928
enh: reply to message
tjbck Sep 27, 2025
b4eea78
refac
tjbck Sep 27, 2025
86ef57f
refac
tjbck Sep 27, 2025
272c6f5
refac
tjbck Sep 27, 2025
27cd87e
fix: i81n.t and correct button layout issue
silentoplayz Sep 27, 2025
68a4fdf
fix: correct messageId parameter in createMessagesList call
ITOTI-Y Sep 27, 2025
1283a8c
Merge pull request #17819 from silentoplayz/fix-layout-and-i18n
tjbck Sep 27, 2025
2c80f60
Merge pull request #17812 from silentoplayz/long-text-truncation
tjbck Sep 27, 2025
2b5dca2
fix: pinned chats not updating after archiving all chats
silentoplayz Sep 28, 2025
f912b06
i18n: improve Chinese translation
ShirasawaSama Sep 28, 2025
88bfe77
add Bosnian language pack
BakirBukvic Sep 28, 2025
baed303
add bosnian to languages.json
BakirBukvic Sep 28, 2025
50a2204
add env vars
Classic298 Sep 28, 2025
8dc43f9
Create milvus_multitenancy.py
Classic298 Sep 28, 2025
01d4a8a
Update factory.py
Classic298 Sep 28, 2025
27af450
Update config.py
Classic298 Sep 28, 2025
1773a4d
typo
Classic298 Sep 28, 2025
cafe748
feat(groups): Clone default group permissions for new groups
google-labs-jules[bot] Sep 28, 2025
30550d9
Feat: Add warning for conflicting group permissions
google-labs-jules[bot] Sep 28, 2025
fb3eeaa
Update Groups.svelte
Classic298 Sep 28, 2025
670dfca
remove: used advanced params
silentoplayz Sep 28, 2025
57c02b2
feat: add toggle to show/hide chat title in browser tab
google-labs-jules[bot] Sep 28, 2025
baf913c
Merge pull request #17850 from silentoplayz/remove-unused-params
tjbck Sep 28, 2025
54ed62f
Merge pull request #17832 from silentoplayz/pinned-chats-not-updating
tjbck Sep 28, 2025
2915bcf
Merge pull request #17833 from ShirasawaSama/patch-20
tjbck Sep 28, 2025
5568a31
Merge pull request #17835 from BakirBukvic/main
tjbck Sep 28, 2025
4aa41aa
refac
tjbck Sep 28, 2025
db9d3d3
refac: mcp spec/response handling
tjbck Sep 28, 2025
97dae43
refac
tjbck Sep 28, 2025
a572cf4
feat: add backend handling for unarchiving all chats
silentoplayz Sep 28, 2025
3aad157
refac
tjbck Sep 28, 2025
742e2ff
refac
tjbck Sep 28, 2025
e71ed76
Merge pull request #17857 from silentoplayz/feat-bulk-unarchive
tjbck Sep 28, 2025
2cb35e7
Merge pull request #17843 from Classic298/feat/clone-default-group-pe…
tjbck Sep 28, 2025
11fd073
Merge pull request #17851 from Classic298/feat-toggle-chat-title-in-b…
tjbck Sep 28, 2025
95462a3
refac
tjbck Sep 28, 2025
9a8c9ec
Merge pull request #17823 from ITOTI-Y/main
tjbck Sep 28, 2025
4c2c582
refac
tjbck Sep 28, 2025
4f06f29
refac
tjbck Sep 28, 2025
0e99c43
ADD FAT WARNING
Classic298 Sep 28, 2025
b1e6363
ADD FAT WARNING - QDRANT
Classic298 Sep 28, 2025
a4e0c10
Delete src/lib/components/admin/Users/Groups/PermissionSwitch.svelte
Classic298 Sep 28, 2025
ad9cae3
Delete src/lib/components/icons/ExclamationTriangle.svelte
Classic298 Sep 28, 2025
67b3929
Delete src/lib/components/common/Warning.svelte
Classic298 Sep 28, 2025
cf20f04
Update Permissions.svelte
Classic298 Sep 28, 2025
91b6483
refac
tjbck Sep 28, 2025
da6748a
refac
tjbck Sep 28, 2025
7e8ee46
refac
tjbck Sep 28, 2025
fe54fb6
fix: session middleware should be required by default
tjbck Sep 28, 2025
231d182
feat: move JSON model import to backend
silentoplayz Sep 28, 2025
7bae905
refac: copy behaviour
tjbck Sep 28, 2025
fe28097
feat: refactor model import to a single backend endpoint
silentoplayz Sep 28, 2025
1c418a7
Merge pull request #17871 from silentoplayz/backend-json-model-import
tjbck Sep 29, 2025
118549c
enh/fix: filter content metadata
tjbck Sep 29, 2025
f58fc75
feat/enh: embed citation
tjbck Sep 29, 2025
234aa69
refac
tjbck Sep 29, 2025
88aca2e
chore: format
tjbck Sep 29, 2025
d37f108
Merge pull request #17848 from Classic298/feat/group-permission-warning
tjbck Sep 29, 2025
8656bfc
refac
tjbck Sep 29, 2025
2d94b8e
Merge pull request #17837 from Classic298/milvus-multitenancy
tjbck Sep 29, 2025
aee7aaa
refac
tjbck Sep 29, 2025
51a138a
refac: edit user modal
tjbck Sep 29, 2025
e7fa86a
chore: format
tjbck Sep 29, 2025
da236d5
chore: bump
tjbck Sep 29, 2025
b6a4853
doc: changelog
tjbck Sep 29, 2025
37d1c85
Merge pull request #17827 from open-webui/dev
tjbck Sep 29, 2025
1657a7c
5419: Combined frontend changes
cableman Sep 8, 2025
e22df94
5419: Updated to matched current frontend release
cableman Sep 8, 2025
1d649b2
5419: Updated to matched current frontend release - login banner
cableman Sep 8, 2025
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
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,26 @@ 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.6.32] - 2025-09-29

### Added

- 🗝️ Permission toggle for public sharing of notes was added, allowing note owners to quickly enable or disable public access from the note settings interface.
- ⚠️ A warning is now displayed in the user edit modal if conflicting group permissions are detected, helping administrators resolve access control ambiguities before saving changes.

### Fixed

- 🧰 Fixed regression where External Tool servers (OpenAPI) were nonfunctional after the 0.6.31 update; external tools integration is now restored and reliable.
- 🚑 Resolved a critical bug causing Streamable HTTP OAuth 2.1 (MCP server) integrations to throw a 500 error on first invocation due to missing 'SessionMiddleware'. OAuth 2.1 registration now succeeds and works on subsequent requests as expected.
- 🐛 The "Set as default" option is now reliably clickable in model and filter selection menus, fixing cases where the interface appeared unresponsive.
- 🛠️ Embed UI now works seamlessly with both default and native function calling flows, ensuring the tool embedding experience is consistent regardless of invocation method.
- 🧹 Addressed various minor UI bugs and inconsistencies for a cleaner user experience.

### Changed

- 🧬 MCP tool result handling code was refactored for improved parsing and robustness of tool outputs.
- 🧩 The user edit modal was overhauled for clarity and usability, improving the organization of group, permission, and public sharing controls.

## [0.6.31] - 2025-09-25

### Added
Expand Down
43 changes: 41 additions & 2 deletions backend/open_webui/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,32 @@ def feishu_oauth_register(client: OAuth):
),
)


# PATCH EXTRA LOGIN INFO
SYSTEM_REGISTER_URL = PersistentConfig(
"SYSTEM_REGISTER_URL",
"ui.SYSTEM_REGISTER_URL",
os.environ.get("SYSTEM_REGISTER_URL", ""),
)


SYSTEM_REGISTER_GUIDE_URL = PersistentConfig(
"SYSTEM_REGISTER_GUIDE_URL",
"ui.SYSTEM_REGISTER_GUIDE_URL",
os.environ.get("SYSTEM_REGISTER_GUIDE_URL", ""),
)
# /PATCH EXTRA LOGIN INFO


# PATCH ADD LOGO TO SIDEBAR
LOGO_URL = PersistentConfig(
"LOGO_URL",
"ui.LOGO_URL",
os.environ.get("LOGO_URL", ""),
)
# /PATCH ADD LOGO TO SIDEBAR


ENABLE_LOGIN_FORM = PersistentConfig(
"ENABLE_LOGIN_FORM",
"ui.ENABLE_LOGIN_FORM",
Expand Down Expand Up @@ -1217,6 +1243,11 @@ def feishu_oauth_register(client: OAuth):
== "true"
)

USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING = (
os.environ.get("USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING", "False").lower()
== "true"
)

USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING = (
os.environ.get(
"USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING", "False"
Expand Down Expand Up @@ -1354,6 +1385,7 @@ def feishu_oauth_register(client: OAuth):
"public_knowledge": USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ALLOW_PUBLIC_SHARING,
"public_prompts": USER_PERMISSIONS_WORKSPACE_PROMPTS_ALLOW_PUBLIC_SHARING,
"public_tools": USER_PERMISSIONS_WORKSPACE_TOOLS_ALLOW_PUBLIC_SHARING,
"public_notes": USER_PERMISSIONS_NOTES_ALLOW_PUBLIC_SHARING,
},
"chat": {
"controls": USER_PERMISSIONS_CHAT_CONTROLS,
Expand Down Expand Up @@ -1999,16 +2031,23 @@ class BannerModel(BaseModel):
# this uses the model defined in the Dockerfile ENV variable. If you dont use docker or docker based deployments such as k8s, the default embedding model will be used (sentence-transformers/all-MiniLM-L6-v2)

# Milvus

MILVUS_URI = os.environ.get("MILVUS_URI", f"{DATA_DIR}/vector_db/milvus.db")
MILVUS_DB = os.environ.get("MILVUS_DB", "default")
MILVUS_TOKEN = os.environ.get("MILVUS_TOKEN", None)

MILVUS_INDEX_TYPE = os.environ.get("MILVUS_INDEX_TYPE", "HNSW")
MILVUS_METRIC_TYPE = os.environ.get("MILVUS_METRIC_TYPE", "COSINE")
MILVUS_HNSW_M = int(os.environ.get("MILVUS_HNSW_M", "16"))
MILVUS_HNSW_EFCONSTRUCTION = int(os.environ.get("MILVUS_HNSW_EFCONSTRUCTION", "100"))
MILVUS_IVF_FLAT_NLIST = int(os.environ.get("MILVUS_IVF_FLAT_NLIST", "128"))
MILVUS_DISKANN_MAX_DEGREE = int(os.environ.get("MILVUS_DISKANN_MAX_DEGREE", "56"))
MILVUS_DISKANN_SEARCH_LIST_SIZE = int(
os.environ.get("MILVUS_DISKANN_SEARCH_LIST_SIZE", "100")
)
ENABLE_MILVUS_MULTITENANCY_MODE = (
os.environ.get("ENABLE_MILVUS_MULTITENANCY_MODE", "true").lower() == "true"
)
# Hyphens not allowed, need to use underscores in collection names
MILVUS_COLLECTION_PREFIX = os.environ.get("MILVUS_COLLECTION_PREFIX", "open_webui")

# Qdrant
QDRANT_URI = os.environ.get("QDRANT_URI", None)
Expand Down
6 changes: 6 additions & 0 deletions backend/open_webui/functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ async def get_function_models(request):
try:
function_module = get_function_module_by_id(request, pipe.id)

has_user_valves = False
if hasattr(function_module, "UserValves"):
has_user_valves = True

# Check if function is a manifold
if hasattr(function_module, "pipes"):
sub_pipes = []
Expand Down Expand Up @@ -124,6 +128,7 @@ async def get_function_models(request):
"created": pipe.created_at,
"owned_by": "openai",
"pipe": pipe_flag,
"has_user_valves": has_user_valves,
}
)
else:
Expand All @@ -141,6 +146,7 @@ async def get_function_models(request):
"created": pipe.created_at,
"owned_by": "openai",
"pipe": pipe_flag,
"has_user_valves": has_user_valves,
}
)
except Exception as e:
Expand Down
82 changes: 53 additions & 29 deletions backend/open_webui/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,13 @@
PENDING_USER_OVERLAY_TITLE,
DEFAULT_PROMPT_SUGGESTIONS,
DEFAULT_MODELS,
# PATCH EXTRA LOGIN INFO
SYSTEM_REGISTER_URL,
SYSTEM_REGISTER_GUIDE_URL,
# /PATCH EXTRA LOGIN INFO
# PATCH ADD LOGO TO SIDEBAR
LOGO_URL,
# /PATCH ADD LOGO TO SIDEBAR
DEFAULT_ARENA_MODEL,
MODEL_ORDER_LIST,
EVALUATION_ARENA_MODELS,
Expand Down Expand Up @@ -728,6 +735,18 @@ async def lifespan(app: FastAPI):
app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE


# PATCH EXTRA LOGIN INFO
app.state.config.SYSTEM_REGISTER_URL = SYSTEM_REGISTER_URL
app.state.config.SYSTEM_REGISTER_GUIDE_URL = SYSTEM_REGISTER_GUIDE_URL
# /PATCH EXTRA LOGIN INFO


# PATCH ADD LOGO TO SIDEBAR
app.state.config.LOGO_URL = LOGO_URL
# /PATCH ADD LOGO TO SIDEBAR


app.state.config.PENDING_USER_OVERLAY_CONTENT = PENDING_USER_OVERLAY_CONTENT
app.state.config.PENDING_USER_OVERLAY_TITLE = PENDING_USER_OVERLAY_TITLE

Expand Down Expand Up @@ -1552,7 +1571,7 @@ async def process_chat(request, form_data, user, metadata, model):
finally:
try:
if mcp_clients := metadata.get("mcp_clients"):
for client in mcp_clients:
for client in mcp_clients.values():
await client.disconnect()
except Exception as e:
log.debug(f"Error cleaning up: {e}")
Expand Down Expand Up @@ -1698,6 +1717,16 @@ async def get_app_config(request: Request):
for name, config in OAUTH_PROVIDERS.items()
}
},
# Environment variables for patches
"extended_features": {
# PATCH EXTRA LOGIN INFO
"system_register_url": app.state.config.SYSTEM_REGISTER_URL,
"system_register_guide_url": app.state.config.SYSTEM_REGISTER_GUIDE_URL,
# /PATCH EXTRA LOGIN INFO
# PATCH ADD LOGO TO SIDEBAR
"logo_url": app.state.config.LOGO_URL,
# /PATCH ADD LOGO TO SIDEBAR
},
"features": {
"auth": WEBUI_AUTH,
"auth_trusted_header": bool(app.state.AUTH_TRUSTED_EMAIL_HEADER),
Expand Down Expand Up @@ -1908,37 +1937,32 @@ async def get_current_usage(user=Depends(get_verified_user)):
f"mcp:{server_id}", OAuthClientInformationFull(**oauth_client_info)
)

try:
if REDIS_URL:
redis_session_store = RedisStore(
url=REDIS_URL,
prefix=(f"{REDIS_KEY_PREFIX}:session:" if REDIS_KEY_PREFIX else "session:"),
)

# SessionMiddleware is used by authlib for oauth
if len(OAUTH_PROVIDERS) > 0:
try:
if REDIS_URL:
redis_session_store = RedisStore(
url=REDIS_URL,
prefix=(
f"{REDIS_KEY_PREFIX}:session:" if REDIS_KEY_PREFIX else "session:"
),
)

app.add_middleware(SessionAutoloadMiddleware)
app.add_middleware(
StarSessionsMiddleware,
store=redis_session_store,
cookie_name="oui-session",
cookie_same_site=WEBUI_SESSION_COOKIE_SAME_SITE,
cookie_https_only=WEBUI_SESSION_COOKIE_SECURE,
)
log.info("Using Redis for session")
else:
raise ValueError("No Redis URL provided")
except Exception as e:
app.add_middleware(SessionAutoloadMiddleware)
app.add_middleware(
SessionMiddleware,
secret_key=WEBUI_SECRET_KEY,
session_cookie="oui-session",
same_site=WEBUI_SESSION_COOKIE_SAME_SITE,
https_only=WEBUI_SESSION_COOKIE_SECURE,
StarSessionsMiddleware,
store=redis_session_store,
cookie_name="owui-session",
cookie_same_site=WEBUI_SESSION_COOKIE_SAME_SITE,
cookie_https_only=WEBUI_SESSION_COOKIE_SECURE,
)
log.info("Using Redis for session")
else:
raise ValueError("No Redis URL provided")
except Exception as e:
app.add_middleware(
SessionMiddleware,
secret_key=WEBUI_SECRET_KEY,
session_cookie="owui-session",
same_site=WEBUI_SESSION_COOKIE_SAME_SITE,
https_only=WEBUI_SESSION_COOKIE_SECURE,
)


@app.get("/oauth/clients/{client_id}/authorize")
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
"""Add reply_to_id column to message

Revision ID: a5c220713937
Revises: 38d63c18f30f
Create Date: 2025-09-27 02:24:18.058455

"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision: str = "a5c220713937"
down_revision: Union[str, None] = "38d63c18f30f"
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# Add 'reply_to_id' column to the 'message' table for replying to messages
op.add_column(
"message",
sa.Column("reply_to_id", sa.Text(), nullable=True),
)
pass


def downgrade() -> None:
# Remove 'reply_to_id' column from the 'message' table
op.drop_column("message", "reply_to_id")

pass
16 changes: 15 additions & 1 deletion backend/open_webui/models/chats.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,6 +366,15 @@ def delete_shared_chat_by_chat_id(self, chat_id: str) -> bool:
except Exception:
return False

def unarchive_all_chats_by_user_id(self, user_id: str) -> bool:
try:
with get_db() as db:
db.query(Chat).filter_by(user_id=user_id).update({"archived": False})
db.commit()
return True
except Exception:
return False

def update_chat_share_id_by_id(
self, id: str, share_id: Optional[str]
) -> Optional[ChatModel]:
Expand Down Expand Up @@ -810,7 +819,7 @@ def get_chats_by_user_id_and_search_text(
return [ChatModel.model_validate(chat) for chat in all_chats]

def get_chats_by_folder_id_and_user_id(
self, folder_id: str, user_id: str
self, folder_id: str, user_id: str, skip: int = 0, limit: int = 60
) -> list[ChatModel]:
with get_db() as db:
query = db.query(Chat).filter_by(folder_id=folder_id, user_id=user_id)
Expand All @@ -819,6 +828,11 @@ def get_chats_by_folder_id_and_user_id(

query = query.order_by(Chat.updated_at.desc())

if skip:
query = query.offset(skip)
if limit:
query = query.limit(limit)

all_chats = query.all()
return [ChatModel.model_validate(chat) for chat in all_chats]

Expand Down
14 changes: 14 additions & 0 deletions backend/open_webui/models/folders.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,20 @@ class FolderModel(BaseModel):
model_config = ConfigDict(from_attributes=True)


class FolderMetadataResponse(BaseModel):
icon: Optional[str] = None


class FolderNameIdResponse(BaseModel):
id: str
name: str
meta: Optional[FolderMetadataResponse] = None
parent_id: Optional[str] = None
is_expanded: bool = False
created_at: int
updated_at: int


####################
# Forms
####################
Expand Down
Loading