Files
Classic298 038832492b fix: local speech-to-text fails on new pip installs (#34280)
On a fresh pip install, local Whisper failed on every transcription with "open() got an unexpected keyword argument 'metadata_errors'", because PyAV 19 dropped an option that faster-whisper still passes when it reads audio. The Docker image was never affected, since it already pins PyAV to 14.0.1. The pip package now pins the same version, so new installs transcribe again. Checked on a clean Python 3.12 environment: a faster-whisper transcription fails with PyAV 19 and works with 14.0.1.

Fixes #34278
2026-11-13 18:37:15 +09:00

247 lines
6.0 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.54.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.1",
"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.5", # 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.1",
"brotlicffi==1.2.1.0",
"httpx[socks,http2,zstd,cli,brotli]==0.28.1",
"httpx2==2.16.0",
"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.5.2", # 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==2.3.0",
"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.21.2",
"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==13.0.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",
"av==14.0.1", # Caution: Set due to FATAL FIPS SELFTEST FAILURE, see discussion https://github.com/open-webui/open-webui/discussions/15720
"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",
"preshed==3.0.13", # keep pinned: transitive via unstructured -> spaCy; 3.0.14 breaks HTML extraction (web loader)
]
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",
"preshed==3.0.13", # keep pinned: transitive via unstructured -> spaCy; 3.0.14 breaks HTML extraction (web loader)
]
[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",
"requirements.lock",
"requirements-slim.lock",
"update-locks.sh",
"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"