mirror of
https://github.com/open-webui/open-webui.git
synced 2026-10-11 03:38:02 +00:00
rapidocr 3.9.2 required the GUI build of OpenCV, so every install carried it next to the headless build Open WebUI already pins. Both builds install the same Python package, so which one you got depended on install order, and the GUI build added about 115 MB of installed files on x86_64 that a server never uses. rapidocr 3.10.0 depends on the headless build instead, so installs now carry only that one. Text extracted from images inside PDFs is unchanged. Part of #29721.
239 lines
5.5 KiB
TOML
239 lines
5.5 KiB
TOML
[project]
|
|
name = "open-webui"
|
|
description = "Open WebUI"
|
|
authors = [
|
|
{ name = "Timothy Jaeryang Baek", email = "tim@openwebui.com" }
|
|
]
|
|
license = { file = "LICENSE" }
|
|
dependencies = [
|
|
"fastapi==0.136.3",
|
|
"uvicorn[standard]==0.51.0",
|
|
"pydantic==2.13.4",
|
|
"python-multipart==0.0.32",
|
|
"itsdangerous==2.2.0",
|
|
|
|
"python-socketio==5.16.2",
|
|
"orjson==3.11.9",
|
|
"cryptography==48.0.0",
|
|
"pyotp==2.9.0",
|
|
"qrcode==8.2",
|
|
"bcrypt==5.0.0",
|
|
"argon2-cffi==25.1.0",
|
|
"PyJWT[crypto]==2.13.0",
|
|
"authlib==1.7.2",
|
|
"joserfc==1.7.4",
|
|
|
|
"requests==2.34.2",
|
|
"aiohttp==3.14.3", # do not update to 3.13.3 - broken
|
|
"aiodns==3.6.1", # keep pinned: 4.x pulls pycares 5 (c-ares 1.34.6) which breaks DNS on some hosts (#28013, #28215); opt-in via AIOHTTP_CLIENT_ASYNC_DNS_RESOLVER
|
|
"aiocache==0.12.3",
|
|
"aiofiles==25.1.0",
|
|
"starlette-compress==1.7.1",
|
|
"Brotli==1.2.0",
|
|
"brotlicffi==1.2.0.1",
|
|
"httpx[socks,http2,zstd,cli,brotli]==0.28.1",
|
|
"starsessions[redis]==2.2.1",
|
|
"python-mimeparse==2.0.0",
|
|
|
|
"sqlalchemy[asyncio]==2.0.50",
|
|
"aiosqlite==0.22.1",
|
|
"psycopg[binary]==3.3.4",
|
|
"alembic==1.18.4",
|
|
|
|
"pycrdt==0.14.8",
|
|
"redis==8.0.1",
|
|
"hiredis==3.4.2",
|
|
# "valkey-glide-sync==2.3.1", # optional: install manually if VECTOR_DB=valkey
|
|
|
|
"pytz==2026.2",
|
|
|
|
"loguru==0.7.3",
|
|
"asgiref==3.11.1",
|
|
|
|
"tiktoken==0.13.0",
|
|
"regex==2026.5.9",
|
|
"google-re2==1.1.20251105",
|
|
"mcp==1.27.2",
|
|
|
|
"openai==2.29.0",
|
|
"anthropic==0.86.0",
|
|
|
|
"langchain-core==1.4.8",
|
|
"langchain-classic==1.0.7",
|
|
"langchain-text-splitters==1.1.2",
|
|
|
|
"fake-useragent==2.2.0",
|
|
"chromadb==1.5.9",
|
|
"opensearch-py==3.2.0",
|
|
"PyMySQL==1.2.0",
|
|
"boto3==1.42.62",
|
|
|
|
"transformers==5.5.4",
|
|
"sentence-transformers==5.5.1",
|
|
"accelerate==1.13.0",
|
|
"pyarrow==20.0.0", # fix: pin pyarrow version to 20 for rpi compatibility #15897
|
|
"einops==0.8.2",
|
|
|
|
"ftfy==6.3.1",
|
|
"chardet==7.4.3",
|
|
"pypdf==6.7.5",
|
|
"docx2txt==0.9",
|
|
"python-docx==1.2.0",
|
|
"python-pptx==1.0.2",
|
|
"msoffcrypto-tool==6.0.0",
|
|
"Markdown==3.10.2",
|
|
"beautifulsoup4==4.14.3",
|
|
"lxml==6.1.1",
|
|
"pypandoc==1.17",
|
|
"pandas==3.0.3",
|
|
"openpyxl==3.1.5",
|
|
"pyxlsb==1.0.10",
|
|
"xlrd==2.0.2",
|
|
"validators==0.35.0",
|
|
"psutil==7.2.2",
|
|
"sentencepiece==0.2.1",
|
|
"soundfile==0.13.1",
|
|
"azure-ai-documentintelligence==1.0.2",
|
|
|
|
"pillow==12.3.0",
|
|
"opencv-python-headless==4.13.0.92",
|
|
"rapidocr==3.10.0",
|
|
"rank-bm25==0.2.2",
|
|
|
|
"onnxruntime==1.26.0",
|
|
"faster-whisper==1.2.1",
|
|
|
|
"black==26.5.1",
|
|
"youtube-transcript-api==1.2.4",
|
|
|
|
"pydub==0.25.1",
|
|
"ddgs==9.14.4",
|
|
|
|
"googleapis-common-protos==1.75.0",
|
|
"google-cloud-storage==3.9.0",
|
|
|
|
"azure-identity==1.25.3",
|
|
"azure-storage-blob==12.29.0",
|
|
|
|
"ldap3==2.9.1",
|
|
]
|
|
readme = "README.md"
|
|
requires-python = ">= 3.11, < 3.13.0a1"
|
|
dynamic = ["version"]
|
|
classifiers = [
|
|
"Development Status :: 4 - Beta",
|
|
"License :: Other/Proprietary License",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Topic :: Communications :: Chat",
|
|
"Topic :: Multimedia",
|
|
]
|
|
|
|
[project.optional-dependencies]
|
|
postgres = [
|
|
"psycopg2-binary==2.9.12",
|
|
"pgvector==0.4.2",
|
|
]
|
|
mariadb = [
|
|
"mariadb==1.1.14",
|
|
]
|
|
unstructured = [
|
|
"unstructured==0.22.31",
|
|
]
|
|
|
|
all = [
|
|
"psycopg2-binary==2.9.12",
|
|
"pgvector==0.4.2",
|
|
"playwright==1.60.0", # Caution: version must match docker-compose.playwright.yaml - Update the docker-compose.yaml if necessary
|
|
"elasticsearch==9.4.1",
|
|
|
|
"qdrant-client==1.18.0",
|
|
|
|
"weaviate-client==4.20.3",
|
|
"pymilvus==2.6.14",
|
|
"pinecone==6.0.2",
|
|
"oracledb==3.4.2",
|
|
"colbert-ai==0.2.22",
|
|
|
|
"azure-search-documents==12.0.0",
|
|
"unstructured==0.22.31",
|
|
]
|
|
|
|
[project.scripts]
|
|
open-webui = "open_webui:app"
|
|
|
|
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[tool.rye]
|
|
managed = true
|
|
dev-dependencies = []
|
|
|
|
[tool.hatch.metadata]
|
|
allow-direct-references = true
|
|
|
|
[tool.hatch.version]
|
|
path = "package.json"
|
|
pattern = '"version":\s*"(?P<version>[^"]+)"'
|
|
|
|
[tool.hatch.build.hooks.custom] # keep this for reading hooks from `hatch_build.py`
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
sources = ["backend"]
|
|
exclude = [
|
|
".dockerignore",
|
|
".gitignore",
|
|
".webui_secret_key",
|
|
"dev.sh",
|
|
"requirements.txt",
|
|
"start.sh",
|
|
"start_windows.bat",
|
|
"webui.db",
|
|
"chroma.sqlite3",
|
|
]
|
|
force-include = { "CHANGELOG.md" = "open_webui/CHANGELOG.md", build = "open_webui/frontend" }
|
|
|
|
[tool.codespell]
|
|
# Ref: https://github.com/codespell-project/codespell#using-a-config-file
|
|
skip = '.git*,*.svg,package-lock.json,i18n,*.lock,*.css,*-bundle.js,locales,example-doc.txt,emoji-shortcodes.json'
|
|
check-hidden = true
|
|
# ignore-regex = ''
|
|
ignore-words-list = 'ans'
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"pytest-asyncio>=1.0.0",
|
|
"ruff>=0.15.5",
|
|
]
|
|
|
|
[tool.black]
|
|
line-length = 120
|
|
skip-string-normalization = true
|
|
|
|
[tool.ruff]
|
|
line-length = 120
|
|
|
|
[tool.ruff.format]
|
|
quote-style = "single"
|
|
docstring-code-format = false
|
|
|
|
[tool.ruff.lint]
|
|
select = [
|
|
"E", # pycodestyle errors
|
|
"F", # pyflakes
|
|
"W", # pycodestyle warnings
|
|
"I", # isort
|
|
"UP", # pyupgrade
|
|
"C90", # mccabe
|
|
"Q", # flake8-quotes
|
|
"ICN", # flake8-import-conventions
|
|
]
|
|
|
|
# Plugin configs:
|
|
flake8-import-conventions.banned-from = [ "ast", "datetime" ]
|
|
flake8-import-conventions.aliases = { datetime = "dt" }
|
|
flake8-quotes.inline-quotes = "single"
|
|
mccabe.max-complexity = 10
|
|
pydocstyle.convention = "google"
|