open-webui/pyproject.toml
Classic298 ed75c8593d
chore: bump rapidocr to 3.10.0 to drop the duplicate OpenCV install (#32125)
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.
2026-10-09 12:49:12 +04:00

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"