[project]
name = "dify-api"
version = "1.13.0"
requires-python = ">=3.11,<3.13"

dependencies = [
    "aliyun-log-python-sdk~=0.9.37",
    "arize-phoenix-otel~=0.9.2",
    "azure-identity==1.16.1",
    "beautifulsoup4==4.12.2",
    "boto3==1.35.99",
    "bs4~=0.0.1",
    "cachetools~=5.3.0",
    "celery~=5.5.2",
    "charset-normalizer>=3.4.4",
    "flask~=3.1.2",
    "flask-compress>=1.17,<1.18",
    "flask-cors~=6.0.0",
    "flask-login~=0.6.3",
    "flask-migrate~=4.0.7",
    "flask-orjson~=2.0.0",
    "flask-sqlalchemy~=3.1.1",
    "gevent~=25.9.1",
    "gmpy2~=2.3.0",
    "google-api-core>=2.19.1",
    "google-api-python-client==2.189.0",
    "google-auth>=2.47.0",
    "google-auth-httplib2==0.2.0",
    "google-cloud-aiplatform>=1.123.0",
    "googleapis-common-protos>=1.65.0",
    "gunicorn~=23.0.0",
    "httpx[socks]~=0.28.0",
    "jieba==0.42.1",
    "json-repair>=0.55.1",
    "jsonschema>=4.25.1",
    "langfuse~=2.51.3",
    "langsmith~=0.1.77",
    "markdown~=3.5.1",
    "mlflow-skinny>=3.0.0",
    "numpy~=1.26.4",
    "openpyxl~=3.1.5",
    "opik~=1.8.72",
    "litellm==1.77.1",                                  # Pinned to avoid madoka dependency issue
    "opentelemetry-api==1.28.0",
    "opentelemetry-distro==0.49b0",
    "opentelemetry-exporter-otlp==1.28.0",
    "opentelemetry-exporter-otlp-proto-common==1.28.0",
    "opentelemetry-exporter-otlp-proto-grpc==1.28.0",
    "opentelemetry-exporter-otlp-proto-http==1.28.0",
    "opentelemetry-instrumentation==0.49b0",
    "opentelemetry-instrumentation-celery==0.49b0",
    "opentelemetry-instrumentation-flask==0.49b0",
    "opentelemetry-instrumentation-httpx==0.49b0",
    "opentelemetry-instrumentation-redis==0.49b0",
    "opentelemetry-instrumentation-sqlalchemy==0.49b0",
    "opentelemetry-propagator-b3==1.28.0",
    "opentelemetry-proto==1.28.0",
    "opentelemetry-sdk==1.28.0",
    "opentelemetry-semantic-conventions==0.49b0",
    "opentelemetry-util-http==0.49b0",
    "pandas[excel,output-formatting,performance]~=2.2.2",
    "psycogreen~=1.0.2",
    "psycopg2-binary~=2.9.6",
    "pycryptodome==3.23.0",
    "pydantic~=2.12.5",
    "pydantic-extra-types~=2.10.3",
    "pydantic-settings~=2.12.0",
    "pyjwt~=2.11.0",
    "pypdfium2==5.2.0",
    "python-docx~=1.2.0",
    "python-dotenv==1.0.1",
    "pyyaml~=6.0.1",
    "readabilipy~=0.3.0",
    "redis[hiredis]~=7.2.0",
    "resend~=2.9.0",
    "sentry-sdk[flask]~=2.28.0",
    "sqlalchemy~=2.0.29",
    "starlette==0.49.1",
    "tiktoken~=0.9.0",
    "transformers~=4.56.1",
    "unstructured[docx,epub,md,ppt,pptx]~=0.18.18",
    "yarl~=1.18.3",
    "webvtt-py~=0.5.1",
    "sseclient-py~=1.8.0",
    "httpx-sse~=0.4.0",
    "sendgrid~=6.12.3",
    "flask-restx~=1.3.2",
    "packaging~=23.2",
    "croniter>=6.0.0",
    "weaviate-client==4.17.0",
    "apscheduler>=3.11.0",
    "weave>=0.52.16",
    "fastopenapi[flask]>=0.7.0",
]
# Before adding new dependency, consider place it in
# alphabet order (a-z) and suitable group.

[tool.setuptools]
packages = []

[tool.uv]
default-groups = ["storage", "tools", "vdb"]
package = false

[dependency-groups]

############################################################
# [ Dev ] dependency group
# Required for development and running tests
############################################################
dev = [
    "coverage~=7.2.4",
    "dotenv-linter~=0.5.0",
    "faker~=38.2.0",
    "lxml-stubs~=0.5.1",
    "basedpyright~=1.31.0",
    "ruff~=0.14.0",
    "pytest~=8.3.2",
    "pytest-benchmark~=4.0.0",
    "pytest-cov~=4.1.0",
    "pytest-env~=1.1.3",
    "pytest-mock~=3.14.0",
    "testcontainers~=4.13.2",
    "types-aiofiles~=25.1.0",
    "types-beautifulsoup4~=4.12.0",
    "types-cachetools~=5.5.0",
    "types-colorama~=0.4.15",
    "types-defusedxml~=0.7.0",
    "types-deprecated~=1.2.15",
    "types-docutils~=0.21.0",
    "types-jsonschema~=4.23.0",
    "types-flask-cors~=5.0.0",
    "types-flask-migrate~=4.1.0",
    "types-gevent~=25.9.0",
    "types-greenlet~=3.3.0",
    "types-html5lib~=1.1.11",
    "types-markdown~=3.10.2",
    "types-oauthlib~=3.2.0",
    "types-objgraph~=3.6.0",
    "types-olefile~=0.47.0",
    "types-openpyxl~=3.1.5",
    "types-pexpect~=4.9.0",
    "types-protobuf~=5.29.1",
    "types-psutil~=7.2.2",
    "types-psycopg2~=2.9.21",
    "types-pygments~=2.19.0",
    "types-pymysql~=1.1.0",
    "types-python-dateutil~=2.9.0",
    "types-pywin32~=310.0.0",
    "types-pyyaml~=6.0.12",
    "types-regex~=2024.11.6",
    "types-shapely~=2.1.0",
    "types-simplejson>=3.20.0",
    "types-six>=1.17.0",
    "types-tensorflow>=2.18.0",
    "types-tqdm>=4.67.0",
    "types-ujson>=5.10.0",
    "boto3-stubs>=1.38.20",
    "types-jmespath>=1.0.2.20240106",
    "hypothesis>=6.131.15",
    "types_pyOpenSSL>=24.1.0",
    "types_cffi>=1.17.0",
    "types_setuptools>=80.9.0",
    "pandas-stubs~=2.2.3",
    "scipy-stubs>=1.15.3.0",
    "types-python-http-client>=3.3.7.20240910",
    "import-linter>=2.3",
    "types-redis>=4.6.0.20241004",
    "celery-types>=0.23.0",
    "mypy~=1.17.1",
    # "locust>=2.40.4",  # Temporarily removed due to compatibility issues. Uncomment when resolved.
    "sseclient-py>=1.8.0",
    "pytest-timeout>=2.4.0",
    "pytest-xdist>=3.8.0",
    "pyrefly>=0.55.0",
]

############################################################
# [ Storage ] dependency group
# Required for storage clients
############################################################
storage = [
    "azure-storage-blob==12.26.0",
    "bce-python-sdk~=0.9.23",
    "cos-python-sdk-v5==1.9.38",
    "esdk-obs-python==3.25.8",
    "google-cloud-storage>=3.0.0",
    "opendal~=0.46.0",
    "oss2==2.18.5",
    "supabase~=2.18.1",
    "tos~=2.9.0",
]

############################################################
# [ Tools ] dependency group
############################################################
tools = ["cloudscraper~=1.2.71", "nltk~=3.9.1"]

############################################################
# [ VDB ] dependency group
# Required by vector store clients
############################################################
vdb = [
    "alibabacloud_gpdb20160503~=3.8.0",
    "alibabacloud_tea_openapi~=0.3.9",
    "chromadb==0.5.20",
    "clickhouse-connect~=0.10.0",
    "clickzetta-connector-python>=0.8.102",
    "couchbase~=4.3.0",
    "elasticsearch==8.14.0",
    "opensearch-py==3.1.0",
    "oracledb==3.3.0",
    "pgvecto-rs[sqlalchemy]~=0.2.1",
    "pgvector==0.2.5",
    "pymilvus~=2.5.0",
    "pymochow==2.2.9",
    "pyobvector~=0.2.17",
    "qdrant-client==1.9.0",
    "intersystems-irispython>=5.1.0",
    "tablestore==6.3.7",
    "tcvectordb~=1.6.4",
    "tidb-vector==0.0.9",
    "upstash-vector==0.6.0",
    "volcengine-compat~=1.0.0",
    "weaviate-client==4.17.0",
    "xinference-client~=1.2.2",
    "mo-vector~=0.1.13",
    "mysql-connector-python>=9.3.0",
]

[tool.mypy]

[[tool.mypy.overrides]]
# targeted ignores for current type-check errors
# TODO(QuantumGhost): suppress type errors in HITL related code.
# fix the type error later
module = [
    "configs.middleware.cache.redis_pubsub_config",
    "extensions.ext_redis",
    "tasks.workflow_execution_tasks",
    "dify_graph.nodes.base.node",
    "services.human_input_delivery_test_service",
    "core.app.apps.advanced_chat.app_generator",
    "controllers.console.human_input_form",
    "controllers.console.app.workflow_run",
    "repositories.sqlalchemy_api_workflow_node_execution_repository",
    "extensions.logstore.repositories.logstore_api_workflow_run_repository",
]
ignore_errors = true
