This commit is contained in:
Tim Baek
2026-02-06 03:23:37 +04:00
parent 8e79b3d0bc
commit 2c37daef86
8 changed files with 42 additions and 16 deletions
+7 -4
View File
@@ -195,10 +195,13 @@ ENABLE_FORWARD_USER_INFO_HEADERS = (
) )
# Header names for user info forwarding (customizable via environment variables) # Header names for user info forwarding (customizable via environment variables)
FORWARD_USER_INFO_HEADER_NAME = os.environ.get("FORWARD_USER_INFO_HEADER_NAME", "X-OpenWebUI-User-Name") FORWARD_USER_INFO_HEADER_USER_NAME = os.environ.get("FORWARD_USER_INFO_HEADER_USER_NAME", "X-OpenWebUI-User-Name")
FORWARD_USER_INFO_HEADER_ID = os.environ.get("FORWARD_USER_INFO_HEADER_ID", "X-OpenWebUI-User-Id") FORWARD_USER_INFO_HEADER_USER_ID = os.environ.get("FORWARD_USER_INFO_HEADER_USER_ID", "X-OpenWebUI-User-Id")
FORWARD_USER_INFO_HEADER_EMAIL = os.environ.get("FORWARD_USER_INFO_HEADER_EMAIL", "X-OpenWebUI-User-Email") FORWARD_USER_INFO_HEADER_USER_EMAIL = os.environ.get("FORWARD_USER_INFO_HEADER_USER_EMAIL", "X-OpenWebUI-User-Email")
FORWARD_USER_INFO_HEADER_ROLE = os.environ.get("FORWARD_USER_INFO_HEADER_ROLE", "X-OpenWebUI-User-Role") FORWARD_USER_INFO_HEADER_USER_ROLE = os.environ.get("FORWARD_USER_INFO_HEADER_USER_ROLE", "X-OpenWebUI-User-Role")
# Header name for chat ID forwarding (customizable via environment variable)
FORWARD_SESSION_INFO_HEADER_CHAT_ID = os.environ.get("FORWARD_SESSION_INFO_HEADER_CHAT_ID", "X-OpenWebUI-Chat-Id")
# Experimental feature, may be removed in future # Experimental feature, may be removed in future
ENABLE_STAR_SESSIONS_MIDDLEWARE = ( ENABLE_STAR_SESSIONS_MIDDLEWARE = (
+2 -1
View File
@@ -8,6 +8,7 @@ from fastapi import Request
from open_webui.retrieval.web.main import SearchResult, get_filtered_results from open_webui.retrieval.web.main import SearchResult, get_filtered_results
from open_webui.utils.headers import include_user_info_headers from open_webui.utils.headers import include_user_info_headers
from open_webui.env import FORWARD_SESSION_INFO_HEADER_CHAT_ID
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@@ -31,7 +32,7 @@ def search_external(
chat_id = getattr(request.state, "chat_id", None) chat_id = getattr(request.state, "chat_id", None)
if chat_id: if chat_id:
headers["X-OpenWebUI-Chat-Id"] = str(chat_id) headers[FORWARD_SESSION_INFO_HEADER_CHAT_ID] = str(chat_id)
response = requests.post( response = requests.post(
external_url, external_url,
+2 -1
View File
@@ -11,6 +11,7 @@ from fastapi import Request
from open_webui.retrieval.web.main import SearchResult, get_filtered_results from open_webui.retrieval.web.main import SearchResult, get_filtered_results
from open_webui.utils.headers import include_user_info_headers from open_webui.utils.headers import include_user_info_headers
from open_webui.env import FORWARD_SESSION_INFO_HEADER_CHAT_ID
from xml.etree import ElementTree as ET from xml.etree import ElementTree as ET
from xml.etree.ElementTree import Element from xml.etree.ElementTree import Element
@@ -50,7 +51,7 @@ def search_yandex(
chat_id = getattr(request.state, "chat_id", None) chat_id = getattr(request.state, "chat_id", None)
if chat_id: if chat_id:
headers["X-OpenWebUI-Chat-Id"] = str(chat_id) headers[FORWARD_SESSION_INFO_HEADER_CHAT_ID] = str(chat_id)
payload = {} if yandex_search_config == "" else json.loads(yandex_search_config) payload = {} if yandex_search_config == "" else json.loads(yandex_search_config)
+2 -1
View File
@@ -23,6 +23,7 @@ from open_webui.models.users import UserModel
from open_webui.env import ( from open_webui.env import (
ENABLE_FORWARD_USER_INFO_HEADERS, ENABLE_FORWARD_USER_INFO_HEADERS,
FORWARD_SESSION_INFO_HEADER_CHAT_ID,
) )
from fastapi import ( from fastapi import (
@@ -137,7 +138,7 @@ async def send_post_request(
if ENABLE_FORWARD_USER_INFO_HEADERS and user: if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user) headers = include_user_info_headers(headers, user)
if metadata and metadata.get("chat_id"): if metadata and metadata.get("chat_id"):
headers["X-OpenWebUI-Chat-Id"] = metadata.get("chat_id") headers[FORWARD_SESSION_INFO_HEADER_CHAT_ID] = metadata.get("chat_id")
r = await session.post( r = await session.post(
url, url,
+2 -1
View File
@@ -33,6 +33,7 @@ from open_webui.env import (
AIOHTTP_CLIENT_TIMEOUT, AIOHTTP_CLIENT_TIMEOUT,
AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST, AIOHTTP_CLIENT_TIMEOUT_MODEL_LIST,
ENABLE_FORWARD_USER_INFO_HEADERS, ENABLE_FORWARD_USER_INFO_HEADERS,
FORWARD_SESSION_INFO_HEADER_CHAT_ID,
BYPASS_MODEL_ACCESS_CONTROL, BYPASS_MODEL_ACCESS_CONTROL,
) )
from open_webui.models.users import UserModel from open_webui.models.users import UserModel
@@ -142,7 +143,7 @@ async def get_headers_and_cookies(
if ENABLE_FORWARD_USER_INFO_HEADERS and user: if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user) headers = include_user_info_headers(headers, user)
if metadata and metadata.get("chat_id"): if metadata and metadata.get("chat_id"):
headers["X-OpenWebUI-Chat-Id"] = metadata.get("chat_id") headers[FORWARD_SESSION_INFO_HEADER_CHAT_ID] = metadata.get("chat_id")
token = None token = None
auth_type = config.get("auth_type") auth_type = config.get("auth_type")
+8 -8
View File
@@ -1,18 +1,18 @@
from urllib.parse import quote from urllib.parse import quote
from open_webui.env import ( from open_webui.env import (
FORWARD_USER_INFO_HEADER_NAME, FORWARD_USER_INFO_HEADER_USER_NAME,
FORWARD_USER_INFO_HEADER_ID, FORWARD_USER_INFO_HEADER_USER_ID,
FORWARD_USER_INFO_HEADER_EMAIL, FORWARD_USER_INFO_HEADER_USER_EMAIL,
FORWARD_USER_INFO_HEADER_ROLE, FORWARD_USER_INFO_HEADER_USER_ROLE,
) )
def include_user_info_headers(headers, user): def include_user_info_headers(headers, user):
return { return {
**headers, **headers,
FORWARD_USER_INFO_HEADER_NAME: quote(user.name, safe=" "), FORWARD_USER_INFO_HEADER_USER_NAME: quote(user.name, safe=" "),
FORWARD_USER_INFO_HEADER_ID: user.id, FORWARD_USER_INFO_HEADER_USER_ID: user.id,
FORWARD_USER_INFO_HEADER_EMAIL: user.email, FORWARD_USER_INFO_HEADER_USER_EMAIL: user.email,
FORWARD_USER_INFO_HEADER_ROLE: user.role, FORWARD_USER_INFO_HEADER_USER_ROLE: user.role,
} }
+9
View File
@@ -127,7 +127,10 @@ from open_webui.env import (
ENABLE_REALTIME_CHAT_SAVE, ENABLE_REALTIME_CHAT_SAVE,
ENABLE_QUERIES_CACHE, ENABLE_QUERIES_CACHE,
RAG_SYSTEM_CONTEXT, RAG_SYSTEM_CONTEXT,
ENABLE_FORWARD_USER_INFO_HEADERS,
FORWARD_SESSION_INFO_HEADER_CHAT_ID,
) )
from open_webui.utils.headers import include_user_info_headers
from open_webui.constants import TASKS from open_webui.constants import TASKS
@@ -2207,6 +2210,12 @@ async def process_chat_payload(request, form_data, user, metadata, model):
for key, value in connection_headers.items(): for key, value in connection_headers.items():
headers[key] = value headers[key] = value
# Add user info headers if enabled
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
if metadata and metadata.get("chat_id"):
headers[FORWARD_SESSION_INFO_HEADER_CHAT_ID] = metadata.get("chat_id")
mcp_clients[server_id] = MCPClient() mcp_clients[server_id] = MCPClient()
await mcp_clients[server_id].connect( await mcp_clients[server_id].connect(
url=mcp_server_connection.get("url", ""), url=mcp_server_connection.get("url", ""),
+10
View File
@@ -45,7 +45,10 @@ from open_webui.env import (
AIOHTTP_CLIENT_TIMEOUT, AIOHTTP_CLIENT_TIMEOUT,
AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA, AIOHTTP_CLIENT_TIMEOUT_TOOL_SERVER_DATA,
AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL, AIOHTTP_CLIENT_SESSION_TOOL_SERVER_SSL,
ENABLE_FORWARD_USER_INFO_HEADERS,
FORWARD_SESSION_INFO_HEADER_CHAT_ID,
) )
from open_webui.utils.headers import include_user_info_headers
from open_webui.tools.builtin import ( from open_webui.tools.builtin import (
search_web, search_web,
fetch_url, fetch_url,
@@ -335,6 +338,13 @@ async def get_tools(
for key, value in connection_headers.items(): for key, value in connection_headers.items():
headers[key] = value headers[key] = value
# Add user info headers if enabled
if ENABLE_FORWARD_USER_INFO_HEADERS and user:
headers = include_user_info_headers(headers, user)
metadata = extra_params.get("__metadata__", {})
if metadata and metadata.get("chat_id"):
headers[FORWARD_SESSION_INFO_HEADER_CHAT_ID] = metadata.get("chat_id")
def make_tool_function( def make_tool_function(
function_name, tool_server_data, headers function_name, tool_server_data, headers
): ):