config.py
,它位于 open-webui\backend\open_webui\config.py
。以下是该文件的功能详细描述:
config.py
这是项目的 主配置文件,负责管理所有与系统运行相关的 环境变量、数据库配置、认证设置、工具服务器连接、模型参数、RAG(信息检索)、图像生成、语音识别、LDAP 认证等全局配置项。
这个文件的主要作用是:
open_webui\env.py
或系统环境中加载配置。def run_migrations():
log.info("Running migrations")
try:
from alembic import command
from alembic.config import Config
alembic_cfg = Config(OPEN_WEBUI_DIR / "alembic.ini")
# Set the script location dynamically
migrations_path = OPEN_WEBUI_DIR / "migrations"
alembic_cfg.set_main_option("script_location", str(migrations_path))
command.upgrade(alembic_cfg, "head")
except Exception as e:
log.exception(f"Error running migrations: {e}")
alembic.ini
并执行 upgrade head
。Config
class Config(Base):
__tablename__ = "config"
id = Column(Integer, primary_key=True)
data = Column(JSON, nullable=False)
version = Column(Integer, nullable=False, default=0)
created_at = Column(DateTime, nullable=False, server_default=func.now())
updated_at = Column(DateTime, nullable=True, onupdate=func.now())
data
: JSON 格式的配置数据。version
: 版本号。created_at
, updated_at
: 时间戳。class PersistentConfig(Generic[T]):
def __init__(self, env_name: str, config_path: str, env_value: T):
self.env_name = env_name
self.config_path = config_path
self.env_value = env_value
self.config_value = get_config_value(config_path)
if self.config_value is not None and ENABLE_PERSISTENT_CONFIG:
log.info(f"'{env_name}' loaded from the latest database entry")
self.value = self.config_value
else:
self.value = env_value
PERSISTENT_CONFIG_REGISTRY.append(self)
ENABLE_OAUTH_SIGNUP = PersistentConfig(
"ENABLE_OAUTH_SIGNUP",
"oauth.enable_signup",
os.environ.get("ENABLE_OAUTH_SIGNUP", "False").lower() == "true",
)
GOOGLE_CLIENT_ID = PersistentConfig(
"GOOGLE_CLIENT_ID",
"oauth.google.client_id",
os.environ.get("GOOGLE_CLIENT_ID", ""),
)
MICROSOFT_CLIENT_ID = PersistentConfig(
"MICROSOFT_CLIENT_ID",
"oauth.microsoft.client_id",
os.environ.get("MICROSOFT_CLIENT_ID", ""),
)
GITHUB_CLIENT_ID = PersistentConfig(
"GITHUB_CLIENT_ID",
"oauth.github.client_id",
os.environ.get("GITHUB_CLIENT_ID", ""),
)
OAUTH_PROVIDER_NAME = PersistentConfig(
"OAUTH_PROVIDER_NAME",
"oauth.oidc.provider_name",
os.environ.get("OAUTH_PROVIDER_NAME", "SSO"),
)
USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS = (
os.environ.get("USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS", "False").lower()
== "true"
)
USER_PERMISSIONS_FEATURES_CODE_INTERPRETER = (
os.environ.get("USER_PERMISSIONS_FEATURES_CODE_INTERPRETER", "True").lower()
== "true"
)
DEFAULT_USER_PERMISSIONS = {
"workspace": {
"models": USER_PERMISSIONS_WORKSPACE_MODELS_ACCESS,
"knowledge": USER_PERMISSIONS_WORKSPACE_KNOWLEDGE_ACCESS,
...
},
"features": {
"code_interpreter": USER_PERMISSIONS_FEATURES_CODE_INTERPRETER,
...
}
}
RAG_EMBEDDING_MODEL = PersistentConfig(
"RAG_EMBEDDING_MODEL",
"rag.embedding_model",
os.environ.get("RAG_EMBEDDING_MODEL", "sentence-transformers/all-MiniLM-L6-v2"),
)
CHUNK_SIZE = PersistentConfig(
"CHUNK_SIZE", "rag.chunk_size", int(os.environ.get("CHUNK_SIZE", "1000"))
)
RAG_TEMPLATE = PersistentConfig(
"RAG_TEMPLATE",
"rag.template",
os.environ.get("RAG_TEMPLATE", DEFAULT_RAG_TEMPLATE),
)
ENABLE_IMAGE_GENERATION = PersistentConfig(
"ENABLE_IMAGE_GENERATION",
"image_generation.enable",
os.environ.get("ENABLE_IMAGE_GENERATION", "").lower() == "true",
)
IMAGE_GENERATION_ENGINE = PersistentConfig(
"IMAGE_GENERATION_ENGINE",
"image_generation.engine",
os.getenv("IMAGE_GENERATION_ENGINE", "openai"),
)
IMAGE_SIZE = PersistentConfig(
"IMAGE_SIZE", "image_generation.size", os.getenv("IMAGE_SIZE", "512x512")
)
ENABLE_CODE_EXECUTION = PersistentConfig(
"ENABLE_CODE_EXECUTION",
"code_execution.enable",
os.environ.get("ENABLE_CODE_EXECUTION", "True").lower() == "true",
)
CODE_EXECUTION_ENGINE = PersistentConfig(
"CODE_EXECUTION_ENGINE",
"code_execution.engine",
os.environ.get("CODE_EXECUTION_ENGINE", "pyodide"),
)
WHISPER_MODEL = PersistentConfig(
"WHISPER_MODEL",
"audio.stt.whisper_model",
os.getenv("WHISPER_MODEL", "base"),
)
AUDIO_TTS_ENGINE = PersistentConfig(
"AUDIO_TTS_ENGINE",
"audio.tts.engine",
os.getenv("AUDIO_TTS_ENGINE", ""),
)
ENABLE_WEB_SEARCH = PersistentConfig(
"ENABLE_WEB_SEARCH",
"rag.web.search.enable",
os.getenv("ENABLE_WEB_SEARCH", "False").lower() == "true",
)
WEB_SEARCH_ENGINE = PersistentConfig(
"WEB_SEARCH_ENGINE",
"rag.web.search.engine",
os.getenv("WEB_SEARCH_ENGINE", ""),
)
VECTOR_DB = os.environ.get("VECTOR_DB", "chroma")
CHROMA_DATA_PATH = f"{DATA_DIR}/vector_db"
CHROMA_HTTP_HOST = os.environ.get("CHROMA_HTTP_HOST", "")
CHROMA_HTTP_PORT = int(os.environ.get("CHROMA_HTTP_PORT", "8000"))
MILVUS_URI = os.environ.get("MILVUS_URI", f"{DATA_DIR}/vector_db/milvus.db")
STATIC_DIR = Path(os.getenv("STATIC_DIR", OPEN_WEBUI_DIR / "static")).resolve()
for file_path in (FRONTEND_BUILD_DIR / "static").glob("**/*"):
if file_path.is_file():
target_path = STATIC_DIR / file_path.relative_to((FRONTEND_BUILD_DIR / "static"))
target_path.parent.mkdir(parents=True, exist_ok=True)
try:
shutil.copyfile(file_path, target_path)
except Exception as e:
logging.error(f"An error occurred: {e}")
static
目录。LICENSE_KEY = os.environ.get("LICENSE_KEY", "")
STORAGE_PROVIDER = os.environ.get("STORAGE_PROVIDER", "local") # defaults to local, s3
S3_ACCESS_KEY_ID = os.environ.get("S3_ACCESS_KEY_ID", None)
S3_SECRET_ACCESS_KEY = os.environ.get("S3_SECRET_ACCESS_KEY", None)
S3_REGION_NAME = os.environ.get("S3_REGION_NAME", None)
S3_BUCKET_NAME = os.environ.get("S3_BUCKET_NAME", None)
TASK_MODEL = PersistentConfig(
"TASK_MODEL",
"task.model.default",
os.environ.get("TASK_MODEL", ""),
)
TITLE_GENERATION_PROMPT_TEMPLATE = PersistentConfig(
"TITLE_GENERATION_PROMPT_TEMPLATE",
"task.title.prompt_template",
os.environ.get("TITLE_GENERATION_PROMPT_TEMPLATE", ""),
)
CORS_ALLOW_ORIGIN = os.environ.get(
"CORS_ALLOW_ORIGIN", "*;http://localhost:5173;http://localhost:8080"
).split(";")
ENABLE_LDAP = PersistentConfig(
"ENABLE_LDAP",
"ldap.enable",
os.environ.get("ENABLE_LDAP", "false").lower() == "true",
)
LDAP_SERVER_HOST = PersistentConfig(
"LDAP_SERVER_HOST",
"ldap.server.host",
os.environ.get("LDAP_SERVER_HOST", "localhost"),
)
模块 | 作用 |
---|---|
数据库配置 | 初始化 Alembic 迁移、SQLAlchemy ORM 映射 |
OAuth 登录 | 支持 Google、Microsoft、GitHub、OIDC 等 |
用户权限控制 | 控制用户对模型、知识库、工具等的访问 |
RAG(检索增强生成) | 定义嵌入模型、检索 Top-K、重排序器等 |
图像生成 | 启用图像生成功能,支持 OpenAI、Stable Diffusion 等 |
代码执行 | 支持 Pyodide、Jupyter 执行代码片段 |
语音识别与合成 | 支持 Whisper、OpenAI TTS、Azure STT/TTS |
向量数据库 | 支持 Chroma、Milvus、Qdrant、PgVector |
网络搜索 | 支持 Bing、Google、SearXNG 等搜索引擎 |
静态资源管理 | 复制前端资源,支持自定义 logo、splash 图片 |
任务调度 | 自动生成标题、标签、搜索查询等 |
CORS 设置 | 跨域资源共享配置,确保前后端通信 |
LDAP 登录 | 支持企业级 LDAP 用户认证 |
ENABLE_OAUTH_SIGNUP
为 "True"
时,用户可以通过 OAuth 注册新账号。VECTOR_DB="milvus"
并提供 Milvus 地址和 token。ENABLE_IMAGE_GENERATION=False
。CORS_ALLOW_ORIGIN="*"
,改为只允许特定域名。该文件还包含大量默认值和环境变量映射,使得开发者可以在 open_webui\env.py
中快速调整行为,例如:
# 示例 .env 配置
ENABLE_OAUTH_SIGNUP=True
ENABLE_WEB_SEARCH=True
ENABLE_IMAGE_GENERATION=True
ENABLE_CODE_EXECUTION=True
这些配置最终都会被 config.py
解析为 PersistentConfig
对象,供整个系统使用。
你可以根据实际需求修改open_webui\env.py
文件中的配置项,例如:
# 启用 Google 登录
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-secret
GOOGLE_REDIRECT_URI=http://localhost:3000/auth/google/callback
# 启用 Milvus 向量数据库
VECTOR_DB=milvus
MILVUS_URI=localhost:19530
MILVUS_TOKEN=root:Milvus
然后重启应用即可生效。
这个文件是整个系统的“大脑”,决定了几乎所有模块的行为。理解它有助于快速定制和扩展系统功能。