diff --git a/.github/workflows/lint-py.yml b/.github/workflows/lint-py.yml index af53e4b52..471dc30e7 100644 --- a/.github/workflows/lint-py.yml +++ b/.github/workflows/lint-py.yml @@ -34,7 +34,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install the project - run: uv sync --dev + run: uv sync - name: Run Mypy run: | uv run mypy --namespace-packages -p "langflow" diff --git a/.github/workflows/nightly_build.yml b/.github/workflows/nightly_build.yml index ff76b2035..e037ffdb1 100644 --- a/.github/workflows/nightly_build.yml +++ b/.github/workflows/nightly_build.yml @@ -31,7 +31,7 @@ jobs: - name: "Setup Environment" uses: ./.github/actions/setup-uv - name: Install the project - run: uv sync --dev + run: uv sync - name: Generate main nightly tag id: generate_main_tag diff --git a/.github/workflows/py_autofix.yml b/.github/workflows/py_autofix.yml index 7f448a4a8..25d7e4dab 100644 --- a/.github/workflows/py_autofix.yml +++ b/.github/workflows/py_autofix.yml @@ -30,7 +30,7 @@ jobs: - name: "Install dependencies" run: | - uv sync --frozen + uv sync uv pip install -e . - name: Run starter projects update diff --git a/.github/workflows/python_test.yml b/.github/workflows/python_test.yml index 3ac3b7496..66ed1b5d8 100644 --- a/.github/workflows/python_test.yml +++ b/.github/workflows/python_test.yml @@ -54,7 +54,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install the project - run: uv sync --dev + run: uv sync - name: Run unit tests uses: nick-fields/retry@v3 with: @@ -78,7 +78,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - name: Install the project - run: uv sync --dev + run: uv sync - name: Run integration tests run: make integration_tests_no_api_keys - name: Minimize uv cache diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 53247064e..3e4b4cb42 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,7 +65,7 @@ jobs: - name: Setup Environment uses: ./.github/actions/setup-uv - name: Install the project - run: uv sync --dev + run: uv sync - name: Check Version id: check-version run: | @@ -129,7 +129,7 @@ jobs: - name: Setup Environment uses: ./.github/actions/setup-uv - name: Install the project - run: uv sync --dev + run: uv sync # If pre-release is true, we need to check if ["a", "b", "rc", "dev", "post"] is in the version string # if the version string is incorrect, we need to exit the workflow diff --git a/.github/workflows/release_nightly.yml b/.github/workflows/release_nightly.yml index a83270c8e..277ca6c90 100644 --- a/.github/workflows/release_nightly.yml +++ b/.github/workflows/release_nightly.yml @@ -75,7 +75,7 @@ jobs: - name: "Setup Environment" uses: ./.github/actions/setup-uv - name: Install the project - run: uv sync --dev + run: uv sync - name: Verify Nightly Name and Version id: verify @@ -152,7 +152,7 @@ jobs: - name: "Setup Environment" uses: ./.github/actions/setup-uv - name: Install the project - run: uv sync --dev + run: uv sync - name: Verify Nightly Name and Version id: verify diff --git a/.github/workflows/store_pytest_durations.yml b/.github/workflows/store_pytest_durations.yml index 1756b1563..8fe3512c4 100644 --- a/.github/workflows/store_pytest_durations.yml +++ b/.github/workflows/store_pytest_durations.yml @@ -26,7 +26,7 @@ jobs: - name: "Setup Environment" uses: ./.github/actions/setup-uv - name: Install the project - run: uv sync --dev + run: uv sync - name: Run unit tests id: run_tests continue-on-error: true diff --git a/.github/workflows/typescript_test.yml b/.github/workflows/typescript_test.yml index 0628d6aaf..79763075a 100644 --- a/.github/workflows/typescript_test.yml +++ b/.github/workflows/typescript_test.yml @@ -262,7 +262,7 @@ jobs: uses: ./.github/actions/setup-uv - name: Install Python Dependencies - run: uv sync --dev + run: uv sync - name: Configure Environment Variables run: | diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index f33fdd9e1..4cf392482 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -101,7 +101,7 @@ Pre-commit hooks will help keep your changes clean and well-formatted. Install pre-commit hooks by running the following commands: ```bash -uv sync --dev +uv sync uv run pre-commit install ``` diff --git a/pyproject.toml b/pyproject.toml index 766fcc947..662deb729 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -115,54 +115,8 @@ dependencies = [ "apify-client>=1.8.1", ] -[tool.uv.sources] -langflow-base = { workspace = true } -langflow = { workspace = true } - -[tool.uv.workspace] -members = ["src/backend/base", "."] - -[tool.hatch.build.targets.wheel] -packages = ["src/backend/langflow"] - - -[project.urls] -Repository = "https://github.com/langflow-ai/langflow" -Documentation = "https://docs.langflow.org" - -[project.optional-dependencies] -deploy = [ - "celery[redis]>=5.3.6", - "flower>=2.0.0" -] -couchbase = [ - "couchbase>=4.2.1" -] -cassio = [ - "cassio>=0.1.7" -] -local = [ - "llama-cpp-python~=0.2.0", - "sentence-transformers>=2.3.1", - "ctransformers>=0.2.10" -] -clickhouse-connect = [ - "clickhouse-connect==0.7.19" -] -nv-ingest = [ - # nv-ingest-client 2025.2.7.dev0 does not correctly install its - # dependencies, so we need to install some manually. - "nv-ingest-client==2025.2.7.dev0", - "python-pptx==0.6.23", - "pymilvus[bulk_writer,model]==2.5.0", - "llama-index-embeddings-nvidia==0.1.5", -] - -[project.scripts] -langflow = "langflow.__main__:main" - -[tool.uv] -dev-dependencies = [ +[dependency-groups] +dev = [ "pytest-instafail>=0.5.0", "types-redis>=4.6.0.5", "ipykernel>=6.29.0", @@ -203,6 +157,52 @@ dev-dependencies = [ "locust>=2.32.9", ] +[tool.uv.sources] +langflow-base = { workspace = true } +langflow = { workspace = true } + +[tool.uv.workspace] +members = ["src/backend/base", "."] + +[tool.hatch.build.targets.wheel] +packages = ["src/backend/langflow"] + + +[project.urls] +Repository = "https://github.com/langflow-ai/langflow" +Documentation = "https://docs.langflow.org" + +[project.optional-dependencies] +deploy = [ + "celery[redis]>=5.3.6", + "flower>=2.0.0" +] +couchbase = [ + "couchbase>=4.2.1" +] +cassio = [ + "cassio>=0.1.7" +] +local = [ + "llama-cpp-python~=0.2.0", + "sentence-transformers>=2.3.1", + "ctransformers>=0.2.10" +] +clickhouse-connect = [ + "clickhouse-connect==0.7.19" +] + +nv-ingest = [ + # nv-ingest-client 2025.2.7.dev0 does not correctly install its + # dependencies, so we need to install some manually. + "nv-ingest-client==2025.2.7.dev0", + "python-pptx==0.6.23", + "pymilvus[bulk_writer,model]==2.5.0", + "llama-index-embeddings-nvidia==0.1.5", +] + +[project.scripts] +langflow = "langflow.__main__:main" [tool.codespell] skip = '.git,*.pdf,*.svg,*.pdf,*.yaml,*.ipynb,poetry.lock,*.min.js,*.css,package-lock.json,*.trig.,**/node_modules/**,./stuff/*,*.csv' diff --git a/src/backend/base/pyproject.toml b/src/backend/base/pyproject.toml index 79b2e7542..fb057d97d 100644 --- a/src/backend/base/pyproject.toml +++ b/src/backend/base/pyproject.toml @@ -83,6 +83,45 @@ dependencies = [ "greenlet>=3.1.1", ] +[dependency-groups] +dev = [ + "asgi-lifespan>=2.1.0", + "pytest-codspeed>=3.0.0", + "pytest-github-actions-annotate-failures>=0.2.0", + "types-aiofiles>=24.1.0.20240626", + "types-redis>=4.6.0.5", + "ipykernel>=6.29.0", + "mypy>=1.11.0", + "ruff>=0.6.2", + "httpx[http2]>=0.27", + "pytest>=8.2.0", + "types-requests>=2.32.0", + "requests>=2.32.0", + "pytest-cov>=5.0.0", + "pandas-stubs>=2.1.4.231227", + "types-pillow>=10.2.0.20240213", + "types-pyyaml>=6.0.12.8", + "types-python-jose>=3.3.4.8", + "types-passlib>=1.7.7.13", + "pytest-mock>=3.14.0", + "pytest-xdist>=3.6.0", + "types-pywin32>=306.0.0.4", + "types-google-cloud-ndb>=2.2.0.0", + "pytest-sugar>=1.0.0", + "respx>=0.21.1", + "pytest-instafail>=0.5.0", + "pytest-asyncio>=0.23.0", + "pytest-profiling>=1.7.0", + "pre-commit>=3.7.0", + "vulture>=2.11", + "dictdiffer>=0.9.0", + "pytest-split>=0.9.0", + "devtools>=0.12.2", + "pytest-flakefinder>=1.1.0", + "types-markdown>=3.7.0.20240822", + "codeflash>=0.8.4" +] + [tool.hatch.build.targets.wheel] packages = ["langflow"] @@ -158,13 +197,6 @@ ignore = [ "S301", # Use of pickle ] -[tool.uv] -dev-dependencies = [ - "asgi-lifespan>=2.1.0", - "pytest-codspeed>=3.0.0", - "pytest-github-actions-annotate-failures>=0.2.0", - "types-aiofiles>=24.1.0.20240626", -] [tool.codeflash] # All paths are relative to this pyproject.toml's directory. module-root = "langflow" @@ -208,40 +240,5 @@ all = [ "ctransformers>=0.2" ] -# Development dependencies -dev = [ - "types-redis>=4.6.0.5", - "ipykernel>=6.29.0", - "mypy>=1.11.0", - "ruff>=0.6.2", - "httpx[http2]>=0.27", - "pytest>=8.2.0", - "types-requests>=2.32.0", - "requests>=2.32.0", - "pytest-cov>=5.0.0", - "pandas-stubs>=2.1.4.231227", - "types-pillow>=10.2.0.20240213", - "types-pyyaml>=6.0.12.8", - "types-python-jose>=3.3.4.8", - "types-passlib>=1.7.7.13", - "pytest-mock>=3.14.0", - "pytest-xdist>=3.6.0", - "types-pywin32>=306.0.0.4", - "types-google-cloud-ndb>=2.2.0.0", - "pytest-sugar>=1.0.0", - "respx>=0.21.1", - "pytest-instafail>=0.5.0", - "pytest-asyncio>=0.23.0", - "pytest-profiling>=1.7.0", - "pre-commit>=3.7.0", - "vulture>=2.11", - "dictdiffer>=0.9.0", - "pytest-split>=0.9.0", - "devtools>=0.12.2", - "pytest-flakefinder>=1.1.0", - "types-markdown>=3.7.0.20240822", - "codeflash>=0.8.4" -] - [project.scripts] langflow-base = "langflow.__main__:main" diff --git a/uv.lock b/uv.lock index 3893242ce..8f3f5687c 100644 --- a/uv.lock +++ b/uv.lock @@ -4640,7 +4640,15 @@ deploy = [ { name = "flower" }, { name = "redis" }, ] +local = [ + { name = "ctransformers" }, + { name = "llama-cpp-python" }, + { name = "sentence-transformers" }, +] + +[package.dev-dependencies] dev = [ + { name = "asgi-lifespan" }, { name = "codeflash" }, { name = "devtools" }, { name = "dictdiffer" }, @@ -4651,8 +4659,10 @@ dev = [ { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-asyncio" }, + { name = "pytest-codspeed" }, { name = "pytest-cov" }, { name = "pytest-flakefinder" }, + { name = "pytest-github-actions-annotate-failures" }, { name = "pytest-instafail" }, { name = "pytest-mock" }, { name = "pytest-profiling" }, @@ -4662,6 +4672,7 @@ dev = [ { name = "requests" }, { name = "respx" }, { name = "ruff" }, + { name = "types-aiofiles" }, { name = "types-google-cloud-ndb" }, { name = "types-markdown" }, { name = "types-passlib" }, @@ -4673,19 +4684,6 @@ dev = [ { name = "types-requests" }, { name = "vulture" }, ] -local = [ - { name = "ctransformers" }, - { name = "llama-cpp-python" }, - { name = "sentence-transformers" }, -] - -[package.dev-dependencies] -dev = [ - { name = "asgi-lifespan" }, - { name = "pytest-codspeed" }, - { name = "pytest-github-actions-annotate-failures" }, - { name = "types-aiofiles" }, -] [package.metadata] requires-dist = [ @@ -4701,13 +4699,10 @@ requires-dist = [ { name = "celery", marker = "extra == 'deploy'", specifier = ">=5.3.1" }, { name = "chardet", specifier = ">=5.2.0,<6.0.0" }, { name = "clickhouse-connect", specifier = "==0.7.19" }, - { name = "codeflash", marker = "extra == 'dev'", specifier = ">=0.8.4" }, { name = "cryptography", specifier = ">=42.0.5,<44.0.0" }, { name = "ctransformers", marker = "extra == 'all'", specifier = ">=0.2" }, { name = "ctransformers", marker = "extra == 'local'", specifier = ">=0.2" }, { name = "defusedxml", specifier = ">=0.7.1,<1.0.0" }, - { name = "devtools", marker = "extra == 'dev'", specifier = ">=0.12.2" }, - { name = "dictdiffer", marker = "extra == 'dev'", specifier = ">=0.9.0" }, { name = "diskcache", specifier = ">=5.6.3,<6.0.0" }, { name = "docstring-parser", specifier = ">=0.16,<1.0.0" }, { name = "duckdb", specifier = ">=1.0.0,<2.0.0" }, @@ -4722,8 +4717,6 @@ requires-dist = [ { name = "greenlet", specifier = ">=3.1.1" }, { name = "gunicorn", specifier = ">=22.0.0,<24.0.0" }, { name = "httpx", extras = ["http2"], specifier = ">=0.27,<1.0.0" }, - { name = "httpx", extras = ["http2"], marker = "extra == 'dev'", specifier = ">=0.27" }, - { name = "ipykernel", marker = "extra == 'dev'", specifier = ">=6.29.0" }, { name = "jq", marker = "sys_platform != 'win32'", specifier = ">=1.7.0,<2.0.0" }, { name = "json-repair", specifier = ">=0.30.3" }, { name = "langchain", specifier = "~=0.3.10" }, @@ -4736,7 +4729,6 @@ requires-dist = [ { name = "loguru", specifier = ">=0.7.1,<1.0.0" }, { name = "mcp", specifier = ">=1.1.2" }, { name = "multiprocess", specifier = ">=0.70.14,<1.0.0" }, - { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.11.0" }, { name = "nanoid", specifier = ">=2.0.0,<3.0.0" }, { name = "nest-asyncio", specifier = ">=1.6.0,<2.0.0" }, { name = "networkx", specifier = ">=3.4.2" }, @@ -4746,35 +4738,20 @@ requires-dist = [ { name = "opentelemetry-sdk", specifier = ">=1.25.0,<2.0.0" }, { name = "orjson", specifier = "==3.10.15" }, { name = "pandas", specifier = "==2.2.3" }, - { name = "pandas-stubs", marker = "extra == 'dev'", specifier = ">=2.1.4.231227" }, { name = "passlib", specifier = ">=1.7.4,<2.0.0" }, { name = "pillow", specifier = ">=11.1.0,<12.0.0" }, { name = "platformdirs", specifier = ">=4.2.0,<5.0.0" }, - { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=3.7.0" }, { name = "prometheus-client", specifier = ">=0.20.0,<1.0.0" }, { name = "pydantic", specifier = "~=2.10.1" }, { name = "pydantic-settings", specifier = ">=2.2.0,<3.0.0" }, { name = "pypdf", specifier = "~=5.1.0" }, { name = "pyperclip", specifier = ">=1.8.2,<2.0.0" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.2.0" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" }, - { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5.0.0" }, - { name = "pytest-flakefinder", marker = "extra == 'dev'", specifier = ">=1.1.0" }, - { name = "pytest-instafail", marker = "extra == 'dev'", specifier = ">=0.5.0" }, - { name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.14.0" }, - { name = "pytest-profiling", marker = "extra == 'dev'", specifier = ">=1.7.0" }, - { name = "pytest-split", marker = "extra == 'dev'", specifier = ">=0.9.0" }, - { name = "pytest-sugar", marker = "extra == 'dev'", specifier = ">=1.0.0" }, - { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.6.0" }, { name = "python-docx", specifier = ">=1.1.0,<2.0.0" }, { name = "python-jose", specifier = ">=3.3.0,<4.0.0" }, { name = "python-multipart", specifier = ">=0.0.12,<1.0.0" }, { name = "redis", marker = "extra == 'all'", specifier = ">=4.6.0" }, { name = "redis", marker = "extra == 'deploy'", specifier = ">=4.6.0" }, - { name = "requests", marker = "extra == 'dev'", specifier = ">=2.32.0" }, - { name = "respx", marker = "extra == 'dev'", specifier = ">=0.21.1" }, { name = "rich", specifier = ">=13.7.0,<14.0.0" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.6.2" }, { name = "sentence-transformers", marker = "extra == 'all'", specifier = ">=2.0.0" }, { name = "sentence-transformers", marker = "extra == 'local'", specifier = ">=2.0.0" }, { name = "sentry-sdk", extras = ["fastapi", "loguru"], specifier = ">=2.5.1,<3.0.0" }, @@ -4782,27 +4759,48 @@ requires-dist = [ { name = "spider-client", specifier = ">=0.0.27,<1.0.0" }, { name = "sqlmodel", specifier = "==0.0.22" }, { name = "typer", specifier = ">=0.13.0,<1.0.0" }, - { name = "types-google-cloud-ndb", marker = "extra == 'dev'", specifier = ">=2.2.0.0" }, - { name = "types-markdown", marker = "extra == 'dev'", specifier = ">=3.7.0.20240822" }, - { name = "types-passlib", marker = "extra == 'dev'", specifier = ">=1.7.7.13" }, - { name = "types-pillow", marker = "extra == 'dev'", specifier = ">=10.2.0.20240213" }, - { name = "types-python-jose", marker = "extra == 'dev'", specifier = ">=3.3.4.8" }, - { name = "types-pywin32", marker = "extra == 'dev'", specifier = ">=306.0.0.4" }, - { name = "types-pyyaml", marker = "extra == 'dev'", specifier = ">=6.0.12.8" }, - { name = "types-redis", marker = "extra == 'dev'", specifier = ">=4.6.0.5" }, - { name = "types-requests", marker = "extra == 'dev'", specifier = ">=2.32.0" }, { name = "uncurl", specifier = ">=0.0.11,<1.0.0" }, { name = "uvicorn", specifier = ">=0.30.0,<1.0.0" }, { name = "validators", specifier = ">=0.34.0" }, - { name = "vulture", marker = "extra == 'dev'", specifier = ">=2.11" }, ] [package.metadata.requires-dev] dev = [ { name = "asgi-lifespan", specifier = ">=2.1.0" }, + { name = "codeflash", specifier = ">=0.8.4" }, + { name = "devtools", specifier = ">=0.12.2" }, + { name = "dictdiffer", specifier = ">=0.9.0" }, + { name = "httpx", extras = ["http2"], specifier = ">=0.27" }, + { name = "ipykernel", specifier = ">=6.29.0" }, + { name = "mypy", specifier = ">=1.11.0" }, + { name = "pandas-stubs", specifier = ">=2.1.4.231227" }, + { name = "pre-commit", specifier = ">=3.7.0" }, + { name = "pytest", specifier = ">=8.2.0" }, + { name = "pytest-asyncio", specifier = ">=0.23.0" }, { name = "pytest-codspeed", specifier = ">=3.0.0" }, + { name = "pytest-cov", specifier = ">=5.0.0" }, + { name = "pytest-flakefinder", specifier = ">=1.1.0" }, { name = "pytest-github-actions-annotate-failures", specifier = ">=0.2.0" }, + { name = "pytest-instafail", specifier = ">=0.5.0" }, + { name = "pytest-mock", specifier = ">=3.14.0" }, + { name = "pytest-profiling", specifier = ">=1.7.0" }, + { name = "pytest-split", specifier = ">=0.9.0" }, + { name = "pytest-sugar", specifier = ">=1.0.0" }, + { name = "pytest-xdist", specifier = ">=3.6.0" }, + { name = "requests", specifier = ">=2.32.0" }, + { name = "respx", specifier = ">=0.21.1" }, + { name = "ruff", specifier = ">=0.6.2" }, { name = "types-aiofiles", specifier = ">=24.1.0.20240626" }, + { name = "types-google-cloud-ndb", specifier = ">=2.2.0.0" }, + { name = "types-markdown", specifier = ">=3.7.0.20240822" }, + { name = "types-passlib", specifier = ">=1.7.7.13" }, + { name = "types-pillow", specifier = ">=10.2.0.20240213" }, + { name = "types-python-jose", specifier = ">=3.3.4.8" }, + { name = "types-pywin32", specifier = ">=306.0.0.4" }, + { name = "types-pyyaml", specifier = ">=6.0.12.8" }, + { name = "types-redis", specifier = ">=4.6.0.5" }, + { name = "types-requests", specifier = ">=2.32.0" }, + { name = "vulture", specifier = ">=2.11" }, ] [[package]]