diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py index 41e88df5d2..fcf31fdd27 100644 --- a/backend/open_webui/config.py +++ b/backend/open_webui/config.py @@ -808,7 +808,7 @@ def load_oauth_providers(): f"⚠️ OAuth providers configured ({provider_list}) but OPENID_PROVIDER_URL not set - logout will not work!" ) log.warning( - f"Set OPENID_PROVIDER_URL to your OAuth provider's OpenID Connect discovery endpoint to fix logout functionality." + "Set OPENID_PROVIDER_URL to your OAuth provider's OpenID Connect discovery endpoint to fix logout functionality." ) @@ -826,9 +826,9 @@ try: if item.is_file() or item.is_symlink(): try: item.unlink() - except Exception as e: + except Exception: pass -except Exception as e: +except Exception: pass for file_path in (FRONTEND_BUILD_DIR / "static").glob("**/*"): @@ -3104,6 +3104,12 @@ JINA_API_KEY = PersistentConfig( os.getenv("JINA_API_KEY", ""), ) +JINA_SEARCH_API_URL = PersistentConfig( + "JINA_SEARCH_API_URL", + "rag.web.search.jina_search_api_url", + os.getenv("JINA_SEARCH_API_URL", "https://s.jina.ai/"), +) + SEARCHAPI_API_KEY = PersistentConfig( "SEARCHAPI_API_KEY", "rag.web.search.searchapi_api_key", diff --git a/backend/open_webui/main.py b/backend/open_webui/main.py index 21a1aee043..58d8d9e427 100644 --- a/backend/open_webui/main.py +++ b/backend/open_webui/main.py @@ -1,526 +1,489 @@ import asyncio -import inspect import json import logging import mimetypes import os -import shutil +import re import sys import time -import random -import re -from uuid import uuid4 - - from contextlib import asynccontextmanager -from urllib.parse import urlencode, parse_qs, urlparse -from pydantic import BaseModel -from sqlalchemy import text +from urllib.parse import parse_qs, urlencode, urlparse -from typing import Optional -from aiocache import cached import aiohttp import anyio.to_thread import requests -from redis import Redis - - from fastapi import ( Depends, FastAPI, - File, - Form, HTTPException, Request, - UploadFile, - status, applications, - BackgroundTasks, + status, ) -from fastapi.openapi.docs import get_swagger_ui_html - from fastapi.middleware.cors import CORSMiddleware +from fastapi.openapi.docs import get_swagger_ui_html from fastapi.responses import FileResponse, JSONResponse, RedirectResponse from fastapi.staticfiles import StaticFiles - -from starlette_compress import CompressMiddleware - +from pydantic import BaseModel +from sqlalchemy import text +from starlette.datastructures import Headers from starlette.exceptions import HTTPException as StarletteHTTPException from starlette.middleware.base import BaseHTTPMiddleware from starlette.middleware.sessions import SessionMiddleware -from starlette.responses import Response, StreamingResponse -from starlette.datastructures import Headers - +from starlette.responses import Response +from starlette_compress import CompressMiddleware +from starsessions import ( + SessionAutoloadMiddleware, +) from starsessions import ( SessionMiddleware as StarSessionsMiddleware, - SessionAutoloadMiddleware, ) from starsessions.stores.redis import RedisStore -from open_webui.utils import logger -from open_webui.utils.audit import AuditLevel, AuditLoggingMiddleware -from open_webui.utils.logger import start_logger -from open_webui.socket.main import ( - MODELS, - app as socket_app, - periodic_usage_pool_cleanup, - get_event_emitter, - get_models_in_use, -) -from open_webui.routers import ( - audio, - images, - ollama, - openai, - retrieval, - pipelines, - tasks, - auths, - channels, - chats, - notes, - folders, - configs, - groups, - files, - functions, - memories, - models, - knowledge, - prompts, - evaluations, - tools, - users, - utils, - scim, -) - -from open_webui.routers.retrieval import ( - get_embedding_function, - get_reranking_function, - get_ef, - get_rf, -) - -from open_webui.internal.db import Session, engine - -from open_webui.models.functions import Functions -from open_webui.models.models import Models -from open_webui.models.users import UserModel, Users -from open_webui.models.chats import Chats - from open_webui.config import ( - # Ollama - ENABLE_OLLAMA_API, - OLLAMA_BASE_URLS, - OLLAMA_API_CONFIGS, - # OpenAI - ENABLE_OPENAI_API, - OPENAI_API_BASE_URLS, - OPENAI_API_KEYS, - OPENAI_API_CONFIGS, - # Direct Connections - ENABLE_DIRECT_CONNECTIONS, - # Model list - ENABLE_BASE_MODELS_CACHE, - # Thread pool size for FastAPI/AnyIO - THREAD_POOL_SIZE, - # Tool Server Configs - TOOL_SERVER_CONNECTIONS, - # Code Execution - ENABLE_CODE_EXECUTION, - CODE_EXECUTION_ENGINE, - CODE_EXECUTION_JUPYTER_URL, - CODE_EXECUTION_JUPYTER_AUTH, - CODE_EXECUTION_JUPYTER_AUTH_TOKEN, - CODE_EXECUTION_JUPYTER_AUTH_PASSWORD, - CODE_EXECUTION_JUPYTER_TIMEOUT, - ENABLE_CODE_INTERPRETER, - CODE_INTERPRETER_ENGINE, - CODE_INTERPRETER_PROMPT_TEMPLATE, - CODE_INTERPRETER_JUPYTER_URL, - CODE_INTERPRETER_JUPYTER_AUTH, - CODE_INTERPRETER_JUPYTER_AUTH_TOKEN, - CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD, - CODE_INTERPRETER_JUPYTER_TIMEOUT, + ADMIN_EMAIL, + API_KEYS_ALLOWED_ENDPOINTS, + AUDIO_STT_AZURE_API_KEY, + AUDIO_STT_AZURE_BASE_URL, + AUDIO_STT_AZURE_LOCALES, + AUDIO_STT_AZURE_MAX_SPEAKERS, + AUDIO_STT_AZURE_REGION, + # Audio + AUDIO_STT_ENGINE, + AUDIO_STT_MISTRAL_API_BASE_URL, + AUDIO_STT_MISTRAL_API_KEY, + AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS, + AUDIO_STT_MODEL, + AUDIO_STT_OPENAI_API_BASE_URL, + AUDIO_STT_OPENAI_API_KEY, + AUDIO_STT_SUPPORTED_CONTENT_TYPES, + AUDIO_TTS_API_KEY, + AUDIO_TTS_AZURE_SPEECH_BASE_URL, + AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT, + AUDIO_TTS_AZURE_SPEECH_REGION, + AUDIO_TTS_ENGINE, + AUDIO_TTS_MODEL, + AUDIO_TTS_OPENAI_API_BASE_URL, + AUDIO_TTS_OPENAI_API_KEY, + AUDIO_TTS_OPENAI_PARAMS, + AUDIO_TTS_SPLIT_ON, + AUDIO_TTS_VOICE, + AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH, + AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, # Image AUTOMATIC1111_API_AUTH, AUTOMATIC1111_BASE_URL, AUTOMATIC1111_PARAMS, - COMFYUI_BASE_URL, - COMFYUI_API_KEY, - COMFYUI_WORKFLOW, - COMFYUI_WORKFLOW_NODES, - ENABLE_IMAGE_GENERATION, - ENABLE_IMAGE_PROMPT_GENERATION, - IMAGE_GENERATION_ENGINE, - IMAGE_GENERATION_MODEL, - IMAGE_SIZE, - IMAGE_STEPS, - IMAGES_OPENAI_API_BASE_URL, - IMAGES_OPENAI_API_VERSION, - IMAGES_OPENAI_API_KEY, - IMAGES_OPENAI_API_PARAMS, - IMAGES_GEMINI_API_BASE_URL, - IMAGES_GEMINI_API_KEY, - IMAGES_GEMINI_ENDPOINT_METHOD, - ENABLE_IMAGE_EDIT, - IMAGE_EDIT_ENGINE, - IMAGE_EDIT_MODEL, - IMAGE_EDIT_SIZE, - IMAGES_EDIT_OPENAI_API_BASE_URL, - IMAGES_EDIT_OPENAI_API_KEY, - IMAGES_EDIT_OPENAI_API_VERSION, - IMAGES_EDIT_GEMINI_API_BASE_URL, - IMAGES_EDIT_GEMINI_API_KEY, - IMAGES_EDIT_COMFYUI_BASE_URL, - IMAGES_EDIT_COMFYUI_API_KEY, - IMAGES_EDIT_COMFYUI_WORKFLOW, - IMAGES_EDIT_COMFYUI_WORKFLOW_NODES, - # Audio - AUDIO_STT_ENGINE, - AUDIO_STT_MODEL, - AUDIO_STT_SUPPORTED_CONTENT_TYPES, - AUDIO_STT_OPENAI_API_BASE_URL, - AUDIO_STT_OPENAI_API_KEY, - AUDIO_STT_AZURE_API_KEY, - AUDIO_STT_AZURE_REGION, - AUDIO_STT_AZURE_LOCALES, - AUDIO_STT_AZURE_BASE_URL, - AUDIO_STT_AZURE_MAX_SPEAKERS, - AUDIO_STT_MISTRAL_API_KEY, - AUDIO_STT_MISTRAL_API_BASE_URL, - AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS, - AUDIO_TTS_ENGINE, - AUDIO_TTS_MODEL, - AUDIO_TTS_VOICE, - AUDIO_TTS_OPENAI_API_BASE_URL, - AUDIO_TTS_OPENAI_API_KEY, - AUDIO_TTS_OPENAI_PARAMS, - AUDIO_TTS_API_KEY, - AUDIO_TTS_SPLIT_ON, - AUDIO_TTS_AZURE_SPEECH_REGION, - AUDIO_TTS_AZURE_SPEECH_BASE_URL, - AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT, - PLAYWRIGHT_WS_URL, - PLAYWRIGHT_TIMEOUT, - FIRECRAWL_API_BASE_URL, - FIRECRAWL_API_KEY, - WEB_LOADER_ENGINE, - WEB_LOADER_CONCURRENT_REQUESTS, - WHISPER_MODEL, - WHISPER_VAD_FILTER, - WHISPER_LANGUAGE, - DEEPGRAM_API_KEY, - WHISPER_MODEL_AUTO_UPDATE, - WHISPER_MODEL_DIR, - # Retrieval - RAG_TEMPLATE, - DEFAULT_RAG_TEMPLATE, - RAG_FULL_CONTEXT, + BING_SEARCH_V7_ENDPOINT, + BING_SEARCH_V7_SUBSCRIPTION_KEY, + BOCHA_SEARCH_API_KEY, + BRAVE_SEARCH_API_KEY, + BYPASS_ADMIN_ACCESS_CONTROL, BYPASS_EMBEDDING_AND_RETRIEVAL, - RAG_EMBEDDING_MODEL, - RAG_EMBEDDING_MODEL_AUTO_UPDATE, - RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE, - RAG_RERANKING_ENGINE, - RAG_RERANKING_MODEL, - RAG_EXTERNAL_RERANKER_URL, - RAG_EXTERNAL_RERANKER_API_KEY, - RAG_RERANKING_MODEL_AUTO_UPDATE, - RAG_RERANKING_MODEL_TRUST_REMOTE_CODE, - RAG_EMBEDDING_ENGINE, - RAG_EMBEDDING_BATCH_SIZE, - ENABLE_ASYNC_EMBEDDING, - RAG_TOP_K, - RAG_TOP_K_RERANKER, - RAG_RELEVANCE_THRESHOLD, - RAG_HYBRID_BM25_WEIGHT, - RAG_ALLOWED_FILE_EXTENSIONS, - RAG_FILE_MAX_COUNT, - RAG_FILE_MAX_SIZE, - FILE_IMAGE_COMPRESSION_WIDTH, - FILE_IMAGE_COMPRESSION_HEIGHT, - RAG_OPENAI_API_BASE_URL, - RAG_OPENAI_API_KEY, - RAG_AZURE_OPENAI_BASE_URL, - RAG_AZURE_OPENAI_API_KEY, - RAG_AZURE_OPENAI_API_VERSION, - RAG_OLLAMA_BASE_URL, - RAG_OLLAMA_API_KEY, + BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, + BYPASS_WEB_SEARCH_WEB_LOADER, + CACHE_DIR, CHUNK_OVERLAP, CHUNK_SIZE, + CODE_EXECUTION_ENGINE, + CODE_EXECUTION_JUPYTER_AUTH, + CODE_EXECUTION_JUPYTER_AUTH_PASSWORD, + CODE_EXECUTION_JUPYTER_AUTH_TOKEN, + CODE_EXECUTION_JUPYTER_TIMEOUT, + CODE_EXECUTION_JUPYTER_URL, + CODE_INTERPRETER_ENGINE, + CODE_INTERPRETER_JUPYTER_AUTH, + CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD, + CODE_INTERPRETER_JUPYTER_AUTH_TOKEN, + CODE_INTERPRETER_JUPYTER_TIMEOUT, + CODE_INTERPRETER_JUPYTER_URL, + CODE_INTERPRETER_PROMPT_TEMPLATE, + COMFYUI_API_KEY, + COMFYUI_BASE_URL, + COMFYUI_WORKFLOW, + COMFYUI_WORKFLOW_NODES, CONTENT_EXTRACTION_ENGINE, - DATALAB_MARKER_API_KEY, - DATALAB_MARKER_API_BASE_URL, + CORS_ALLOW_ORIGIN, DATALAB_MARKER_ADDITIONAL_CONFIG, - DATALAB_MARKER_SKIP_CACHE, - DATALAB_MARKER_FORCE_OCR, - DATALAB_MARKER_PAGINATE, - DATALAB_MARKER_STRIP_EXISTING_OCR, + DATALAB_MARKER_API_BASE_URL, + DATALAB_MARKER_API_KEY, DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION, + DATALAB_MARKER_FORCE_OCR, DATALAB_MARKER_FORMAT_LINES, DATALAB_MARKER_OUTPUT_FORMAT, - MINERU_API_MODE, - MINERU_API_URL, - MINERU_API_KEY, - MINERU_PARAMS, + DATALAB_MARKER_PAGINATE, + DATALAB_MARKER_SKIP_CACHE, + DATALAB_MARKER_STRIP_EXISTING_OCR, DATALAB_MARKER_USE_LLM, - EXTERNAL_DOCUMENT_LOADER_URL, - EXTERNAL_DOCUMENT_LOADER_API_KEY, - TIKA_SERVER_URL, - DOCLING_SERVER_URL, + DEEPGRAM_API_KEY, + DEFAULT_GROUP_ID, + DEFAULT_LOCALE, + DEFAULT_MODELS, + DEFAULT_PINNED_MODELS, + DEFAULT_PROMPT_SUGGESTIONS, + DEFAULT_USER_ROLE, DOCLING_API_KEY, DOCLING_PARAMS, + DOCLING_SERVER_URL, DOCUMENT_INTELLIGENCE_ENDPOINT, DOCUMENT_INTELLIGENCE_KEY, DOCUMENT_INTELLIGENCE_MODEL, - MISTRAL_OCR_API_BASE_URL, - MISTRAL_OCR_API_KEY, - RAG_TEXT_SPLITTER, - TIKTOKEN_ENCODING_NAME, - PDF_EXTRACT_IMAGES, - YOUTUBE_LOADER_LANGUAGE, - YOUTUBE_LOADER_PROXY_URL, + # Admin + ENABLE_ADMIN_CHAT_ACCESS, + ENABLE_ADMIN_EXPORT, + ENABLE_API_KEYS, + ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS, + ENABLE_ASYNC_EMBEDDING, + ENABLE_AUTOCOMPLETE_GENERATION, + # Model list + ENABLE_BASE_MODELS_CACHE, + ENABLE_CHANNELS, + # Code Execution + ENABLE_CODE_EXECUTION, + ENABLE_CODE_INTERPRETER, + ENABLE_COMMUNITY_SHARING, + # Direct Connections + ENABLE_DIRECT_CONNECTIONS, + ENABLE_EVALUATION_ARENA_MODELS, + ENABLE_FOLDERS, + ENABLE_FOLLOW_UP_GENERATION, + ENABLE_GOOGLE_DRIVE_INTEGRATION, + ENABLE_IMAGE_EDIT, + ENABLE_IMAGE_GENERATION, + ENABLE_IMAGE_PROMPT_GENERATION, + # WebUI (LDAP) + ENABLE_LDAP, + ENABLE_LDAP_GROUP_CREATION, + # LDAP Group Management + ENABLE_LDAP_GROUP_MANAGEMENT, + ENABLE_LOGIN_FORM, + ENABLE_MESSAGE_RATING, + ENABLE_NOTES, + # WebUI (OAuth) + ENABLE_OAUTH_ROLE_MANAGEMENT, + # Ollama + ENABLE_OLLAMA_API, + ENABLE_ONEDRIVE_BUSINESS, + ENABLE_ONEDRIVE_INTEGRATION, + ENABLE_ONEDRIVE_PERSONAL, + # OpenAI + ENABLE_OPENAI_API, + ENABLE_RAG_HYBRID_SEARCH, + ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS, + ENABLE_RETRIEVAL_QUERY_GENERATION, + ENABLE_SEARCH_QUERY_GENERATION, + ENABLE_SIGNUP, + ENABLE_TAGS_GENERATION, + ENABLE_TITLE_GENERATION, + ENABLE_USER_WEBHOOKS, + ENABLE_WEB_LOADER_SSL_VERIFICATION, # Retrieval (Web Search) ENABLE_WEB_SEARCH, - WEB_SEARCH_ENGINE, - BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL, - BYPASS_WEB_SEARCH_WEB_LOADER, - WEB_SEARCH_RESULT_COUNT, - WEB_SEARCH_CONCURRENT_REQUESTS, - WEB_SEARCH_TRUST_ENV, - WEB_SEARCH_DOMAIN_FILTER_LIST, - OLLAMA_CLOUD_WEB_SEARCH_API_KEY, + # Misc + ENV, + EVALUATION_ARENA_MODELS, + EXA_API_KEY, + EXTERNAL_DOCUMENT_LOADER_API_KEY, + EXTERNAL_DOCUMENT_LOADER_URL, + EXTERNAL_WEB_LOADER_API_KEY, + EXTERNAL_WEB_LOADER_URL, + EXTERNAL_WEB_SEARCH_API_KEY, + EXTERNAL_WEB_SEARCH_URL, + FILE_IMAGE_COMPRESSION_HEIGHT, + FILE_IMAGE_COMPRESSION_WIDTH, + FIRECRAWL_API_BASE_URL, + FIRECRAWL_API_KEY, + FOLLOW_UP_GENERATION_PROMPT_TEMPLATE, + FRONTEND_BUILD_DIR, + GOOGLE_DRIVE_API_KEY, + GOOGLE_DRIVE_CLIENT_ID, + GOOGLE_PSE_API_KEY, + GOOGLE_PSE_ENGINE_ID, + IMAGE_EDIT_ENGINE, + IMAGE_EDIT_MODEL, + IMAGE_EDIT_SIZE, + IMAGE_GENERATION_ENGINE, + IMAGE_GENERATION_MODEL, + IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, + IMAGE_SIZE, + IMAGE_STEPS, + IMAGES_EDIT_COMFYUI_API_KEY, + IMAGES_EDIT_COMFYUI_BASE_URL, + IMAGES_EDIT_COMFYUI_WORKFLOW, + IMAGES_EDIT_COMFYUI_WORKFLOW_NODES, + IMAGES_EDIT_GEMINI_API_BASE_URL, + IMAGES_EDIT_GEMINI_API_KEY, + IMAGES_EDIT_OPENAI_API_BASE_URL, + IMAGES_EDIT_OPENAI_API_KEY, + IMAGES_EDIT_OPENAI_API_VERSION, + IMAGES_GEMINI_API_BASE_URL, + IMAGES_GEMINI_API_KEY, + IMAGES_GEMINI_ENDPOINT_METHOD, + IMAGES_OPENAI_API_BASE_URL, + IMAGES_OPENAI_API_KEY, + IMAGES_OPENAI_API_PARAMS, + IMAGES_OPENAI_API_VERSION, JINA_API_KEY, + JINA_SEARCH_API_URL, + JWT_EXPIRES_IN, + KAGI_SEARCH_API_KEY, + LDAP_APP_DN, + LDAP_APP_PASSWORD, + LDAP_ATTRIBUTE_FOR_GROUPS, + LDAP_ATTRIBUTE_FOR_MAIL, + LDAP_ATTRIBUTE_FOR_USERNAME, + LDAP_CA_CERT_FILE, + LDAP_CIPHERS, + LDAP_SEARCH_BASE, + LDAP_SEARCH_FILTERS, + LDAP_SERVER_HOST, + LDAP_SERVER_LABEL, + LDAP_SERVER_PORT, + LDAP_USE_TLS, + LDAP_VALIDATE_CERT, + MINERU_API_KEY, + MINERU_API_MODE, + MINERU_API_URL, + MINERU_PARAMS, + MISTRAL_OCR_API_BASE_URL, + MISTRAL_OCR_API_KEY, + MODEL_ORDER_LIST, + MOJEEK_SEARCH_API_KEY, + OAUTH_ADMIN_ROLES, + OAUTH_ALLOWED_ROLES, + OAUTH_EMAIL_CLAIM, + OAUTH_PICTURE_CLAIM, + OAUTH_PROVIDERS, + OAUTH_ROLES_CLAIM, + OAUTH_USERNAME_CLAIM, + OLLAMA_API_CONFIGS, + OLLAMA_BASE_URLS, + OLLAMA_CLOUD_WEB_SEARCH_API_KEY, + ONEDRIVE_CLIENT_ID_BUSINESS, + ONEDRIVE_CLIENT_ID_PERSONAL, + ONEDRIVE_SHAREPOINT_TENANT_ID, + ONEDRIVE_SHAREPOINT_URL, + OPENAI_API_BASE_URLS, + OPENAI_API_CONFIGS, + OPENAI_API_KEYS, + PDF_EXTRACT_IMAGES, + PENDING_USER_OVERLAY_CONTENT, + PENDING_USER_OVERLAY_TITLE, + PERPLEXITY_API_KEY, + PERPLEXITY_MODEL, + PERPLEXITY_SEARCH_API_URL, + PERPLEXITY_SEARCH_CONTEXT_USAGE, + PLAYWRIGHT_TIMEOUT, + PLAYWRIGHT_WS_URL, + QUERY_GENERATION_PROMPT_TEMPLATE, + RAG_ALLOWED_FILE_EXTENSIONS, + RAG_AZURE_OPENAI_API_KEY, + RAG_AZURE_OPENAI_API_VERSION, + RAG_AZURE_OPENAI_BASE_URL, + RAG_EMBEDDING_BATCH_SIZE, + RAG_EMBEDDING_ENGINE, + RAG_EMBEDDING_MODEL, + RAG_EXTERNAL_RERANKER_API_KEY, + RAG_EXTERNAL_RERANKER_URL, + RAG_FILE_MAX_COUNT, + RAG_FILE_MAX_SIZE, + RAG_FULL_CONTEXT, + RAG_HYBRID_BM25_WEIGHT, + RAG_OLLAMA_API_KEY, + RAG_OLLAMA_BASE_URL, + RAG_OPENAI_API_BASE_URL, + RAG_OPENAI_API_KEY, + RAG_RELEVANCE_THRESHOLD, + RAG_RERANKING_ENGINE, + RAG_RERANKING_MODEL, + RAG_TEMPLATE, + RAG_TEXT_SPLITTER, + RAG_TOP_K, + RAG_TOP_K_RERANKER, + RESPONSE_WATERMARK, SEARCHAPI_API_KEY, SEARCHAPI_ENGINE, + SEARXNG_QUERY_URL, SERPAPI_API_KEY, SERPAPI_ENGINE, - SEARXNG_QUERY_URL, - YACY_QUERY_URL, - YACY_USERNAME, - YACY_PASSWORD, SERPER_API_KEY, SERPLY_API_KEY, SERPSTACK_API_KEY, SERPSTACK_HTTPS, - TAVILY_API_KEY, - TAVILY_EXTRACT_DEPTH, - BING_SEARCH_V7_ENDPOINT, - BING_SEARCH_V7_SUBSCRIPTION_KEY, - BRAVE_SEARCH_API_KEY, - EXA_API_KEY, - PERPLEXITY_API_KEY, - PERPLEXITY_MODEL, - PERPLEXITY_SEARCH_CONTEXT_USAGE, - PERPLEXITY_SEARCH_API_URL, + SHOW_ADMIN_DETAILS, SOUGOU_API_SID, SOUGOU_API_SK, - KAGI_SEARCH_API_KEY, - MOJEEK_SEARCH_API_KEY, - BOCHA_SEARCH_API_KEY, - GOOGLE_PSE_API_KEY, - GOOGLE_PSE_ENGINE_ID, - GOOGLE_DRIVE_CLIENT_ID, - GOOGLE_DRIVE_API_KEY, - ENABLE_ONEDRIVE_INTEGRATION, - ONEDRIVE_CLIENT_ID_PERSONAL, - ONEDRIVE_CLIENT_ID_BUSINESS, - ONEDRIVE_SHAREPOINT_URL, - ONEDRIVE_SHAREPOINT_TENANT_ID, - ENABLE_ONEDRIVE_PERSONAL, - ENABLE_ONEDRIVE_BUSINESS, - ENABLE_RAG_HYBRID_SEARCH, - ENABLE_RAG_HYBRID_SEARCH_ENRICHED_TEXTS, - ENABLE_RAG_LOCAL_WEB_FETCH, - ENABLE_WEB_LOADER_SSL_VERIFICATION, - ENABLE_GOOGLE_DRIVE_INTEGRATION, - UPLOAD_DIR, - EXTERNAL_WEB_SEARCH_URL, - EXTERNAL_WEB_SEARCH_API_KEY, - EXTERNAL_WEB_LOADER_URL, - EXTERNAL_WEB_LOADER_API_KEY, - # WebUI - WEBUI_AUTH, - WEBUI_NAME, - WEBUI_BANNERS, - WEBHOOK_URL, - ADMIN_EMAIL, - SHOW_ADMIN_DETAILS, - JWT_EXPIRES_IN, - ENABLE_SIGNUP, - ENABLE_LOGIN_FORM, - ENABLE_API_KEYS, - ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS, - API_KEYS_ALLOWED_ENDPOINTS, - ENABLE_FOLDERS, - ENABLE_CHANNELS, - ENABLE_NOTES, - ENABLE_COMMUNITY_SHARING, - ENABLE_MESSAGE_RATING, - ENABLE_USER_WEBHOOKS, - ENABLE_EVALUATION_ARENA_MODELS, - BYPASS_ADMIN_ACCESS_CONTROL, - USER_PERMISSIONS, - DEFAULT_USER_ROLE, - DEFAULT_GROUP_ID, - PENDING_USER_OVERLAY_CONTENT, - PENDING_USER_OVERLAY_TITLE, - DEFAULT_PROMPT_SUGGESTIONS, - DEFAULT_MODELS, - DEFAULT_PINNED_MODELS, - DEFAULT_ARENA_MODEL, - MODEL_ORDER_LIST, - EVALUATION_ARENA_MODELS, - # WebUI (OAuth) - ENABLE_OAUTH_ROLE_MANAGEMENT, - OAUTH_ROLES_CLAIM, - OAUTH_EMAIL_CLAIM, - OAUTH_PICTURE_CLAIM, - OAUTH_USERNAME_CLAIM, - OAUTH_ALLOWED_ROLES, - OAUTH_ADMIN_ROLES, - # WebUI (LDAP) - ENABLE_LDAP, - LDAP_SERVER_LABEL, - LDAP_SERVER_HOST, - LDAP_SERVER_PORT, - LDAP_ATTRIBUTE_FOR_MAIL, - LDAP_ATTRIBUTE_FOR_USERNAME, - LDAP_SEARCH_FILTERS, - LDAP_SEARCH_BASE, - LDAP_APP_DN, - LDAP_APP_PASSWORD, - LDAP_USE_TLS, - LDAP_CA_CERT_FILE, - LDAP_VALIDATE_CERT, - LDAP_CIPHERS, - # LDAP Group Management - ENABLE_LDAP_GROUP_MANAGEMENT, - ENABLE_LDAP_GROUP_CREATION, - LDAP_ATTRIBUTE_FOR_GROUPS, - # Misc - ENV, - CACHE_DIR, STATIC_DIR, - FRONTEND_BUILD_DIR, - CORS_ALLOW_ORIGIN, - DEFAULT_LOCALE, - OAUTH_PROVIDERS, - WEBUI_URL, - RESPONSE_WATERMARK, - # Admin - ENABLE_ADMIN_CHAT_ACCESS, - BYPASS_ADMIN_ACCESS_CONTROL, - ENABLE_ADMIN_EXPORT, + TAGS_GENERATION_PROMPT_TEMPLATE, # Tasks TASK_MODEL, TASK_MODEL_EXTERNAL, - ENABLE_TAGS_GENERATION, - ENABLE_TITLE_GENERATION, - ENABLE_FOLLOW_UP_GENERATION, - ENABLE_SEARCH_QUERY_GENERATION, - ENABLE_RETRIEVAL_QUERY_GENERATION, - ENABLE_AUTOCOMPLETE_GENERATION, + TAVILY_API_KEY, + TAVILY_EXTRACT_DEPTH, + # Thread pool size for FastAPI/AnyIO + THREAD_POOL_SIZE, + TIKA_SERVER_URL, + TIKTOKEN_ENCODING_NAME, TITLE_GENERATION_PROMPT_TEMPLATE, - FOLLOW_UP_GENERATION_PROMPT_TEMPLATE, - TAGS_GENERATION_PROMPT_TEMPLATE, - IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE, + # Tool Server Configs + TOOL_SERVER_CONNECTIONS, TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE, + USER_PERMISSIONS, VOICE_MODE_PROMPT_TEMPLATE, - QUERY_GENERATION_PROMPT_TEMPLATE, - AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE, - AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH, + WEB_LOADER_CONCURRENT_REQUESTS, + WEB_LOADER_ENGINE, + WEB_SEARCH_CONCURRENT_REQUESTS, + WEB_SEARCH_DOMAIN_FILTER_LIST, + WEB_SEARCH_ENGINE, + WEB_SEARCH_RESULT_COUNT, + WEB_SEARCH_TRUST_ENV, + WEBHOOK_URL, + # WebUI + WEBUI_AUTH, + WEBUI_BANNERS, + WEBUI_NAME, + WEBUI_URL, + WHISPER_MODEL, + WHISPER_VAD_FILTER, + YACY_PASSWORD, + YACY_QUERY_URL, + YACY_USERNAME, + YOUTUBE_LOADER_LANGUAGE, + YOUTUBE_LOADER_PROXY_URL, AppConfig, reset_config, ) +from open_webui.constants import ERROR_MESSAGES from open_webui.env import ( - LICENSE_KEY, + AIOHTTP_CLIENT_SESSION_SSL, AUDIT_EXCLUDED_PATHS, AUDIT_LOG_LEVEL, + BYPASS_MODEL_ACCESS_CONTROL, CHANGELOG, - REDIS_URL, + DEPLOYMENT_ID, + ENABLE_COMPRESSION_MIDDLEWARE, + ENABLE_OTEL, + # SCIM + ENABLE_SCIM, + ENABLE_SIGNUP_PASSWORD_CONFIRMATION, + ENABLE_STAR_SESSIONS_MIDDLEWARE, + ENABLE_VERSION_UPDATE_CHECK, + ENABLE_WEBSOCKET_SUPPORT, + EXTERNAL_PWA_MANIFEST_URL, + GLOBAL_LOG_LEVEL, + INSTANCE_ID, + LICENSE_KEY, + MAX_BODY_LOG_SIZE, REDIS_CLUSTER, REDIS_KEY_PREFIX, REDIS_SENTINEL_HOSTS, REDIS_SENTINEL_PORT, - GLOBAL_LOG_LEVEL, - MAX_BODY_LOG_SIZE, + REDIS_URL, + RESET_CONFIG_ON_START, SAFE_MODE, + SCIM_TOKEN, SRC_LOG_LEVELS, VERSION, - DEPLOYMENT_ID, - INSTANCE_ID, + WEBUI_AUTH_SIGNOUT_REDIRECT_URL, + WEBUI_AUTH_TRUSTED_EMAIL_HEADER, + WEBUI_AUTH_TRUSTED_NAME_HEADER, WEBUI_BUILD_HASH, WEBUI_SECRET_KEY, WEBUI_SESSION_COOKIE_SAME_SITE, WEBUI_SESSION_COOKIE_SECURE, - ENABLE_SIGNUP_PASSWORD_CONFIRMATION, - WEBUI_AUTH_TRUSTED_EMAIL_HEADER, - WEBUI_AUTH_TRUSTED_NAME_HEADER, - WEBUI_AUTH_SIGNOUT_REDIRECT_URL, - # SCIM - ENABLE_SCIM, - SCIM_TOKEN, - ENABLE_COMPRESSION_MIDDLEWARE, - ENABLE_WEBSOCKET_SUPPORT, - BYPASS_MODEL_ACCESS_CONTROL, - RESET_CONFIG_ON_START, - ENABLE_VERSION_UPDATE_CHECK, - ENABLE_OTEL, - EXTERNAL_PWA_MANIFEST_URL, - AIOHTTP_CLIENT_SESSION_SSL, - ENABLE_STAR_SESSIONS_MIDDLEWARE, ) - - -from open_webui.utils.models import ( - get_all_models, - get_all_base_models, - check_model_access, - get_filtered_models, +from open_webui.internal.db import Session, engine +from open_webui.models.chats import Chats +from open_webui.models.functions import Functions +from open_webui.models.models import Models +from open_webui.models.users import Users +from open_webui.routers import ( + audio, + auths, + channels, + chats, + configs, + evaluations, + files, + folders, + functions, + groups, + images, + knowledge, + memories, + models, + notes, + ollama, + openai, + pipelines, + prompts, + retrieval, + scim, + tasks, + tools, + users, + utils, +) +from open_webui.routers.retrieval import ( + get_ef, + get_embedding_function, + get_reranking_function, + get_rf, +) +from open_webui.socket.main import ( + MODELS, + get_event_emitter, + get_models_in_use, + periodic_usage_pool_cleanup, +) +from open_webui.socket.main import ( + app as socket_app, +) +from open_webui.tasks import ( + create_task, + list_task_ids_by_item_id, + list_tasks, + redis_task_command_listener, + stop_task, +) # Import from tasks.py +from open_webui.utils import logger +from open_webui.utils.audit import AuditLevel, AuditLoggingMiddleware +from open_webui.utils.auth import ( + decode_token, + get_admin_user, + get_http_authorization_cred, + get_license_data, + get_verified_user, +) +from open_webui.utils.chat import ( + chat_action as chat_action_handler, +) +from open_webui.utils.chat import ( + chat_completed as chat_completed_handler, ) from open_webui.utils.chat import ( generate_chat_completion as chat_completion_handler, - chat_completed as chat_completed_handler, - chat_action as chat_action_handler, ) from open_webui.utils.embeddings import generate_embeddings +from open_webui.utils.logger import start_logger from open_webui.utils.middleware import process_chat_payload, process_chat_response -from open_webui.utils.access_control import has_access - -from open_webui.utils.auth import ( - get_license_data, - get_http_authorization_cred, - decode_token, - get_admin_user, - get_verified_user, +from open_webui.utils.models import ( + check_model_access, + get_all_base_models, + get_all_models, + get_filtered_models, +) +from open_webui.utils.oauth import ( + OAuthClientInformationFull, + OAuthClientManager, + OAuthManager, + decrypt_data, + encrypt_data, + get_oauth_client_info_with_dynamic_client_registration, ) from open_webui.utils.plugin import install_tool_and_function_dependencies -from open_webui.utils.oauth import ( - get_oauth_client_info_with_dynamic_client_registration, - encrypt_data, - decrypt_data, - OAuthManager, - OAuthClientManager, - OAuthClientInformationFull, -) +from open_webui.utils.redis import get_redis_connection, get_sentinels_from_env from open_webui.utils.security_headers import SecurityHeadersMiddleware -from open_webui.utils.redis import get_redis_connection - -from open_webui.tasks import ( - redis_task_command_listener, - list_task_ids_by_item_id, - create_task, - stop_task, - list_tasks, -) # Import from tasks.py - -from open_webui.utils.redis import get_sentinels_from_env - - -from open_webui.constants import ERROR_MESSAGES - if SAFE_MODE: print("SAFE MODE ENABLED") @@ -953,6 +916,7 @@ app.state.config.SEARCHAPI_ENGINE = SEARCHAPI_ENGINE app.state.config.SERPAPI_API_KEY = SERPAPI_API_KEY app.state.config.SERPAPI_ENGINE = SERPAPI_ENGINE app.state.config.JINA_API_KEY = JINA_API_KEY +app.state.config.JINA_SEARCH_API_URL = JINA_SEARCH_API_URL app.state.config.BING_SEARCH_V7_ENDPOINT = BING_SEARCH_V7_ENDPOINT app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY app.state.config.EXA_API_KEY = EXA_API_KEY @@ -1652,7 +1616,7 @@ async def chat_completion( {"type": "chat:tasks:cancel"}, ) ) - except Exception as e: + except Exception: pass finally: raise # re-raise to ensure proper task cancellation handling @@ -1987,7 +1951,7 @@ async def get_app_version(): async def get_app_latest_release_version(user=Depends(get_verified_user)): if not ENABLE_VERSION_UPDATE_CHECK: log.debug( - f"Version update check is disabled, returning current version as latest version" + "Version update check is disabled, returning current version as latest version" ) return {"current": VERSION, "latest": VERSION} try: @@ -2075,7 +2039,7 @@ try: log.info("Using Redis for session") else: raise ValueError("No Redis URL provided") -except Exception as e: +except Exception: app.add_middleware( SessionMiddleware, secret_key=WEBUI_SECRET_KEY, diff --git a/backend/open_webui/retrieval/web/jina_search.py b/backend/open_webui/retrieval/web/jina_search.py index a87293db5c..4e3faa4d92 100644 --- a/backend/open_webui/retrieval/web/jina_search.py +++ b/backend/open_webui/retrieval/web/jina_search.py @@ -1,15 +1,20 @@ import logging import requests -from open_webui.retrieval.web.main import SearchResult from open_webui.env import SRC_LOG_LEVELS +from open_webui.retrieval.web.main import SearchResult from yarl import URL log = logging.getLogger(__name__) log.setLevel(SRC_LOG_LEVELS["RAG"]) -def search_jina(api_key: str, query: str, count: int) -> list[SearchResult]: +def search_jina( + api_key: str, + query: str, + count: int, + api_url: str = "https://s.jina.ai/", +) -> list[SearchResult]: """ Search using Jina's Search API and return the results as a list of SearchResult objects. Args: @@ -19,7 +24,12 @@ def search_jina(api_key: str, query: str, count: int) -> list[SearchResult]: Returns: list[SearchResult]: A list of search results """ - jina_search_endpoint = "https://s.jina.ai/" + # Handle PersistentConfig object + if hasattr(api_key, "__str__"): + api_key = str(api_key) + + if hasattr(api_url, "__str__"): + api_url = str(api_url) headers = { "Accept": "application/json", @@ -30,7 +40,7 @@ def search_jina(api_key: str, query: str, count: int) -> list[SearchResult]: payload = {"q": query, "count": count if count <= 10 else 10} - url = str(URL(jina_search_endpoint)) + url = str(URL(api_url)) response = requests.post(url, headers=headers, json=payload) response.raise_for_status() data = response.json() diff --git a/backend/open_webui/routers/retrieval.py b/backend/open_webui/routers/retrieval.py index b7ed993895..74be0c461c 100644 --- a/backend/open_webui/routers/retrieval.py +++ b/backend/open_webui/routers/retrieval.py @@ -526,6 +526,7 @@ async def get_rag_config(request: Request, user=Depends(get_admin_user)): "SERPAPI_API_KEY": request.app.state.config.SERPAPI_API_KEY, "SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE, "JINA_API_KEY": request.app.state.config.JINA_API_KEY, + "JINA_SEARCH_API_URL": request.app.state.config.JINA_SEARCH_API_URL, "BING_SEARCH_V7_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT, "BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, "EXA_API_KEY": request.app.state.config.EXA_API_KEY, @@ -584,6 +585,7 @@ class WebConfig(BaseModel): SERPAPI_API_KEY: Optional[str] = None SERPAPI_ENGINE: Optional[str] = None JINA_API_KEY: Optional[str] = None + JINA_SEARCH_API_URL: Optional[str] = None BING_SEARCH_V7_ENDPOINT: Optional[str] = None BING_SEARCH_V7_SUBSCRIPTION_KEY: Optional[str] = None EXA_API_KEY: Optional[str] = None @@ -1051,6 +1053,7 @@ async def update_rag_config( request.app.state.config.SERPAPI_API_KEY = form_data.web.SERPAPI_API_KEY request.app.state.config.SERPAPI_ENGINE = form_data.web.SERPAPI_ENGINE request.app.state.config.JINA_API_KEY = form_data.web.JINA_API_KEY + request.app.state.config.JINA_SEARCH_API_URL = form_data.web.JINA_SEARCH_API_URL request.app.state.config.BING_SEARCH_V7_ENDPOINT = ( form_data.web.BING_SEARCH_V7_ENDPOINT ) @@ -1196,6 +1199,7 @@ async def update_rag_config( "SERPAPI_API_KEY": request.app.state.config.SERPAPI_API_KEY, "SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE, "JINA_API_KEY": request.app.state.config.JINA_API_KEY, + "JINA_SEARCH_API_URL": request.app.state.config.JINA_SEARCH_API_URL, "BING_SEARCH_V7_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT, "BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY, "EXA_API_KEY": request.app.state.config.EXA_API_KEY, @@ -1458,7 +1462,6 @@ def process_file( if file: try: - collection_name = form_data.collection_name if collection_name is None: @@ -1971,6 +1974,7 @@ def search_web( request.app.state.config.JINA_API_KEY, query, request.app.state.config.WEB_SEARCH_RESULT_COUNT, + request.app.state.config.JINA_SEARCH_API_URL, ) elif engine == "bing": return search_bing( @@ -2057,7 +2061,6 @@ def search_web( async def process_web_search( request: Request, form_data: SearchForm, user=Depends(get_verified_user) ): - urls = [] result_items = [] diff --git a/src/lib/components/admin/Settings/WebSearch.svelte b/src/lib/components/admin/Settings/WebSearch.svelte index 17191ac216..8d844da176 100644 --- a/src/lib/components/admin/Settings/WebSearch.svelte +++ b/src/lib/components/admin/Settings/WebSearch.svelte @@ -448,19 +448,39 @@ - {:else if webConfig.WEB_SEARCH_ENGINE === 'jina'} -