Skip to content

Commit aab4a82

Browse files
authored
Merge branch 'release-1.10.0' into cz/agent-create-agent-1.0
2 parents e2de7d2 + 09bd68d commit aab4a82

36 files changed

Lines changed: 1244 additions & 391 deletions

.github/workflows/nightly_build.yml

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,16 +163,20 @@ jobs:
163163
uv run --no-sync ./scripts/ci/update_sdk_version.py $SDK_TAG
164164
echo "Updating LFX project version to $LFX_TAG"
165165
uv run --no-sync ./scripts/ci/update_lfx_version.py $LFX_TAG $SDK_TAG
166-
echo "Renaming bundle packages to their -nightly counterparts (lfx dev suffix: $LFX_TAG)"
167-
uv run --no-sync ./scripts/ci/update_bundle_versions.py $LFX_TAG
168166
echo "Updating base project version to $BASE_TAG and updating main project version to $RELEASE_TAG"
169167
uv run --no-sync ./scripts/ci/update_pyproject_combined.py main $RELEASE_TAG $BASE_TAG $LFX_TAG
170168
171169
uv lock
172170
cd src/backend/base && uv lock && cd ../../..
173171
cd src/lfx && uv lock && cd ../..
174172
175-
git add pyproject.toml src/backend/base/pyproject.toml src/lfx/pyproject.toml src/sdk/pyproject.toml src/bundles/*/pyproject.toml uv.lock src/backend/base/uv.lock
173+
git add pyproject.toml src/backend/base/pyproject.toml src/lfx/pyproject.toml src/sdk/pyproject.toml uv.lock src/backend/base/uv.lock
174+
# update_lfx_version.py re-pins each bundle's `lfx` dep to
175+
# lfx-nightly==<dev>, so any modified bundle pyprojects need to
176+
# ride the same commit/tag as the rest of the version bumps.
177+
if compgen -G "src/bundles/*/pyproject.toml" > /dev/null; then
178+
git add src/bundles/*/pyproject.toml
179+
fi
176180
git commit -m "Update version and project name"
177181
178182
echo "Tagging main with $RELEASE_TAG"
Lines changed: 223 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,223 @@
1+
name: Release Bundles
2+
3+
# Manually-triggered workflow for publishing stable `lfx-<name>` bundle wheels
4+
# from src/bundles/* to PyPI. Bundles change infrequently, so we release them
5+
# on demand rather than on a schedule. Re-running the workflow without a
6+
# version bump is a no-op (PyPI rejects the duplicate upload and we tolerate
7+
# the conflict).
8+
9+
on:
10+
workflow_dispatch:
11+
inputs:
12+
release_tag:
13+
description: "Git ref to build from (branch, tag, or SHA). Defaults to the workflow's checked-out ref."
14+
required: false
15+
type: string
16+
default: ""
17+
dry_run:
18+
description: "Build and test only; skip the PyPI publish step."
19+
required: false
20+
type: boolean
21+
default: false
22+
23+
env:
24+
PYTHON_VERSION: "3.13"
25+
26+
jobs:
27+
build-bundles:
28+
name: Build Langflow Bundles
29+
runs-on: ubuntu-latest
30+
defaults:
31+
run:
32+
shell: bash
33+
outputs:
34+
bundles-found: ${{ steps.build.outputs.bundles-found }}
35+
steps:
36+
- name: Checkout code
37+
uses: actions/checkout@v6
38+
with:
39+
ref: ${{ inputs.release_tag || github.ref }}
40+
- name: Setup Environment
41+
uses: astral-sh/setup-uv@v6
42+
with:
43+
enable-cache: true
44+
cache-dependency-glob: "uv.lock"
45+
python-version: ${{ env.PYTHON_VERSION }}
46+
prune-cache: false
47+
- name: Install the project
48+
run: uv sync
49+
- name: Build bundle wheels
50+
id: build
51+
run: |
52+
shopt -s nullglob
53+
bundles=(src/bundles/*/pyproject.toml)
54+
if [ ${#bundles[@]} -eq 0 ]; then
55+
echo "No bundles found under src/bundles/*/"
56+
echo "bundles-found=0" >> $GITHUB_OUTPUT
57+
exit 0
58+
fi
59+
mkdir -p bundles-dist
60+
BUNDLES_DIST="$PWD/bundles-dist"
61+
for bundle_pyproject in "${bundles[@]}"; do
62+
bundle_dir=$(dirname "$bundle_pyproject")
63+
echo "Building wheel for $bundle_dir"
64+
(cd "$bundle_dir" && uv build --wheel --out-dir "$BUNDLES_DIST")
65+
done
66+
echo "bundles-found=1" >> $GITHUB_OUTPUT
67+
ls -la bundles-dist/
68+
# Bundles pin lfx (e.g. lfx>=0.5.0,<0.6.0). The smoke test below
69+
# installs the bundles in a fresh venv, so it needs an lfx wheel that
70+
# satisfies the pin available locally — PyPI may not yet have a
71+
# matching lfx published when bundles are released ahead of a main
72+
# release. We build the lfx wheel from the current ref so the smoke
73+
# test resolves against it; this artifact is not published.
74+
- name: Build lfx wheel for smoke test
75+
if: steps.build.outputs.bundles-found == '1'
76+
run: |
77+
mkdir -p lfx-dist
78+
LFX_DIST="$PWD/lfx-dist"
79+
(cd src/lfx && uv build --wheel --out-dir "$LFX_DIST")
80+
ls -la lfx-dist/
81+
- name: Upload bundles artifact
82+
if: steps.build.outputs.bundles-found == '1'
83+
uses: actions/upload-artifact@v6
84+
with:
85+
name: dist-bundles
86+
path: bundles-dist
87+
- name: Upload lfx artifact (smoke-test only; not published)
88+
if: steps.build.outputs.bundles-found == '1'
89+
uses: actions/upload-artifact@v6
90+
with:
91+
name: dist-lfx-smoketest
92+
path: lfx-dist
93+
94+
test-install:
95+
name: Install Smoke Test - ${{ matrix.os }} ${{ matrix.python-version }}
96+
needs: [build-bundles]
97+
if: needs.build-bundles.outputs.bundles-found == '1'
98+
runs-on: ${{ matrix.runner }}
99+
strategy:
100+
fail-fast: false
101+
matrix:
102+
include:
103+
- os: linux
104+
runner: ubuntu-latest
105+
python-version: "3.10"
106+
- os: linux
107+
runner: ubuntu-latest
108+
python-version: "3.12"
109+
- os: macos
110+
runner: macos-latest
111+
python-version: "3.12"
112+
- os: windows
113+
runner: windows-latest
114+
python-version: "3.12"
115+
steps:
116+
- name: Setup Python
117+
uses: actions/setup-python@v6
118+
with:
119+
python-version: ${{ matrix.python-version }}
120+
- name: Setup UV
121+
uses: astral-sh/setup-uv@v6
122+
with:
123+
enable-cache: false
124+
ignore-empty-workdir: true
125+
- name: Download bundles artifact
126+
uses: actions/download-artifact@v7
127+
with:
128+
name: dist-bundles
129+
path: ./bundles-dist
130+
- name: Download lfx artifact
131+
uses: actions/download-artifact@v7
132+
with:
133+
name: dist-lfx-smoketest
134+
path: ./lfx-dist
135+
- name: Create fresh virtual environment
136+
run: uv venv test-env --seed
137+
shell: bash
138+
- name: Install lfx + bundle wheels (Unix)
139+
if: matrix.os != 'windows'
140+
run: |
141+
shopt -s nullglob
142+
BUNDLE_WHEELS=(./bundles-dist/*.whl)
143+
LFX_WHEELS=(./lfx-dist/*.whl)
144+
if [ ${#BUNDLE_WHEELS[@]} -eq 0 ]; then
145+
echo "No bundle wheels found in ./bundles-dist/"
146+
exit 1
147+
fi
148+
if [ ${#LFX_WHEELS[@]} -eq 0 ]; then
149+
echo "No lfx wheel found in ./lfx-dist/"
150+
exit 1
151+
fi
152+
printf 'Installing: %s\n' "${LFX_WHEELS[@]}" "${BUNDLE_WHEELS[@]}"
153+
uv pip install --prerelease=allow --python ./test-env/bin/python "${LFX_WHEELS[@]}" "${BUNDLE_WHEELS[@]}"
154+
shell: bash
155+
- name: Install lfx + bundle wheels (Windows)
156+
if: matrix.os == 'windows'
157+
run: |
158+
shopt -s nullglob
159+
BUNDLE_WHEELS=(./bundles-dist/*.whl)
160+
LFX_WHEELS=(./lfx-dist/*.whl)
161+
if [ ${#BUNDLE_WHEELS[@]} -eq 0 ]; then
162+
echo "No bundle wheels found in ./bundles-dist/"
163+
exit 1
164+
fi
165+
if [ ${#LFX_WHEELS[@]} -eq 0 ]; then
166+
echo "No lfx wheel found in ./lfx-dist/"
167+
exit 1
168+
fi
169+
printf 'Installing: %s\n' "${LFX_WHEELS[@]}" "${BUNDLE_WHEELS[@]}"
170+
uv pip install --prerelease=allow --python ./test-env/Scripts/python.exe "${LFX_WHEELS[@]}" "${BUNDLE_WHEELS[@]}"
171+
shell: bash
172+
173+
publish-bundles:
174+
name: Publish Bundles to PyPI
175+
needs: [build-bundles, test-install]
176+
if: |
177+
always() &&
178+
!cancelled() &&
179+
!inputs.dry_run &&
180+
needs.build-bundles.result == 'success' &&
181+
needs.build-bundles.outputs.bundles-found == '1' &&
182+
needs.test-install.result == 'success'
183+
runs-on: ubuntu-latest
184+
steps:
185+
- name: Download bundles artifact
186+
uses: actions/download-artifact@v7
187+
with:
188+
name: dist-bundles
189+
path: bundles-dist
190+
- name: Setup Environment
191+
uses: astral-sh/setup-uv@v6
192+
with:
193+
enable-cache: false
194+
python-version: ${{ env.PYTHON_VERSION }}
195+
- name: Publish bundles to PyPI
196+
env:
197+
UV_PUBLISH_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
198+
run: |
199+
shopt -s nullglob
200+
wheels=(bundles-dist/*.whl)
201+
if [ ${#wheels[@]} -eq 0 ]; then
202+
echo "No bundle wheels to publish."
203+
exit 0
204+
fi
205+
failed=0
206+
for wheel in "${wheels[@]}"; do
207+
echo "Publishing $wheel"
208+
# Capture stderr so we can tolerate "already exists" without failing
209+
# the whole run — re-running this workflow without bumping a bundle
210+
# version should be a no-op for that bundle.
211+
if ! err=$(uv publish "$wheel" 2>&1); then
212+
echo "$err"
213+
if echo "$err" | grep -qiE 'already exists|file already exists|HTTP 400|duplicate'; then
214+
echo "Skipping $wheel: already published."
215+
else
216+
echo "Publish failed for $wheel"
217+
failed=1
218+
fi
219+
fi
220+
done
221+
if [ "$failed" = "1" ]; then
222+
exit 1
223+
fi

.github/workflows/release_nightly.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,7 @@ jobs:
437437
publish-nightly-main:
438438
name: Publish Langflow Main Nightly to PyPI
439439
needs: [build-nightly-main, test-cross-platform, publish-nightly-base]
440+
if: ${{ always() && needs.build-nightly-main.result == 'success' && needs.test-cross-platform.result == 'success' && needs.publish-nightly-base.result == 'success' }}
440441
runs-on: ubuntu-latest
441442
steps:
442443
- name: Checkout code

.secrets.baseline

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@
187187
"filename": ".github/workflows/nightly_build.yml",
188188
"hashed_secret": "3e26d6750975d678acb8fa35a0f69237881576b0",
189189
"is_verified": false,
190-
"line_number": 299,
190+
"line_number": 303,
191191
"is_secret": false
192192
}
193193
],
@@ -207,7 +207,7 @@
207207
"filename": ".github/workflows/release_nightly.yml",
208208
"hashed_secret": "3e26d6750975d678acb8fa35a0f69237881576b0",
209209
"is_verified": false,
210-
"line_number": 473,
210+
"line_number": 474,
211211
"is_secret": false
212212
}
213213
],
@@ -3462,7 +3462,7 @@
34623462
"filename": "src/backend/tests/unit/base/models/test_model_utils.py",
34633463
"hashed_secret": "c053ecf9ed41df0311b9df13cc6c3b6078d2d3c2",
34643464
"is_verified": false,
3465-
"line_number": 96
3465+
"line_number": 97
34663466
}
34673467
],
34683468
"src/backend/tests/unit/components/bundles/agentics/test_llm_factory.py": [
@@ -9031,5 +9031,5 @@
90319031
}
90329032
]
90339033
},
9034-
"generated_at": "2026-05-19T01:55:40Z"
9034+
"generated_at": "2026-05-19T17:11:47Z"
90359035
}

docs/docs/Components/directory.mdx

Lines changed: 0 additions & 32 deletions
This file was deleted.

0 commit comments

Comments
 (0)