mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-14 21:35:19 +00:00
feat: add JINA_SEARCH_API_URL configuration support
- Add JINA_SEARCH_API_URL as PersistentConfig in config.py - Update jina_search function to accept and use configurable API URL - Add JINA_SEARCH_API_URL to API endpoints (get/update) - Add frontend UI fields for Jina Search API URL configuration - Align Jina integration with Perplexity Search API URL pattern
This commit is contained in:
parent
c86fcb75b7
commit
e0d7055fa9
5 changed files with 451 additions and 448 deletions
|
|
@ -808,7 +808,7 @@ def load_oauth_providers():
|
||||||
f"⚠️ OAuth providers configured ({provider_list}) but OPENID_PROVIDER_URL not set - logout will not work!"
|
f"⚠️ OAuth providers configured ({provider_list}) but OPENID_PROVIDER_URL not set - logout will not work!"
|
||||||
)
|
)
|
||||||
log.warning(
|
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():
|
if item.is_file() or item.is_symlink():
|
||||||
try:
|
try:
|
||||||
item.unlink()
|
item.unlink()
|
||||||
except Exception as e:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
except Exception as e:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
for file_path in (FRONTEND_BUILD_DIR / "static").glob("**/*"):
|
for file_path in (FRONTEND_BUILD_DIR / "static").glob("**/*"):
|
||||||
|
|
@ -3104,6 +3104,12 @@ JINA_API_KEY = PersistentConfig(
|
||||||
os.getenv("JINA_API_KEY", ""),
|
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 = PersistentConfig(
|
||||||
"SEARCHAPI_API_KEY",
|
"SEARCHAPI_API_KEY",
|
||||||
"rag.web.search.searchapi_api_key",
|
"rag.web.search.searchapi_api_key",
|
||||||
|
|
|
||||||
|
|
@ -1,526 +1,489 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import inspect
|
|
||||||
import json
|
import json
|
||||||
import logging
|
import logging
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import os
|
import os
|
||||||
import shutil
|
import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import random
|
|
||||||
import re
|
|
||||||
from uuid import uuid4
|
|
||||||
|
|
||||||
|
|
||||||
from contextlib import asynccontextmanager
|
from contextlib import asynccontextmanager
|
||||||
from urllib.parse import urlencode, parse_qs, urlparse
|
from urllib.parse import parse_qs, urlencode, urlparse
|
||||||
from pydantic import BaseModel
|
|
||||||
from sqlalchemy import text
|
|
||||||
|
|
||||||
from typing import Optional
|
|
||||||
from aiocache import cached
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import anyio.to_thread
|
import anyio.to_thread
|
||||||
import requests
|
import requests
|
||||||
from redis import Redis
|
|
||||||
|
|
||||||
|
|
||||||
from fastapi import (
|
from fastapi import (
|
||||||
Depends,
|
Depends,
|
||||||
FastAPI,
|
FastAPI,
|
||||||
File,
|
|
||||||
Form,
|
|
||||||
HTTPException,
|
HTTPException,
|
||||||
Request,
|
Request,
|
||||||
UploadFile,
|
|
||||||
status,
|
|
||||||
applications,
|
applications,
|
||||||
BackgroundTasks,
|
status,
|
||||||
)
|
)
|
||||||
from fastapi.openapi.docs import get_swagger_ui_html
|
|
||||||
|
|
||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
from fastapi.openapi.docs import get_swagger_ui_html
|
||||||
from fastapi.responses import FileResponse, JSONResponse, RedirectResponse
|
from fastapi.responses import FileResponse, JSONResponse, RedirectResponse
|
||||||
from fastapi.staticfiles import StaticFiles
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
from pydantic import BaseModel
|
||||||
from starlette_compress import CompressMiddleware
|
from sqlalchemy import text
|
||||||
|
from starlette.datastructures import Headers
|
||||||
from starlette.exceptions import HTTPException as StarletteHTTPException
|
from starlette.exceptions import HTTPException as StarletteHTTPException
|
||||||
from starlette.middleware.base import BaseHTTPMiddleware
|
from starlette.middleware.base import BaseHTTPMiddleware
|
||||||
from starlette.middleware.sessions import SessionMiddleware
|
from starlette.middleware.sessions import SessionMiddleware
|
||||||
from starlette.responses import Response, StreamingResponse
|
from starlette.responses import Response
|
||||||
from starlette.datastructures import Headers
|
from starlette_compress import CompressMiddleware
|
||||||
|
from starsessions import (
|
||||||
|
SessionAutoloadMiddleware,
|
||||||
|
)
|
||||||
from starsessions import (
|
from starsessions import (
|
||||||
SessionMiddleware as StarSessionsMiddleware,
|
SessionMiddleware as StarSessionsMiddleware,
|
||||||
SessionAutoloadMiddleware,
|
|
||||||
)
|
)
|
||||||
from starsessions.stores.redis import RedisStore
|
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 (
|
from open_webui.config import (
|
||||||
# Ollama
|
ADMIN_EMAIL,
|
||||||
ENABLE_OLLAMA_API,
|
API_KEYS_ALLOWED_ENDPOINTS,
|
||||||
OLLAMA_BASE_URLS,
|
AUDIO_STT_AZURE_API_KEY,
|
||||||
OLLAMA_API_CONFIGS,
|
AUDIO_STT_AZURE_BASE_URL,
|
||||||
# OpenAI
|
AUDIO_STT_AZURE_LOCALES,
|
||||||
ENABLE_OPENAI_API,
|
AUDIO_STT_AZURE_MAX_SPEAKERS,
|
||||||
OPENAI_API_BASE_URLS,
|
AUDIO_STT_AZURE_REGION,
|
||||||
OPENAI_API_KEYS,
|
# Audio
|
||||||
OPENAI_API_CONFIGS,
|
AUDIO_STT_ENGINE,
|
||||||
# Direct Connections
|
AUDIO_STT_MISTRAL_API_BASE_URL,
|
||||||
ENABLE_DIRECT_CONNECTIONS,
|
AUDIO_STT_MISTRAL_API_KEY,
|
||||||
# Model list
|
AUDIO_STT_MISTRAL_USE_CHAT_COMPLETIONS,
|
||||||
ENABLE_BASE_MODELS_CACHE,
|
AUDIO_STT_MODEL,
|
||||||
# Thread pool size for FastAPI/AnyIO
|
AUDIO_STT_OPENAI_API_BASE_URL,
|
||||||
THREAD_POOL_SIZE,
|
AUDIO_STT_OPENAI_API_KEY,
|
||||||
# Tool Server Configs
|
AUDIO_STT_SUPPORTED_CONTENT_TYPES,
|
||||||
TOOL_SERVER_CONNECTIONS,
|
AUDIO_TTS_API_KEY,
|
||||||
# Code Execution
|
AUDIO_TTS_AZURE_SPEECH_BASE_URL,
|
||||||
ENABLE_CODE_EXECUTION,
|
AUDIO_TTS_AZURE_SPEECH_OUTPUT_FORMAT,
|
||||||
CODE_EXECUTION_ENGINE,
|
AUDIO_TTS_AZURE_SPEECH_REGION,
|
||||||
CODE_EXECUTION_JUPYTER_URL,
|
AUDIO_TTS_ENGINE,
|
||||||
CODE_EXECUTION_JUPYTER_AUTH,
|
AUDIO_TTS_MODEL,
|
||||||
CODE_EXECUTION_JUPYTER_AUTH_TOKEN,
|
AUDIO_TTS_OPENAI_API_BASE_URL,
|
||||||
CODE_EXECUTION_JUPYTER_AUTH_PASSWORD,
|
AUDIO_TTS_OPENAI_API_KEY,
|
||||||
CODE_EXECUTION_JUPYTER_TIMEOUT,
|
AUDIO_TTS_OPENAI_PARAMS,
|
||||||
ENABLE_CODE_INTERPRETER,
|
AUDIO_TTS_SPLIT_ON,
|
||||||
CODE_INTERPRETER_ENGINE,
|
AUDIO_TTS_VOICE,
|
||||||
CODE_INTERPRETER_PROMPT_TEMPLATE,
|
AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH,
|
||||||
CODE_INTERPRETER_JUPYTER_URL,
|
AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE,
|
||||||
CODE_INTERPRETER_JUPYTER_AUTH,
|
|
||||||
CODE_INTERPRETER_JUPYTER_AUTH_TOKEN,
|
|
||||||
CODE_INTERPRETER_JUPYTER_AUTH_PASSWORD,
|
|
||||||
CODE_INTERPRETER_JUPYTER_TIMEOUT,
|
|
||||||
# Image
|
# Image
|
||||||
AUTOMATIC1111_API_AUTH,
|
AUTOMATIC1111_API_AUTH,
|
||||||
AUTOMATIC1111_BASE_URL,
|
AUTOMATIC1111_BASE_URL,
|
||||||
AUTOMATIC1111_PARAMS,
|
AUTOMATIC1111_PARAMS,
|
||||||
COMFYUI_BASE_URL,
|
BING_SEARCH_V7_ENDPOINT,
|
||||||
COMFYUI_API_KEY,
|
BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
||||||
COMFYUI_WORKFLOW,
|
BOCHA_SEARCH_API_KEY,
|
||||||
COMFYUI_WORKFLOW_NODES,
|
BRAVE_SEARCH_API_KEY,
|
||||||
ENABLE_IMAGE_GENERATION,
|
BYPASS_ADMIN_ACCESS_CONTROL,
|
||||||
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,
|
|
||||||
BYPASS_EMBEDDING_AND_RETRIEVAL,
|
BYPASS_EMBEDDING_AND_RETRIEVAL,
|
||||||
RAG_EMBEDDING_MODEL,
|
BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL,
|
||||||
RAG_EMBEDDING_MODEL_AUTO_UPDATE,
|
BYPASS_WEB_SEARCH_WEB_LOADER,
|
||||||
RAG_EMBEDDING_MODEL_TRUST_REMOTE_CODE,
|
CACHE_DIR,
|
||||||
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,
|
|
||||||
CHUNK_OVERLAP,
|
CHUNK_OVERLAP,
|
||||||
CHUNK_SIZE,
|
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,
|
CONTENT_EXTRACTION_ENGINE,
|
||||||
DATALAB_MARKER_API_KEY,
|
CORS_ALLOW_ORIGIN,
|
||||||
DATALAB_MARKER_API_BASE_URL,
|
|
||||||
DATALAB_MARKER_ADDITIONAL_CONFIG,
|
DATALAB_MARKER_ADDITIONAL_CONFIG,
|
||||||
DATALAB_MARKER_SKIP_CACHE,
|
DATALAB_MARKER_API_BASE_URL,
|
||||||
DATALAB_MARKER_FORCE_OCR,
|
DATALAB_MARKER_API_KEY,
|
||||||
DATALAB_MARKER_PAGINATE,
|
|
||||||
DATALAB_MARKER_STRIP_EXISTING_OCR,
|
|
||||||
DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION,
|
DATALAB_MARKER_DISABLE_IMAGE_EXTRACTION,
|
||||||
|
DATALAB_MARKER_FORCE_OCR,
|
||||||
DATALAB_MARKER_FORMAT_LINES,
|
DATALAB_MARKER_FORMAT_LINES,
|
||||||
DATALAB_MARKER_OUTPUT_FORMAT,
|
DATALAB_MARKER_OUTPUT_FORMAT,
|
||||||
MINERU_API_MODE,
|
DATALAB_MARKER_PAGINATE,
|
||||||
MINERU_API_URL,
|
DATALAB_MARKER_SKIP_CACHE,
|
||||||
MINERU_API_KEY,
|
DATALAB_MARKER_STRIP_EXISTING_OCR,
|
||||||
MINERU_PARAMS,
|
|
||||||
DATALAB_MARKER_USE_LLM,
|
DATALAB_MARKER_USE_LLM,
|
||||||
EXTERNAL_DOCUMENT_LOADER_URL,
|
DEEPGRAM_API_KEY,
|
||||||
EXTERNAL_DOCUMENT_LOADER_API_KEY,
|
DEFAULT_GROUP_ID,
|
||||||
TIKA_SERVER_URL,
|
DEFAULT_LOCALE,
|
||||||
DOCLING_SERVER_URL,
|
DEFAULT_MODELS,
|
||||||
|
DEFAULT_PINNED_MODELS,
|
||||||
|
DEFAULT_PROMPT_SUGGESTIONS,
|
||||||
|
DEFAULT_USER_ROLE,
|
||||||
DOCLING_API_KEY,
|
DOCLING_API_KEY,
|
||||||
DOCLING_PARAMS,
|
DOCLING_PARAMS,
|
||||||
|
DOCLING_SERVER_URL,
|
||||||
DOCUMENT_INTELLIGENCE_ENDPOINT,
|
DOCUMENT_INTELLIGENCE_ENDPOINT,
|
||||||
DOCUMENT_INTELLIGENCE_KEY,
|
DOCUMENT_INTELLIGENCE_KEY,
|
||||||
DOCUMENT_INTELLIGENCE_MODEL,
|
DOCUMENT_INTELLIGENCE_MODEL,
|
||||||
MISTRAL_OCR_API_BASE_URL,
|
# Admin
|
||||||
MISTRAL_OCR_API_KEY,
|
ENABLE_ADMIN_CHAT_ACCESS,
|
||||||
RAG_TEXT_SPLITTER,
|
ENABLE_ADMIN_EXPORT,
|
||||||
TIKTOKEN_ENCODING_NAME,
|
ENABLE_API_KEYS,
|
||||||
PDF_EXTRACT_IMAGES,
|
ENABLE_API_KEYS_ENDPOINT_RESTRICTIONS,
|
||||||
YOUTUBE_LOADER_LANGUAGE,
|
ENABLE_ASYNC_EMBEDDING,
|
||||||
YOUTUBE_LOADER_PROXY_URL,
|
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)
|
# Retrieval (Web Search)
|
||||||
ENABLE_WEB_SEARCH,
|
ENABLE_WEB_SEARCH,
|
||||||
WEB_SEARCH_ENGINE,
|
# Misc
|
||||||
BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL,
|
ENV,
|
||||||
BYPASS_WEB_SEARCH_WEB_LOADER,
|
EVALUATION_ARENA_MODELS,
|
||||||
WEB_SEARCH_RESULT_COUNT,
|
EXA_API_KEY,
|
||||||
WEB_SEARCH_CONCURRENT_REQUESTS,
|
EXTERNAL_DOCUMENT_LOADER_API_KEY,
|
||||||
WEB_SEARCH_TRUST_ENV,
|
EXTERNAL_DOCUMENT_LOADER_URL,
|
||||||
WEB_SEARCH_DOMAIN_FILTER_LIST,
|
EXTERNAL_WEB_LOADER_API_KEY,
|
||||||
OLLAMA_CLOUD_WEB_SEARCH_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_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_API_KEY,
|
||||||
SEARCHAPI_ENGINE,
|
SEARCHAPI_ENGINE,
|
||||||
|
SEARXNG_QUERY_URL,
|
||||||
SERPAPI_API_KEY,
|
SERPAPI_API_KEY,
|
||||||
SERPAPI_ENGINE,
|
SERPAPI_ENGINE,
|
||||||
SEARXNG_QUERY_URL,
|
|
||||||
YACY_QUERY_URL,
|
|
||||||
YACY_USERNAME,
|
|
||||||
YACY_PASSWORD,
|
|
||||||
SERPER_API_KEY,
|
SERPER_API_KEY,
|
||||||
SERPLY_API_KEY,
|
SERPLY_API_KEY,
|
||||||
SERPSTACK_API_KEY,
|
SERPSTACK_API_KEY,
|
||||||
SERPSTACK_HTTPS,
|
SERPSTACK_HTTPS,
|
||||||
TAVILY_API_KEY,
|
SHOW_ADMIN_DETAILS,
|
||||||
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,
|
|
||||||
SOUGOU_API_SID,
|
SOUGOU_API_SID,
|
||||||
SOUGOU_API_SK,
|
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,
|
STATIC_DIR,
|
||||||
FRONTEND_BUILD_DIR,
|
TAGS_GENERATION_PROMPT_TEMPLATE,
|
||||||
CORS_ALLOW_ORIGIN,
|
|
||||||
DEFAULT_LOCALE,
|
|
||||||
OAUTH_PROVIDERS,
|
|
||||||
WEBUI_URL,
|
|
||||||
RESPONSE_WATERMARK,
|
|
||||||
# Admin
|
|
||||||
ENABLE_ADMIN_CHAT_ACCESS,
|
|
||||||
BYPASS_ADMIN_ACCESS_CONTROL,
|
|
||||||
ENABLE_ADMIN_EXPORT,
|
|
||||||
# Tasks
|
# Tasks
|
||||||
TASK_MODEL,
|
TASK_MODEL,
|
||||||
TASK_MODEL_EXTERNAL,
|
TASK_MODEL_EXTERNAL,
|
||||||
ENABLE_TAGS_GENERATION,
|
TAVILY_API_KEY,
|
||||||
ENABLE_TITLE_GENERATION,
|
TAVILY_EXTRACT_DEPTH,
|
||||||
ENABLE_FOLLOW_UP_GENERATION,
|
# Thread pool size for FastAPI/AnyIO
|
||||||
ENABLE_SEARCH_QUERY_GENERATION,
|
THREAD_POOL_SIZE,
|
||||||
ENABLE_RETRIEVAL_QUERY_GENERATION,
|
TIKA_SERVER_URL,
|
||||||
ENABLE_AUTOCOMPLETE_GENERATION,
|
TIKTOKEN_ENCODING_NAME,
|
||||||
TITLE_GENERATION_PROMPT_TEMPLATE,
|
TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||||
FOLLOW_UP_GENERATION_PROMPT_TEMPLATE,
|
# Tool Server Configs
|
||||||
TAGS_GENERATION_PROMPT_TEMPLATE,
|
TOOL_SERVER_CONNECTIONS,
|
||||||
IMAGE_PROMPT_GENERATION_PROMPT_TEMPLATE,
|
|
||||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||||
|
USER_PERMISSIONS,
|
||||||
VOICE_MODE_PROMPT_TEMPLATE,
|
VOICE_MODE_PROMPT_TEMPLATE,
|
||||||
QUERY_GENERATION_PROMPT_TEMPLATE,
|
WEB_LOADER_CONCURRENT_REQUESTS,
|
||||||
AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE,
|
WEB_LOADER_ENGINE,
|
||||||
AUTOCOMPLETE_GENERATION_INPUT_MAX_LENGTH,
|
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,
|
AppConfig,
|
||||||
reset_config,
|
reset_config,
|
||||||
)
|
)
|
||||||
|
from open_webui.constants import ERROR_MESSAGES
|
||||||
from open_webui.env import (
|
from open_webui.env import (
|
||||||
LICENSE_KEY,
|
AIOHTTP_CLIENT_SESSION_SSL,
|
||||||
AUDIT_EXCLUDED_PATHS,
|
AUDIT_EXCLUDED_PATHS,
|
||||||
AUDIT_LOG_LEVEL,
|
AUDIT_LOG_LEVEL,
|
||||||
|
BYPASS_MODEL_ACCESS_CONTROL,
|
||||||
CHANGELOG,
|
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_CLUSTER,
|
||||||
REDIS_KEY_PREFIX,
|
REDIS_KEY_PREFIX,
|
||||||
REDIS_SENTINEL_HOSTS,
|
REDIS_SENTINEL_HOSTS,
|
||||||
REDIS_SENTINEL_PORT,
|
REDIS_SENTINEL_PORT,
|
||||||
GLOBAL_LOG_LEVEL,
|
REDIS_URL,
|
||||||
MAX_BODY_LOG_SIZE,
|
RESET_CONFIG_ON_START,
|
||||||
SAFE_MODE,
|
SAFE_MODE,
|
||||||
|
SCIM_TOKEN,
|
||||||
SRC_LOG_LEVELS,
|
SRC_LOG_LEVELS,
|
||||||
VERSION,
|
VERSION,
|
||||||
DEPLOYMENT_ID,
|
WEBUI_AUTH_SIGNOUT_REDIRECT_URL,
|
||||||
INSTANCE_ID,
|
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
||||||
|
WEBUI_AUTH_TRUSTED_NAME_HEADER,
|
||||||
WEBUI_BUILD_HASH,
|
WEBUI_BUILD_HASH,
|
||||||
WEBUI_SECRET_KEY,
|
WEBUI_SECRET_KEY,
|
||||||
WEBUI_SESSION_COOKIE_SAME_SITE,
|
WEBUI_SESSION_COOKIE_SAME_SITE,
|
||||||
WEBUI_SESSION_COOKIE_SECURE,
|
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.internal.db import Session, engine
|
||||||
|
from open_webui.models.chats import Chats
|
||||||
from open_webui.utils.models import (
|
from open_webui.models.functions import Functions
|
||||||
get_all_models,
|
from open_webui.models.models import Models
|
||||||
get_all_base_models,
|
from open_webui.models.users import Users
|
||||||
check_model_access,
|
from open_webui.routers import (
|
||||||
get_filtered_models,
|
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 (
|
from open_webui.utils.chat import (
|
||||||
generate_chat_completion as chat_completion_handler,
|
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.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.middleware import process_chat_payload, process_chat_response
|
||||||
from open_webui.utils.access_control import has_access
|
from open_webui.utils.models import (
|
||||||
|
check_model_access,
|
||||||
from open_webui.utils.auth import (
|
get_all_base_models,
|
||||||
get_license_data,
|
get_all_models,
|
||||||
get_http_authorization_cred,
|
get_filtered_models,
|
||||||
decode_token,
|
)
|
||||||
get_admin_user,
|
from open_webui.utils.oauth import (
|
||||||
get_verified_user,
|
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.plugin import install_tool_and_function_dependencies
|
||||||
from open_webui.utils.oauth import (
|
from open_webui.utils.redis import get_redis_connection, get_sentinels_from_env
|
||||||
get_oauth_client_info_with_dynamic_client_registration,
|
|
||||||
encrypt_data,
|
|
||||||
decrypt_data,
|
|
||||||
OAuthManager,
|
|
||||||
OAuthClientManager,
|
|
||||||
OAuthClientInformationFull,
|
|
||||||
)
|
|
||||||
from open_webui.utils.security_headers import SecurityHeadersMiddleware
|
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:
|
if SAFE_MODE:
|
||||||
print("SAFE MODE ENABLED")
|
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_API_KEY = SERPAPI_API_KEY
|
||||||
app.state.config.SERPAPI_ENGINE = SERPAPI_ENGINE
|
app.state.config.SERPAPI_ENGINE = SERPAPI_ENGINE
|
||||||
app.state.config.JINA_API_KEY = JINA_API_KEY
|
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_ENDPOINT = BING_SEARCH_V7_ENDPOINT
|
||||||
app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY
|
app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY = BING_SEARCH_V7_SUBSCRIPTION_KEY
|
||||||
app.state.config.EXA_API_KEY = EXA_API_KEY
|
app.state.config.EXA_API_KEY = EXA_API_KEY
|
||||||
|
|
@ -1652,7 +1616,7 @@ async def chat_completion(
|
||||||
{"type": "chat:tasks:cancel"},
|
{"type": "chat:tasks:cancel"},
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except Exception as e:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
finally:
|
finally:
|
||||||
raise # re-raise to ensure proper task cancellation handling
|
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)):
|
async def get_app_latest_release_version(user=Depends(get_verified_user)):
|
||||||
if not ENABLE_VERSION_UPDATE_CHECK:
|
if not ENABLE_VERSION_UPDATE_CHECK:
|
||||||
log.debug(
|
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}
|
return {"current": VERSION, "latest": VERSION}
|
||||||
try:
|
try:
|
||||||
|
|
@ -2075,7 +2039,7 @@ try:
|
||||||
log.info("Using Redis for session")
|
log.info("Using Redis for session")
|
||||||
else:
|
else:
|
||||||
raise ValueError("No Redis URL provided")
|
raise ValueError("No Redis URL provided")
|
||||||
except Exception as e:
|
except Exception:
|
||||||
app.add_middleware(
|
app.add_middleware(
|
||||||
SessionMiddleware,
|
SessionMiddleware,
|
||||||
secret_key=WEBUI_SECRET_KEY,
|
secret_key=WEBUI_SECRET_KEY,
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,20 @@
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from open_webui.retrieval.web.main import SearchResult
|
|
||||||
from open_webui.env import SRC_LOG_LEVELS
|
from open_webui.env import SRC_LOG_LEVELS
|
||||||
|
from open_webui.retrieval.web.main import SearchResult
|
||||||
from yarl import URL
|
from yarl import URL
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
log.setLevel(SRC_LOG_LEVELS["RAG"])
|
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.
|
Search using Jina's Search API and return the results as a list of SearchResult objects.
|
||||||
Args:
|
Args:
|
||||||
|
|
@ -19,7 +24,12 @@ def search_jina(api_key: str, query: str, count: int) -> list[SearchResult]:
|
||||||
Returns:
|
Returns:
|
||||||
list[SearchResult]: A list of search results
|
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 = {
|
headers = {
|
||||||
"Accept": "application/json",
|
"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}
|
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 = requests.post(url, headers=headers, json=payload)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
data = response.json()
|
data = response.json()
|
||||||
|
|
|
||||||
|
|
@ -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_API_KEY": request.app.state.config.SERPAPI_API_KEY,
|
||||||
"SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE,
|
"SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE,
|
||||||
"JINA_API_KEY": request.app.state.config.JINA_API_KEY,
|
"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_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
|
||||||
"BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
"BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
||||||
"EXA_API_KEY": request.app.state.config.EXA_API_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_API_KEY: Optional[str] = None
|
||||||
SERPAPI_ENGINE: Optional[str] = None
|
SERPAPI_ENGINE: Optional[str] = None
|
||||||
JINA_API_KEY: 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_ENDPOINT: Optional[str] = None
|
||||||
BING_SEARCH_V7_SUBSCRIPTION_KEY: Optional[str] = None
|
BING_SEARCH_V7_SUBSCRIPTION_KEY: Optional[str] = None
|
||||||
EXA_API_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_API_KEY = form_data.web.SERPAPI_API_KEY
|
||||||
request.app.state.config.SERPAPI_ENGINE = form_data.web.SERPAPI_ENGINE
|
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_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 = (
|
request.app.state.config.BING_SEARCH_V7_ENDPOINT = (
|
||||||
form_data.web.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_API_KEY": request.app.state.config.SERPAPI_API_KEY,
|
||||||
"SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE,
|
"SERPAPI_ENGINE": request.app.state.config.SERPAPI_ENGINE,
|
||||||
"JINA_API_KEY": request.app.state.config.JINA_API_KEY,
|
"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_ENDPOINT": request.app.state.config.BING_SEARCH_V7_ENDPOINT,
|
||||||
"BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
"BING_SEARCH_V7_SUBSCRIPTION_KEY": request.app.state.config.BING_SEARCH_V7_SUBSCRIPTION_KEY,
|
||||||
"EXA_API_KEY": request.app.state.config.EXA_API_KEY,
|
"EXA_API_KEY": request.app.state.config.EXA_API_KEY,
|
||||||
|
|
@ -1458,7 +1462,6 @@ def process_file(
|
||||||
|
|
||||||
if file:
|
if file:
|
||||||
try:
|
try:
|
||||||
|
|
||||||
collection_name = form_data.collection_name
|
collection_name = form_data.collection_name
|
||||||
|
|
||||||
if collection_name is None:
|
if collection_name is None:
|
||||||
|
|
@ -1971,6 +1974,7 @@ def search_web(
|
||||||
request.app.state.config.JINA_API_KEY,
|
request.app.state.config.JINA_API_KEY,
|
||||||
query,
|
query,
|
||||||
request.app.state.config.WEB_SEARCH_RESULT_COUNT,
|
request.app.state.config.WEB_SEARCH_RESULT_COUNT,
|
||||||
|
request.app.state.config.JINA_SEARCH_API_URL,
|
||||||
)
|
)
|
||||||
elif engine == "bing":
|
elif engine == "bing":
|
||||||
return search_bing(
|
return search_bing(
|
||||||
|
|
@ -2057,7 +2061,6 @@ def search_web(
|
||||||
async def process_web_search(
|
async def process_web_search(
|
||||||
request: Request, form_data: SearchForm, user=Depends(get_verified_user)
|
request: Request, form_data: SearchForm, user=Depends(get_verified_user)
|
||||||
):
|
):
|
||||||
|
|
||||||
urls = []
|
urls = []
|
||||||
result_items = []
|
result_items = []
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -448,19 +448,39 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{:else if webConfig.WEB_SEARCH_ENGINE === 'jina'}
|
{:else if webConfig.WEB_SEARCH_ENGINE === 'jina'}
|
||||||
<div class="mb-2.5 flex w-full flex-col">
|
<div class="mb-2.5 flex w-full flex-col">
|
||||||
<div>
|
<div>
|
||||||
<div class=" self-center text-xs font-medium mb-1">
|
<div class=" self-center text-xs font-medium mb-1">
|
||||||
{$i18n.t('Jina API Key')}
|
{$i18n.t('Jina Search API URL')}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<SensitiveInput
|
<div class="flex w-full">
|
||||||
placeholder={$i18n.t('Enter Jina API Key')}
|
<div class="flex-1">
|
||||||
bind:value={webConfig.JINA_API_KEY}
|
<input
|
||||||
/>
|
class="w-full rounded-lg py-2 px-4 text-sm bg-gray-50 dark:text-gray-300 dark:bg-gray-850 outline-hidden"
|
||||||
|
type="text"
|
||||||
|
placeholder={$i18n.t('Enter Jina Search API URL')}
|
||||||
|
bind:value={webConfig.JINA_SEARCH_API_URL}
|
||||||
|
autocomplete="off"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-2.5 flex w-full flex-col">
|
||||||
|
<div>
|
||||||
|
<div class=" self-center text-xs font-medium mb-1">
|
||||||
|
{$i18n.t('Jina API Key')}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<SensitiveInput
|
||||||
|
placeholder={$i18n.t('Enter Jina API Key')}
|
||||||
|
bind:value={webConfig.JINA_API_KEY}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
{:else if webConfig.WEB_SEARCH_ENGINE === 'bing'}
|
{:else if webConfig.WEB_SEARCH_ENGINE === 'bing'}
|
||||||
<div class="mb-2.5 flex w-full flex-col">
|
<div class="mb-2.5 flex w-full flex-col">
|
||||||
<div>
|
<div>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue