diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py
index c0177e251..548c9c314 100644
--- a/backend/open_webui/config.py
+++ b/backend/open_webui/config.py
@@ -1002,6 +1002,13 @@ PENDING_USER_OVERLAY_CONTENT = PersistentConfig(
)
+RESPONSE_WATERMARK = PersistentConfig(
+ "RESPONSE_WATERMARK",
+ "ui.watermark",
+ os.environ.get("RESPONSE_WATERMARK", ""),
+)
+
+
USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS = (
os.environ.get("USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS", "False").lower()
== "true"
diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py
index d5d481ad1..646db6846 100644
--- a/backend/open_webui/main.py
+++ b/backend/open_webui/main.py
@@ -334,6 +334,7 @@ from open_webui.config import (
DEFAULT_LOCALE,
OAUTH_PROVIDERS,
WEBUI_URL,
+ RESPONSE_WATERMARK,
# Admin
ENABLE_ADMIN_CHAT_ACCESS,
ENABLE_ADMIN_EXPORT,
@@ -580,9 +581,12 @@ app.state.config.ADMIN_EMAIL = ADMIN_EMAIL
app.state.config.DEFAULT_MODELS = DEFAULT_MODELS
app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
+
app.state.config.PENDING_USER_OVERLAY_CONTENT = PENDING_USER_OVERLAY_CONTENT
app.state.config.PENDING_USER_OVERLAY_TITLE = PENDING_USER_OVERLAY_TITLE
+app.state.config.RESPONSE_WATERMARK = RESPONSE_WATERMARK
+
app.state.config.USER_PERMISSIONS = USER_PERMISSIONS
app.state.config.WEBHOOK_URL = WEBHOOK_URL
app.state.config.BANNERS = WEBUI_BANNERS
@@ -1413,6 +1417,7 @@ async def get_app_config(request: Request):
"ui": {
"pending_user_overlay_title": app.state.config.PENDING_USER_OVERLAY_TITLE,
"pending_user_overlay_content": app.state.config.PENDING_USER_OVERLAY_CONTENT,
+ "response_watermark": app.state.config.RESPONSE_WATERMARK,
},
"license_metadata": app.state.LICENSE_METADATA,
**(
diff --git a/backend/open_webui/routers/auths.py b/backend/open_webui/routers/auths.py
index 34a646427..390c7d428 100644
--- a/backend/open_webui/routers/auths.py
+++ b/backend/open_webui/routers/auths.py
@@ -187,9 +187,7 @@ async def ldap_auth(request: Request, response: Response, form_data: LdapForm):
LDAP_USE_TLS = request.app.state.config.LDAP_USE_TLS
LDAP_CA_CERT_FILE = request.app.state.config.LDAP_CA_CERT_FILE
LDAP_VALIDATE_CERT = (
- CERT_REQUIRED
- if request.app.state.config.LDAP_VALIDATE_CERT
- else CERT_NONE
+ CERT_REQUIRED if request.app.state.config.LDAP_VALIDATE_CERT else CERT_NONE
)
LDAP_CIPHERS = (
request.app.state.config.LDAP_CIPHERS
@@ -703,6 +701,7 @@ async def get_admin_config(request: Request, user=Depends(get_admin_user)):
"ENABLE_USER_WEBHOOKS": request.app.state.config.ENABLE_USER_WEBHOOKS,
"PENDING_USER_OVERLAY_TITLE": request.app.state.config.PENDING_USER_OVERLAY_TITLE,
"PENDING_USER_OVERLAY_CONTENT": request.app.state.config.PENDING_USER_OVERLAY_CONTENT,
+ "RESPONSE_WATERMARK": request.app.state.config.RESPONSE_WATERMARK,
}
@@ -722,6 +721,7 @@ class AdminConfig(BaseModel):
ENABLE_USER_WEBHOOKS: bool
PENDING_USER_OVERLAY_TITLE: Optional[str] = None
PENDING_USER_OVERLAY_CONTENT: Optional[str] = None
+ RESPONSE_WATERMARK: Optional[str] = None
@router.post("/admin/config")
@@ -766,6 +766,8 @@ async def update_admin_config(
form_data.PENDING_USER_OVERLAY_CONTENT
)
+ request.app.state.config.RESPONSE_WATERMARK = form_data.RESPONSE_WATERMARK
+
return {
"SHOW_ADMIN_DETAILS": request.app.state.config.SHOW_ADMIN_DETAILS,
"WEBUI_URL": request.app.state.config.WEBUI_URL,
@@ -782,6 +784,7 @@ async def update_admin_config(
"ENABLE_USER_WEBHOOKS": request.app.state.config.ENABLE_USER_WEBHOOKS,
"PENDING_USER_OVERLAY_TITLE": request.app.state.config.PENDING_USER_OVERLAY_TITLE,
"PENDING_USER_OVERLAY_CONTENT": request.app.state.config.PENDING_USER_OVERLAY_CONTENT,
+ "RESPONSE_WATERMARK": request.app.state.config.RESPONSE_WATERMARK,
}
diff --git a/src/lib/components/admin/Settings/General.svelte b/src/lib/components/admin/Settings/General.svelte
index 850303b90..86cc876ef 100644
--- a/src/lib/components/admin/Settings/General.svelte
+++ b/src/lib/components/admin/Settings/General.svelte
@@ -306,8 +306,8 @@