Ctrl K
ComunidadGuías…

pyproject.toml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
[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",

    "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",
    "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"