Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions .github/ISSUE_TEMPLATE/bug-report.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -100,14 +100,13 @@ body:
label: "Python Version"
description: |

**Langflow requires Python version 3.10 or greater.**
**Langflow supports Python 3.11 through 3.14. Python 3.15 support is experimental.**
options:
- "3.15"
- "3.14"
- "3.13"
- "3.12"
- "3.11"
- "3.10"

- type: textarea
id: screenshot
Expand Down
33 changes: 33 additions & 0 deletions .github/actions/setup-python-preview/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Set up Python preview builds
description: Install native build dependencies for experimental Python source builds.
runs:
using: composite
steps:
- name: Use the stable Python ABI for older PyO3 extensions
shell: bash
run: echo "PYO3_USE_ABI3_FORWARD_COMPATIBILITY=1" >> "$GITHUB_ENV"
- name: Enable the HTTP/3 API required by impit source builds
shell: bash
run: echo "RUSTFLAGS=${RUSTFLAGS:+$RUSTFLAGS }--cfg reqwest_unstable" >> "$GITHUB_ENV"
- name: Install Linux native build dependencies
if: runner.os == 'Linux'
shell: bash
run: |
set -euo pipefail
curl -fsSL https://packages.confluent.io/clients/deb/archive.key \
| gpg --dearmor \
| sudo tee /usr/share/keyrings/confluent-clients.gpg >/dev/null
source /etc/os-release
echo "deb [signed-by=/usr/share/keyrings/confluent-clients.gpg] https://packages.confluent.io/clients/deb ${VERSION_CODENAME} main" \
| sudo tee /etc/apt/sources.list.d/confluent-clients.list >/dev/null
sudo apt-get update
sudo apt-get install --no-install-recommends -y \
libev-dev libxml2-dev libxslt1-dev librdkafka-dev protobuf-compiler
- name: Install macOS native build dependencies
if: runner.os == 'macOS'
shell: bash
run: |
set -euo pipefail
brew install libev librdkafka protobuf
echo "CPPFLAGS=-I$(brew --prefix)/include ${CPPFLAGS:-}" >> "$GITHUB_ENV"
echo "LDFLAGS=-L$(brew --prefix)/lib ${LDFLAGS:-}" >> "$GITHUB_ENV"
9 changes: 5 additions & 4 deletions .github/workflows/backend-tests.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

`python_test.yml` delegates the complete backend unit suite to
`backend-unit-tests.yml`. Integration, LFX, bundle and CLI jobs remain separate.
Both supported Python endpoints run the full unit selection. Python 3.10 also
collects coverage and publishes the existing Codecov report.
The supported Python endpoints and experimental Python 3.15 run the full unit
selection. Python 3.11 also collects coverage and publishes the existing Codecov
report.

## Timing baselines

Expand Down Expand Up @@ -75,9 +76,9 @@ Dispatch `Store pytest durations` with `shards`, `workers` and `distribution`:

```bash
gh workflow run store_pytest_durations.yml --ref YOUR_BRANCH \
-f python-versions='["3.10"]' -f shards=5 -f workers=2 -f distribution=load
-f python-versions='["3.11"]' -f shards=5 -f workers=2 -f distribution=load
gh workflow run store_pytest_durations.yml --ref YOUR_BRANCH \
-f python-versions='["3.10"]' -f shards=5 -f workers=4 -f distribution=worksteal
-f python-versions='["3.11"]' -f shards=5 -f workers=4 -f distribution=worksteal
```

Compare elapsed time, summed phase time, total runner minutes, memory pressure,
Expand Down
15 changes: 9 additions & 6 deletions .github/workflows/backend-unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ on:
inputs:
python-versions:
type: string
default: '["3.10", "3.14"]'
default: '["3.11", "3.14", "3.15"]'
ref:
type: string
default: ''
Expand Down Expand Up @@ -74,9 +74,9 @@ jobs:
- uses: actions/cache/restore@v6
with:
path: ci-durations/durations.json
key: backend-timings-v1-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-${{ matrix.python-version == '3.10' && 'cov' || 'no-cov' }}-w${{ inputs.workers }}-${{ inputs.distribution }}-${{ github.run_id }}-${{ github.run_attempt }}
key: backend-timings-v1-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-${{ matrix.python-version == '3.11' && 'cov' || 'no-cov' }}-w${{ inputs.workers }}-${{ inputs.distribution }}-${{ github.run_id }}-${{ github.run_attempt }}
restore-keys: |
backend-timings-v1-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-${{ matrix.python-version == '3.10' && 'cov' || 'no-cov' }}-w${{ inputs.workers }}-${{ inputs.distribution }}-
backend-timings-v1-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-${{ matrix.python-version == '3.11' && 'cov' || 'no-cov' }}-w${{ inputs.workers }}-${{ inputs.distribution }}-
- name: Fall back to checked-in durations on a cold cache
run: |
mkdir -p ci-durations
Expand Down Expand Up @@ -120,6 +120,9 @@ jobs:
cache-dependency-glob: uv.lock
python-version: ${{ matrix.python-version }}
prune-cache: false
- name: Set up Python preview builds
if: matrix.python-version == '3.15'
uses: ./.github/actions/setup-python-preview
- name: Install the project
run: uv sync --frozen
- uses: actions/download-artifact@v8
Expand All @@ -138,7 +141,7 @@ jobs:
PYTHON_VERSION: ${{ matrix.python-version }}
run: |
coverage=(--no-cov)
if [ "$PYTHON_VERSION" == '3.10' ]; then
if [ "$PYTHON_VERSION" == '3.11' ]; then
coverage=(--cov --cov-config=pyproject.toml --cov-report=xml)
fi
mkdir -p test-results
Expand All @@ -165,7 +168,7 @@ jobs:
if-no-files-found: warn
# Preserve the existing public repository's success-only Codecov upload.
- name: Upload coverage to Codecov
if: inputs.publish-coverage && matrix.python-version == '3.10'
if: inputs.publish-coverage && matrix.python-version == '3.11'
uses: codecov/codecov-action@v7
with:
token: ${{ secrets.CODECOV_TOKEN }}
Expand Down Expand Up @@ -206,7 +209,7 @@ jobs:
uses: actions/cache/save@v6
with:
path: ci-durations/durations.json
key: backend-timings-v1-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-${{ matrix.python-version == '3.10' && 'cov' || 'no-cov' }}-w${{ inputs.workers }}-${{ inputs.distribution }}-${{ github.run_id }}-${{ github.run_attempt }}
key: backend-timings-v1-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-${{ matrix.python-version == '3.11' && 'cov' || 'no-cov' }}-w${{ inputs.workers }}-${{ inputs.distribution }}-${{ github.run_id }}-${{ github.run_attempt }}
- uses: actions/upload-artifact@v7
with:
name: backend-timings-${{ needs.plan.outputs.namespace }}-py${{ matrix.python-version }}-s${{ inputs.shards }}-w${{ inputs.workers }}-${{ inputs.distribution }}
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:
description: "Python Versions"
required: false
type: string
default: "['3.10', '3.14']"
default: "['3.11', '3.14', '3.15']"
frontend-tests-folder:
description: "Frontend Tests Folder"
required: false
Expand Down Expand Up @@ -42,7 +42,7 @@ on:
description: "Python Versions"
required: false
type: string
default: "['3.10', '3.14']"
default: "['3.11', '3.14', '3.15']"
runs-on:
description: "Runner to use for the tests"
required: false
Expand Down Expand Up @@ -257,7 +257,7 @@ jobs:
)
uses: ./.github/workflows/python_test.yml
with:
python-versions: ${{ inputs.python-versions || '["3.10", "3.14"]' }}
python-versions: ${{ inputs.python-versions || '["3.11", "3.14", "3.15"]' }}
runs-on: ${{ inputs['runs-on'] || github.event.inputs['runs-on'] || 'ubuntu-latest' }}
ref: ${{ inputs.ref || github.ref }}
secrets:
Expand Down
19 changes: 11 additions & 8 deletions .github/workflows/cross-bundle-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ jobs:
# Scheduled runs: every supported Python (the exhaustive grid).
# The lfx-minor axis collapses to the in-repo lfx until the 1.10 line
# publishes (see header).
python-version: ${{ github.event_name == 'schedule' && fromJson('["3.10", "3.11", "3.12", "3.13", "3.14", "3.15"]') || fromJson('["3.10", "3.13"]') }}
python-version: ${{ github.event_name == 'schedule' && fromJson('["3.11", "3.12", "3.13", "3.14", "3.15"]') || fromJson('["3.11", "3.14", "3.15"]') }}
steps:
- uses: actions/checkout@v7
with:
Expand All @@ -92,26 +92,24 @@ jobs:
cache-dependency-glob: "uv.lock"
python-version: ${{ matrix.python-version }}

- name: Set up Python preview builds
if: matrix.python-version == '3.15'
uses: ./.github/actions/setup-python-preview
- name: Install in-repo lfx + the bundle into a clean venv
run: |
uv venv
# The in-repo lfx satisfies the bundle's `lfx>=X,<Y` pin and is the
# contract surface under test; pytest is for the bundle's own tests.
# tomli backports stdlib tomllib for the py3.10 matrix leg.
uv pip install ./src/lfx "./${{ matrix.bundle }}" pytest pytest-asyncio tomli
uv pip install ./src/lfx "./${{ matrix.bundle }}" pytest pytest-asyncio

- name: Contract smoke -- import + discovery
run: |
.venv/bin/python - "${{ matrix.bundle }}" <<'PY'
import importlib
import sys
import tomllib
from pathlib import Path

try:
import tomllib # stdlib from 3.11
except ModuleNotFoundError:
import tomli as tomllib # py3.10 backport, installed above

bundle_dir = Path(sys.argv[1])
meta = tomllib.loads((bundle_dir / "pyproject.toml").read_text())
name = meta["project"]["name"]
Expand All @@ -126,6 +124,11 @@ jobs:
importlib.import_module(value.split(":", 1)[0])
print(f" imported {value}")

# Valkey loads its SDK lazily, and its unit tests mock the client.
# Import the real SDK so source packaging failures remain visible.
if name == "lfx-valkey":
importlib.import_module("glide_sync")

# The manifest-less metapackage must be discoverable by the loader.
# This venv installs the bundle WITHOUT its per-provider extras, so
# providers whose modules import their SDK at top level degrade with
Expand Down
22 changes: 11 additions & 11 deletions .github/workflows/cross-platform-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,14 +58,14 @@ jobs:
- **macOS**: Intel (AMD64), Apple Silicon (ARM64)
- **Windows**: AMD64
- **Python versions**:
- **All platforms**: 3.10, 3.12, 3.13, 3.14, and 3.15
- **Stability**: 3.10, 3.12, and 3.13 are required to pass (blocking)
- **Preview**: 3.14 and 3.15 testing is optional (non-blocking) to monitor ecosystem readiness
- **All platforms**: 3.11, 3.12, 3.13, 3.14, and 3.15
- **Stability**: 3.11, 3.12, 3.13, and 3.14 are required to pass (blocking)
- **Experimental**: 3.15 testing is optional (non-blocking) to monitor ecosystem readiness
- **Note**: macOS Intel (x86_64) is tested only on Python 3.12. macOS x86_64 is
being dropped across the ecosystem — PyTorch ships no x86_64 wheels for py>=3.13
and onnxruntime shipped none after 1.23 — and langflow requires `onnxruntime>=1.26`
on py>=3.14, so macOS Intel + py>=3.14 cannot resolve. The 3.13 (blocking) and
3.14/3.15 (preview) sets therefore run on Linux, Windows, and macOS arm64 only
on py>=3.14, so macOS Intel + py>=3.14 cannot resolve. The 3.13/3.14 (blocking) and
3.15 (experimental) sets therefore run on Linux, Windows, and macOS arm64 only

## What Gets Tested

Expand Down Expand Up @@ -108,8 +108,8 @@ gh workflow run cross-platform-test.yml \
- **Timeout**: Configurable timeout with proper cross-platform handling

### Platform-Specific Optimizations
- **Stable versions**: Python 3.10, 3.12, and 3.13 provide reliable package ecosystem support
- **Preview testing**: Python 3.14 and 3.15 run as non-blocking to monitor when they become viable
- **Stable versions**: Python 3.11, 3.12, 3.13, and 3.14 provide reliable package ecosystem support
- **Experimental testing**: Python 3.15 runs as non-blocking to monitor ecosystem readiness
- **Virtual Environments**: Uses `uv venv --seed` for consistent pip availability

### Workflow Architecture
Expand Down Expand Up @@ -192,11 +192,11 @@ error: command '/usr/bin/clang++' failed with exit code 1
3. **macOS clang** doesn't support `-march=native` flag used by `chroma-hnswlib` compilation

**Current Status**:
- **Stable testing**: Python 3.10, 3.12, and 3.13 are required to pass (blocking jobs)
- **Preview testing**: Python 3.14 and 3.15 run as non-blocking to monitor ecosystem readiness
- **Stable testing**: Python 3.11, 3.12, 3.13, and 3.14 are required to pass (blocking jobs)
- **Experimental testing**: Python 3.15 runs as non-blocking to monitor ecosystem readiness
- **Compilation issues**: the historical `chroma-hnswlib` failure is avoided on the tested install
paths (workspace/source builds exclude `chromadb`); a similar upstream issue surfacing on the
preview (3.14/3.15) tier stays non-blocking
experimental (3.15) tier stays non-blocking
- **Manual testing**: Source builds now use the same dependency transformation as nightly builds for testing parity

**Files Involved**:
Expand All @@ -209,4 +209,4 @@ error: command '/usr/bin/clang++' failed with exit code 1
- ✅ **Success**: All platforms pass installation and basic functionality
- ❌ **Failure**: One or more platforms fail (check logs for details)
- Each platform/Python combination runs independently
- **Parallel execution**: All platforms tested simultaneously for faster feedback
- **Parallel execution**: All platforms tested simultaneously for faster feedback
66 changes: 31 additions & 35 deletions .github/workflows/cross-platform-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ jobs:
- os: linux
arch: amd64
runner: ubuntu-latest
python-version: "3.10"
python-version: "3.11"
- os: linux
arch: amd64
runner: ubuntu-latest
Expand All @@ -172,7 +172,7 @@ jobs:
- os: macos
arch: arm64
runner: macos-latest
python-version: "3.10"
python-version: "3.11"
- os: macos
arch: arm64
runner: macos-latest
Expand All @@ -181,16 +181,13 @@ jobs:
- os: windows
arch: amd64
runner: windows-latest
python-version: "3.10"
python-version: "3.11"
- os: windows
arch: amd64
runner: windows-latest
python-version: "3.12"
# Python 3.13 - graduated from experimental to stable (blocking).
# macOS Intel (amd64) is intentionally omitted here: like 3.10/3.12 above
# it stays on the costly macos-latest-large runner only at 3.12. Intel
# coverage for newer Python continues (non-blocking) in the experimental
# 3.14 set below.
# Python 3.13 is stable and required to pass.
# macOS Intel stays on Python 3.12 to limit runner cost.
- os: linux
arch: amd64
runner: ubuntu-latest
Expand All @@ -203,6 +200,21 @@ jobs:
arch: amd64
runner: windows-latest
python-version: "3.13"
# Python 3.14 is stable and required to pass.
# macOS Intel stays on Python 3.12. The required onnxruntime>=1.26
# has no macOS Intel wheels for Python 3.14.
- os: linux
arch: amd64
runner: ubuntu-latest
python-version: "3.14"
- os: windows
arch: amd64
runner: windows-latest
python-version: "3.14"
- os: macos
arch: arm64
runner: macos-latest
python-version: "3.14"

steps:
- name: Checkout authentication smoke check
Expand Down Expand Up @@ -467,29 +479,8 @@ jobs:
fail-fast: false
matrix:
include:
# Python 3.14 - Experimental (non-blocking) to monitor ecosystem readiness.
# macOS Intel (x86_64) is intentionally omitted: langflow requires
# onnxruntime>=1.26 on Python >=3.14 (pyproject.toml), but onnxruntime
# dropped macOS x86_64 wheels at 1.24 — so macOS Intel + py3.14 is
# permanently unsatisfiable (older onnxruntime that still ships macOS
# x86_64 wheels has no cp314 ABI). macOS Intel resolves fine through 3.13;
# arm64 has cp314 wheels. Running it would only burn the costly
# macos-latest-large runner on a guaranteed, no-signal failure.
- os: linux
arch: amd64
runner: ubuntu-latest
python-version: "3.14"
- os: windows
arch: amd64
runner: windows-latest
python-version: "3.14"
- os: macos
arch: arm64
runner: macos-latest
python-version: "3.14"
# Python 3.15 - Preview (non-blocking). macOS Intel is omitted for the same
# onnxruntime reason as 3.14. Expect failures until upstream packages ship
# cp315 wheels (ormsgpack, via langgraph-checkpoint, blocks installation today).
# Python 3.15 is experimental and does not block releases.
# macOS Intel is omitted for the same onnxruntime reason as 3.14.
- os: linux
arch: amd64
runner: ubuntu-latest
Expand All @@ -508,7 +499,9 @@ jobs:
uses: actions/checkout@v7
with:
path: auth-smoke
sparse-checkout: scripts/ci/check_authentication.py
sparse-checkout: |
scripts/ci/check_authentication.py
.github/actions/setup-python-preview
sparse-checkout-cone-mode: false
persist-credentials: false

Expand Down Expand Up @@ -542,6 +535,9 @@ jobs:
enable-cache: false
ignore-empty-workdir: true

- name: Set up Python preview builds
uses: ./auth-smoke/.github/actions/setup-python-preview

- name: Install Protocol Buffers (macOS AMD64)
if: matrix.os == 'macos' && matrix.arch == 'amd64'
run: |
Expand Down Expand Up @@ -1041,7 +1037,7 @@ jobs:
exit 0
fi

# Stable platforms must succeed. The experimental (Python 3.14/3.15) job runs with
# Stable platforms must succeed. The experimental (Python 3.15) job runs with
# continue-on-error, so its result reads "success" even when a leg fails; report it
# as non-blocking rather than claiming those versions passed.
if [ "$stable_result" = "success" ]; then
Expand All @@ -1054,10 +1050,10 @@ jobs:
else
echo "✅ Cross-platform tests passed on the stable platforms - PyPI upload can proceed"
fi
echo "ℹ️ Python 3.14/3.15 experimental results are non-blocking; check the (Experimental) jobs for their outcome"
echo "ℹ️ Python 3.15 experimental results are non-blocking; check the (Experimental) jobs for their outcome"
elif [ "$stable_result" = "failure" ]; then
echo "❌ Critical platform tests failed - blocking release"
echo "Stable platforms (Python 3.10, 3.12, 3.13) must pass for release"
echo "Stable platforms (Python 3.11, 3.12, 3.13, 3.14) must pass for release"
exit 1
elif [ "$stable_result" = "cancelled" ]; then
echo "❌ Critical platform tests were cancelled"
Expand Down
Loading
Loading