Skip to content

Commit 3926a63

Browse files
authored
Merge branch 'feat/le-1953-approved-provider-policy' into feat/le-1955-provider-runtime-policy
2 parents 7197067 + de4393b commit 3926a63

307 files changed

Lines changed: 15724 additions & 9369 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/changes-filter.yaml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ python:
33
- "src/backend/**"
44
- "src/backend/**.py"
55
- "src/lfx/**"
6-
- "src/langflow-core/**"
76
- "pyproject.toml"
87
- "uv.lock"
98
- "src/backend/base/pyproject.toml"
@@ -35,7 +34,6 @@ docker:
3534
- "src/backend/**"
3635
- "src/frontend/**"
3736
- "src/lfx/**"
38-
- "src/langflow-core/**"
3937
- ".dockerignore"
4038
- ".github/workflows/docker-build-v2.yml"
4139
- ".github/workflows/docker_test.yml"

.github/workflows/cross-platform-test.yml

Lines changed: 50 additions & 154 deletions
Large diffs are not rendered by default.

.github/workflows/db-migration-validation.yml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ jobs:
169169
# `python -m langflow` could keep running the stable version and no real nightly migration
170170
# is exercised (false-positive test).
171171
echo "Removing stable langflow to force a clean install of the nightly dev version..."
172-
uv pip uninstall -y langflow langflow-core langflow-base || true
172+
uv pip uninstall -y langflow langflow-base || true
173173
174174
# Extract version from Docker tag (format: langflowai/langflow:v1.10.0.dev20260522)
175175
if [[ "$NIGHTLY_TAG" == *":"* ]]; then
@@ -182,24 +182,24 @@ jobs:
182182
183183
# Scope pre-release resolution to the langflow stack only. uv accepts a
184184
# pre-release for a package when its own requirement carries a pre-release
185-
# marker, but NOT via transitive pins (langflow -> langflow-core ->
186-
# langflow-base -> lfx -> langflow-sdk are exact ==devN pins on nightlies), so each lockstep package
185+
# marker, but NOT via transitive pins (langflow -> langflow-base ->
186+
# lfx -> langflow-sdk are exact ==devN pins on nightlies), so each lockstep package
187187
# must be requested directly. A global --prerelease=allow is NOT safe here:
188188
# it lets unrelated dependencies resolve to alphas (pydantic 2.14.0a1 broke
189189
# langchain-core imports on the first canonical-prerelease nightly).
190190
# langflow-sdk has its own version line, so an explicit .dev0 floor marks it
191191
# pre-release-eligible while the lfx pin selects the exact version.
192192
if [[ "$VERSION" == "latest" ]]; then
193193
# Install latest nightly (canonical pre-release) from PyPI
194-
uv pip install --upgrade 'langflow[postgresql]>=0.0.0.dev0' 'langflow-core>=0.0.0.dev0' 'langflow-base>=0.0.0.dev0' 'lfx>=0.0.0.dev0' 'langflow-sdk>=0.0.0.dev0'
194+
uv pip install --upgrade 'langflow[postgresql]>=0.0.0.dev0' 'langflow-base>=0.0.0.dev0' 'lfx>=0.0.0.dev0' 'langflow-sdk>=0.0.0.dev0'
195195
else
196196
# Install specific version
197-
uv pip install --upgrade "langflow[postgresql]==$VERSION" "langflow-core==$VERSION" "langflow-base==$VERSION" "lfx==$VERSION" 'langflow-sdk>=0.0.0.dev0'
197+
uv pip install --upgrade "langflow[postgresql]==$VERSION" "langflow-base==$VERSION" "lfx==$VERSION" 'langflow-sdk>=0.0.0.dev0'
198198
fi
199199
else
200200
# Direct version string (strip 'v' prefix if present)
201201
VERSION="${NIGHTLY_TAG#v}"
202-
uv pip install --upgrade "langflow[postgresql]==$VERSION" "langflow-core==$VERSION" "langflow-base==$VERSION" "lfx==$VERSION" 'langflow-sdk>=0.0.0.dev0'
202+
uv pip install --upgrade "langflow[postgresql]==$VERSION" "langflow-base==$VERSION" "lfx==$VERSION" 'langflow-sdk>=0.0.0.dev0'
203203
fi
204204
205205
# Verify upgrade

.github/workflows/docker-build-v2.yml

Lines changed: 18 additions & 169 deletions
Large diffs are not rendered by default.

.github/workflows/docker-build.yml

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ on:
2424
type: string
2525
description: "Ref to check out. If not specified, will default to the main version or current branch."
2626
warning_check:
27-
required: true
27+
required: false
2828
type: boolean
2929
description: "Warning - use docker-build-v2 unless you have a very valid reason for using this deprecated workflow. By setting to True, you acknowledge all risks of using a possibly breaking workflow."
3030
default: false
@@ -160,6 +160,7 @@ jobs:
160160
docker_tags: ${{ steps.set-vars.outputs.docker_tags }}
161161
ghcr_tags: ${{ steps.set-vars.outputs.ghcr_tags }}
162162
file: ${{ steps.set-vars.outputs.file }}
163+
target: ${{ steps.set-vars.outputs.target }}
163164
steps:
164165
- name: Set Dockerfile and Tags
165166
id: set-vars
@@ -173,13 +174,15 @@ jobs:
173174
# LANGFLOW-BASE RELEASE
174175
echo "docker_tags=langflowai/langflow${nightly_suffix}:base-${{ needs.get-version.outputs.version }},langflowai/langflow${nightly_suffix}:base-latest" >> $GITHUB_OUTPUT
175176
echo "ghcr_tags=ghcr.io/langflow-ai/langflow${nightly_suffix}:base-${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow${nightly_suffix}:base-latest" >> $GITHUB_OUTPUT
176-
echo "file=./docker/build_and_push_base.Dockerfile" >> $GITHUB_OUTPUT
177+
echo "file=./docker/build_and_push.Dockerfile" >> $GITHUB_OUTPUT
178+
echo "target=base" >> $GITHUB_OUTPUT
177179
else
178180
if [[ "${{ inputs.pre_release }}" == "true" ]]; then
179181
# LANGFLOW-MAIN PRE-RELEASE
180182
echo "docker_tags=langflowai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }}" >> $GITHUB_OUTPUT
181183
echo "ghcr_tags=ghcr.io/langflow-ai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }}" >> $GITHUB_OUTPUT
182184
echo "file=./docker/build_and_push.Dockerfile" >> $GITHUB_OUTPUT
185+
echo "target=full" >> $GITHUB_OUTPUT
183186
elif [[ "${{ inputs.release_type }}" == "main-ep" ]]; then
184187
# LANGFLOW-MAIN (ENTRYPOINT) RELEASE
185188
echo "docker_tags=langflowai/langflow-ep${nightly_suffix}:${{ needs.get-version.outputs.version }},langflowai/langflow-ep${nightly_suffix}:latest" >> $GITHUB_OUTPUT
@@ -190,11 +193,13 @@ jobs:
190193
echo "docker_tags=langflowai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }},langflowai/langflow${nightly_suffix}:latest" >> $GITHUB_OUTPUT
191194
echo "ghcr_tags=ghcr.io/langflow-ai/langflow${nightly_suffix}:${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow${nightly_suffix}:latest" >> $GITHUB_OUTPUT
192195
echo "file=./docker/build_and_push.Dockerfile" >> $GITHUB_OUTPUT
196+
echo "target=full" >> $GITHUB_OUTPUT
193197
elif [[ "${{ inputs.release_type }}" == "main-all" || "${{ inputs.release_type }}" == "nightly-main-all" ]]; then
194198
# LANGFLOW-MAIN (ALL OPTIONAL DEPS) RELEASE
195199
echo "docker_tags=langflowai/langflow-all${nightly_suffix}:${{ needs.get-version.outputs.version }},langflowai/langflow-all${nightly_suffix}:latest" >> $GITHUB_OUTPUT
196200
echo "ghcr_tags=ghcr.io/langflow-ai/langflow-all${nightly_suffix}:${{ needs.get-version.outputs.version }},ghcr.io/langflow-ai/langflow-all${nightly_suffix}:latest" >> $GITHUB_OUTPUT
197-
echo "file=./docker/build_and_push_with_extras.Dockerfile" >> $GITHUB_OUTPUT
201+
echo "file=./docker/build_and_push.Dockerfile" >> $GITHUB_OUTPUT
202+
echo "target=full-bundles" >> $GITHUB_OUTPUT
198203
else
199204
echo "Invalid release type. Exiting the workflow."
200205
exit 1
@@ -261,6 +266,7 @@ jobs:
261266
context: .
262267
push: true
263268
file: ${{ needs.setup.outputs.file }}
269+
target: ${{ needs.setup.outputs.target }}
264270
tags: ${{ needs.setup.outputs.docker_tags }}
265271
platforms: linux/amd64,linux/arm64
266272
cache-from: type=gha
@@ -281,6 +287,7 @@ jobs:
281287
context: .
282288
push: true
283289
file: ${{ needs.setup.outputs.file }}
290+
target: ${{ needs.setup.outputs.target }}
284291
tags: ${{ needs.setup.outputs.ghcr_tags }}
285292
platforms: linux/amd64,linux/arm64
286293
cache-from: type=gha
@@ -343,14 +350,14 @@ jobs:
343350
network=host
344351
345352
- name: Login to Docker Hub
346-
if: ${{ matrix.component == 'docker-backend' }} || ${{ matrix.component == 'docker-frontend' }}
353+
if: ${{ matrix.component == 'docker-backend' || matrix.component == 'docker-frontend' }}
347354
uses: docker/login-action@v3
348355
with:
349356
username: ${{ secrets.DOCKERHUB_USERNAME }}
350357
password: ${{ secrets.DOCKERHUB_TOKEN }}
351358

352359
- name: Login to Github Container Registry
353-
if: ${{ matrix.component == 'ghcr-backend' }} || ${{ matrix.component == 'ghcr-frontend' }}
360+
if: ${{ matrix.component == 'ghcr-backend' || matrix.component == 'ghcr-frontend' }}
354361
uses: docker/login-action@v3
355362
with:
356363
registry: ghcr.io

.github/workflows/docker-nightly-build.yml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,8 @@ jobs:
122122
context: .
123123
push: ${{ inputs.push_to_registry }}
124124
pull: true
125-
file: ./docker/build_and_push_base.Dockerfile
125+
file: ./docker/build_and_push.Dockerfile
126+
target: base
126127
tags: ${{ steps.tags.outputs.docker_tags }}
127128
platforms: linux/${{ matrix.arch }}
128129
provenance: false
@@ -135,7 +136,8 @@ jobs:
135136
context: .
136137
push: ${{ inputs.push_to_registry }}
137138
pull: true
138-
file: ./docker/build_and_push_base.Dockerfile
139+
file: ./docker/build_and_push.Dockerfile
140+
target: base
139141
tags: ${{ steps.tags.outputs.ghcr_tags }}
140142
platforms: linux/${{ matrix.arch }}
141143
provenance: false
@@ -218,6 +220,7 @@ jobs:
218220
push: ${{ inputs.push_to_registry }}
219221
pull: true
220222
file: ./docker/build_and_push.Dockerfile
223+
target: full
221224
tags: ${{ steps.tags.outputs.docker_tags }}
222225
platforms: linux/${{ matrix.arch }}
223226
provenance: false
@@ -231,6 +234,7 @@ jobs:
231234
push: ${{ inputs.push_to_registry }}
232235
pull: true
233236
file: ./docker/build_and_push.Dockerfile
237+
target: full
234238
tags: ${{ steps.tags.outputs.ghcr_tags }}
235239
platforms: linux/${{ matrix.arch }}
236240
provenance: false
@@ -312,7 +316,8 @@ jobs:
312316
context: .
313317
push: ${{ inputs.push_to_registry }}
314318
pull: true
315-
file: ./docker/build_and_push_with_extras.Dockerfile
319+
file: ./docker/build_and_push.Dockerfile
320+
target: full-bundles
316321
tags: ${{ steps.tags.outputs.docker_tags }}
317322
platforms: linux/${{ matrix.arch }}
318323
provenance: false
@@ -325,7 +330,8 @@ jobs:
325330
context: .
326331
push: ${{ inputs.push_to_registry }}
327332
pull: true
328-
file: ./docker/build_and_push_with_extras.Dockerfile
333+
file: ./docker/build_and_push.Dockerfile
334+
target: full-bundles
329335
tags: ${{ steps.tags.outputs.ghcr_tags }}
330336
platforms: linux/${{ matrix.arch }}
331337
provenance: false

.github/workflows/docker_test.yml

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -82,45 +82,48 @@ jobs:
8282
echo "=== Disk usage after cleanup ==="
8383
df -h /
8484
85-
- name: Build core image
85+
- name: Build base image
8686
run: |
87-
${{ env.CONTAINER_RUNTIME }} build -t langflowai/langflow:core-latest-dev \
87+
${{ env.CONTAINER_RUNTIME }} build -t langflowai/langflow:base-latest-dev \
8888
-f docker/build_and_push.Dockerfile \
89-
--target core \
89+
--target base \
9090
.
9191
92-
- name: Test core image
92+
- name: Test base image
9393
run: |
94-
expected_version=$(grep '^version = ' src/langflow-core/pyproject.toml | head -n 1 | cut -d '"' -f 2)
95-
version=$(${{ env.CONTAINER_RUNTIME }} run --rm --entrypoint python langflowai/langflow:core-latest-dev -c 'from importlib.metadata import version; print(version("langflow-core"))')
94+
expected_version=$(grep '^version = ' src/backend/base/pyproject.toml | head -n 1 | cut -d '"' -f 2)
95+
version=$(${{ env.CONTAINER_RUNTIME }} run --rm --entrypoint python langflowai/langflow:base-latest-dev -c 'from importlib.metadata import version; print(version("langflow-base"))')
9696
if [ "$expected_version" != "$version" ]; then
97-
echo "Expected core version: $expected_version"
98-
echo "Actual core version: $version"
97+
echo "Expected base version: $expected_version"
98+
echo "Actual base version: $version"
9999
exit 1
100100
fi
101101
102-
${{ env.CONTAINER_RUNTIME }} run --rm --entrypoint python langflowai/langflow:core-latest-dev -c '
102+
${{ env.CONTAINER_RUNTIME }} run --rm --entrypoint python langflowai/langflow:base-latest-dev -c '
103103
import importlib.metadata as metadata
104104
names = {dist.metadata["Name"].lower() for dist in metadata.distributions()}
105-
required = {"langflow-core", "langflow-base", "lfx", "langflow-sdk"}
105+
required = {"langflow-base", "lfx", "langflow-sdk"}
106106
missing = sorted(required - names)
107-
forbidden = sorted(name for name in names if name.startswith("lfx-"))
108-
assert not missing, f"missing core distributions: {missing}"
107+
forbidden = sorted(
108+
name for name in names
109+
if name.startswith("lfx-") or name in {"langflow-core", "torch", "torchvision"}
110+
)
111+
assert not missing, f"missing base distributions: {missing}"
109112
assert not forbidden, f"extension distributions installed: {forbidden}"
110113
'
111114
112-
${{ env.CONTAINER_RUNTIME }} run --rm --entrypoint bash langflowai/langflow:core-latest-dev -c '
115+
${{ env.CONTAINER_RUNTIME }} run --rm --entrypoint bash langflowai/langflow:base-latest-dev -c '
113116
command -v langflow >/dev/null
114-
command -v langflow-core >/dev/null
117+
! command -v langflow-base >/dev/null
115118
'
116119
117120
container_id=$(${{ env.CONTAINER_RUNTIME }} run -d \
118-
-e LANGFLOW_SUPERUSER_PASSWORD=CoreImageTest-2026! \
119-
langflowai/langflow:core-latest-dev)
120-
cleanup_core_container() {
121+
-e LANGFLOW_SUPERUSER_PASSWORD=BaseImageTest-2026! \
122+
langflowai/langflow:base-latest-dev)
123+
cleanup_base_container() {
121124
${{ env.CONTAINER_RUNTIME }} rm -f "$container_id" >/dev/null 2>&1 || true
122125
}
123-
trap cleanup_core_container EXIT
126+
trap cleanup_base_container EXIT
124127
125128
healthy=false
126129
for _ in $(seq 1 60); do
@@ -135,15 +138,15 @@ jobs:
135138
done
136139
137140
if [ "$healthy" != "true" ]; then
138-
echo "Core image did not become healthy"
141+
echo "Base image did not become healthy"
139142
${{ env.CONTAINER_RUNTIME }} logs "$container_id" || true
140143
exit 1
141144
fi
142145
143-
cleanup_core_container
146+
cleanup_base_container
144147
trap - EXIT
145148
146-
- name: Cleanup after core image
149+
- name: Cleanup after base image
147150
if: always()
148151
run: |
149152
echo "=== Disk usage before cleanup ==="
@@ -152,8 +155,8 @@ jobs:
152155
if [ -n "$container_id" ]; then
153156
${{ env.CONTAINER_RUNTIME }} rm -f "$container_id" 2>/dev/null || true
154157
fi
155-
done < <(${{ env.CONTAINER_RUNTIME }} ps -aq --filter ancestor=langflowai/langflow:core-latest-dev)
156-
${{ env.CONTAINER_RUNTIME }} rmi langflowai/langflow:core-latest-dev || true
158+
done < <(${{ env.CONTAINER_RUNTIME }} ps -aq --filter ancestor=langflowai/langflow:base-latest-dev)
159+
${{ env.CONTAINER_RUNTIME }} rmi langflowai/langflow:base-latest-dev || true
157160
${{ env.CONTAINER_RUNTIME }} system prune -af || true
158161
if command -v docker &> /dev/null; then
159162
docker buildx prune -af || true

.github/workflows/nightly_build.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,11 +107,11 @@ jobs:
107107
run: |
108108
echo "PWD: $(pwd)"
109109
find . -name "pypi_nightly_tag.py"
110-
- name: Generate shared nightly tag (main == core == base, lockstep)
110+
- name: Generate shared nightly tag (main == base, lockstep)
111111
id: generate_shared_tag
112112
run: |
113-
# langflow -> langflow-core -> langflow-base uses exact nightly dev pins,
114-
# so all three versions MUST be identical. Compute from one PyPI snapshot.
113+
# langflow -> langflow-base uses an exact nightly dev pin, so both
114+
# versions MUST be identical. Compute from one PyPI snapshot.
115115
# NOTE: This outputs the tag with the `v` prefix.
116116
TAGS_OUTPUT="$(uv run ./scripts/ci/pypi_nightly_tag.py both)"
117117
RELEASE_TAG="$(printf '%s\n' "$TAGS_OUTPUT" | sed -n '1p')"
@@ -164,13 +164,13 @@ jobs:
164164
uv run --no-sync ./scripts/ci/update_sdk_version.py $SDK_TAG
165165
echo "Updating LFX project version to $LFX_TAG"
166166
uv run --no-sync ./scripts/ci/update_lfx_version.py $LFX_TAG $SDK_TAG
167-
echo "Updating base/core/main project versions to the shared nightly tag"
167+
echo "Updating base/main project versions to the shared nightly tag"
168168
uv run --no-sync ./scripts/ci/update_pyproject_combined.py main $RELEASE_TAG $BASE_TAG $LFX_TAG
169169
170170
uv lock
171171
cd src/lfx && uv lock && cd ../..
172172
173-
git add pyproject.toml src/langflow-core/pyproject.toml src/backend/base/pyproject.toml src/lfx/pyproject.toml \
173+
git add pyproject.toml src/backend/base/pyproject.toml src/lfx/pyproject.toml \
174174
src/lfx/src/lfx/_assets/component_index.json src/sdk/pyproject.toml uv.lock
175175
# The nightly keeps canonical package names and the stable `lfx-*` bundles
176176
# are not modified (see src/bundles/NIGHTLY.md), so no bundle pyprojects ride this commit.

.github/workflows/python_test.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -204,27 +204,27 @@ jobs:
204204
cache-dependency-glob: "uv.lock"
205205
python-version: ${{ matrix.python-version }}
206206
prune-cache: false
207-
# This job intentionally exits before invoking uv when langflow-core
207+
# This job intentionally exits before invoking uv when langflow-base
208208
# has not been published yet (including its first release).
209209
ignore-nothing-to-cache: true
210210

211211
- name: Check Version
212212
id: check-version
213-
# The main wheel resolves its direct langflow-core dependency from PyPI.
214-
# Skip until the source core version (stable or canonical nightly) exists.
213+
# The main wheel resolves its direct langflow-base dependency from PyPI.
214+
# Skip until the source base version (stable or canonical nightly) exists.
215215
run: |
216-
version=$(python -c "import pathlib, tomllib; print(tomllib.loads(pathlib.Path('src/langflow-core/pyproject.toml').read_text())['project']['version'])")
217-
url="https://pypi.org/pypi/langflow-core/json"
216+
version=$(python -c "import pathlib, tomllib; print(tomllib.loads(pathlib.Path('src/backend/base/pyproject.toml').read_text())['project']['version'])")
217+
url="https://pypi.org/pypi/langflow-base/json"
218218
219-
status=$(curl -sS -o "$RUNNER_TEMP/langflow-core-pypi.json" -w "%{http_code}" "$url")
219+
status=$(curl -sS -o "$RUNNER_TEMP/langflow-base-pypi.json" -w "%{http_code}" "$url")
220220
if [ "$status" = "404" ]; then
221221
last_released_version=""
222222
elif [ "$status" != "200" ]; then
223-
echo "Failed to fetch langflow-core releases: HTTP $status"
224-
cat "$RUNNER_TEMP/langflow-core-pypi.json"
223+
echo "Failed to fetch langflow-base releases: HTTP $status"
224+
cat "$RUNNER_TEMP/langflow-base-pypi.json"
225225
exit 1
226226
else
227-
last_released_version=$(jq -r '.releases | keys[]' "$RUNNER_TEMP/langflow-core-pypi.json" | sort -V | tail -n 1)
227+
last_released_version=$(jq -r '.releases | keys[]' "$RUNNER_TEMP/langflow-base-pypi.json" | sort -V | tail -n 1)
228228
fi
229229
230230
if [ "$version" != "$last_released_version" ]; then

0 commit comments

Comments
 (0)