Skip to content
Open
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
c7a17d6
fix: make the 1.11 core runtime self-contained
erichare Jul 15, 2026
db4b17c
test: define langflow-core distribution contract
erichare Jul 15, 2026
a33b411
feat: add langflow-core distribution
erichare Jul 15, 2026
969d348
feat: add langflow-core container image
erichare Jul 15, 2026
7a4881d
feat: ship the langflow-core distribution
erichare Jul 15, 2026
036549b
fix: support Python 3.10 in core distribution tests
erichare Jul 15, 2026
1318adb
Merge remote-tracking branch 'origin/release-1.11.0' into fix/langflo…
erichare Jul 15, 2026
1a41f07
Merge remote-tracking branch 'origin/release-1.11.0' into fix/langflo…
erichare Jul 15, 2026
28e6c54
fix: address langflow-core review feedback
erichare Jul 15, 2026
904005a
Merge branch 'release-1.11.0' into fix/langflow-core-distribution-1.11
erichare Jul 15, 2026
b8b0106
Merge branch 'release-1.11.0' into fix/langflow-core-distribution-1.11
erichare Jul 16, 2026
64b0c7a
[autofix.ci] apply automated fixes
autofix-ci[bot] Jul 16, 2026
6292cac
[autofix.ci] apply automated fixes (attempt 2/3)
autofix-ci[bot] Jul 16, 2026
fd77f07
Merge remote-tracking branch 'upstream/release-1.11.0' into fix/langf…
erichare Jul 16, 2026
1254387
feat: make langflow-core the shared distribution base
erichare Jul 16, 2026
b606478
Merge remote-tracking branch 'upstream/release-1.11.0' into fix/langf…
erichare Jul 16, 2026
8c2198a
docs: put information in one place and include uv
mendonk Jul 16, 2026
556725b
Merge branch 'fix/langflow-core-distribution-1.11' of https://github.…
mendonk Jul 16, 2026
6203957
docs: align core dependency guidance
erichare Jul 16, 2026
ede7e11
fix: allow first core release CLI gate to skip
erichare Jul 16, 2026
48e6280
Merge branch 'release-1.11.0' into fix/langflow-core-distribution-1.11
erichare Jul 16, 2026
6b21867
docs: fix relative links
mendonk Jul 16, 2026
5a0ce2f
Merge branch 'fix/langflow-core-distribution-1.11' of https://github.…
mendonk Jul 16, 2026
d5b966b
docs: defer user guidance to documentation PR
erichare Jul 16, 2026
a927484
Merge remote-tracking branch 'upstream/fix/langflow-core-distribution…
erichare Jul 16, 2026
5158e42
Merge branch 'release-1.11.0' into fix/langflow-core-distribution-1.11
erichare Jul 16, 2026
c9004b0
Merge branch 'release-1.11.0' into fix/langflow-core-distribution-1.11
erichare Jul 16, 2026
6ed0f44
Merge branch 'release-1.11.0' into fix/langflow-core-distribution-1.11
erichare Jul 17, 2026
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: 3 additions & 0 deletions .github/changes-filter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ python:
- "src/backend/**"
- "src/backend/**.py"
- "src/lfx/**"
- "src/langflow-core/**"
- "pyproject.toml"
- "uv.lock"
- "src/backend/base/pyproject.toml"
Expand Down Expand Up @@ -34,7 +35,9 @@ docker:
- "src/backend/**"
- "src/frontend/**"
- "src/lfx/**"
- "src/langflow-core/**"
- ".dockerignore"
- ".github/workflows/docker-build-v2.yml"
- ".github/workflows/docker_test.yml"

# Test categories and their associated paths
Expand Down
95 changes: 80 additions & 15 deletions .github/workflows/cross-platform-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,15 @@ on:
inputs:
base-artifact-name:
description: "Name of the base package artifact"
required: true
required: false
type: string
core-artifact-name:
description: "Name of the langflow-core package artifact"
required: false
type: string
main-artifact-name:
description: "Name of the main package artifact"
required: true
required: false
type: string
lfx-artifact-name:
description: "Name of the LFX package artifact"
Expand All @@ -43,6 +47,7 @@ jobs:
if: inputs.langflow-version == '' && contains(github.workflow_ref, 'cross-platform-test.yml')
outputs:
base-artifact-name: ${{ steps.set-names.outputs.base-artifact-name }}
core-artifact-name: ${{ steps.set-names.outputs.core-artifact-name }}
main-artifact-name: ${{ steps.set-names.outputs.main-artifact-name }}
lfx-artifact-name: ${{ steps.set-names.outputs.lfx-artifact-name }}
sdk-artifact-name: ${{ steps.set-names.outputs.sdk-artifact-name }}
Expand All @@ -69,6 +74,8 @@ jobs:
# Base package builds to dist/ but should be in src/backend/base/dist/
mkdir -p src/backend/base/dist
mv dist/langflow_base*.whl src/backend/base/dist/
- name: Build core package
run: make build_langflow_core args="--wheel"
- name: Build LFX package
run: |
cd src/lfx
Expand Down Expand Up @@ -113,6 +120,11 @@ jobs:
with:
name: adhoc-dist-base
path: src/backend/base/dist
- name: Upload core artifact
uses: actions/upload-artifact@v6
with:
name: adhoc-dist-core
path: src/langflow-core/dist
- name: Upload main artifact
uses: actions/upload-artifact@v6
with:
Expand All @@ -128,6 +140,7 @@ jobs:
id: set-names
run: |
echo "base-artifact-name=adhoc-dist-base" >> $GITHUB_OUTPUT
echo "core-artifact-name=adhoc-dist-core" >> $GITHUB_OUTPUT
echo "main-artifact-name=adhoc-dist-main" >> $GITHUB_OUTPUT
echo "lfx-artifact-name=adhoc-dist-lfx" >> $GITHUB_OUTPUT
echo "sdk-artifact-name=adhoc-dist-sdk" >> $GITHUB_OUTPUT
Expand All @@ -140,7 +153,10 @@ jobs:
test-installation-stable:
name: Install & Run - ${{ matrix.os }} ${{ matrix.arch }} ${{ matrix.python-version }}
needs: [build-if-needed]
if: always() && (needs.build-if-needed.result == 'success' || needs.build-if-needed.result == 'skipped')
if: |
always() &&
(needs.build-if-needed.result == 'success' || needs.build-if-needed.result == 'skipped') &&
(inputs.langflow-version != '' || inputs.main-artifact-name != '' || needs.build-if-needed.outputs.main-artifact-name != '')
runs-on: ${{ matrix.runner }}
strategy:
fail-fast: false
Expand Down Expand Up @@ -257,7 +273,7 @@ jobs:
path: ./base-dist

- name: Download main package artifact
if: steps.install-method.outputs.method == 'wheel'
if: steps.install-method.outputs.method == 'wheel' && (inputs.main-artifact-name != '' || needs.build-if-needed.outputs.main-artifact-name != '')
uses: actions/download-artifact@v7
with:
name: ${{ inputs.main-artifact-name || needs.build-if-needed.outputs.main-artifact-name || 'adhoc-dist-main' }}
Expand Down Expand Up @@ -464,7 +480,10 @@ jobs:
test-installation-experimental:
name: Install & Run - ${{ matrix.os }} ${{ matrix.arch }} ${{ matrix.python-version }} (Experimental)
needs: [build-if-needed]
if: always() && (needs.build-if-needed.result == 'success' || needs.build-if-needed.result == 'skipped')
if: |
always() &&
(needs.build-if-needed.result == 'success' || needs.build-if-needed.result == 'skipped') &&
(inputs.langflow-version != '' || inputs.main-artifact-name != '' || needs.build-if-needed.outputs.main-artifact-name != '')
runs-on: ${{ matrix.runner }}
continue-on-error: true
strategy:
Expand Down Expand Up @@ -553,7 +572,7 @@ jobs:
path: ./base-dist

- name: Download main package artifact
if: steps.install-method.outputs.method == 'wheel'
if: steps.install-method.outputs.method == 'wheel' && (inputs.main-artifact-name != '' || needs.build-if-needed.outputs.main-artifact-name != '')
uses: actions/download-artifact@v7
with:
name: ${{ inputs.main-artifact-name || needs.build-if-needed.outputs.main-artifact-name || 'adhoc-dist-main' }}
Expand Down Expand Up @@ -890,12 +909,15 @@ jobs:
shell: bash

test-core-runtime:
name: Core Runtime Wheel - Linux Python 3.14
name: Core Distribution Wheel - Linux Python 3.14
needs: [build-if-needed]
if: |
always() &&
inputs.langflow-version == '' &&
(needs.build-if-needed.result == 'success' || needs.build-if-needed.result == 'skipped')
(needs.build-if-needed.result == 'success' || needs.build-if-needed.result == 'skipped') &&
(inputs.base-artifact-name != '' || inputs.core-artifact-name != '' ||
needs.build-if-needed.outputs.base-artifact-name != '' ||
needs.build-if-needed.outputs.core-artifact-name != '')
runs-on: ubuntu-latest
steps:
- name: Setup UV
Expand All @@ -912,17 +934,26 @@ jobs:
path: ./sdk-dist

- name: Download LFX package artifact
if: inputs.lfx-artifact-name != '' || needs.build-if-needed.outputs.lfx-artifact-name != ''
uses: actions/download-artifact@v7
with:
name: ${{ inputs.lfx-artifact-name || needs.build-if-needed.outputs.lfx-artifact-name || 'adhoc-dist-lfx' }}
path: ./lfx-dist

- name: Download base package artifact
if: inputs.base-artifact-name != '' || needs.build-if-needed.outputs.base-artifact-name != ''
uses: actions/download-artifact@v7
with:
name: ${{ inputs.base-artifact-name || needs.build-if-needed.outputs.base-artifact-name || 'adhoc-dist-base' }}
path: ./base-dist

- name: Download langflow-core package artifact
if: inputs.core-artifact-name != '' || needs.build-if-needed.outputs.core-artifact-name != ''
uses: actions/download-artifact@v7
with:
name: ${{ inputs.core-artifact-name || needs.build-if-needed.outputs.core-artifact-name || 'adhoc-dist-core' }}
path: ./core-dist

- name: Install only core wheels
shell: bash
run: |
Expand All @@ -932,26 +963,41 @@ jobs:
SDK_WHEELS=(./sdk-dist/*.whl)
LFX_WHEELS=(./lfx-dist/*.whl)
BASE_WHEELS=(./base-dist/*.whl)
[ ${#LFX_WHEELS[@]} -eq 1 ] || { echo "Expected one LFX wheel, found ${#LFX_WHEELS[@]}"; exit 1; }
[ ${#BASE_WHEELS[@]} -eq 1 ] || { echo "Expected one base wheel, found ${#BASE_WHEELS[@]}"; exit 1; }
CORE_WHEELS=(./core-dist/*.whl)
[ ${#SDK_WHEELS[@]} -le 1 ] || { echo "Expected at most one SDK wheel, found ${#SDK_WHEELS[@]}"; exit 1; }
[ ${#LFX_WHEELS[@]} -le 1 ] || { echo "Expected at most one LFX wheel, found ${#LFX_WHEELS[@]}"; exit 1; }
[ ${#BASE_WHEELS[@]} -le 1 ] || { echo "Expected at most one base wheel, found ${#BASE_WHEELS[@]}"; exit 1; }
[ ${#CORE_WHEELS[@]} -le 1 ] || { echo "Expected at most one core wheel, found ${#CORE_WHEELS[@]}"; exit 1; }

FIND_LINKS=(--find-links ./lfx-dist --find-links ./base-dist)
if [ ${#SDK_WHEELS[@]} -eq 1 ]; then
FIND_LINKS+=(--find-links ./sdk-dist)
FIND_LINKS=()
for directory in sdk-dist lfx-dist base-dist core-dist; do
if [ -d "$directory" ]; then
FIND_LINKS+=(--find-links "./$directory")
fi
done
if [ ${#CORE_WHEELS[@]} -eq 1 ]; then
INSTALL_ROOTS=("${CORE_WHEELS[0]}")
echo "EXPECT_LANGFLOW_CORE=true" >> "$GITHUB_ENV"
elif [ ${#BASE_WHEELS[@]} -eq 1 ]; then
INSTALL_ROOTS=("${BASE_WHEELS[0]}")
echo "EXPECT_LANGFLOW_CORE=false" >> "$GITHUB_ENV"
else
echo "A base or langflow-core wheel is required for the core runtime test."
exit 1
fi

uv venv core-test-env --seed --python 3.14
uv pip install --python core-test-env/bin/python \
--prerelease=if-necessary-or-explicit \
"${FIND_LINKS[@]}" "${SDK_WHEELS[@]}" "${LFX_WHEELS[@]}" "${BASE_WHEELS[0]}"
"${FIND_LINKS[@]}" "${SDK_WHEELS[@]}" "${LFX_WHEELS[@]}" "${INSTALL_ROOTS[@]}"
uv pip check --python core-test-env/bin/python

- name: Verify core boundary and indexed imports
shell: bash
run: |
core-test-env/bin/python - <<'PY'
import importlib
import os
import re
from importlib.metadata import distributions, entry_points

Expand All @@ -961,6 +1007,10 @@ jobs:
installed = {normalize(dist.metadata["Name"]) for dist in distributions() if dist.metadata["Name"]}
assert {"langflow-base", "langflow-sdk", "lfx"} <= installed, installed
assert "langflow" not in installed, installed
if os.environ["EXPECT_LANGFLOW_CORE"] == "true":
assert "langflow-core" in installed, installed
else:
assert "langflow-core" not in installed, installed
extensions = sorted(name for name in installed if name.startswith("lfx-"))
assert not extensions, f"Extension distributions installed: {extensions}"
for group in ("lfx.bundles", "langflow.extensions", "langflow.plugins"):
Expand Down Expand Up @@ -989,7 +1039,12 @@ jobs:
export DO_NOT_TRACK=true
LOG_FILE="$RUNTIME_DIR/server.log"

core-test-env/bin/langflow-base run \
if [ "$EXPECT_LANGFLOW_CORE" = "true" ]; then
LANGFLOW_CLI=core-test-env/bin/langflow
else
LANGFLOW_CLI=core-test-env/bin/langflow-base
fi
"$LANGFLOW_CLI" run \
--host 127.0.0.1 --port 7861 --backend-only --workers 1 >"$LOG_FILE" 2>&1 &
SERVER_PID=$!
cleanup() {
Expand Down Expand Up @@ -1037,11 +1092,21 @@ jobs:
echo "Experimental platforms result: $experimental_result"
echo "Core runtime result: $core_result"

if [ "$stable_result" = "skipped" ] && [ "$core_result" = "skipped" ]; then
echo "✅ No Langflow application distribution was selected; package build tests passed"
exit 0
fi

if [ "${{ inputs.langflow-version }}" = "" ] && [ "$core_result" != "success" ]; then
Comment thread
erichare marked this conversation as resolved.
Outdated
echo "❌ Core runtime wheel test failed: $core_result"
exit 1
fi

if [ "$stable_result" = "skipped" ] && [ "$core_result" = "success" ]; then
echo "✅ Core-only wheel installation tests passed"
exit 0
fi

# Stable platforms must succeed, experimental can fail
if [ "$stable_result" = "success" ]; then
if [ "$experimental_result" = "success" ]; then
Expand Down
Loading
Loading