[project]
name = "dify-api"
version = "1.14.2"
requires-python = "~=3.12.0"

dependencies = [
    # Legacy: mature and widely deployed
    "bleach>=6.3.0,<7.0.0",
    "boto3>=1.43.14,<2.0.0",
    "celery>=5.6.3,<6.0.0",
    "croniter>=6.2.2,<7.0.0",
    "dify-agent",
    "flask>=3.1.3,<4.0.0",
    "flask-cors>=6.0.2,<7.0.0",
    "gevent>=26.4.0,<26.5.0",
    "gevent-websocket==0.10.1",
    "gmpy2>=2.3.0,<3.0.0",
    "google-api-python-client>=2.196.0,<3.0.0",
    "gunicorn>=26.0.0,<27.0.0",
    "psycogreen>=1.0.2,<2.0.0",
    "psycopg2-binary>=2.9.12,<3.0.0",
    "python-socketio>=5.13.0,<6.0.0",
    "redis[hiredis]>=7.4.0,<8.0.0",
    "sendgrid>=6.12.5,<7.0.0",
    "sseclient-py>=1.8.0,<2.0.0",
    # Stable: production-proven, cap below the next major
    "aliyun-log-python-sdk==0.9.44",
    "azure-identity>=1.25.3,<2.0.0",
    "flask-compress>=1.24,<2.0.0",
    "flask-login==0.6.3",
    "flask-migrate>=4.1.0,<5.0.0",
    "flask-orjson>=2.0.0,<3.0.0",
    "flask-restx>=1.3.2,<2.0.0",
    "google-cloud-aiplatform>=1.151.0,<2.0.0",
    "httpx[socks]==0.28.1",
    "opentelemetry-distro==0.62b1",
    "opentelemetry-instrumentation-celery==0.62b1",
    "opentelemetry-instrumentation-flask==0.62b1",
    "opentelemetry-instrumentation-httpx==0.62b1",
    "opentelemetry-instrumentation-redis==0.62b1",
    "opentelemetry-instrumentation-sqlalchemy==0.62b1",
    "opentelemetry-propagator-b3>=1.41.1,<2.0.0",
    "readabilipy==0.3.0",
    "resend>=2.27.0,<3.0.0",
    # Emerging: newer and fast-moving, use compatible pins
    "fastopenapi[flask]==0.7.0",
    "graphon==0.4.0",
    "httpx-sse==0.4.3",
    "json-repair==0.59.4",
]
# Before adding new dependency, consider place it in
# alphabet order (a-z) and suitable group.

[tool.setuptools]
packages = []

[tool.uv.workspace]
members = ["providers/vdb/*", "providers/trace/*"]
exclude = ["providers/vdb/__pycache__", "providers/trace/__pycache__"]

[tool.uv.sources]
dify-agent = { path = "../dify-agent", editable = true }
dify-vdb-alibabacloud-mysql = { workspace = true }
dify-vdb-analyticdb = { workspace = true }
dify-vdb-baidu = { workspace = true }
dify-vdb-chroma = { workspace = true }
dify-vdb-clickzetta = { workspace = true }
dify-vdb-couchbase = { workspace = true }
dify-vdb-elasticsearch = { workspace = true }
dify-vdb-hologres = { workspace = true }
dify-vdb-huawei-cloud = { workspace = true }
dify-vdb-iris = { workspace = true }
dify-vdb-lindorm = { workspace = true }
dify-vdb-matrixone = { workspace = true }
dify-vdb-milvus = { workspace = true }
dify-vdb-myscale = { workspace = true }
dify-vdb-oceanbase = { workspace = true }
dify-vdb-opengauss = { workspace = true }
dify-vdb-opensearch = { workspace = true }
dify-vdb-oracle = { workspace = true }
dify-vdb-pgvecto-rs = { workspace = true }
dify-vdb-pgvector = { workspace = true }
dify-vdb-qdrant = { workspace = true }
dify-vdb-relyt = { workspace = true }
dify-vdb-tablestore = { workspace = true }
dify-vdb-tencent = { workspace = true }
dify-vdb-tidb-on-qdrant = { workspace = true }
dify-vdb-tidb-vector = { workspace = true }
dify-vdb-upstash = { workspace = true }
dify-vdb-vastbase = { workspace = true }
dify-vdb-vikingdb = { workspace = true }
dify-vdb-weaviate = { workspace = true }
dify-trace-aliyun = { workspace = true }
dify-trace-arize-phoenix = { workspace = true }
dify-trace-langfuse = { workspace = true }
dify-trace-langsmith = { workspace = true }
dify-trace-mlflow = { workspace = true }
dify-trace-opik = { workspace = true }
dify-trace-tencent = { workspace = true }
dify-trace-weave = { workspace = true }

[tool.uv]
default-groups = ["storage", "tools", "vdb-all", "trace-all"]
package = false
override-dependencies = ["litellm>=1.83.10,<2.0.0", "pyarrow>=23.0.1,<24.0.0"]

[dependency-groups]

############################################################
# [ Dev ] dependency group
# Required for development and running tests
############################################################
dev = [
    "coverage>=7.13.4",
    "dotenv-linter>=0.7.0",
    "faker>=40.15.0",
    "lxml-stubs>=0.5.1",
    "ruff>=0.15.12",
    "pytest>=9.0.3",
    "pytest-benchmark>=5.2.3",
    "pytest-cov>=7.1.0",
    "pytest-env>=1.6.0",
    "pytest-mock>=3.15.1",
    "testcontainers>=4.14.2",
    "types-aiofiles>=25.1.0",
    "types-beautifulsoup4>=4.12.0",
    "types-cachetools>=7.0.0.20260503",
    "types-colorama>=0.4.15",
    "types-defusedxml>=0.7.0",
    "types-deprecated>=1.3.1",
    "types-docutils>=0.22.3",
    "types-flask-cors>=6.0.0",
    "types-flask-migrate>=4.1.0",
    "types-gevent>=26.4.0",
    "types-greenlet>=3.5.0.20260428",
    "types-html5lib>=1.1.11",
    "types-markdown>=3.10.2",
    "types-oauthlib>=3.3.0",
    "types-objgraph>=3.6.0",
    "types-olefile>=0.47.0",
    "types-openpyxl>=3.1.5",
    "types-pexpect>=4.9.0",
    "types-protobuf>=7.34.1.20260503",
    "types-psutil>=7.2.2",
    "types-psycopg2>=2.9.21.20260422",
    "types-pygments>=2.20.0",
    "types-pymysql>=1.1.0",
    "types-python-dateutil>=2.9.0",
    "types-pywin32>=311.0.0",
    "types-pyyaml>=6.0.12",
    "types-regex>=2026.4.4",
    "types-shapely>=2.1.0",
    "types-simplejson>=3.20.0.20260408",
    "types-six>=1.17.0.20260408",
    "types-tensorflow>=2.18.0.20260408",
    "types-tqdm>=4.67.3.20260408",
    "types-ujson>=5.10.0",
    "boto3-stubs>=1.43.10",
    "types-jmespath>=1.1.0.20260408",
    "hypothesis>=6.152.4",
    "types_pyOpenSSL>=24.1.0",
    "types_cffi>=2.0.0.20260429",
    "types_setuptools>=82.0.0.20260408",
    "pandas-stubs>=3.0.0",
    "scipy-stubs>=1.17.1.4",
    "types-python-http-client>=3.3.7.20260408",
    "import-linter>=2.3",
    "types-redis>=4.6.0.20241004",
    "celery-types>=0.23.0",
    "mypy>=1.20.2",
    # "locust>=2.40.4",  # Temporarily removed due to compatibility issues. Uncomment when resolved.
    "pytest-timeout>=2.4.0",
    "pytest-xdist>=3.8.0",
    "pyrefly>=1.0.0",
    "xinference-client>=2.7.0",
]

############################################################
# [ Storage ] dependency group
# Required for storage clients
############################################################
storage = [
    "azure-storage-blob>=12.29.0,<13.0.0",
    "bce-python-sdk==0.9.71",
    "cos-python-sdk-v5>=1.9.43,<2.0.0",
    "esdk-obs-python>=3.22.2,<4.0.0",
    "google-cloud-storage>=3.10.1,<4.0.0",
    "opendal==0.46.0",
    "oss2>=2.19.1,<3.0.0",
    "supabase>=2.30.0,<3.0.0",
    "tos>=2.9.0,<3.0.0",
]

############################################################
# [ Tools ] dependency group
############################################################
tools = ["cloudscraper>=1.2.71,<2.0.0", "nltk>=3.9.1,<4.0.0"]

############################################################
# [ VDB ] workspace plugins — hollow packages under providers/vdb/*
# Each declares its own third-party deps and registers dify.vector_backends entry points.
# Use: uv sync --group vdb-all | uv sync --group vdb-qdrant
############################################################
vdb-all = [
    "dify-vdb-alibabacloud-mysql",
    "dify-vdb-analyticdb",
    "dify-vdb-baidu",
    "dify-vdb-chroma",
    "dify-vdb-clickzetta",
    "dify-vdb-couchbase",
    "dify-vdb-elasticsearch",
    "dify-vdb-hologres",
    "dify-vdb-huawei-cloud",
    "dify-vdb-iris",
    "dify-vdb-lindorm",
    "dify-vdb-matrixone",
    "dify-vdb-milvus",
    "dify-vdb-myscale",
    "dify-vdb-oceanbase",
    "dify-vdb-opengauss",
    "dify-vdb-opensearch",
    "dify-vdb-oracle",
    "dify-vdb-pgvecto-rs",
    "dify-vdb-pgvector",
    "dify-vdb-qdrant",
    "dify-vdb-relyt",
    "dify-vdb-tablestore",
    "dify-vdb-tencent",
    "dify-vdb-tidb-on-qdrant",
    "dify-vdb-tidb-vector",
    "dify-vdb-upstash",
    "dify-vdb-vastbase",
    "dify-vdb-vikingdb",
    "dify-vdb-weaviate",
]
vdb-alibabacloud-mysql = ["dify-vdb-alibabacloud-mysql"]
vdb-analyticdb = ["dify-vdb-analyticdb"]
vdb-baidu = ["dify-vdb-baidu"]
vdb-chroma = ["dify-vdb-chroma"]
vdb-clickzetta = ["dify-vdb-clickzetta"]
vdb-couchbase = ["dify-vdb-couchbase"]
vdb-elasticsearch = ["dify-vdb-elasticsearch"]
vdb-hologres = ["dify-vdb-hologres"]
vdb-huawei-cloud = ["dify-vdb-huawei-cloud"]
vdb-iris = ["dify-vdb-iris"]
vdb-lindorm = ["dify-vdb-lindorm"]
vdb-matrixone = ["dify-vdb-matrixone"]
vdb-milvus = ["dify-vdb-milvus"]
vdb-myscale = ["dify-vdb-myscale"]
vdb-oceanbase = ["dify-vdb-oceanbase"]
vdb-opengauss = ["dify-vdb-opengauss"]
vdb-opensearch = ["dify-vdb-opensearch"]
vdb-oracle = ["dify-vdb-oracle"]
vdb-pgvecto-rs = ["dify-vdb-pgvecto-rs"]
vdb-pgvector = ["dify-vdb-pgvector"]
vdb-qdrant = ["dify-vdb-qdrant"]
vdb-relyt = ["dify-vdb-relyt"]
vdb-tablestore = ["dify-vdb-tablestore"]
vdb-tencent = ["dify-vdb-tencent"]
vdb-tidb-on-qdrant = ["dify-vdb-tidb-on-qdrant"]
vdb-tidb-vector = ["dify-vdb-tidb-vector"]
vdb-upstash = ["dify-vdb-upstash"]
vdb-vastbase = ["dify-vdb-vastbase"]
vdb-vikingdb = ["dify-vdb-vikingdb"]
vdb-weaviate = ["dify-vdb-weaviate"]
# Optional client used by some tests / integrations (not a vector backend plugin)
vdb-xinference = ["xinference-client>=2.7.0,<3.0.0"]

trace-all = [
    "dify-trace-aliyun",
    "dify-trace-arize-phoenix",
    "dify-trace-langfuse",
    "dify-trace-langsmith",
    "dify-trace-mlflow",
    "dify-trace-opik",
    "dify-trace-tencent",
    "dify-trace-weave",
]
trace-aliyun = ["dify-trace-aliyun"]
trace-arize-phoenix = ["dify-trace-arize-phoenix"]
trace-langfuse = ["dify-trace-langfuse"]
trace-langsmith = ["dify-trace-langsmith"]
trace-mlflow = ["dify-trace-mlflow"]
trace-opik = ["dify-trace-opik"]
trace-tencent = ["dify-trace-tencent"]
trace-weave = ["dify-trace-weave"]

[tool.pyrefly]
project-includes = ["."]
project-excludes = [".venv", "migrations/"]
python-platform = "linux"
python-version = "3.12.0"
infer-with-first-use = true
min-severity = "warn"
