-
Notifications
You must be signed in to change notification settings - Fork 9.2k
feat(bundles): create lfx-bundles metapackage skeleton #13564
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
erichare
merged 8 commits into
bundles/foundation-discovery
from
bundles/create-lfx-bundles
Jun 11, 2026
Merged
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
6e77c8f
feat(bundles): add lfx-bundles metapackage skeleton
erichare a7281f1
Merge branch 'bundles/foundation-discovery' into bundles/create-lfx-b…
erichare b3e245c
fix(ci): nightly bundle rename follows [extras] refs and self-refs
erichare 61a0d94
Merge branch 'bundles/foundation-discovery' into bundles/create-lfx-b…
erichare 0b198ab
Merge branch 'bundles/foundation-discovery' into bundles/create-lfx-b…
erichare b1cb7d0
Merge branch 'bundles/foundation-discovery' into bundles/create-lfx-b…
erichare d32a878
Merge branch 'bundles/foundation-discovery' into bundles/create-lfx-b…
erichare e887249
fix(bundles): address review — drop orphaned nightly bundle-rename sc…
erichare File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,65 @@ | ||
| # lfx-bundles | ||
|
|
||
| The long tail of Langflow's provider components as a **single manifest-less | ||
| metapackage**, modeled on `langchain-community`. This is the destination for | ||
| every vendor/third-party provider that does not warrant its own standalone | ||
| distribution; the curated partner providers (OpenAI, Anthropic, AWS, | ||
| DataStax, Cohere) ship as separate `lfx-<provider>` packages instead. | ||
|
|
||
| ## How it works | ||
|
|
||
| `lfx-bundles` declares the `lfx.bundles` entry point: | ||
|
|
||
| ```toml | ||
| [project.entry-points."lfx.bundles"] | ||
| lfx_bundles = "lfx_bundles" | ||
| ``` | ||
|
|
||
| At startup, lfx resolves this package and **folder-walks its immediate | ||
| subdirectories**. Each subdirectory is one bundle, registered at the | ||
| `@official` slot under its directory name — no `extension.json`, no per-provider | ||
| manifest. Adding a provider is just adding a folder. | ||
|
|
||
| ``` | ||
| src/lfx_bundles/ | ||
| ├── __init__.py # bare namespace marker | ||
| ├── <provider>/ # one bundle, e.g. tavily/, pinecone/, ... | ||
| │ └── *.py # Component subclasses | ||
| └── ... | ||
| ``` | ||
|
|
||
| A component's identity is its **bundle name** (`ext:<provider>:<Class>@official`), | ||
| which is stable whether the provider ships here or graduates to a standalone | ||
| `lfx-<provider>` package. Because a manifest-shipping package always shadows the | ||
| manifest-less metapackage, a provider can graduate with **no lockstep release**. | ||
|
|
||
| ## Installing | ||
|
|
||
| Available today (`lfx-bundles` is an empty skeleton until the bulk move | ||
| populates it): | ||
|
|
||
| ```bash | ||
| pip install langflow # everything (langflow pins lfx-bundles[all]) | ||
| pip install lfx # engine only, no bundles | ||
| ``` | ||
|
|
||
| Once the long-tail providers move in (and the `lfx[bundles]` extra ships with | ||
| the engine-only `lfx` split), these become available: | ||
|
|
||
| ```bash | ||
| pip install "lfx[bundles]" # engine + this metapackage (deployment footnote) | ||
| pip install "lfx-bundles[<provider>]" # provider code + that provider's SDK deps | ||
| ``` | ||
|
|
||
| `lfx-bundles` itself depends only on `lfx`. Each provider's third-party SDKs are | ||
| **optional extras** (PEP 685-normalized keys, e.g. `lfx-bundles[google-genai]`); | ||
| the generated `all` extra (empty until the first provider tranche lands) pulls | ||
| every provider's deps and is what `langflow` depends on so `pip install langflow` | ||
| is unchanged. | ||
|
|
||
| ## Adding a provider | ||
|
|
||
| Providers are moved here by `scripts/migrate/consolidate_bundles.py`, which also | ||
| maintains the per-provider extras and the generated `all` aggregate. **Do not** | ||
| hand-edit the extras block in `pyproject.toml`. Provider folder names must be | ||
| lowercase snake_case (`a-z`, `0-9`, `_`, 2–64 chars). |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,57 @@ | ||
| [project] | ||
| name = "lfx-bundles" | ||
| version = "1.0.0" | ||
| description = "Langflow's long-tail provider bundles as a single manifest-less metapackage (the langchain-community model)." | ||
| readme = "README.md" | ||
| requires-python = ">=3.10,<3.15" | ||
| license = { text = "MIT" } | ||
| authors = [ | ||
| { name = "Langflow", email = "contact@langflow.org" }, | ||
| ] | ||
| keywords = ["langflow", "lfx", "extension", "bundle", "providers"] | ||
|
|
||
| # Runtime: only lfx (the BUNDLE_API surface). Each provider's third-party SDK | ||
| # is an optional extra (see [project.optional-dependencies]); installing | ||
| # lfx-bundles bare gives the provider *code* but defers each provider's SDK to | ||
| # its extra, so a user opts into exactly the providers they need. The | ||
| # generated ``all`` extra pulls every provider's deps and is what ``langflow`` | ||
| # depends on (``lfx-bundles[all]``) so ``pip install langflow`` stays | ||
| # functionally identical to today. | ||
| dependencies = [ | ||
| "lfx>=1.11.0.dev0,<2.0.0", | ||
| ] | ||
|
|
||
| [project.optional-dependencies] | ||
| # Per-provider extras + the ``all`` aggregate are populated by the bulk move | ||
| # (scripts/migrate/consolidate_bundles.py) as the long-tail providers land | ||
| # here. Extra keys are PEP 685-normalized (lowercase, hyphen-separated). | ||
| # ``all`` is GENERATED from the per-provider keys -- never hand-edit it. | ||
| # Empty until the first provider tranche moves in. | ||
| all = [] | ||
|
|
||
| [project.urls] | ||
| Homepage = "https://github.com/langflow-ai/langflow" | ||
| Documentation = "https://docs.langflow.org/extensions" | ||
| Repository = "https://github.com/langflow-ai/langflow" | ||
|
|
||
| # Manifest-less discovery via the ``lfx.bundles`` entry-point group (NOT | ||
| # ``langflow.extensions``). The loader (lfx.extension.loader._bundles_root) | ||
| # resolves this package with find_spec and folder-walks its immediate | ||
| # subdirectories -- each is one bundle at the @official slot, named after the | ||
| # directory. No extension.json; exempt from ``lfx extension validate``. | ||
| [project.entry-points."lfx.bundles"] | ||
| lfx_bundles = "lfx_bundles" | ||
|
|
||
| [build-system] | ||
| requires = ["hatchling"] | ||
| build-backend = "hatchling.build" | ||
|
|
||
| [tool.hatch.build.targets.wheel] | ||
| packages = ["src/lfx_bundles"] | ||
|
|
||
| [tool.hatch.build.targets.sdist] | ||
| include = [ | ||
| "src/lfx_bundles", | ||
| "README.md", | ||
| "pyproject.toml", | ||
| ] | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,16 @@ | ||
| """lfx-bundles: the manifest-less metapackage of Langflow's long-tail providers. | ||
| This package is a bare namespace marker. Each immediate subdirectory is one | ||
| provider bundle, discovered at runtime by lfx's ``lfx.bundles`` entry-point | ||
| folder-walk (``lfx.extension.loader._bundles_root``) and registered at the | ||
| ``@official`` slot under its directory name. There are intentionally no | ||
| re-exports here and no ``extension.json`` -- providers are added as folders, | ||
| the langchain-community way. | ||
| Provider folders are lowercase snake_case (``BUNDLE_NAME_RE``); a component's | ||
| identity is its bundle name (``ext:<provider>:<Class>@official``), stable | ||
| whether the provider ships here or in a graduated ``lfx-<provider>`` package. | ||
| Providers are added by ``scripts/migrate/consolidate_bundles.py``, never by | ||
| hand. | ||
| """ |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The PR body says this declares an
lfx>=1.10.0,<2.0.0pin, but the code has>=1.11.0.dev0, which I think is the right one (it's what sync_bundle_lfx_pin.py generates for lfx 1.11.0). Could you update the body?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Updated the PR body — it now states the actual
lfx>=1.11.0.dev0,<2.0.0pin (the pre-release-safe floorsync_bundle_lfx_pin.pygenerates for the 1.11 line) and also mentions theupdate_bundle_versions.pyremoval from the other thread.