Files
langflow/docs/docs/Develop/extensions-overview.mdx
Eric Hare 4a8b47e46a Merge remote-tracking branch 'origin/release-1.10.1' into release-1.11.0
# Conflicts:
#	.secrets.baseline
#	pyproject.toml
#	src/backend/base/langflow/initial_setup/starter_projects/Pokédex Agent.json
#	src/backend/base/langflow/initial_setup/starter_projects/Structured Data Analysis Agent.json
#	src/backend/base/langflow/services/auth/service.py
#	src/backend/base/langflow/services/job_queue/service.py
#	src/backend/base/pyproject.toml
#	src/backend/tests/unit/components/models_and_agents/test_cuga_agent.py
#	src/backend/tests/unit/test_redis_job_queue_service.py
#	src/bundles/lfx-bundles/src/lfx_bundles/deepseek/deepseek.py
#	src/bundles/lfx-bundles/src/lfx_bundles/glean/glean_search_api.py
#	src/bundles/lfx-bundles/src/lfx_bundles/homeassistant/home_assistant_control.py
#	src/bundles/lfx-bundles/src/lfx_bundles/homeassistant/list_home_assistant_states.py
#	src/bundles/lfx-bundles/src/lfx_bundles/huggingface/huggingface_inference_api.py
#	src/bundles/lfx-bundles/src/lfx_bundles/lmstudio/lmstudioembeddings.py
#	src/bundles/lfx-bundles/src/lfx_bundles/xai/xai.py
#	src/frontend/package-lock.json
#	src/frontend/package.json
#	src/lfx/pyproject.toml
#	src/lfx/src/lfx/_assets/component_index.json
#	src/lfx/src/lfx/components/files_and_knowledge/filesystem.py
#	src/lfx/tests/unit/components/tools/test_filesystem_deny_list.py
#	uv.lock
2026-06-23 17:22:13 -07:00

116 lines
6.5 KiB
Plaintext

---
title: Langflow Extensions overview
slug: /extensions-overview
---
import Icon from "@site/src/components/icon";
Langflow ships component bundles that are maintained and released separately from the core Langflow server as Extensions.
Instead of every integration being built into `langflow`, bundles ship as pip-installable packages.
There are two install stories:
* **`uv pip install langflow`** — everything, same as today. The `langflow` metapackage pins the component packages below as regular pip dependencies, so a flat install is functionally identical to earlier releases.
* **`uv pip install lfx`** — the engine only, with no component bundles. Bring your own bundles: install `lfx-bundles`, individual `lfx-<provider>` packages, or your own extensions alongside it.
A component's identity is its **bundle name**, never the package it ships in.
The canonical ID `ext:<bundle>:<Class>@official`, the palette grouping, and saved flows are identical whether a provider ships in the `lfx-bundles` metapackage or in its own standalone package, so providers can move between packages without affecting your flows.
## Current Extension bundles
The following component packages are included with `uv pip install langflow`:
| Package | Contents |
|---------|----------|
| `lfx-bundles` | The long tail of provider bundles (vector stores, model providers, search and tool integrations) as a single package. Each provider is one bundle, for example `tavily`, `qdrant`, or `ollama`. Per-provider pip extras carry the third-party SDKs, and the generated `lfx-bundles[all]` extra pulls all of them. |
| `lfx-openai`, `lfx-anthropic`, `lfx-amazon`, `lfx-datastax`, `lfx-cohere` | Partner providers as standalone packages, each on its own release cadence. |
| `lfx-arxiv` | [arXiv](/bundles-arxiv) search |
| `lfx-docling` | [Docling](/bundles-docling) document parsing and chunking |
| `lfx-duckduckgo` | [DuckDuckGo](/bundles-duckduckgo) web search |
| `lfx-ibm` | [IBM](/bundles-ibm) watsonx.ai LLM and embeddings, IBM Db2 Vector Store |
The internal identifier for each component changes.
For example, a DuckDuckGo component previously referenced as a `DuckDuckGoSearchComponent` class is now `ext:duckduckgo:DuckDuckGoSearchComponent@official`.
Langflow rewrites these references automatically when you open a saved flow, so in most cases the migration is invisible.
## If a component is missing after an upgrade
If you open a flow and a node shows an error like `component-not-found`, it means the automatic migration couldn't resolve the component reference.
This can happen when:
* The bundle the component came from was not installed in the upgraded environment.
* The component was referenced by a name that appears in more than one bundle (`component-name-ambiguous`).
In both cases the error message includes a hint that names the expected canonical ID. For example:
```text
component-not-found-with-hint: DuckDuckGoSearchComponent not found.
Hint: try ext:duckduckgo:DuckDuckGoSearchComponent@official
```
Use the bundle name from the hint, such as `duckduckgo` in this example, to find and install the correct extension package, and then reload the flow.
## Install a bundle extension
If a bundle you need is not included in your Langflow environment, install it with pip:
```bash
uv pip install lfx-duckduckgo
uv run langflow run
```
Langflow discovers the package at server startup and loads the components into the palette automatically.
No additional configuration is required.
To see what extensions are currently loaded, run:
```bash
lfx extension list
```
:::note
`lfx extension list` shows manifest-shipping extensions only.
Manifest-less packages such as `lfx-bundles` are discovered and loaded at server startup but are not listed by this command.
:::
## Legacy import paths and the shim error
Code that imports components by their old in-tree path, such as `from lfx.components.qdrant import QdrantVectorStoreComponent`, keeps working as long as the bundle that now ships the provider is installed — which `pip install langflow` always guarantees.
A small import shim at the old location forwards to the bundle package.
On an engine-only install with no bundles, the same import raises an actionable error that names exactly what to install:
```text
ModuleNotFoundError: The 'qdrant' components moved to the 'lfx-bundles' distribution.
Install it with: pip install lfx-bundles (or 'pip install langflow', which bundles it).
```
If you `pip install lfx` directly and your code depends on components, either switch to `lfx[bundles]` (see [LFX and Langflow version compatibility](/lfx-compatibility)) or pin the specific `lfx-<provider>` packages you use.
The shims are a compatibility bridge and will be removed in a future major milestone; prefer the bundle packages' own import paths for new code.
## Override a bundled component
Want to replace a provider that ships in `lfx-bundles` with your own implementation? **Ship a manifest. A manifest always wins.**
Discovery resolves bundle-name collisions by source precedence: installed manifest-shipping extensions beat seed-directory extensions, which beat manifest-less bundle packages, which beat local development paths.
Package your override as an extension with an `extension.json` that declares the same bundle name, and your copy shadows the bundled one — the server logs a typed `bundle-shadowed` warning naming both sources so the shadowing is visible.
This works the same for first-party and third-party packages, and it is also why a provider can graduate from `lfx-bundles` to its own standalone package with no coordinated release.
## Version compatibility
`bundle_api_version` is the single compatibility number between bundles and the engine.
Manifest-shipping extensions declare the contract versions they support with `lfx.compat: ["1"]`; the engine refuses to load an extension that does not list its current version.
Manifest-less packages such as `lfx-bundles` carry no manifest, so their compatibility is enforced at install time by their `lfx>=X,<Y` dependency pin instead.
There is no version arithmetic across the `lfx`, `lfx-bundles`, and `lfx-<provider>` lines: each package releases on its own cadence, and the pip dependency ranges plus `lfx.compat` do the coordination.
## Build your own extension
If you have custom components that you want to distribute and version independently of your Langflow install, you can package them as an extension.
For more information, see [Build your first Langflow Extension](./extensions-quickstart.mdx).
## See also
- [Build your first extension](./extensions-quickstart)
- [Manifest reference](./extensions-manifest)