소스 검색

feat: Add option to forward user info as headers to OpenAI API

Duc Nguyen 6 달 전
부모
커밋
3f0b3ea90e
4개의 변경된 파일42개의 추가작업 그리고 0개의 파일을 삭제
  1. 7 0
      backend/open_webui/apps/audio/main.py
  2. 7 0
      backend/open_webui/apps/images/main.py
  3. 21 0
      backend/open_webui/apps/openai/main.py
  4. 7 0
      backend/open_webui/config.py

+ 7 - 0
backend/open_webui/apps/audio/main.py

@@ -23,6 +23,7 @@ from open_webui.config import (
     AUDIO_TTS_VOICE,
     AUDIO_TTS_AZURE_SPEECH_REGION,
     AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
+    OPENAI_FORWARD_USER_INFO_AS_HEADERS,
     CACHE_DIR,
     CORS_ALLOW_ORIGIN,
     WHISPER_MODEL,
@@ -248,6 +249,12 @@ async def speech(request: Request, user=Depends(get_verified_user)):
         headers["Authorization"] = f"Bearer {app.state.config.TTS_OPENAI_API_KEY}"
         headers["Content-Type"] = "application/json"
 
+        if OPENAI_FORWARD_USER_INFO_AS_HEADERS:
+            headers["X-OpenWebUI-User-Name"] = user.name
+            headers["X-OpenWebUI-User-Id"] = user.id
+            headers["X-OpenWebUI-User-Email"] = user.email
+            headers["X-OpenWebUI-User-Role"] = user.role
+
         try:
             body = body.decode("utf-8")
             body = json.loads(body)

+ 7 - 0
backend/open_webui/apps/images/main.py

@@ -25,6 +25,7 @@ from open_webui.config import (
     COMFYUI_WORKFLOW,
     COMFYUI_WORKFLOW_NODES,
     CORS_ALLOW_ORIGIN,
+    OPENAI_FORWARD_USER_INFO_AS_HEADERS,
     ENABLE_IMAGE_GENERATION,
     IMAGE_GENERATION_ENGINE,
     IMAGE_GENERATION_MODEL,
@@ -456,6 +457,12 @@ async def image_generations(
             headers["Authorization"] = f"Bearer {app.state.config.OPENAI_API_KEY}"
             headers["Content-Type"] = "application/json"
 
+            if OPENAI_FORWARD_USER_INFO_AS_HEADERS:
+                headers["X-OpenWebUI-User-Name"] = user.name
+                headers["X-OpenWebUI-User-Id"] = user.id
+                headers["X-OpenWebUI-User-Email"] = user.email
+                headers["X-OpenWebUI-User-Role"] = user.role
+
             data = {
                 "model": (
                     app.state.config.MODEL

+ 21 - 0
backend/open_webui/apps/openai/main.py

@@ -16,6 +16,7 @@ from open_webui.config import (
     MODEL_FILTER_LIST,
     OPENAI_API_BASE_URLS,
     OPENAI_API_KEYS,
+    OPENAI_FORWARD_USER_INFO_AS_HEADERS,
     AppConfig,
 )
 from open_webui.env import (
@@ -140,6 +141,11 @@ async def speech(request: Request, user=Depends(get_verified_user)):
         if "openrouter.ai" in app.state.config.OPENAI_API_BASE_URLS[idx]:
             headers["HTTP-Referer"] = "https://openwebui.com/"
             headers["X-Title"] = "Open WebUI"
+        if OPENAI_FORWARD_USER_INFO_AS_HEADERS:
+            headers["X-OpenWebUI-User-Name"] = user.name
+            headers["X-OpenWebUI-User-Id"] = user.id
+            headers["X-OpenWebUI-User-Email"] = user.email
+            headers["X-OpenWebUI-User-Role"] = user.role
         r = None
         try:
             r = requests.post(
@@ -325,6 +331,11 @@ async def get_models(url_idx: Optional[int] = None, user=Depends(get_verified_us
         headers = {}
         headers["Authorization"] = f"Bearer {key}"
         headers["Content-Type"] = "application/json"
+        if OPENAI_FORWARD_USER_INFO_AS_HEADERS:
+            headers["X-OpenWebUI-User-Name"] = user.name
+            headers["X-OpenWebUI-User-Id"] = user.id
+            headers["X-OpenWebUI-User-Email"] = user.email
+            headers["X-OpenWebUI-User-Role"] = user.role
 
         r = None
 
@@ -437,6 +448,11 @@ async def generate_chat_completion(
     if "openrouter.ai" in app.state.config.OPENAI_API_BASE_URLS[idx]:
         headers["HTTP-Referer"] = "https://openwebui.com/"
         headers["X-Title"] = "Open WebUI"
+    if OPENAI_FORWARD_USER_INFO_AS_HEADERS:
+        headers["X-OpenWebUI-User-Name"] = user.name
+        headers["X-OpenWebUI-User-Id"] = user.id
+        headers["X-OpenWebUI-User-Email"] = user.email
+        headers["X-OpenWebUI-User-Role"] = user.role
 
     r = None
     session = None
@@ -505,6 +521,11 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
     headers = {}
     headers["Authorization"] = f"Bearer {key}"
     headers["Content-Type"] = "application/json"
+    if OPENAI_FORWARD_USER_INFO_AS_HEADERS:
+        headers["X-OpenWebUI-User-Name"] = user.name
+        headers["X-OpenWebUI-User-Id"] = user.id
+        headers["X-OpenWebUI-User-Email"] = user.email
+        headers["X-OpenWebUI-User-Role"] = user.role
 
     r = None
     session = None

+ 7 - 0
backend/open_webui/config.py

@@ -422,6 +422,7 @@ OAUTH_ADMIN_ROLES = PersistentConfig(
 )
 
 
+
 def load_oauth_providers():
     OAUTH_PROVIDERS.clear()
     if GOOGLE_CLIENT_ID.value and GOOGLE_CLIENT_SECRET.value:
@@ -657,6 +658,12 @@ except Exception:
 
 OPENAI_API_BASE_URL = "https://api.openai.com/v1"
 
+OPENAI_FORWARD_USER_INFO_AS_HEADERS = PersistentConfig(
+    "OPENAI_FORWARD_USER_INFO_AS_HEADERS",
+    "oauth.OPENAI_FORWARD_USER_INFO_AS_HEADERS",
+    os.environ.get("OPENAI_FORWARD_USER_INFO_AS_HEADERS", "False").lower() == "true",
+)
+
 ####################################
 # WEBUI
 ####################################