diff --git a/deploy/observability/grafana-loki/README.md b/deploy/observability/grafana-loki/README.md
index 74a17c68d240..a985e5e99d99 100644
--- a/deploy/observability/grafana-loki/README.md
+++ b/deploy/observability/grafana-loki/README.md
@@ -2,12 +2,14 @@
Reference stack that ingests Langflow's structured JSON logs into [Loki](https://grafana.com/oss/loki/) and visualizes them with a pre-provisioned Grafana dashboard.
-Use this as a starting point. The compose file, Promtail config, and dashboard JSON are independent of the rest of `deploy/` and can be lifted into any environment.
+Use this as a starting point. The compose file, Alloy config, dashboard JSON, and legacy Promtail configuration are independent of the rest of `deploy/` and can be lifted into any environment.
+
+[Grafana Alloy](https://grafana.com/oss/alloy/) replaced [Promtail](https://grafana.com/docs/alloy/latest/set-up/migrate/from-promtail/), which reached end of life on March 2, 2026.
## What you get
- **Loki 3.2** on `:3100`
-- **Promtail 3.2** scraping a directory of Langflow log files
+- **Alloy 1.18** scraping a directory of Langflow log files
- **Grafana 11.3** on `:3000` with the Loki datasource and the `Langflow Logs` dashboard already provisioned
## Prerequisites on the Langflow side
@@ -22,17 +24,9 @@ LANGFLOW_VERSION=1.10.0
LANGFLOW_ENVIRONMENT=production
```
-Promtail scrapes a directory of `*.log` files, so `LANGFLOW_LOG_FILE` must point at a file inside
-the directory you expose to Promtail as `LANGFLOW_LOG_DIR` (see [Run](#run)). Set both to the same
-directory, otherwise Promtail watches an empty folder and the dashboard stays blank. Use an
-absolute path: `LANGFLOW_LOG_FILE` is resolved against Langflow's working directory, not this one.
+Alloy scrapes a directory of `*.log` files, so `LANGFLOW_LOG_FILE` must point at a file inside the directory you expose to Alloy as `LANGFLOW_LOG_DIR` (see [Run](#run)). Set both to the same directory, otherwise Alloy watches an empty folder and the dashboard stays blank. Use an absolute path: `LANGFLOW_LOG_FILE` is resolved against Langflow's working directory, not this one.
-In JSON mode the file is a single JSON stream: application logs and third-party stdlib loggers
-(`uvicorn`, `sqlalchemy`, `httpx`, `langchain`) are all rendered as JSON and run through PII
-redaction, so the `json` parse stage and the **Stdlib intercept routing** panel work against it
-directly. This stack scrapes a file, so `LANGFLOW_LOG_FILE` is required. If you instead run
-Langflow as a container, you can drop the file and scrape its stdout by swapping Promtail's
-`static_configs` file target for `docker_sd_configs` (same JSON, same labels).
+In JSON mode the file is a single JSON stream: application logs and third-party stdlib loggers (`uvicorn`, `sqlalchemy`, `httpx`, `langchain`) are all rendered as JSON and run through PII redaction, so the `stage.json` parse stage and the **Stdlib intercept routing** panel work against it directly. This stack scrapes a file, so `LANGFLOW_LOG_FILE` is required. If you instead run Langflow as a container, you can drop the file and scrape its stdout by swapping Alloy's `loki.source.file` target for [`loki.source.docker`](https://grafana.com/docs/alloy/latest/reference/components/loki/loki.source.docker/).
See [Logs and observability](../../../docs/docs/Develop/observability-grafana-loki.mdx) for the full list of environment variables (per-logger overrides, extra PII redaction keys, trace correlation, etc.).
@@ -41,7 +35,7 @@ See [Logs and observability](../../../docs/docs/Develop/observability-grafana-lo
From this directory:
```bash
-# Point Promtail at the directory that holds the file you set in
+# Point Alloy at the directory that holds the file you set in
# LANGFLOW_LOG_FILE above. Must be the same directory. Defaults to the
# bundled ./logs (used by the quick smoke test below).
export LANGFLOW_LOG_DIR=/absolute/path/to/langflow/logs
@@ -59,8 +53,7 @@ docker compose down -v
### Quick smoke test (no Langflow required)
-To verify the stack end to end without running Langflow, write a sample record into the bundled
-`./logs` directory and query Loki directly:
+To verify the stack end to end without running Langflow, write a sample record into the bundled `./logs` directory and query Loki directly:
```bash
mkdir -p logs
@@ -68,7 +61,7 @@ echo '{"event":"smoke test","level":"info","logger":"langflow.api.run","timestam
docker compose up -d
-# Give Promtail a few seconds to tail the file, then confirm the line reached Loki:
+# Give Alloy a few seconds to tail the file, then confirm the line reached Loki:
sleep 5
curl -sG 'http://localhost:3100/loki/api/v1/query_range' --data-urlencode 'query={job="langflow"}' | grep -q "smoke test" && echo "OK: log reached Loki"
```
@@ -87,6 +80,6 @@ curl -sG 'http://localhost:3100/loki/api/v1/query_range' --data-urlencode 'query
## Notes
-- Promtail only promotes `level`, `service`, `environment`, `version`, `logger` to labels. High-cardinality fields (`user_id`, `flow_id`, `trace_id`) stay in the log body — query them with `| json` in LogQL.
-- Replace Promtail with [Grafana Alloy](https://grafana.com/oss/alloy/) if you already standardize on it; the JSON parse stage maps 1:1.
+- Alloy only promotes `level`, `service`, `environment`, `version`, `logger` to labels. High-cardinality fields (`user_id`, `flow_id`, `trace_id`) stay in the log body — query them with `| json` in LogQL.
+- A legacy Promtail config remains at [`promtail/config.yml`](./promtail/config.yml) for reference. Promtail reached end of life on March 2, 2026 and is not started by compose. Grafana documents a [Promtail-to-Alloy conversion](https://grafana.com/docs/alloy/latest/set-up/migrate/from-promtail/).
- If your runtime ships logs through a different transport (Fluent Bit, Vector, OTLP), only the scrape side changes — the dashboard and label schema stay the same.
diff --git a/deploy/observability/grafana-loki/alloy/config.alloy b/deploy/observability/grafana-loki/alloy/config.alloy
new file mode 100644
index 000000000000..c9c1e4e7c2b6
--- /dev/null
+++ b/deploy/observability/grafana-loki/alloy/config.alloy
@@ -0,0 +1,48 @@
+logging {
+ level = "info"
+ format = "logfmt"
+}
+
+local.file_match "langflow" {
+ path_targets = [
+ {
+ __path__ = "/var/log/langflow/*.log",
+ job = "langflow",
+ },
+ ]
+}
+
+loki.source.file "langflow" {
+ targets = local.file_match.langflow.targets
+ forward_to = [loki.process.langflow.receiver]
+}
+
+loki.process "langflow" {
+ stage.json {
+ expressions = {
+ level = "level",
+ service = "service",
+ environment = "environment",
+ version = "version",
+ logger = "logger",
+ }
+ }
+
+ stage.labels {
+ values = {
+ level = "",
+ service = "",
+ environment = "",
+ version = "",
+ logger = "",
+ }
+ }
+
+ forward_to = [loki.write.default.receiver]
+}
+
+loki.write "default" {
+ endpoint {
+ url = "http://loki:3100/loki/api/v1/push"
+ }
+}
diff --git a/deploy/observability/grafana-loki/docker-compose.yml b/deploy/observability/grafana-loki/docker-compose.yml
index 94b52383354b..b6ad7213af47 100644
--- a/deploy/observability/grafana-loki/docker-compose.yml
+++ b/deploy/observability/grafana-loki/docker-compose.yml
@@ -11,15 +11,19 @@ services:
timeout: 3s
retries: 20
- promtail:
- image: grafana/promtail:3.2.0
- container_name: lf-promtail
+ alloy:
+ image: grafana/alloy:v1.18.1
+ container_name: lf-alloy
volumes:
- - ./promtail/config.yml:/etc/promtail/config.yml
+ - ./alloy/config.alloy:/etc/alloy/config.alloy:ro
# Mount the directory that holds your langflow JSON log file.
# Override LANGFLOW_LOG_DIR to point at your real log location.
- ${LANGFLOW_LOG_DIR:-./logs}:/var/log/langflow:ro
- command: -config.file=/etc/promtail/config.yml
+ command:
+ - run
+ - --server.http.listen-addr=127.0.0.1:12345
+ - --storage.path=/var/lib/alloy/data
+ - /etc/alloy/config.alloy
depends_on:
loki:
condition: service_healthy
diff --git a/deploy/observability/grafana-loki/promtail/config.yml b/deploy/observability/grafana-loki/promtail/config.yml
index 228e06efe98b..54fe302ac3d3 100644
--- a/deploy/observability/grafana-loki/promtail/config.yml
+++ b/deploy/observability/grafana-loki/promtail/config.yml
@@ -1,3 +1,7 @@
+# LEGACY. Promtail reached end of life on 2026-03-02 and is not used by this stack.
+# The compose file runs Grafana Alloy instead.
+# For more on converting this file, see the Grafana documentation: https://grafana.com/docs/alloy/latest/set-up/migrate/from-promtail/
+
server:
http_listen_port: 9080
grpc_listen_port: 0
diff --git a/docs/docs/API-Reference/api-governance-policy.mdx b/docs/docs/API-Reference/api-governance-policy.mdx
new file mode 100644
index 000000000000..ae5f65b1d5d0
--- /dev/null
+++ b/docs/docs/API-Reference/api-governance-policy.mdx
@@ -0,0 +1,352 @@
+---
+title: Catalog and model policy
+slug: /api-governance-policy
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+On a shared Langflow server, anyone who can build a flow can use every component and model.
+
+Superusers can create catalog and model policy to hide components, templates, model providers, and models from the Langflow visual builder.
+
+OSS Langflow has no visual editor for policy management.
+Instead, use the APIs on this page with a **superuser** API key or session.
+This is the same credential the [Users API](/api-users) requires.
+
+An empty policy is the default, and has no restrictions.
+Nothing is restricted until a superuser writes a policy.
+
+The four lists of restrictions are saved in one policy bundle.
+Replace the policy bundle with a `PUT` request.
+Send every list you want in effect with the `PUT` request.
+Send `[]` for a list you want unrestricted.
+
+| You want to… | Field | Example |
+|--------------|-------|---------|
+| Hide a component and refuse flows that use it | `blocked_component_keys` | `PythonREPLComponent` (Python Interpreter) |
+| Hide a starter template | `blocked_template_keys` | `basic_prompting` |
+| Allow only some providers | `approved_provider_ids` | `["openai", "anthropic"]`. `[]` means every provider. |
+| Block a model | `blocked_model_keys` | `gpt-4o`, `openai::gpt-4o`, or `openai::llm::gpt-4o` |
+
+A blocked component disappears from the palette.
+Saving or running a flow that still contains the component fails.
+
+A blocked template is omitted from the starter list.
+
+:::tip
+Catalog policy hides or refuses *named* components, including built-ins.
+
+To block creating and editing custom code, set [`LANGFLOW_ALLOW_CUSTOM_COMPONENTS`](/deployment-block-custom-components).
+To block built-in code-execution components at runtime without a policy bundle, set [`LANGFLOW_BLOCK_CODE_INTERPRETER_COMPONENTS`](/api-keys-and-authentication#multi-tenant-component-hardening).
+:::
+
+## Apply a policy {#policy-bundle}
+
+:::tip
+Apply any [database migrations](./database-migrations) before sending requests to these endpoints.
+An uninitialized bundle returns `503`.
+:::
+
+1. Create a [superuser API key](/api-keys-and-authentication#create-a-langflow-api-key).
+
+2. Query how many flows a component would affect before you block it.
+
+ `GET /api/v1/catalog-policy/usage` returns the number of affected flows.
+ `GET /api/v1/catalog-policy/usage/flows?component=PythonREPLComponent` lists the affected flows.
+
+ For field names and key formats, see [How to name what you block](#keys).
+
+3. Read the current policy bundle, and copy `revision`.
+
+
+
+
+ ```python
+ import os
+
+ import requests
+
+ url = f"{os.environ['LANGFLOW_URL']}/api/v1/policy-bundle"
+ headers = {
+ "accept": "application/json",
+ "x-api-key": os.environ["LANGFLOW_API_KEY"],
+ }
+
+ response = requests.get(url, headers=headers)
+ response.raise_for_status()
+ print(response.json())
+ ```
+
+
+
+
+ ```javascript
+ const url = `${process.env.LANGFLOW_URL}/api/v1/policy-bundle`;
+
+ const response = await fetch(url, {
+ method: "GET",
+ headers: {
+ accept: "application/json",
+ "x-api-key": process.env.LANGFLOW_API_KEY,
+ },
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+ console.log(await response.json());
+ ```
+
+
+
+
+ ```bash
+ curl -X GET \
+ "$LANGFLOW_URL/api/v1/policy-bundle" \
+ -H "accept: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY"
+ ```
+
+
+
+
+
+ Result
+
+ ```json
+ {
+ "revision": 1,
+ "initialized": true,
+ "source": "default",
+ "approved_provider_ids": [],
+ "blocked_component_keys": [],
+ "blocked_template_keys": [],
+ "blocked_model_keys": [],
+ "content_hash": "ef74cccb21593ac02fc514e669c911768e740b1135d7a91d3fb15f72837ab762",
+ "created_at": null,
+ "created_by": null,
+ "reason": null,
+ "rollback_of_revision": null,
+ "managed_externally": false
+ }
+ ```
+
+
+
+ :::tip
+ If `managed_externally` is `true`, an external controller owns policy.
+ Reads still work. Writes return `409`.
+ :::
+
+4. Replace the bundle with a `PUT` request that includes every list you want in effect.
+ Send the `revision` number copied from step 3 as `expected_revision`.
+ Send `[]` for a list you want unrestricted.
+
+
+
+
+ ```python
+ import os
+
+ import requests
+
+ base = os.environ["LANGFLOW_URL"]
+ headers = {
+ "accept": "application/json",
+ "Content-Type": "application/json",
+ "x-api-key": os.environ["LANGFLOW_API_KEY"],
+ }
+
+ current = requests.get(f"{base}/api/v1/policy-bundle", headers=headers)
+ current.raise_for_status()
+ revision = current.json()["revision"]
+
+ payload = {
+ "expected_revision": revision,
+ "approved_provider_ids": ["openai", "anthropic"],
+ "blocked_component_keys": ["PythonREPLComponent"],
+ "blocked_template_keys": [],
+ "blocked_model_keys": ["openai::llm::gpt-4o"],
+ "reason": "Limit providers and block code execution",
+ }
+
+ response = requests.put(f"{base}/api/v1/policy-bundle", headers=headers, json=payload)
+ response.raise_for_status()
+ print(response.json())
+ ```
+
+
+
+
+ ```javascript
+ const base = process.env.LANGFLOW_URL;
+ const headers = {
+ accept: "application/json",
+ "Content-Type": "application/json",
+ "x-api-key": process.env.LANGFLOW_API_KEY,
+ };
+
+ const current = await fetch(`${base}/api/v1/policy-bundle`, { headers });
+ if (!current.ok) {
+ throw new Error(`HTTP ${current.status}`);
+ }
+ const revision = (await current.json()).revision;
+
+ const response = await fetch(`${base}/api/v1/policy-bundle`, {
+ method: "PUT",
+ headers,
+ body: JSON.stringify({
+ expected_revision: revision,
+ approved_provider_ids: ["openai", "anthropic"],
+ blocked_component_keys: ["PythonREPLComponent"],
+ blocked_template_keys: [],
+ blocked_model_keys: ["openai::llm::gpt-4o"],
+ reason: "Limit providers and block code execution",
+ }),
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+ console.log(await response.json());
+ ```
+
+
+
+
+ ```bash
+ curl -X PUT \
+ "$LANGFLOW_URL/api/v1/policy-bundle" \
+ -H "accept: application/json" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{
+ "expected_revision": 1,
+ "approved_provider_ids": ["openai", "anthropic"],
+ "blocked_component_keys": ["PythonREPLComponent"],
+ "blocked_template_keys": [],
+ "blocked_model_keys": ["openai::llm::gpt-4o"],
+ "reason": "Limit providers and block code execution"
+ }'
+ ```
+
+
+
+
+ If another user updated the policy first, the `PUT` returns `409`.
+ Repeat from step 3 with an updated `revision` number.
+
+ ```json
+ {
+ "detail": {
+ "message": "Policy bundle revision conflict",
+ "expected_revision": 1,
+ "active_revision": 2
+ }
+ }
+ ```
+
+5. Optional: Undo a prior revision.
+
+ `GET /api/v1/policy-bundle/history` lists prior bundle policy revisions.
+
+ To restore a revision, `POST` to `/api/v1/policy-bundle/rollback/{revision}` with the current `expected_revision`:
+
+ ```bash
+ curl -X POST \
+ "$LANGFLOW_URL/api/v1/policy-bundle/rollback/1" \
+ -H "accept: application/json" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{"expected_revision": 2, "reason": "Revert last change"}'
+ ```
+
+## How to name blocked items {#keys}
+
+Components use the type stored in the flow JSON, such as `PythonREPLComponent` or `ChatInput`.
+That is the component's class identity, not the label in the visual builder.
+Keys are case-sensitive.
+Older aliases still match, so blocking `PythonREPLComponent` also catches nodes saved under a previous type for the same component.
+
+```json
+"blocked_component_keys": ["PythonREPLComponent"]
+```
+
+Starter templates use a lowercase slug of the English name with underscores, such as `basic_prompting`.
+
+```json
+"blocked_template_keys": ["basic_prompting"]
+```
+
+Providers use lowercase IDs, such as `openai`.
+`GET /api/v1/model-provider-policy` lists every provider the process is aware of, with `provider_id` and display name.
+
+```json
+"approved_provider_ids": ["openai", "anthropic"]
+```
+
+Models use the identities in the model picker.
+
+```json
+"blocked_model_keys": ["gpt-4o", "openai::gpt-4o", "openai::llm::gpt-4o"]
+```
+
+## Change one list at a time {#catalog-policy}
+
+Use these endpoints when you want to change only components, templates, or providers.
+If you are changing more than one list, use one `PUT` to `/api/v1/policy-bundle` instead. See [Apply a policy](#policy-bundle).
+
+1. To hide or unhide components, `PUT` the complete blocked list to `/api/v1/catalog-policy/components`.
+ A `PUT` replaces the whole list.
+ Send `{"blocked": []}` to unblock every component.
+
+ ```bash
+ curl -X PUT \
+ "$LANGFLOW_URL/api/v1/catalog-policy/components" \
+ -H "accept: application/json" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{"blocked": ["PythonREPLComponent"]}'
+ ```
+
+ To read the current list first, `GET /api/v1/catalog-policy/components`.
+
+2. To hide or unhide starter templates, `PUT` the complete blocked list to `/api/v1/catalog-policy/templates`.
+
+ ```bash
+ curl -X PUT \
+ "$LANGFLOW_URL/api/v1/catalog-policy/templates" \
+ -H "accept: application/json" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{"blocked": ["basic_prompting"]}'
+ ```
+
+ To read the current list first, `GET /api/v1/catalog-policy/templates`.
+
+3. Optional: List the flows that include a component.
+
+ `GET /api/v1/catalog-policy/usage` returns the number of flows.
+ `GET /api/v1/catalog-policy/usage/flows?component=PythonREPLComponent` lists the affected flows.
+
+4. To allow only some providers, `PUT` the complete approved list to `/api/v1/model-provider-policy`.
+ Send `{"approved_provider_ids": []}` to allow every provider.
+
+ ```bash
+ curl -X PUT \
+ "$LANGFLOW_URL/api/v1/model-provider-policy" \
+ -H "accept: application/json" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{"approved_provider_ids": ["openai", "anthropic"]}'
+ ```
+
+ Set `blocked_model_keys` with `PUT /api/v1/policy-bundle`.
+
+## See also
+
+* [Restrict API tweaks](./deployment-tweaks-policy)
+* [Users endpoints](/api-users)
+* [Block custom components](/deployment-block-custom-components)
+* [API keys and authentication](/api-keys-and-authentication)
diff --git a/docs/docs/API-Reference/api-reference-api-examples.mdx b/docs/docs/API-Reference/api-reference-api-examples.mdx
index 0b8b988e4f08..f3bc5b13b647 100644
--- a/docs/docs/API-Reference/api-reference-api-examples.mdx
+++ b/docs/docs/API-Reference/api-reference-api-examples.mdx
@@ -323,6 +323,12 @@ Other endpoints are helpful for specific use cases, such as administration and f
* PATCH `/v1/users/{user_id}/reset-password`: Reset own password.
* DELETE `/v1/users/{user_id}`: Delete a user (cannot delete yourself).
+* [Catalog and model policy](./api-governance-policy) (superuser required):
+ * GET `/v1/policy-bundle`: Read the install-wide catalog and model policy.
+ * PUT `/v1/policy-bundle`: Replace the bundle. Requires `expected_revision`.
+ * GET `/v1/catalog-policy/components` and `PUT /v1/catalog-policy/components`: Blocked component keys.
+ * GET `/v1/model-provider-policy` and `PUT /v1/model-provider-policy`: Approved model providers.
+
* Custom components: You might use these endpoints when developing custom Langflow components for your own use or to share with the Langflow community:
* GET `/v1/all`: Return all available Langflow component types. See [Get all components](/api-reference-api-examples#get-all-components).
* POST `/v1/custom_component`: Build a custom component from code and return its node.
diff --git a/docs/docs/API-Reference/api-users.mdx b/docs/docs/API-Reference/api-users.mdx
index 10243f2cb12e..0ce989b62fe1 100644
--- a/docs/docs/API-Reference/api-users.mdx
+++ b/docs/docs/API-Reference/api-users.mdx
@@ -11,6 +11,7 @@ import exampleApiUsersListAllUsers from '!!raw-loader!@site/docs/API-Reference/c
import resultApiUsersResultListAllUsers from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/result-list-all-users.json';
import exampleApiUsersUpdateUser from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/update-user.sh';
import resultApiUsersResultUpdateUser from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/result-update-user.json';
+import exampleApiUsersSetUserPassword from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/set-user-password.sh';
import exampleApiUsersResetPassword from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/reset-password.sh';
import resultApiUsersResultResetPassword from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/result-reset-password.json';
import exampleApiUsersDeleteUser from '!!raw-loader!@site/docs/API-Reference/curl-examples/api-users/delete-user.sh';
@@ -25,6 +26,8 @@ import examplePythonApiUsersListAllUsers from '!!raw-loader!@site/docs/API-Refer
import exampleJavascriptApiUsersListAllUsers from '!!raw-loader!@site/docs/API-Reference/javascript-examples/api-users/list-all-users.js';
import examplePythonApiUsersUpdateUser from '!!raw-loader!@site/docs/API-Reference/python-examples/api-users/update-user.py';
import exampleJavascriptApiUsersUpdateUser from '!!raw-loader!@site/docs/API-Reference/javascript-examples/api-users/update-user.js';
+import examplePythonApiUsersSetUserPassword from '!!raw-loader!@site/docs/API-Reference/python-examples/api-users/set-user-password.py';
+import exampleJavascriptApiUsersSetUserPassword from '!!raw-loader!@site/docs/API-Reference/javascript-examples/api-users/set-user-password.js';
import examplePythonApiUsersResetPassword from '!!raw-loader!@site/docs/API-Reference/python-examples/api-users/reset-password.py';
import exampleJavascriptApiUsersResetPassword from '!!raw-loader!@site/docs/API-Reference/javascript-examples/api-users/reset-password.js';
import examplePythonApiUsersDeleteUser from '!!raw-loader!@site/docs/API-Reference/python-examples/api-users/delete-user.py';
@@ -34,6 +37,9 @@ import exampleJavascriptApiUsersDeleteUser from '!!raw-loader!@site/docs/API-Ref
Use the `/users` endpoint to manage user accounts in Langflow.
+As of Langflow 1.12, there is no **Admin Page** in the visual editor.
+Superusers add, activate, list, and delete users, set **Superuser**, and set another user's password with `PATCH /api/v1/users/{id}`.
+
## Add user
Create a new user account with a given username and password.
@@ -129,7 +135,7 @@ Requires authentication as a superuser if the Langflow server has authentication
-## Update user
+## Update user {#update-user}
Modify an existing user's information with a PATCH request.
@@ -162,11 +168,34 @@ This example activates the specified user's account and makes them a superuser:
+To set another user's password as an administrator, include `"password"` in the same `PATCH /api/v1/users/{id}` body.
+Only a superuser can set a password this way, and the current password is not required.
+Non-superusers cannot change passwords on this route.
+
+
+
+
+{examplePythonApiUsersSetUserPassword}
+
+
+
+
+{exampleJavascriptApiUsersSetUserPassword}
+
+
+
+
+{exampleApiUsersSetUserPassword}
+
+
+
+
## Reset password
-Change the specified user's password to a new secure value.
+Change **your own** password.
-Requires authentication as the target user.
+Authenticate as the target user, send that user's `id` in the path, and include `current_password` plus the new `password`.
+A superuser resetting someone else's password must use [Update user](#update-user) instead.
diff --git a/docs/docs/API-Reference/curl-examples/api-users/reset-password.sh b/docs/docs/API-Reference/curl-examples/api-users/reset-password.sh
index 3ec304a0be10..800d505617ed 100644
--- a/docs/docs/API-Reference/curl-examples/api-users/reset-password.sh
+++ b/docs/docs/API-Reference/curl-examples/api-users/reset-password.sh
@@ -3,5 +3,6 @@ curl -X PATCH \
-H "Content-Type: application/json" \
-H "x-api-key: $LANGFLOW_API_KEY" \
-d '{
+ "current_password": "securepassword123",
"password": "newsecurepassword123"
}'
diff --git a/docs/docs/API-Reference/curl-examples/api-users/set-user-password.sh b/docs/docs/API-Reference/curl-examples/api-users/set-user-password.sh
new file mode 100644
index 000000000000..a9e4fe520f09
--- /dev/null
+++ b/docs/docs/API-Reference/curl-examples/api-users/set-user-password.sh
@@ -0,0 +1,7 @@
+curl -X PATCH \
+ "$LANGFLOW_URL/api/v1/users/10c1c6a2-ab8a-4748-8700-0e4832fd5ce8" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{
+ "password": "newsecurepassword123"
+ }'
diff --git a/docs/docs/API-Reference/javascript-examples/api-users/reset-password.js b/docs/docs/API-Reference/javascript-examples/api-users/reset-password.js
index 483aebcd481d..5b78ac6ab4f9 100644
--- a/docs/docs/API-Reference/javascript-examples/api-users/reset-password.js
+++ b/docs/docs/API-Reference/javascript-examples/api-users/reset-password.js
@@ -7,8 +7,9 @@ const options = {
"x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
},
body: JSON.stringify({
- "password": "newsecurepassword123"
-}),
+ current_password: "securepassword123",
+ password: "newsecurepassword123",
+ }),
};
fetch(url, options)
diff --git a/docs/docs/API-Reference/javascript-examples/api-users/set-user-password.js b/docs/docs/API-Reference/javascript-examples/api-users/set-user-password.js
new file mode 100644
index 000000000000..307376abcdc1
--- /dev/null
+++ b/docs/docs/API-Reference/javascript-examples/api-users/set-user-password.js
@@ -0,0 +1,22 @@
+const url = `${process.env.LANGFLOW_URL ?? ""}/api/v1/users/10c1c6a2-ab8a-4748-8700-0e4832fd5ce8`;
+
+const options = {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ "x-api-key": `${process.env.LANGFLOW_API_KEY ?? ""}`,
+ },
+ body: JSON.stringify({
+ password: "newsecurepassword123",
+ }),
+};
+
+fetch(url, options)
+ .then(async (response) => {
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+ const text = await response.text();
+ console.log(text);
+ })
+ .catch((error) => console.error(error));
diff --git a/docs/docs/API-Reference/python-examples/api-users/reset-password.py b/docs/docs/API-Reference/python-examples/api-users/reset-password.py
index ea4c8fdad343..e36d6e79fda1 100644
--- a/docs/docs/API-Reference/python-examples/api-users/reset-password.py
+++ b/docs/docs/API-Reference/python-examples/api-users/reset-password.py
@@ -12,7 +12,10 @@
user_id = who.json()["id"]
# Must differ from the current password.
-payload = {"password": "DocsExampleResetPass2025!"}
+payload = {
+ "current_password": os.environ.get("LANGFLOW_CURRENT_PASSWORD", "securepassword123"),
+ "password": "DocsExampleResetPass2025!",
+}
response = requests.patch(
f"{base}/api/v1/users/{user_id}/reset-password",
diff --git a/docs/docs/API-Reference/python-examples/api-users/set-user-password.py b/docs/docs/API-Reference/python-examples/api-users/set-user-password.py
new file mode 100644
index 000000000000..355363d89d64
--- /dev/null
+++ b/docs/docs/API-Reference/python-examples/api-users/set-user-password.py
@@ -0,0 +1,15 @@
+import os
+
+import requests
+
+base = os.environ.get("LANGFLOW_URL", "")
+api_key = os.environ.get("LANGFLOW_API_KEY", "")
+user_id = os.environ.get("LANGFLOW_USER_ID", "10c1c6a2-ab8a-4748-8700-0e4832fd5ce8")
+
+headers = {"Content-Type": "application/json", "x-api-key": api_key}
+
+payload = {"password": "newsecurepassword123"}
+
+response = requests.patch(f"{base}/api/v1/users/{user_id}", headers=headers, json=payload, timeout=30)
+response.raise_for_status()
+print(response.text)
diff --git a/docs/docs/Agents/mcp-server.mdx b/docs/docs/Agents/mcp-server.mdx
index 504b0d5fd420..f9af999b27fa 100644
--- a/docs/docs/Agents/mcp-server.mdx
+++ b/docs/docs/Agents/mcp-server.mdx
@@ -13,6 +13,7 @@ This page describes how to use Langflow as an MCP server that exposes your flows
Langflow MCP servers support both the **streamable HTTP** transport and **Server-Sent Events (SSE)** as a fallback.
The default project MCP server configuration uses streamable HTTP transport at the URL path `/streamable`.
+To serve only streamable HTTP, see [Disable the legacy MCP SSE transport](#disable-legacy-sse).
For information about using Langflow as an MCP client and managing MCP server connections within flows, see [Use Langflow as an MCP client](/mcp-client).
@@ -404,6 +405,11 @@ The default address is `http://localhost:6274`.
5. To quit MCP Inspector, press Control+C in the same terminal window where you started it.
+## Disable the legacy MCP SSE transport {#disable-legacy-sse}
+
+Set `LANGFLOW_MCP_SSE_ENABLED=false` to return `404` from the legacy SSE transport and its message endpoint.
+Streamable HTTP is unaffected.
+
## Restrict MCP server management to superusers {#restrict-mcp-server-management}
To prevent non-superusers from editing MCP server connections, set `LANGFLOW_MCP_SERVERS_LOCKED=true`.
@@ -413,19 +419,26 @@ Superusers retain full access to MCP server configuration.
Locking the MCP server configuration for users does not disable Langflow's built-in MCP server for serving flows as MCP tools.
-## MCP server environment variables
+## MCP server environment variables {#mcp-server-environment-variables}
The following environment variables set behaviors related to your Langflow projects' MCP servers:
| Variable | Format | Default | Description |
|----------|--------|---------|-------------|
| `LANGFLOW_MCP_SERVER_ENABLED` | Boolean | `True` | Whether to initialize an MCP server for each of your Langflow projects. If `false`, Langflow doesn't initialize MCP servers. |
+| `LANGFLOW_MCP_SSE_ENABLED` | Boolean | `True` | Whether to serve the legacy SSE transport. If `false`, SSE and its message endpoint return `404`. Streamable HTTP is unaffected. See [Disable the legacy MCP SSE transport](#disable-legacy-sse). |
| `LANGFLOW_MCP_SERVER_ENABLE_PROGRESS_NOTIFICATIONS` | Boolean | `False` | If `true`, Langflow MCP servers send progress notifications. |
+| `LANGFLOW_SKIP_MCP_AUTO_INIT` | Boolean | `False` | If `true`, skip background MCP server auto-initialization on startup. Use this on offline, firewalled, or CI hosts so startup does not wait on outbound MCP connections. |
+| `LANGFLOW_MCP_COMPOSER_ENABLED` | Boolean | `True` | Whether to start the MCP Composer service. |
| `LANGFLOW_MCP_SERVER_TIMEOUT` | Integer | `20` | Timeout in seconds for MCP connection setup and tool execution. See [Configure tool execution timeouts](#configure-tool-execution-timeouts). |
| `LANGFLOW_MCP_TOOL_EXECUTION_TIMEOUT` | Integer | `180` | Global timeout in seconds for MCP tool calls. See [Configure tool execution timeouts](#configure-tool-execution-timeouts). |
| `LANGFLOW_MCP_MAX_SESSIONS_PER_SERVER` | Integer | `10` | Maximum number of MCP sessions to keep per unique server. |
| `LANGFLOW_ADD_PROJECTS_TO_MCP_SERVERS` | Boolean | `True` | Whether to automatically add newly created projects to the user's MCP servers configuration. If `false`, projects must be manually added to MCP servers. |
| `LANGFLOW_MCP_SERVERS_LOCKED` | Boolean | `False` | If `true`, non-superusers cannot add, edit, or remove MCP server connections through the UI or API. Superusers retain full access. For more information, see [Restrict MCP server management to superusers](#restrict-mcp-server-management). |
+| `LANGFLOW_MCP_SERVER_ALLOWED_PACKAGES` | String | Not set | Comma-separated allowlist of package names that MCP `npx`/`uvx` stdio servers may download and run. Leave unset for single-tenant compatibility. An empty value blocks all package runners. |
+| `LANGFLOW_MCP_SERVER_ENV_ALLOWLIST` | String | Not set | Comma-separated allowlist of environment-variable names an MCP stdio config may set. Leave unset for single-tenant compatibility; production preflight warns when it is unset. An empty value blocks all tenant-supplied environment variables. |
+| `LANGFLOW_MCP_SERVER_INTERPRETER_HARDENING` | Boolean | `False` | If `true`, blocks tenant-controlled Python, Node.js, and shell MCP entrypoints. Package wrappers and the authenticated internal Langflow MCP server still work. |
+| `LANGFLOW_MCP_SERVER_DOCKER_HARDENING` | Boolean | `False` | If `true`, applies a strict argument policy to MCP `docker` stdio servers so tenants cannot mount the host filesystem or use privileged flags. |
## Troubleshoot Langflow MCP servers {#troubleshooting-mcp-server}
diff --git a/docs/docs/Components/bundles-paddle.mdx b/docs/docs/Components/bundles-paddle.mdx
index bfaba0636748..41d9f6899c34 100644
--- a/docs/docs/Components/bundles-paddle.mdx
+++ b/docs/docs/Components/bundles-paddle.mdx
@@ -28,8 +28,8 @@ Install it directly:
uv pip install lfx-paddle
```
-Alternatively, include it with the other opt-in standalone and long-tail
-bundles:
+Alternatively, include it with the other opt-in standalone packages and
+providers from `lfx-bundles`:
```bash
uv pip install "langflow[bundles]"
diff --git a/docs/docs/Components/components-bundles.mdx b/docs/docs/Components/components-bundles.mdx
index 377cdc001cc5..6fef128f4b71 100644
--- a/docs/docs/Components/components-bundles.mdx
+++ b/docs/docs/Components/components-bundles.mdx
@@ -52,21 +52,24 @@ If all else fails, you can always create your own [custom components](/component
## Install bundle components {#bundle-install}
-`uv pip install langflow` includes the default curated provider set, but not the
-`lfx-bundles` long tail or the opt-in arXiv, DuckDuckGo, EmpirioLabs, Exa,
-Firecrawl, NextPlaid, Paddle, and Valkey standalone packages. Install the
-supported torch-free full profile with `uv pip install "langflow[bundles]"`.
+`uv pip install langflow` includes the default curated provider set.
+It does _not_ include the opt-in bundles listed in
+[Additional bundles](/extensions-bundle-list#additional-bundles).
+Install a missing provider, or install the supported torch-free full
+profile with `uv pip install "langflow[bundles]"`.
If you install `lfx` directly or need to add bundles to an existing environment, see [Install LFX with bundle components](./lfx-install#install-with-bundle-components).
### Torch opt-in installs {#torch-opt-in}
-The default `uv pip install langflow` and full `uv pip install "langflow[bundles]"` profiles do not install dependencies for components that require PyTorch.
-The standalone `uv pip install "lfx[bundles]"` profile includes the torch-based long tail.
+The default `uv pip install langflow` and full `uv pip install "langflow[bundles]"` installations do not install dependencies for components that require PyTorch.
-As of Langflow 1.11.x, this list includes **CUGA**, **Code Agents**, and the **Docling** local parser.
-To install PyTorch and the additional components, in your Langflow virtual environment, run `uv pip install "lfx-bundles[all]"`.
+To install PyTorch and the components that require it, run the following in your Langflow virtual environment:
+
+```bash
+uv pip install "lfx-bundles[all]"
+```
## Legacy bundles
diff --git a/docs/docs/Components/python-interpreter.mdx b/docs/docs/Components/python-interpreter.mdx
index d3f2f2dd3675..fb88dd03f31a 100644
--- a/docs/docs/Components/python-interpreter.mdx
+++ b/docs/docs/Components/python-interpreter.mdx
@@ -9,10 +9,11 @@ import TabItem from '@theme/TabItem';
This component allows you to execute Python code with imported packages.
-The **Python Interpreter** component can only import packages that are already installed in your Langflow environment.
-If you encounter an `ImportError` when trying to use a package, you need to install it first.
+By default, code runs in the Langflow server process.
+The **Python Interpreter** can only import packages that are already installed in your Langflow environment.
+If you encounter an `ImportError`, install the package first. For more information, see [Install custom dependencies](/install-custom-dependencies).
-To install custom packages, see [Install custom dependencies](/install-custom-dependencies).
+On a shared server, isolate executions in a microVM or [block the custom component](/api-keys-and-authentication#multi-tenant-component-hardening).
## Use the Python Interpreter in a flow
@@ -230,6 +231,35 @@ For example, to connect a [**Chat Input** component](/chat-input-and-output) and
The **Python Interpreter** component can now use the `url` variable in the Python code that it executes.
+## Isolate executions in a microVM {#sandbox}
+
+Set `LANGFLOW_SANDBOX_BACKEND=exec-sandbox` to run each **Python Interpreter** execution in a dedicated [QEMU microVM](https://www.qemu.org/docs/master/system/i386/microvm.html) instead of in the server process.
+The VM has a read-only root filesystem, no host filesystem access, and no network unless you enable it.
+
+1. Use Python 3.12 or later, QEMU 8 or later, and hardware virtualization. Use KVM on Linux, or HVF on macOS.
+2. The microVM is not included with a default `uv pip install langflow` installation.
+To install it, run `uv pip install 'langflow[sandbox]'`.
+If you enable the environment variable but don't install the sandbox package, the component errors.
+
+3. In your `.env` file, set:
+
+ ```text
+ LANGFLOW_SANDBOX_BACKEND=exec-sandbox
+ ```
+
+4. Restart Langflow.
+
+If the sandbox is configured but unavailable, execution fails with an error, and Langflow does not fall back to in-process `exec`.
+
+Sandboxed code may import any module already in the microVM's filesystem.
+Langflow inserts `import` statements at the top of the script in the VM. Those packages must already be in the microVM's filesystem, not only in your Langflow environment.
+Network access is off by default.
+Code that fetches URLs needs `LANGFLOW_SANDBOX_ALLOW_NETWORK=true` and, for non-PyPI hosts, `LANGFLOW_SANDBOX_ALLOWED_DOMAINS`.
+
+Set `LANGFLOW_SANDBOX_ALLOW_SOFTWARE_EMULATION=true` for trusted development or CI hosts without a hypervisor.
+
+For more information, see [Python Interpreter sandbox environment variables](/environment-variables#langflow-sandbox).
+
## Python Interpreter parameters
| Name | Type | Description |
diff --git a/docs/docs/Deployment/deployment-block-custom-components.mdx b/docs/docs/Deployment/deployment-block-custom-components.mdx
index 8ea3cbeca5c4..3041ce2946ca 100644
--- a/docs/docs/Deployment/deployment-block-custom-components.mdx
+++ b/docs/docs/Deployment/deployment-block-custom-components.mdx
@@ -150,6 +150,8 @@ When this is `false` **and** `LANGFLOW_ALLOW_CUSTOM_COMPONENTS=false`, component
Default is `true`, which preserves existing behavior. The setting has no effect while `LANGFLOW_ALLOW_CUSTOM_COMPONENTS=true`, since nothing is being bypassed.
+To hide or refuse named built-in components, starter templates, model providers, or models without turning off custom code entirely, use the superuser [catalog and model policy APIs](./api-governance-policy).
+
For more information, see:
* [Environment variables](/environment-variables#visual-editor-and-playground-behavior)
diff --git a/docs/docs/Deployment/deployment-kubernetes-prod.mdx b/docs/docs/Deployment/deployment-kubernetes-prod.mdx
index 14474529c04b..c4b2b9cadd7c 100644
--- a/docs/docs/Deployment/deployment-kubernetes-prod.mdx
+++ b/docs/docs/Deployment/deployment-kubernetes-prod.mdx
@@ -205,4 +205,5 @@ Use `replicaCount` and `resources` in the Langflow runtime Helm chart's [`values
## See also
* [Best practices for Langflow on Kubernetes](/deployment-prod-best-practices)
+* [Production preflight checks](/deployment-prod-best-practices#production-preflight)
* [Langflow Helm Charts repository](https://github.com/langflow-ai/langflow-helm-charts)
\ No newline at end of file
diff --git a/docs/docs/Deployment/deployment-prod-best-practices.mdx b/docs/docs/Deployment/deployment-prod-best-practices.mdx
index 79061c888ddd..be983f77adce 100644
--- a/docs/docs/Deployment/deployment-prod-best-practices.mdx
+++ b/docs/docs/Deployment/deployment-prod-best-practices.mdx
@@ -120,6 +120,73 @@ Follow industry best practices and use secure Langflow configurations, such as t
* **Encryption and privacy**: Follow industry best practices and legal requirements for data privacy and encryption of data in transit and at rest, including GDPR requirements, HTTPS, TLS, and SSL. For example, configure PostgreSQL with valid SSL certificates and append `?sslmode=require` or `?sslmode=verify-full` to the connection string to enable SSL for database connections.
* **Security posture maintenance**: Conduct regular security audits, keep current with software updates, and monitor for suspicious activity using intrusion detection systems.
+## Production preflight checks {#production-preflight}
+
+To verify production infrastructure before any workers start, set the `LANGFLOW_DEPLOYMENT_PROFILE` environment variable to `prod`.
+
+By default, `LANGFLOW_DEPLOYMENT_PROFILE` is set to `dev` and skips these checks.
+When set to `prod`, Langflow runs every check once and prints the full result. A `fail` aborts boot with a non-zero exit, so a misconfigured server never starts up.
+A `warn` does not abort and allows startup.
+
+Preflight checks run for any Langflow process started with the `prod` profile enabled, not only Kubernetes.
+
+To enable preflight checks, set the following in your `.env` file:
+
+```text
+LANGFLOW_DEPLOYMENT_PROFILE=prod
+```
+
+Alternatively, pass the CLI option, which overrides the environment variable:
+
+```bash
+uv run langflow run --deployment-profile prod
+```
+
+### Required checks
+
+These checks abort boot when they fail:
+
+| Check | What must be true |
+|-------|-------------------|
+| Database | `LANGFLOW_DATABASE_URL` is a reachable **PostgreSQL** database. SQLite fails this check. |
+| File storage | `LANGFLOW_STORAGE_TYPE` is an external object store such as `s3`, not local disk. |
+| Encryption secret | `LANGFLOW_SECRET_KEY` is set in the environment to a usable Fernet key. An auto-generated key or a node-local `config_dir/secret_key` file is not enough. See [`LANGFLOW_SECRET_KEY`](/api-keys-and-authentication#langflow-secret-key). |
+| pgVector | `PGVECTOR_CONNECTION_STRING` is set, the database is reachable, and the Postgres `vector` extension is installed (`CREATE EXTENSION vector;`). Production Langflow requires pgVector even if you are not creating knowledge bases yet. |
+
+### Degraded checks
+
+These checks report reduced capability. Telemetry and MCP only `warn`. Cache and the shared job queue abort boot if you selected an external backend that is unreachable.
+
+| Check | `ok` | `warn` | `fail` (aborts) |
+|-------|------|--------|-----------------|
+| Cache | `LANGFLOW_CACHE_TYPE=redis` and Redis is reachable | In-memory default (`async` or `memory`). Caches are not shared across replicas. | Redis selected but unreachable. Unset `LANGFLOW_CACHE_TYPE` to boot with the in-memory fallback. |
+| Shared queue | `LANGFLOW_JOB_QUEUE_TYPE=redis` and Redis is reachable | In-process default (`asyncio`). Jobs stay on a single pod. | Redis selected but unreachable. Unset `LANGFLOW_JOB_QUEUE_TYPE` to boot with the in-process fallback. |
+| Telemetry | Product telemetry is enabled | `LANGFLOW_DO_NOT_TRACK` is set | Never fails |
+| MCP serving posture | MCP is disabled, or the serving knobs below match the multi-tenant values | One or more knobs are still at a single-tenant default | Never fails |
+
+If this plane does not serve MCP, set `LANGFLOW_MCP_SERVER_ENABLED=false`. Otherwise, production preflight expects these values when MCP is enabled:
+
+| Variable | Expected in `prod` | Default |
+|----------|--------------------|---------|
+| `LANGFLOW_SKIP_MCP_AUTO_INIT` | `true` | `false` |
+| `LANGFLOW_ADD_PROJECTS_TO_MCP_SERVERS` | `false` | `true` |
+| `LANGFLOW_MCP_COMPOSER_ENABLED` | `false` | `true` |
+| `LANGFLOW_MCP_SERVERS_LOCKED` | `true` | `false` |
+| `LANGFLOW_MCP_SSE_ENABLED` | `false` | `true` |
+| `LANGFLOW_MCP_SERVER_INTERPRETER_HARDENING` | `true` | `false` |
+| `LANGFLOW_MCP_SERVER_DOCKER_HARDENING` | `true` | `false` |
+| `LANGFLOW_SSRF_PROTECTION_ENABLED` | `true` | `true` |
+| `LANGFLOW_CONNECTOR_SSRF_VALIDATION_ENABLED` | `true` | `true` |
+| `LANGFLOW_CONNECTOR_SSRF_ALLOW_LOOPBACK` | `false` | `true` |
+| `LANGFLOW_DISABLE_TRACK_APIKEY_USAGE` | `true` | `false` |
+| `LANGFLOW_MCP_SERVER_ALLOWED_PACKAGES` | Set to an allowlist (empty string blocks all package runners) | Unset |
+| `LANGFLOW_MCP_SERVER_ENV_ALLOWLIST` | Set to an allowlist (empty string blocks all tenant-supplied environment variables) | Unset |
+
+### Local Chroma in `prod`
+
+The `prod` profile blocks new knowledge bases and memory bases that use local Chroma.
+For local storage, use a shared pgVector, OpenSearch, or Chroma Cloud store, or run Langflow with `LANGFLOW_DEPLOYMENT_PROFILE=dev`
+
## See also
* [Deploy the Langflow production environment on Kubernetes](/deployment-kubernetes-prod)
diff --git a/docs/docs/Deployment/deployment-tweaks-policy.mdx b/docs/docs/Deployment/deployment-tweaks-policy.mdx
new file mode 100644
index 000000000000..39d3e025c6c1
--- /dev/null
+++ b/docs/docs/Deployment/deployment-tweaks-policy.mdx
@@ -0,0 +1,42 @@
+---
+title: Restrict API tweaks
+slug: /deployment-tweaks-policy
+---
+
+When an application runs a flow through the Langflow API, the request can include `tweaks`, one-time overrides of component settings for that run.
+
+By default, a caller can change almost any field, not only the fields marked **API** in the Langflow visual editor.
+The **API** button adds marked fields to the generated code snippets, but it does not stop the server from accepting other tweaks.
+
+To limit what callers can override, set the following [environment variable](/environment-variables):
+
+```bash
+LANGFLOW_TWEAKS_POLICY=declared
+```
+
+Existing servers keep the default `permissive` behavior until you set this variable.
+
+## Choose a policy
+
+| Value | When to use it | What callers can change |
+|-------|----------------|-------------------------|
+| `permissive` (default) | Trusted callers, local development | Almost any component field. Code fields and other privileged settings stay blocked. |
+| `declared` | Production APIs where you choose the knobs | Only fields marked **API** on a flow. If a flow marks none, it behaves like `permissive` so unpublished flows continue working. |
+| `off` | Run-only serving | Nothing. Callers can still send the chat input (`input_value`) and `session_id`. |
+
+This policy applies to API callers, not values Langflow passes internally. A **Run Flow** component can still feed a sub-flow under `off`.
+
+MCP tools that only accept a prompt still work under `off`.
+Additional MCP fields are tweaks, so they are refused.
+Use `permissive` or `declared` for tools with additional MCP fields.
+
+This setting does not hide components from the palette or block model providers.
+For those controls, see [Catalog and model policy](./api-governance-policy).
+
+To mark fields that `declared` should allow, see [Tweaks (API inputs)](/concepts-publish#input-schema).
+
+For more information, see:
+
+* [Environment variables](/environment-variables#visual-editor-and-playground-behavior)
+* [Component hardening for untrusted users](/api-keys-and-authentication#multi-tenant-component-hardening)
+* [Security](/security)
diff --git a/docs/docs/Deployment/docker-image-profiles.mdx b/docs/docs/Deployment/docker-image-profiles.mdx
index c529a75fc279..408708a44ed8 100644
--- a/docs/docs/Deployment/docker-image-profiles.mdx
+++ b/docs/docs/Deployment/docker-image-profiles.mdx
@@ -3,25 +3,32 @@ title: Choose a Langflow Docker image
slug: /deployment/docker-image-profiles
---
-Langflow publishes three application image profiles. They share the same
-frontend, non-root runtime, health check, SSRF defaults, and `langflow`
-executable. Choose the smallest profile that contains every extension used by
-your flows.
+Langflow publishes three application image profiles from
+`docker/build_and_push.Dockerfile` (`base`, `full`, and `full-bundles`).
+They share the same frontend, non-root runtime (uid 1000),
+`LANGFLOW_AUTO_LOGIN=false`, and `langflow` executable.
+None of them install PyTorch or TorchVision.
+All three include the `postgresql` extra so they can use an external Postgres
+database without a derived image.
+Choose the smallest profile that contains every extension used by your flows.
| Profile | Docker Hub image | GitHub Container Registry image | Included inventory |
| --- | --- | --- | --- |
-| Base | `langflowai/langflow:base-VERSION` | `ghcr.io/langflow-ai/langflow:base-VERSION` | The runnable `langflow-base` application and built-in LFX components, without provider extension distributions |
-| Default | `langflowai/langflow:VERSION` | `ghcr.io/langflow-ai/langflow:VERSION` | Base plus the curated standalone `lfx-*` extensions included by `pip install langflow` |
-| Extended | `langflowai/langflow-all:VERSION` | `ghcr.io/langflow-ai/langflow-all:VERSION` | The `langflow[bundles]` inventory: default plus the no-Torch long tail and opt-in standalone extensions |
+| Base | `langflowai/langflow:base-VERSION` | `ghcr.io/langflow-ai/langflow:base-VERSION` | `langflow-base` plus built-in LFX components. No `lfx-*` provider packages. |
+| Default | `langflowai/langflow:VERSION` | `ghcr.io/langflow-ai/langflow:VERSION` | Base plus the curated standalone `lfx-*` packages from `uv pip install langflow` |
+| Extended | `langflowai/langflow-all:VERSION` | `ghcr.io/langflow-ai/langflow-all:VERSION` | Default plus `langflow[bundles]`: non-PyTorch providers from `lfx-bundles` and opt-in standalone packages, including Confluent |
The base and default profiles use the `langflow` image repository. The extended
profile uses the separate `langflow-all` repository. All three profiles use the
-same Langflow 1.12 version; the base image isn't independently versioned.
-
-The base profile intentionally contains no provider extension distributions,
-PyTorch, or TorchVision. A flow that references an omitted component cannot run
-until you select a profile that provides it or install the reviewed extension
-in a derived image.
+same Langflow 1.12 version.
+As of Langflow 1.12.x, there is no `langflow-core` image, and earlier `core-*` tags are not published.
+
+The base image is a complete, minimal Langflow with no provider extensions,
+not only the [additional bundles](/extensions-bundle-list#additional-bundles)
+omitted from the default `langflow` install.
+The default image matches `uv pip install langflow`.
+A flow that references an omitted component cannot run until you select a
+profile that provides it, or install the reviewed extension in a derived image.
## Pin a release
diff --git a/docs/docs/Develop/api-keys-and-authentication.mdx b/docs/docs/Develop/api-keys-and-authentication.mdx
index 7c48c32dfb99..842cd5de7e18 100644
--- a/docs/docs/Develop/api-keys-and-authentication.mdx
+++ b/docs/docs/Develop/api-keys-and-authentication.mdx
@@ -275,16 +275,17 @@ For more information, see [Secret Key Rotation](https://github.com/langflow-ai/l
### LANGFLOW_NEW_USER_IS_ACTIVE {#langflow-new-user-is-active}
-When `LANGFLOW_NEW_USER_IS_ACTIVE=False` (default), accounts created by superusers are inactive by default and must be explicitly activated before users can sign in to the visual editor.
-The superuser can also deactivate a user's account as needed.
+When `LANGFLOW_NEW_USER_IS_ACTIVE=False` (default), new accounts are inactive until a superuser activates them with the [Users API](/api-users).
+Inactive users cannot sign in to the visual editor.
+The superuser can also deactivate an account with the same API.
-When `LANGFLOW_NEW_USER_IS_ACTIVE=True`, accounts created by superusers are automatically activated.
+When `LANGFLOW_NEW_USER_IS_ACTIVE=True`, new accounts are automatically activated.
```text
LANGFLOW_NEW_USER_IS_ACTIVE=False
```
-Only superusers can manage user accounts for a Langflow server, but user management only matters if your server has authentication enabled.
+Only superusers can manage user accounts for a Langflow server through the [Users API](/api-users).
For more information, see [Start a Langflow server with authentication enabled](#start-a-langflow-server-with-authentication-enabled).
### LANGFLOW_ENABLE_SIGNUP {#langflow-enable-signup}
@@ -294,7 +295,7 @@ This variable controls whether public self-registration is allowed at the `POST
| Value | Description |
|-------|-------------|
| `True` (default) | Anyone can create a new Langflow account by calling the registration endpoint directly. |
-| `False` | Public registration is disabled. Only superusers can create new accounts through the admin interface. |
+| `False` | Public registration is disabled. Only superusers can create new accounts with the [Users API](/api-users). |
Self-registration is always disabled when `LANGFLOW_AUTO_LOGIN=True`, because single-user mode has no multi-account concept.
Superusers can create accounts regardless of this setting.
@@ -453,18 +454,21 @@ LANGFLOW_CORS_ALLOW_METHODS=["GET","POST","PUT"]
### LANGFLOW_ACCESS_* and LANGFLOW_REFRESH_* {#session-cookie-hardening}
-For a shared or public deployment served over HTTPS, harden the session cookies. These default to values that support local HTTP development and same-site deployments. The current frontend reads the access token in JavaScript, while the refresh token remains `HttpOnly`.
+For a shared or public deployment served over HTTPS, harden the session cookies.
+`Secure` and `SameSite` default to values that support local HTTP development.
+Both the access and refresh cookies are `HttpOnly` by default; the browser sends them automatically with requests.
Set both `LANGFLOW_ACCESS_SECURE` and `LANGFLOW_REFRESH_SECURE` to `True` for HTTPS deployments. Cross-site HTTPS deployments must also set `LANGFLOW_REFRESH_SAME_SITE=none`.
| Variable | Format | Default | Description |
|----------|--------|---------|-------------|
| `LANGFLOW_ACCESS_SECURE` | Boolean | `False` | When `true`, the `access_token_lf` cookie is sent only over HTTPS. Recommended `true` for any HTTPS deployment. |
-| `LANGFLOW_ACCESS_HTTPONLY` | Boolean | `False` | When `true`, the `access_token_lf` cookie is not readable by JavaScript. The default is `false` because the bundled frontend currently reads this cookie in JavaScript. |
+| `LANGFLOW_ACCESS_HTTPONLY` | Boolean | `True` | When `true`, the `access_token_lf` cookie is not readable by JavaScript. Set to `false` only if a client must read this cookie in JavaScript. |
| `LANGFLOW_ACCESS_SAME_SITE` | String | `lax` | The `SameSite` attribute of the access-token cookie (`lax`, `strict`, or `none`). |
| `LANGFLOW_REFRESH_SECURE` | Boolean | `False` | When `true`, the `refresh_token_lf` cookie is sent only over HTTPS. Set this to `true` for any HTTPS deployment. |
| `LANGFLOW_REFRESH_HTTPONLY` | Boolean | `True` | When `true`, the `refresh_token_lf` cookie is not readable by JavaScript. |
| `LANGFLOW_REFRESH_SAME_SITE` | String | `lax` | The `SameSite` attribute of the refresh-token cookie (`lax`, `strict`, or `none`). |
+| `LANGFLOW_COOKIE_DOMAIN` | String | Not set | Domain attribute for the access and refresh cookies. Leave unset for host-only cookies. Set to a parent domain, such as `.example.com`, when the frontend and API are on different subdomains. |
### Anonymous public-flow authorization
@@ -516,6 +520,7 @@ For more information, see [Docker image defaults](/deployment-docker#docker-imag
| `LANGFLOW_BLOCK_CODE_INTERPRETER_COMPONENTS` | Boolean | `False` | When `true`, blocks execution of any flow containing a built-in arbitrary-code-execution component, including the [**Python Interpreter**](/python-interpreter), Python REPL/Code tools, [**Smart Transform**](/smart-transform), [**CSV Agent**](/bundles-langchain#csv-agent), and code-running agents such as [**CodeAct**](/bundles-codeagents#codeact-agent-smolagents), [**CUGA**](/bundles-cuga), and [**OpenDsStar**](/bundles-codeagents#opendstar-agent). |
| `LANGFLOW_RESTRICT_LOCAL_FILE_ACCESS` | Boolean | `False` | When `true`, built-in file-reading components, including the [**File**](/read-file), [**Directory**](/legacy-core-components#legacy-data-components), [**JSON/CSV-to-Data**](/legacy-core-components#legacy-data-components), and the [**CSV Agent**](/bundles-langchain#csv-agent), [**JSON Agent**](/bundles-langchain#legacy-langchain-components), and [**OpenAPI Agent**](/bundles-langchain#openapi-agent) can only read and write paths inside the [`LANGFLOW_CONFIG_DIR`](/memory) storage directory. This also blocks `sqlite` and `duckdb` dialects in the [**SQL Database**](/sql-database) components and local-filesystem Git clones. |
| `LANGFLOW_MCP_SERVER_DOCKER_HARDENING` | Boolean | `False` | When `true`, applies a strict Docker-argument policy to MCP stdio servers that use the `docker` transport. Rejects host filesystem or device mounts, `host/another-container` namespaces, non-default networks, privilege flags, and sandbox-disabling `--security-opt` values. Forms such as `--network none` / `bridge` and `--security-opt no-new-privileges` remain allowed. |
+| `LANGFLOW_TWEAKS_POLICY` | String | `permissive` | Which component fields a run request may set through `tweaks`. For more information, see [Restrict API tweaks](./deployment-tweaks-policy). |
Enable these flags when untrusted users can build flows on this server.
@@ -528,6 +533,9 @@ To enable these flags, set the following:
* `LANGFLOW_BLOCK_CODE_INTERPRETER_COMPONENTS=true`: blocks built-in code-execution components.
* `LANGFLOW_RESTRICT_LOCAL_FILE_ACCESS=true`: confines built-in file access to the upload sandbox.
* `LANGFLOW_MCP_SERVER_DOCKER_HARDENING=true`: tightens Docker MCP server arguments.
+* `LANGFLOW_TWEAKS_POLICY=declared` or `off`: limits which component fields an API caller can override at run time. See [Restrict API tweaks](./deployment-tweaks-policy).
+
+To block named built-in components, starter templates, model providers, or models across the install, use the [catalog and model policy APIs](./api-governance-policy).
Pair these settings with the [SSRF settings](#ssrf-protection) to reduce common escape hatches.
@@ -755,7 +763,7 @@ LANGFLOW_REFRESH_TOKEN_EXPIRE_SECONDS=604800 # 7 days
## Start a Langflow server with authentication enabled {#start-a-langflow-server-with-authentication-enabled}
This section shows you how to use the [authentication environment variables](/api-keys-and-authentication#authentication-environment-variables) to deploy a Langflow server with authentication enabled.
-This involves disabling automatic login, setting superuser credentials, generating a secret encryption key, and enabling user management.
+This involves disabling automatic login, setting superuser credentials, and generating a secret encryption key.
This configuration is recommended for any deployment where Langflow is exposed to a shared or public network, or where multiple users access the same Langflow server.
@@ -766,7 +774,8 @@ For more information, see [Docker image defaults](/deployment-docker#docker-imag
:::
With authentication enabled, all users must sign in to the visual editor with valid credentials, and API requests require authentication with a Langflow API key.
-Additionally, you must sign in as a superuser to manage users and [create a Langflow API key](#create-a-langflow-api-key) with superuser privileges.
+Sign in as a superuser to [create a Langflow API key](#create-a-langflow-api-key) with superuser privileges.
+User management is through the [Users API](/api-users), not the visual editor.
### Start the Langflow server
@@ -778,12 +787,16 @@ Additionally, you must sign in as a superuser to manage users and [create a Lang
LANGFLOW_SUPERUSER_PASSWORD=
LANGFLOW_SECRET_KEY=
LANGFLOW_NEW_USER_IS_ACTIVE=False
+ LANGFLOW_ENABLE_SIGNUP=False
LANGFLOW_ENABLE_SUPERUSER_CLI=False
```
Your `.env` file can have other environment variables.
This example focuses on authentication variables.
+ `LANGFLOW_ENABLE_SIGNUP=False` restricts account creation to superusers.
+ `LANGFLOW_NEW_USER_IS_ACTIVE=False` keeps new accounts inactive until you activate them with the Users API.
+
2. Set `LANGFLOW_SUPERUSER_PASSWORD` to your desired superuser password. Optionally set `LANGFLOW_SUPERUSER` to override the default `langflow` username.
For a one-time test, you can use basic credentials like `administrator` and `password`.
@@ -803,6 +816,7 @@ Additionally, you must sign in as a superuser to manage users and [create a Lang
LANGFLOW_SUPERUSER_PASSWORD=securepassword
LANGFLOW_SECRET_KEY=dBuu...2kM2_fb
LANGFLOW_NEW_USER_IS_ACTIVE=False
+ LANGFLOW_ENABLE_SIGNUP=False
LANGFLOW_ENABLE_SUPERUSER_CLI=False
```
@@ -817,35 +831,170 @@ Additionally, you must sign in as a superuser to manage users and [create a Lang
6. Verify the server is running. The default location is `http://localhost:7860`.
-Next, you can add users to your Langflow server to collaborate with others on flows.
+Next, add users with the Users API so they can collaborate on flows.
### Manage users as an administrator
-1. To complete your first-time login as a superuser, go to `http://localhost:7860/login`.
+As of Langflow 1.12, Langflow OSS has no **Admin Page** in the visual editor.
+Superusers add, activate, list, and delete users, set **Superuser**, and set other users' passwords with `PATCH /api/v1/users/{id}`. For more information, see [Users endpoints](/api-users).
+
+1. To complete your first-time login as a superuser, navigate to `http://localhost:7860/login`.
If you aren't using the default location, replace `localhost:7860` with your server's address.
-2. Log in with the superuser credentials from your `.env`: the `LANGFLOW_SUPERUSER` username, or `langflow` if unset, and the `LANGFLOW_SUPERUSER_PASSWORD` password.
+2. Log in with the password you set in `LANGFLOW_SUPERUSER_PASSWORD` and the username from `LANGFLOW_SUPERUSER`.
+ If you did not set `LANGFLOW_SUPERUSER`, the username is `langflow`.
+
+3. [Create a Langflow API key](#create-a-langflow-api-key) while signed in as the superuser.
+ User-management requests require a Langflow API key in the `x-api-key` header.
+
+4. Create a user:
+
+
+
+
+ ```python
+ import os
+
+ import requests
+
+ base = os.environ["LANGFLOW_URL"]
+ headers = {
+ "Content-Type": "application/json",
+ "x-api-key": os.environ["LANGFLOW_API_KEY"],
+ }
+ payload = {
+ "username": "newuser",
+ "password": "securepassword123",
+ }
+
+ response = requests.post(f"{base}/api/v1/users/", headers=headers, json=payload, timeout=30)
+ response.raise_for_status()
+ print(response.json())
+ ```
+
+
+
+
+ ```typescript
+ const url = `${process.env.LANGFLOW_URL}/api/v1/users/`;
+
+ const response = await fetch(url, {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json",
+ "x-api-key": process.env.LANGFLOW_API_KEY!,
+ },
+ body: JSON.stringify({
+ username: "newuser",
+ password: "securepassword123",
+ }),
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+
+ console.log(await response.json());
+ ```
+
+
+
+
+ ```bash
+ curl -X POST \
+ "$LANGFLOW_URL/api/v1/users/" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{
+ "username": "newuser",
+ "password": "securepassword123"
+ }'
+ ```
+
+
+
+
+ The response includes the user's `id`.
+ New accounts are inactive when `LANGFLOW_NEW_USER_IS_ACTIVE=False` (the default, and the value in the `.env` example above).
-3. To manage users on your server, navigate to `/admin`, such as `http://localhost:7860/admin`, click your profile icon, and then click **Admin Page**.
+5. Activate the account so the user can sign in.
+ Replace `USER_ID` with the `id` from the create response:
- As a superuser, you can add users, set permissions, reset passwords, and delete accounts.
+
+
-4. To add a user, click **New User**, and then complete the user account form:
+ ```python
+ import os
- 1. Enter a username and password.
- 2. To activate the account immediately, select **Active**. Inactive users cannot sign in or access flows they created before becoming inactive.
- 3. Deselect **Superuser** if you don't want the user to have full administrative privileges.
- 4. Click **Save**. The new user appears in the **Admin Page**.
+ import requests
+
+ base = os.environ["LANGFLOW_URL"]
+ user_id = "USER_ID"
+ headers = {
+ "Content-Type": "application/json",
+ "x-api-key": os.environ["LANGFLOW_API_KEY"],
+ }
+ payload = {"is_active": True}
+
+ response = requests.patch(
+ f"{base}/api/v1/users/{user_id}", headers=headers, json=payload, timeout=30
+ )
+ response.raise_for_status()
+ print(response.json())
+ ```
+
+
+
+
+ ```typescript
+ const userId = "USER_ID";
+ const url = `${process.env.LANGFLOW_URL}/api/v1/users/${userId}`;
+
+ const response = await fetch(url, {
+ method: "PATCH",
+ headers: {
+ "Content-Type": "application/json",
+ "x-api-key": process.env.LANGFLOW_API_KEY!,
+ },
+ body: JSON.stringify({ is_active: true }),
+ });
+
+ if (!response.ok) {
+ throw new Error(`HTTP ${response.status}`);
+ }
+
+ console.log(await response.json());
+ ```
+
+
+
+
+ ```bash
+ curl -X PATCH \
+ "$LANGFLOW_URL/api/v1/users/USER_ID" \
+ -H "Content-Type: application/json" \
+ -H "x-api-key: $LANGFLOW_API_KEY" \
+ -d '{
+ "is_active": true
+ }'
+ ```
+
+
+
-5. Send the credentials to the user so they can sign in to Langflow. The superuser sets the initial password when creating the account, so users must receive their login credentials from the superuser.
+ To grant administrative privileges, include `"is_superuser": true` in the same request.
+ To reset another user's password, `PATCH /api/v1/users/{id}` with `"password": ""`. That path does not require the current password. `PATCH /api/v1/users/{id}/reset-password` is self-service: it must be called as that user and requires `current_password`. See [Update user](./api-users#update-user).
+ To list, deactivate, or delete a user, see [Users endpoints](/api-users).
-6. To test the new user's access, sign out of Langflow, and then sign in with the new user's credentials.
+6. Send the username and password to the user.
+ The superuser sets the initial password when creating the account.
- Try to access the `/admin` page.
- You are redirected to the `/flows` page if the new user isn't a superuser.
+7. To test the new user's access, sign out of Langflow, and then sign in at `/login` with the new user's credentials.
+ A non-superuser can use the visual editor and cannot call the Users API to manage other accounts.
## See also
* [Langflow environment variables](/environment-variables)
+* [Users endpoints](/api-users)
* [Langflow Security Policy](https://github.com/langflow-ai/langflow/blob/main/SECURITY.md) — reporting vulnerabilities, security configuration, and [secret key rotation](https://github.com/langflow-ai/langflow/blob/main/SECURITY.md#secret-key-rotation)
diff --git a/docs/docs/Develop/configuration-cli.mdx b/docs/docs/Develop/configuration-cli.mdx
index 73e6a338b2d0..e53861ad6c86 100644
--- a/docs/docs/Develop/configuration-cli.mdx
+++ b/docs/docs/Develop/configuration-cli.mdx
@@ -231,6 +231,41 @@ Use this mode to previews the changes that would be made to the database schema
+### langflow observability doctor {#langflow-observability-doctor}
+
+Sends a probe span, metric, and log to the configured OTLP endpoint and reports what the backend accepted.
+
+This command is also available as `lfx observability doctor`.
+It requires the `OTEL_EXPORTER_OTLP_ENDPOINT` environment variable to be set.
+
+
+
+
+```bash
+uv run langflow observability doctor
+```
+
+
+
+
+```bash
+langflow observability doctor
+```
+
+
+
+
+#### Options
+
+| Option | Default | Type | Description |
+|--------|---------|--------|-------------|
+| `--timeout` | `OTEL_EXPORTER_OTLP_TIMEOUT` or the OpenTelemetry SDK default | Float | Per-export timeout in seconds. Must be greater than 0. |
+
+The doctor also prints whether log message bodies (`LANGFLOW_OTEL_LOG_BODIES`) and database spans (`LANGFLOW_OTEL_DB_SPANS`) are enabled.
+In your backend, search for items named `lfx.observability.doctor`.
+
+For more information, see [OpenTelemetry](./observability-opentelemetry.mdx#verify-your-configuration).
+
### langflow run {#langflow-run}
Starts the Langflow server.
@@ -266,6 +301,7 @@ For more information Langflow configuration options, see [Langflow environment v
| `--cache` | `async` | String | The type of [cache storage](/memory) to use. One of `async`, `redis`, `memory`, or `disk`. |
| `--components-path` | Not set | String | The path to the directory containing your custom components. |
| `--dev` | `--no-dev` (false) | Boolean | Whether to run in development mode (may contain bugs). |
+| `--deployment-profile` | `dev` | String | Deployment profile: `dev` or `prod`. `prod` runs [production preflight](/deployment-prod-best-practices#production-preflight) before the server starts and aborts boot if a required service is missing. |
| `--env-file` | Not set | String | The path to the `.env` file containing Langflow environment variables. See [Start Langflow with a specific .env file](#start-langflow-with-a-specific-env-file). |
| `--frontend-path` | Not set | String | The path to the frontend directory containing build files. This is only used when [contributing to the Langflow codebase](/contributing-how-to-contribute) or developing a custom Langflow image that includes customized frontend code. |
| `--health-check-max-retries` | `5` | Integer | The maximum number of retries for your Langflow server's health check. |
diff --git a/docs/docs/Develop/environment-variables.mdx b/docs/docs/Develop/environment-variables.mdx
index 1a2cf6665130..35d9962e3b3f 100644
--- a/docs/docs/Develop/environment-variables.mdx
+++ b/docs/docs/Develop/environment-variables.mdx
@@ -403,7 +403,10 @@ For multi-worker tuning—including the Redis job queue and Gunicorn worker sett
### Monitoring and metrics
-For environment variables for specific monitoring service providers, see the Langflow monitoring integration guides, such as [Langfuse](/integrations-langfuse) and [Best practices for Langflow on Kubernetes](/deployment-prod-best-practices).
+For OpenTelemetry traces, metrics, and logs that describe Langflow service health, including `LANGFLOW_OTEL_*` and `OTEL_EXPORTER_OTLP_*`, see [OpenTelemetry](./observability-opentelemetry.mdx).
+
+For prompt-level LLM tracing, see [Langfuse](/integrations-langfuse) and the other monitoring integrations.
+For Prometheus on Kubernetes, see [Best practices for Langflow on Kubernetes](/deployment-prod-best-practices).
### Server
@@ -415,6 +418,7 @@ The following environment variables set base Langflow server configuration, such
| `LANGFLOW_PORT` | Integer | `7860` | The port on which the Langflow server runs. The server automatically selects a free port if the specified port is in use. |
| `LANGFLOW_BACKEND_ONLY` | Boolean | `False` | Run only the Langflow backend service (no frontend). |
| `LANGFLOW_DEV` | Boolean | `False` | Whether to run Langflow in development mode (may contain bugs). |
+| `LANGFLOW_DEPLOYMENT_PROFILE` | String | `dev` | Deployment profile. `dev` skips production checks. `prod` runs [production preflight](/deployment-prod-best-practices#production-preflight) before the server starts and aborts boot if a required service is missing. |
| `LANGFLOW_OPEN_BROWSER` | Boolean | `False` | Open the system web browser on startup. |
| `LANGFLOW_HEALTH_CHECK_MAX_RETRIES` | Integer | `5` | Set the maximum number of retries for Langflow's server status health checks. |
| `LANGFLOW_WORKERS` | Integer | `1` | Number of worker processes. See [Deploy Langflow with multiple workers](./deployment-multi-worker#recommended-gunicorn-settings). |
@@ -434,9 +438,44 @@ For file storage environment variables, see [File storage environment variables]
For database environment variables, including PostgreSQL configuration, see [Memory management options](/memory#configure-external-memory).
-### Telemetry
+### Telemetry {#telemetry}
+
+Anonymous product usage telemetry is separate from OpenTelemetry export.
+
+See [Telemetry](/contributing-telemetry) to opt out with `DO_NOT_TRACK`.
+
+### OpenTelemetry {#opentelemetry}
-See [Telemetry](/contributing-telemetry).
+Langflow can export service-health traces, metrics, and logs over OTLP to **your** backend.
+This is not LLM tracing and is not the anonymous product telemetry above.
+
+Set `OTEL_EXPORTER_OTLP_ENDPOINT` to enable export. If it is unset, Langflow installs no providers.
+
+| Variable | Format | Default | Description |
+|----------|--------|---------|-------------|
+| `OTEL_EXPORTER_OTLP_ENDPOINT` | String | Not set | OTLP collector or APM endpoint. Required to enable export. |
+| `LANGFLOW_OTEL_DB_SPANS` | Boolean | `True` | Whether to export SQLAlchemy database spans. Set to `false` to send flow and request spans only. |
+| `LANGFLOW_OTEL_LOG_LEVEL` | String | `INFO` | Minimum severity exported over OTLP. `DEBUG` exports more records (flow inputs and outputs are logged at `DEBUG`) but withholds their bodies unless `LANGFLOW_OTEL_LOG_BODIES=all` is also set. |
+| `LANGFLOW_OTEL_LOG_BODIES` | String | `allowlist` | Set to `all` to export log message bodies, including completions and chat history. |
+
+Standard OpenTelemetry SDK variables such as `OTEL_SERVICE_NAME` and `OTEL_EXPORTER_OTLP_HEADERS` also apply.
+To verify the pipeline, run [`langflow observability doctor`](/configuration-cli#langflow-observability-doctor).
+
+For the full list, what Langflow does and does not export, and vendor setup, see [OpenTelemetry](./observability-opentelemetry.mdx).
+
+### Python Interpreter sandbox {#langflow-sandbox}
+
+These variables control the optional QEMU microVM backend for the [**Python Interpreter** component](/python-interpreter#sandbox).
+They are not included in a default `uv pip install langflow` installation. Install `langflow[sandbox]` first.
+
+| Variable | Format | Default | Description |
+|----------|--------|---------|-------------|
+| `LANGFLOW_SANDBOX_BACKEND` | String | `none` | Execution backend for the code-execution components (Python Interpreter and the legacy Python REPL tool). Set to `exec-sandbox` to run user code in a dedicated QEMU microVM per execution instead of in-process. Requires `uv pip install 'langflow[sandbox]'`, Python 3.12 or later, and QEMU 8+ with hardware virtualization (KVM on Linux, HVF on macOS). When configured but unavailable — including hosts without a hardware hypervisor — execution fails with an error instead of falling back to in-process execution. |
+| `LANGFLOW_SANDBOX_TIMEOUT_SECONDS` | Integer | `30` | Wall-clock limit for one sandboxed execution (1-300 seconds). Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
+| `LANGFLOW_SANDBOX_MEMORY_MB` | Integer | `192` | Guest VM memory for sandboxed executions, in MB (minimum 128). Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
+| `LANGFLOW_SANDBOX_ALLOW_NETWORK` | Boolean | `False` | Whether sandboxed code may access the network. The default runs the microVM fully offline. When enabled without `LANGFLOW_SANDBOX_ALLOWED_DOMAINS`, only exec-sandbox's package-registry defaults (PyPI) are reachable. Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
+| `LANGFLOW_SANDBOX_ALLOWED_DOMAINS` | String | Not set | Comma-separated list of domains sandboxed code may reach when network access is enabled. Treat like an SSRF allow-list: prefer narrow, fully-qualified domains. Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
+| `LANGFLOW_SANDBOX_ALLOW_SOFTWARE_EMULATION` | Boolean | `False` | Permit the sandbox to run without a hardware hypervisor, letting QEMU fall back to TCG software emulation. Upstream documents TCG as not security-supported, so enable only for trusted/development workloads. Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
### Visual editor and Playground behavior
@@ -458,12 +497,8 @@ See [Telemetry](/contributing-telemetry).
| `LANGFLOW_BLOCK_CODE_INTERPRETER_COMPONENTS` | Boolean | `False` | If `true`, blocks built-in code-execution components (Python Interpreter, REPL/Code tools, Smart Transform, and code-running agents). See [Component hardening for untrusted users](/api-keys-and-authentication#multi-tenant-component-hardening). |
| `LANGFLOW_RESTRICT_LOCAL_FILE_ACCESS` | Boolean | `False` | If `true`, confines built-in file components to the upload storage directory and blocks local-file SQL dialects and local Git clones. See [Component hardening for untrusted users](/api-keys-and-authentication#multi-tenant-component-hardening). |
| `LANGFLOW_MCP_SERVER_DOCKER_HARDENING` | Boolean | `False` | If `true`, applies a strict Docker-argument policy to MCP stdio servers that use the `docker` transport. See [Component hardening for untrusted users](/api-keys-and-authentication#multi-tenant-component-hardening). |
-| `LANGFLOW_SANDBOX_BACKEND` | String | `none` | Execution backend for the code-execution components (Python Interpreter and the legacy Python REPL tool). Set to `exec-sandbox` to run user code in a dedicated QEMU microVM per execution instead of in-process. Requires `pip install 'langflow[sandbox]'`, Python 3.12 or later, and QEMU 8+ with hardware virtualization (KVM on Linux, HVF on macOS). When configured but unavailable — including hosts without a hardware hypervisor — execution fails with an error instead of falling back to in-process execution. |
-| `LANGFLOW_SANDBOX_TIMEOUT_SECONDS` | Integer | `30` | Wall-clock limit for one sandboxed execution (1-300 seconds). Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
-| `LANGFLOW_SANDBOX_MEMORY_MB` | Integer | `192` | Guest VM memory for sandboxed executions, in MB (minimum 128). Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
-| `LANGFLOW_SANDBOX_ALLOW_NETWORK` | Boolean | `False` | Whether sandboxed code may access the network. The default runs the microVM fully offline. When enabled without `LANGFLOW_SANDBOX_ALLOWED_DOMAINS`, only exec-sandbox's package-registry defaults (PyPI) are reachable. Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
-| `LANGFLOW_SANDBOX_ALLOWED_DOMAINS` | String | Not set | Comma-separated list of domains sandboxed code may reach when network access is enabled. Treat like an SSRF allow-list: prefer narrow, fully-qualified domains. Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
-| `LANGFLOW_SANDBOX_ALLOW_SOFTWARE_EMULATION` | Boolean | `False` | Permit the sandbox to run without a hardware hypervisor, letting QEMU fall back to TCG software emulation. Upstream documents TCG as not security-supported, so enable only for trusted/development workloads. Only used when `LANGFLOW_SANDBOX_BACKEND` is not `none`. |
+| `LANGFLOW_MCP_SERVER_ENV_ALLOWLIST` | String | Not set | Comma-separated allowlist of environment-variable names an MCP stdio config may set. Production preflight warns when this is unset. An empty value blocks all tenant-supplied environment variables. See [MCP server environment variables](/mcp-server#mcp-server-environment-variables). |
+| `LANGFLOW_TWEAKS_POLICY` | String | `permissive` | Which component fields a run request may set through `tweaks`. For more information, see [Restrict API tweaks](./deployment-tweaks-policy). |
| `LANGFLOW_LOAD_FLOWS_PATH` | String | Not set | Path to a directory containing flow JSON files to be loaded on startup. Typically used when creating a Docker image with prepackaged flows. Requires `LANGFLOW_AUTO_LOGIN=True`. |
| `LANGFLOW_LOAD_FLOWS_OVERWRITE_ON_NAME_MATCH` | Boolean | `False` | When a flow file in `LANGFLOW_LOAD_FLOWS_PATH` shares a name with an existing DB row but has a different `id`, controls whether to overwrite the existing row. `False` (default) skips with a warning so UI edits are preserved on restart when file UUIDs regenerate. Set to `True` to opt into prepackaged-flows-are-source-of-truth semantics, typically for CI/CD pipelines. |
| `LANGFLOW_LOAD_FLOWS_PRESERVE_VARIABLE_BINDINGS` | Boolean | `True` | Preserve global-variable bindings configured in the visual editor when an existing flow is reloaded from `LANGFLOW_LOAD_FLOWS_PATH`. Bindings explicitly configured in the flow file still take precedence. Set to `False` to restore blind replacement of the flow data on restart. |
diff --git a/docs/docs/Develop/install-custom-dependencies.mdx b/docs/docs/Develop/install-custom-dependencies.mdx
index 0878a211f4ba..b0ab50e8b641 100644
--- a/docs/docs/Develop/install-custom-dependencies.mdx
+++ b/docs/docs/Develop/install-custom-dependencies.mdx
@@ -7,8 +7,8 @@ Langflow provides optional dependency groups and support for custom dependencies
The Langflow codebase uses three package layers:
-* The full package (`langflow`) is managed by the root-level `pyproject.toml`. It depends on `langflow-base` and adds the curated standalone `lfx-*` provider extensions.
-* The runnable base package (`langflow-base`) is managed at `src/backend/base/pyproject.toml`. It provides the UI, API, platform services, and built-in components without provider extension distributions. It depends on `lfx`.
+* The minimal application (`langflow-base`) is managed at `src/backend/base/pyproject.toml`. As of Langflow 1.12, it is a complete Langflow install: UI, API, platform services, built-in components, and the `langflow` command, without provider extensions. It is version-aligned with `langflow`, and depends on `lfx`. There is no `langflow-core` package.
+* The full package (`langflow`) is managed by the root-level `pyproject.toml`. It depends on the same `langflow-base` version and adds the curated standalone `lfx-*` provider extensions.
* The `lfx` package is managed at `src/lfx/pyproject.toml`. LFX is a lightweight CLI tool for executing and serving Langflow flows. The `lfx` package does not provide optional dependency groups for end users.
## Install custom dependencies in Langflow Desktop {#langflow-desktop}
@@ -54,9 +54,9 @@ To install multiple extras, use commas to separate each dependency group:
uv pip install "langflow[postgresql,audio]"
```
-Use the `bundles` extra to install every no-Torch long-tail bundle plus the
-arXiv, DuckDuckGo, EmpirioLabs, Exa, Firecrawl, NextPlaid, Paddle, and Valkey
-standalone extensions:
+Use the `bundles` extra to install the non-PyTorch providers from `lfx-bundles` plus the
+opt-in standalone packages listed in
+[Additional bundles](/extensions-bundle-list#additional-bundles):
```bash
uv pip install "langflow[bundles]"
@@ -64,11 +64,11 @@ uv pip install "langflow[bundles]"
### Install optional dependency groups for `langflow-base`
-`langflow-base` is recommended when you want the runnable Langflow UI and API
-without provider extensions. It includes platform services such as Redis,
-Chroma, MCP, Kubernetes, object storage, and tracing support. The `langflow`
-package depends on this same version of `langflow-base` and adds curated
-standalone extensions.
+`langflow-base` is the minimal workable Langflow: the UI, API, platform
+services, and built-in components, without provider extensions. It is
+version-aligned with `langflow` starting with version 1.12.0. It includes platform services such as Redis, Chroma, MCP, Kubernetes, object storage, and
+tracing support. The `langflow` package depends on this same version of
+`langflow-base` and adds curated standalone extensions.
The `langflow-base` package provides its own optional dependency groups that are separate from those in the `langflow` package. The `langflow-base` package can be installed as a standalone package with these optional dependency groups.
diff --git a/docs/docs/Develop/knowledge.mdx b/docs/docs/Develop/knowledge.mdx
index c5008892243e..af3f197276d2 100644
--- a/docs/docs/Develop/knowledge.mdx
+++ b/docs/docs/Develop/knowledge.mdx
@@ -30,6 +30,11 @@ Alternatively, you can use [knowledge bases](#knowledge-bases), which include bu
Vector store components read and write to vector databases.
Typically, these components connect to remote databases, but some vector store components support local databases.
+As of Langflow 1.12, most vector store bundles, including the **Chroma DB** component in the visual editor, are not in the default Langflow installation.
+Knowledge bases still use local Chroma storage in the default installation.
+You will have to install any additional vector store providers.
+FOr more information, see [Additional bundles](/extensions-bundle-list#additional-bundles).
+
import PartialVectorRagBlurb from '@site/docs/_partial-vector-rag-blurb.mdx';
diff --git a/docs/docs/Develop/logging.mdx b/docs/docs/Develop/logging.mdx
index 333f40474dcf..a18a06596d04 100644
--- a/docs/docs/Develop/logging.mdx
+++ b/docs/docs/Develop/logging.mdx
@@ -44,7 +44,7 @@ To customize log storage locations and behaviors, set the following [Langflow en
| `LANGFLOW_LOG_TRACE_LOCALS` | Boolean | `false` | Include frame locals in structured tracebacks. Off by default because locals can leak secrets; enable only for local debugging. |
| `LANGFLOW_NATIVE_TRACING` | Boolean | `true` | Enables the tracer to record execution traces in the Langflow database for use in Trace View. Set to `false` to disable. |
| `LANGFLOW_PRETTY_LOGS` | Boolean | `True` | Controls output format when `LANGFLOW_LOG_ENV=default` or unset. `true`: [`ConsoleRenderer`](https://www.structlog.org/en/stable/console-output.html) (human-readable). `false`: JSON format. |
-| `LANGFLOW_SERVICE_NAME` | String | `langflow` | Value of the `service` field on every JSON log record. Used as a label by log aggregators. See [Grafana and Loki](./observability-grafana-loki.mdx). |
+| `LANGFLOW_SERVICE_NAME` | String | `langflow` | Value of the `service` field on every JSON log record. Used as a label by log aggregators. See [Grafana Loki](./observability-grafana-loki.mdx). |
| `LANGFLOW_VERSION` | String | Not set | Adds a `version` field to every JSON log record when set. Omitted otherwise. |
## View logs in real-time
@@ -264,8 +264,8 @@ If `opentelemetry-api` is installed and an active span is present, every log rec
## See also
-* [Grafana and Loki](./observability-grafana-loki.mdx)
+* [Grafana Loki](./observability-grafana-loki.mdx)
* [Logs endpoints](/api-logs)
* [Memory management options](/memory)
* [Configure an external PostgreSQL database](/configuration-custom-database)
-* [Grafana and Loki](./observability-grafana-loki.mdx)
\ No newline at end of file
+* [Grafana Loki](./observability-grafana-loki.mdx)
\ No newline at end of file
diff --git a/docs/docs/Develop/observability-grafana-loki.mdx b/docs/docs/Develop/observability-grafana-loki.mdx
index d041030bff23..b2948a1b8ae5 100644
--- a/docs/docs/Develop/observability-grafana-loki.mdx
+++ b/docs/docs/Develop/observability-grafana-loki.mdx
@@ -1,13 +1,18 @@
---
-title: Grafana and Loki
+title: Grafana Loki
slug: /observability-grafana-loki
---
-Langflow can emit structured JSON logs for ingestion by [Grafana Loki](https://grafana.com/oss/loki/).
+This demonstration scrapes Langflow log files with [Grafana Alloy](https://grafana.com/oss/alloy/), and then sends JSON logs to [Grafana Loki](https://grafana.com/oss/loki/) to be viewed in a Grafana dashboard.
+
+It is _not_ OpenTelemetry.
+For traces, metrics, and OTLP logs to Grafana Cloud or an OpenTelemetry Collector, see [OpenTelemetry](./observability-opentelemetry.mdx).
This page demonstrates how to connect Langflow to the [reference Grafana stack](https://github.com/langflow-ai/langflow/tree/main/deploy/observability/grafana-loki) shipped with the Langflow repository.
For more information, see the [README](https://github.com/langflow-ai/langflow/tree/main/deploy/observability/grafana-loki).
+Grafana Alloy replaced [Promtail](https://grafana.com/docs/alloy/latest/set-up/migrate/from-promtail/), which reached end of life on March 2, 2026.
+
To consume structured Langflow logs with other ingestion providers, see [Logs](/logging).
## Prerequisites
@@ -31,9 +36,9 @@ To consume structured Langflow logs with other ingestion providers, see [Logs](/
Setting `LANGFLOW_LOG_ENV=container` switches structlog's terminal processor to [`JSONRenderer`](https://www.structlog.org/en/stable/api.html#structlog.processors.JSONRenderer), so every line written to stdout is a JSON object containing the event message, level, timestamp, logger name, exception structure, and service metadata. For more information, see [Logs](/logging).
- The shipped Promtail configuration scrapes `*.log` files from a directory rather than stdout. `LANGFLOW_LOG_FILE` must point at a file inside the directory that Promtail watches. Set `LANGFLOW_LOG_DIR` to that same directory so Langflow creates the file in the right place.
+ The shipped Alloy configuration scrapes `*.log` files from a directory rather than stdout. `LANGFLOW_LOG_FILE` must point at a file inside the directory that Alloy watches. Set `LANGFLOW_LOG_DIR` to that same directory so Langflow creates the file in the right place.
-3. Start the reference Loki + Promtail + Grafana stack from the repository:
+3. Start the reference Loki + Alloy + Grafana stack from the repository:
```bash
cd deploy/observability/grafana-loki
@@ -53,5 +58,6 @@ To consume structured Langflow logs with other ingestion providers, see [Logs](/
## See also
+* [OpenTelemetry](./observability-opentelemetry.mdx)
* [Logs](/logging)
* [Logs endpoints](/api-logs)
diff --git a/docs/docs/Develop/observability-new-relic.mdx b/docs/docs/Develop/observability-new-relic.mdx
index 87cbe6caad22..e6d4d670542b 100644
--- a/docs/docs/Develop/observability-new-relic.mdx
+++ b/docs/docs/Develop/observability-new-relic.mdx
@@ -1,7 +1,6 @@
---
title: New Relic
slug: /observability-new-relic
-description: Export Langflow traces, metrics, and logs to New Relic over OTLP, and verify the data actually landed.
---
New Relic accepts OpenTelemetry data over OTLP, so Langflow exports to it with configuration only and no vendor code.
diff --git a/docs/docs/Develop/observability-opentelemetry.mdx b/docs/docs/Develop/observability-opentelemetry.mdx
index c0efce8c7747..62672148f667 100644
--- a/docs/docs/Develop/observability-opentelemetry.mdx
+++ b/docs/docs/Develop/observability-opentelemetry.mdx
@@ -1,14 +1,13 @@
---
title: OpenTelemetry
slug: /observability-opentelemetry
-description: Export Langflow service health, flow execution spans, and runtime metrics to any OpenTelemetry backend.
---
Langflow emits OpenTelemetry traces, metrics, and logs describing the health of the Langflow service itself: request rate, error rate, duration, runtime health, and one span per flow run.
This telemetry answers operator questions, such as which flows are failing, whether the service is slow, and where the time went. It is not LLM tracing. Langflow deliberately withholds prompts, completions, and other flow payloads from this export. For prompt-level tracing, use one of the [monitoring integrations](/integrations-langfuse) instead.
-There is no vendor code in the Langflow runtime. Langflow speaks plain OTLP, so any OpenTelemetry-compatible backend works, either directly or through an OpenTelemetry Collector.
+Langflow speaks plain OTLP, so any OpenTelemetry-compatible backend works, either directly or through an OpenTelemetry Collector.
## Prerequisites
@@ -86,8 +85,8 @@ Two settings widen this, and both warn when set:
| Variable | Effect |
|----------|--------|
-| `LANGFLOW_OTEL_LOG_LEVEL=DEBUG` | Exports `DEBUG` records. Langflow logs flow inputs and outputs at `DEBUG`, so prompt and completion content reaches your backend. |
-| `LANGFLOW_OTEL_LOG_BODIES=all` | Exports log message bodies, including completions, chat history, and provider error text. |
+| `LANGFLOW_OTEL_LOG_LEVEL=DEBUG` | Exports `DEBUG` records. Langflow logs flow inputs and outputs at `DEBUG`, so this raises export volume. Prompt and completion **bodies** stay withheld unless `LANGFLOW_OTEL_LOG_BODIES=all` is also set. |
+| `LANGFLOW_OTEL_LOG_BODIES=all` | Exports log message bodies, including completions, chat history, and provider error text. With `LANGFLOW_OTEL_LOG_LEVEL=DEBUG`, prompt and completion content reaches your backend. |
## Control span volume
@@ -140,8 +139,7 @@ Langflow only sets that variable when it is unset, so a value you provide always
## Vendor guides
-- [New Relic](./observability-new-relic.mdx)
-- [Grafana and Loki](/observability-grafana-loki)
+- [New Relic](./observability-new-relic.mdx) — OTLP export to New Relic.
## See also
diff --git a/docs/docs/Flows/concepts-publish.mdx b/docs/docs/Flows/concepts-publish.mdx
index da92928520a4..d97eb273b947 100644
--- a/docs/docs/Flows/concepts-publish.mdx
+++ b/docs/docs/Flows/concepts-publish.mdx
@@ -117,6 +117,10 @@ curl --request POST \
}'
```
+Marking a field **API** only adds it to generated snippets.
+The server still accepts other `tweaks` unless you set `LANGFLOW_TWEAKS_POLICY`.
+For more information, see [Restrict API tweaks](./deployment-tweaks-policy).
+
### Use a flow ID alias
If you want your requests to use an alias instead of the actual flow ID, you can rename the flow's `/v1/run/$FLOW_ID` endpoint:
diff --git a/docs/docs/Lfx/extensions-bundle-list.mdx b/docs/docs/Lfx/extensions-bundle-list.mdx
index e453feaa7549..872cbab830ce 100644
--- a/docs/docs/Lfx/extensions-bundle-list.mdx
+++ b/docs/docs/Lfx/extensions-bundle-list.mdx
@@ -3,6 +3,8 @@ title: Bundle list
slug: /extensions-bundle-list
---
+import PartialOptInBundles from '@site/docs/_partial-opt-in-bundles.mdx';
+
This page lists every official Langflow bundle and the pip **extension** package that ships it.
Bundle names are stable identifiers used in saved flows (`ext::@official`).
The pip install command is what you run when a bundle is missing from your environment.
@@ -10,45 +12,57 @@ The pip install command is what you run when a bundle is missing from your envir
This list reflects the bundles included with Langflow 1.12.0.
Providers can graduate from `lfx-bundles` to a standalone `lfx-` package without changing the bundle name in your flows.
-## Standalone packages
+## Additional bundles {#additional-bundles}
+
+
+
+## Standalone packages included by default
These providers ship as their own pip packages, each on its own release cadence.
-The default `uv pip install langflow` includes the curated standalone packages
-except arXiv, DuckDuckGo, EmpirioLabs, Exa, Firecrawl, NextPlaid, Paddle, and
-Valkey. Install those eight together with every no-Torch long-tail bundle by
-using `uv pip install "langflow[bundles]"`.
+The default `uv pip install langflow` includes the following curated standalone packages.
| Bundle | Install command |
| --- | --- |
| [`amazon`](/bundles-amazon) (Amazon) | `uv pip install lfx-amazon` |
| [`anthropic`](/bundles-anthropic) (Anthropic) | `uv pip install lfx-anthropic` |
-| [`arxiv`](/bundles-arxiv) (arXiv) | `uv pip install lfx-arxiv` |
| [`azure`](/bundles-azure) (Azure) | `uv pip install lfx-azure` |
| [`cohere`](/bundles-cohere) (Cohere) | `uv pip install lfx-cohere` |
| [`datastax`](/bundles-datastax) (DataStax) | `uv pip install lfx-datastax` |
| [`docling`](/bundles-docling) (Docling) | `uv pip install lfx-docling` |
-| [`duckduckgo`](/bundles-duckduckgo) (DuckDuckGo) | `uv pip install lfx-duckduckgo` |
-| [`empiriolabs`](./bundles-empiriolabs) (EmpirioLabs) | `uv pip install lfx-empiriolabs` |
-| [`exa`](/bundles-exa) (Exa) | `uv pip install lfx-exa` |
-| [`firecrawl`](/bundles-firecrawl) (Firecrawl) | `uv pip install lfx-firecrawl` |
| [`google`](/bundles-google) (Google components) | `uv pip install lfx-google` |
| [`ibm`](/bundles-ibm) (IBM) | `uv pip install lfx-ibm` |
-| [`nextplaid`](./bundles-nextplaid) (NextPlaid) | `uv pip install lfx-nextplaid` |
| [`ollama`](/bundles-ollama) (Ollama) | `uv pip install lfx-ollama` |
| [`openai`](/bundles-openai) (OpenAI) | `uv pip install lfx-openai` |
-| [`openai-compatible`](./bundles-openai-compatible) (OpenAI Compatible) | `uv pip install lfx-openai-compatible` |
-| [`oracle`](./bundles-oracle) (Oracle) | `uv pip install lfx-oracle` |
-| [`paddle`](./bundles-paddle) (Paddle) | `uv pip install lfx-paddle` |
-| [`valkey`](./bundles-valkey) (Valkey) | `uv pip install lfx-valkey` |
+| [`openai-compatible`](/bundles-openai-compatible) (OpenAI Compatible) | `uv pip install lfx-openai-compatible` |
+| [`oracle`](/bundles-oracle) (Oracle) | `uv pip install lfx-oracle` |
| [`vllm`](/bundles-vllm) (vLLM) | `uv pip install lfx-vllm` |
-## Long-tail bundles (`lfx-bundles`)
+## Opt-in standalone packages
+
+These providers are available as standalone `lfx-*` packages, but they are **not** included in `uv pip install langflow`.
+Install one package, or install all of them together with the non-PyTorch providers in `lfx-bundles` by using
+`uv pip install "langflow[bundles]"`.
+
+| Bundle | Install command |
+| --- | --- |
+| [`arxiv`](/bundles-arxiv) (arXiv) | `uv pip install lfx-arxiv` |
+| [`confluent`](./bundles-confluent) (IBM Confluent) | `uv pip install lfx-confluent` |
+| [`duckduckgo`](/bundles-duckduckgo) (DuckDuckGo) | `uv pip install lfx-duckduckgo` |
+| [`empiriolabs`](/bundles-empiriolabs) (EmpirioLabs) | `uv pip install lfx-empiriolabs` |
+| [`exa`](/bundles-exa) (Exa) | `uv pip install lfx-exa` |
+| [`firecrawl`](/bundles-firecrawl) (Firecrawl) | `uv pip install lfx-firecrawl` |
+| [`nextplaid`](/bundles-nextplaid) (NextPlaid) | `uv pip install lfx-nextplaid` |
+| [`paddle`](/bundles-paddle) (Paddle) | `uv pip install lfx-paddle` |
+| [`valkey`](/bundles-valkey) (Valkey) | `uv pip install lfx-valkey` |
+
+## Providers in `lfx-bundles` {#lfx-bundles}
+
+These providers do not have their own `lfx-` package.
+
+To install one provider and its SDK, run `uv pip install "lfx-bundles[]"`.
+To install every provider in `lfx-bundles`, run `uv pip install "lfx[bundles]"`.
-These providers ship inside the `lfx-bundles` metapackage.
-Install one provider (with its SDK dependencies) with `uv pip install "lfx-bundles[]"`.
-Install every long-tail provider with `uv pip install "lfx[bundles]"` or `uv pip install "lfx-bundles[all]"`.
-Install every no-Torch long-tail provider plus the eight opt-in standalone packages listed above with `uv pip install "langflow[bundles]"`.
-Bare `uv pip install lfx-bundles` registers the provider code only; add a per-provider extra when you need that provider's third-party SDK.
+To install every provider, including providers that require PyTorch as a dependency, run `uv pip install "lfx-bundles[all]"`.
| Bundle | Install command |
| --- | --- |
@@ -95,6 +109,7 @@ Bare `uv pip install lfx-bundles` registers the provider code only; add a per-pr
| [`nvidia`](/bundles-nvidia) (NVIDIA) | `uv pip install "lfx-bundles[nvidia]"` |
| `olivya` | `uv pip install "lfx-bundles[olivya]"` |
| [`openrouter`](/bundles-openrouter) (OpenRouter) | `uv pip install "lfx-bundles[openrouter]"` |
+| [`orcarouter`](./bundles-orcarouter) (OrcaRouter) | `uv pip install "lfx-bundles[orcarouter]"` |
| [`perplexity`](/bundles-perplexity) (Perplexity) | `uv pip install "lfx-bundles[perplexity]"` |
| [`pgvector`](/bundles-pgvector) (pgvector) | `uv pip install "lfx-bundles[pgvector]"` |
| [`pinecone`](/bundles-pinecone) (Pinecone) | `uv pip install "lfx-bundles[pinecone]"` |
diff --git a/docs/docs/Lfx/extensions-overview.mdx b/docs/docs/Lfx/extensions-overview.mdx
index 3878520b0e2e..99f4537d526a 100644
--- a/docs/docs/Lfx/extensions-overview.mdx
+++ b/docs/docs/Lfx/extensions-overview.mdx
@@ -12,6 +12,8 @@ This bundle is the same group that related components are listed under in the vi
Instead of every integration being built into `langflow`, you install the extensions you need. Saved flows reference bundles by stable IDs (`ext::@official`), not by pip package name, so a provider can move between packages without breaking your flows.
+Starting in Langflow 1.12, the default `uv pip install langflow` installation includes only a curated list of providers. For more information, see [Additional bundles](/extensions-bundle-list#additional-bundles).
+
To install extensions and bundle components, see [Install LFX with bundle components](./lfx-install#install-with-bundle-components).
To build your own extension, see [Build your first extension](./extensions-quickstart).
diff --git a/docs/docs/Lfx/lfx-compatibility.mdx b/docs/docs/Lfx/lfx-compatibility.mdx
index 671d0555feef..b0404f98b6de 100644
--- a/docs/docs/Lfx/lfx-compatibility.mdx
+++ b/docs/docs/Lfx/lfx-compatibility.mdx
@@ -107,16 +107,17 @@ Going forward, pin with `lfx~=1.10.0` so you receive compatible patches without
## Engine-only LFX and `lfx[bundles]`
`pip install lfx` installs the engine only — no component bundles.
-For headless or serverless deployments that execute flows using provider components without the full Langflow server, install the long-tail bundle package alongside the engine:
+For headless or serverless deployments that execute flows using provider components without the full Langflow server, install `lfx-bundles` alongside the engine:
```bash
uv pip install "lfx[bundles]"
```
-This is equivalent to installing `lfx` plus `lfx-bundles[all]`, including the torch-pulling long-tail providers **CUGA** and **Code Agents**.
-It does **not** install graduated standalone packages such as `lfx-openai` or `lfx-exa`.
+This is equivalent to installing `lfx` plus `lfx-bundles[all]`, including the PyTorch-based providers **CUGA** and **Code Agents**.
+It does **not** install standalone packages such as `lfx-openai` or `lfx-exa`.
`uv pip install langflow` installs the curated standalone `lfx-*` packages without `lfx-bundles`.
-Use `uv pip install "langflow[bundles]"` to add the reviewed `lfx-bundles[all-no-torch]` profile plus the opt-in arXiv, DuckDuckGo, EmpirioLabs, Exa, Firecrawl, NextPlaid, Paddle, and Valkey standalone packages while keeping the full Langflow application torch-free.
+Use `uv pip install "langflow[bundles]"` to add the `lfx-bundles[all-no-torch]` profile plus the opt-in standalone packages while keeping the full Langflow application torch-free.
+For the providers omitted from the default install, see [Additional bundles](/extensions-bundle-list#additional-bundles).
For a slimmer image, install only the provider packages a deployment actually executes, for example `uv pip install lfx lfx-openai "lfx-bundles[qdrant]"`.
-There is intentionally no `lfx[all]` extra. Install `lfx-bundles` explicitly for long-tail providers, or install only the provider extras you need to avoid the full torch-inclusive `[all]` set.
+There is intentionally no `lfx[all]` extra. Install `lfx-bundles` explicitly, or install only the provider extras you need to avoid the full torch-inclusive `[all]` set.
Some components require a [torch opt-in install](./components-bundle-components#torch-opt-in).
diff --git a/docs/docs/Lfx/lfx-overview.mdx b/docs/docs/Lfx/lfx-overview.mdx
index 1d7602b3aa44..3babd25a64d4 100644
--- a/docs/docs/Lfx/lfx-overview.mdx
+++ b/docs/docs/Lfx/lfx-overview.mdx
@@ -39,6 +39,7 @@ LFX provides two sets of commands:
| [`lfx run`](./lfx-run) | Execute a flow locally and stream results to `stdout` |
| [`lfx prewarm`](./lfx-prewarm) | Pre-warm core component imports and optional flows before a fork or snapshot |
| [`lfx-mcp`](./lfx-mcp) | Start an MCP server that connects to a running Langflow instance |
+| `lfx observability doctor` | Send a probe span, metric, and log to the configured OTLP endpoint. See [OpenTelemetry](./observability-opentelemetry#verify-your-configuration). |
For the LFX runtime commands, see [Run flows with LFX](./lfx-run) and [Serve flows with LFX](./lfx-serve).
diff --git a/docs/docs/Support/release-notes.mdx b/docs/docs/Support/release-notes.mdx
index 0518d9f34475..765bb1b744c5 100644
--- a/docs/docs/Support/release-notes.mdx
+++ b/docs/docs/Support/release-notes.mdx
@@ -48,290 +48,89 @@ To avoid the impact of potential breaking changes and test new versions, the Lan
## 1.12.x
-Langflow 1.12 consolidates the runnable application on `langflow-base`.
-`pip install langflow-base` now provides the UI, API, platform services, built-in
-components, and the `langflow` command without provider extension
-distributions. `pip install langflow` installs that same base version and adds
-the curated standalone `lfx-*` extensions.
+Highlights of this release include the following changes. For all changes, see the [Changelog](https://github.com/langflow-ai/langflow/releases/latest).
### Breaking changes
-- `langflow-base` version alignment
+- `langflow-base` is now the minimal install
- The runnable package starts at `langflow-base==1.12.0` and remains
- version-aligned with `langflow` through stable, release-candidate, patch,
- and nightly releases. A dependency such as `langflow-base~=0.12` remains on
- the old package line and must be updated explicitly to select 1.12.
- Before upgrading an existing environment, remove the retired package with
- `pip uninstall langflow-core`; leaving an older `langflow-core` installed
- can create conflicting dependency requirements.
+ Langflow 1.12 makes `langflow-base` a complete, version-aligned installation of the Langflow application.
-- Base command and image tags
+- Ongoing breaking change: bundle separation
- The base package provides the `langflow` executable, not a
- `langflow-base` executable. The canonical bundle-free container is
- `langflowai/langflow:base-VERSION`; normal `langflowai/langflow:VERSION`
- tags contain the curated distribution. The previous `core-*` image profile
- is no longer published.
+ Bundle separation concludes in 1.12.
+ `uv pip install langflow` no longer installs all provider bundles, and includes only a curated list of providers.
-- Cassandra and Policies components are extensions
+ For more information, see [Additional bundles](extensions-bundle-list#additional-bundles).
- Cassandra components now ship in `lfx-datastax`, and the
- `PoliciesComponent` ships in `lfx-toolguard`. The full `langflow` package
- includes both. Existing component class names and legacy Python import
- paths remain compatible. For a base-only environment, add the extensions
- with `pip install "lfx[cassandra,toolguard]"`.
- Policies guard caches are now isolated under
- `tmp_toolguard/{user}/{flow}/{component}/{project}`. Existing project-only
- caches are not reused after upgrading; run **Generate** once before using
- **Guard** in an upgraded flow.
+- Admin Page removed
-- The default `langflow` provider set is smaller
+ Langflow OSS no longer includes an **Admin Page**.
+ The `/admin` route, the account-menu **Admin Page** link, and the user-management page are gone.
+ Superusers can no longer manage users or passwords in the visual editor.
- arXiv, DuckDuckGo, EmpirioLabs, Exa, Firecrawl, NextPlaid, Paddle, and
- Valkey are no longer installed by plain `pip install langflow`. Use
- `pip install "langflow[bundles]"` to add those standalone extensions
- together with every no-Torch long-tail bundle.
+ To manage users, use the [Users API](/api-users).
+ `/login/admin` is still the admin sign-in endpoint and page.
-- PyTorch remains opt-in
+ For more information, see [Manage users as an administrator](/api-keys-and-authentication#manage-users-as-an-administrator).
- The default base and curated Langflow installations do not install PyTorch
- or TorchVision. Components that require them must be installed through an
- explicit opt-in profile.
+### New features
-- IBM watsonx Orchestrate clients move to the IBM extension
+- OpenTelemetry export
- The base deployment adapter remains feature-flagged, but its client
- dependencies now ship with `lfx-ibm`. Install `lfx-ibm` or use the
- compatibility extra `langflow-base[ibm-watsonx-clients]` before enabling
- the adapter in a base-only environment.
+ Langflow can export health traces, metrics, and logs over OTLP to your own backend.
-- LiteLLM remains optional in base-only environments
+ For more information, see [OpenTelemetry](./observability-opentelemetry), [New Relic](./observability-new-relic), and [Instana](./observability-instana).
- `langflow-base` no longer imports LiteLLM by default. Install
- `langflow-base[litellm]` when custom components or IDE tooling depend on
- the LiteLLM compatibility surface.
+- Python Interpreter microVM sandbox
-## 1.11.x
-
-Highlights of this release include the following changes.
-For all changes, see the [Changelog](https://github.com/langflow-ai/langflow/releases).
-
-:::tip
-If Langflow fails to start with a `get_body_field` error after installing version 1.11.0, see [`get_body_field` error after installing Langflow](/troubleshoot#get_body_field-error-after-installing-langflow).
-:::
-
-### Breaking changes
-
-- Short `LANGFLOW_SECRET_KEY` upgrade compatibility
-
- Langflow 1.10.1 changed how secrets shorter than 32 characters derive the Fernet key used for encrypted credentials.
- Langflow 1.11.x retains read compatibility with credentials encrypted by the earlier derivation while continuing to use the current SHA-256 derivation for all new writes.
-
- If your deployment uses a `LANGFLOW_SECRET_KEY` shorter than 32 characters, keep it unchanged during the initial upgrade so Langflow can continue to decrypt existing credentials.
- Langflow logs a startup warning for this configuration because short secrets aren't recommended for production.
- To replace the key, first record or export the stored credentials, set a randomly generated key of at least 32 characters, and then re-enter the credentials; changing the key directly invalidates ciphertext created with the old key.
+ Set `LANGFLOW_SANDBOX_BACKEND=exec-sandbox` to run the [**Python Interpreter** component](/python-interpreter) in a dedicated [QEMU microVM](https://www.qemu.org/docs/master/system/i386/microvm.html) instead of in the Langflow server process.
+ The microVM is not included in a default `uv pip install langflow` installation.
+ To install it, run `uv pip install 'langflow[sandbox]'`.
-- Default superuser password removed
+ For more information, see [Isolate executions in a microVM](/python-interpreter#sandbox).
- Langflow no longer creates or accepts the legacy `langflow`/`langflow` default superuser credentials.
- If `LANGFLOW_AUTO_LOGIN=False`, set `LANGFLOW_SUPERUSER_PASSWORD` to a strong password before startup.
- The legacy value `langflow` is not allowed, even if `LANGFLOW_AUTO_LOGIN=True`.
+- Production preflight checks
- ```bash
- export LANGFLOW_SUPERUSER_PASSWORD=SUPERUSER_PASSWORD
- ```
-
- Replace `SUPERUSER_PASSWORD` with a strong password for the Langflow superuser.
-
- If `LANGFLOW_AUTO_LOGIN=true`, setting `LANGFLOW_SUPERUSER_PASSWORD` is optional. If you omit it, Langflow generates a random bootstrap password for the auto-login account.
-
- If you're running Langflow with Docker and `LANGFLOW_AUTO_LOGIN=false`, pass the password at startup:
-
- ```bash
- docker run -d \
- --name ${CONTAINER_NAME} \
- --restart unless-stopped \
- -p 7860:7860 \
- -e LANGFLOW_HOST=0.0.0.0 \
- -e LANGFLOW_PORT=7860 \
- -e LANGFLOW_AUTO_LOGIN=false \
- -e LANGFLOW_SUPERUSER_PASSWORD=SUPERUSER_PASSWORD \
- -v langflow-data:/app/langflow \
- ${IMAGE}
- ```
+ Set `LANGFLOW_DEPLOYMENT_PROFILE=prod` to probe your Langflow deployment before any workers start.
+ The default remains `dev`, which skips prod checks.
- Replace `SUPERUSER_PASSWORD` with a strong password for the Langflow superuser.
+ For more information, see [Production preflight checks](/deployment-prod-best-practices#production-preflight).
-- Docker images disable auto-login by default
+- Disable the legacy MCP SSE transport
- Official Langflow Docker images set `LANGFLOW_AUTO_LOGIN=false`.
- You must set `LANGFLOW_SUPERUSER_PASSWORD` (and optionally `LANGFLOW_SUPERUSER`) before the container can start, unless you explicitly set `LANGFLOW_AUTO_LOGIN=true`.
+ Set `LANGFLOW_MCP_SSE_ENABLED=false` to return a `404` from the legacy SSE transport endpoint.
+ Streamable HTTP is not affected.
- For more information, see [Docker image defaults](/deployment-docker#docker-image-security-defaults).
+ For more information, see [Disable the legacy MCP SSE transport](/mcp-server#disable-legacy-sse).
- - Docker runtime home moved to `/app/data`
+- OrcaRouter bundle
- Patched 1.11 Docker images set `HOME=/app/data` so the non-root runtime user has a writable home directory.
- When `LANGFLOW_CONFIG_DIR` isn't set, the default config directory therefore changes from `/opt/app-root/src/.cache/langflow` to `/app/data/.cache/langflow`; SQLite follows that directory when `LANGFLOW_SAVE_DB_IN_CONFIG_DIR=true`.
- Persist `/app/data` or set `LANGFLOW_CONFIG_DIR` to your existing writable data directory before upgrading to preserve existing data.
+ The **OrcaRouter** bundle adds an OrcaRouter language model component.
- - Long-tail component bundles are now opt-in
-
- Starting in Langflow 1.11.x, `pip install langflow` no longer installs the long-tail providers in the `lfx-bundles` metapackage.
- If an existing flow uses components such as Chroma, Ollama, Qdrant, Redis, PGVector, Tavily, Wikipedia, MongoDB, Weaviate, or Milvus, install the metapackage in the same environment after upgrading:
-
- ```bash
- pip install lfx-bundles
- ```
-
- You can instead install one provider and its dependencies, for example `pip install "lfx-bundles[qdrant]"`.
- Missing-provider errors use the same install guidance.
- Graduated providers such as OpenAI, Anthropic, Cohere, and Exa remain part of the default Langflow installation through their standalone `lfx-*` packages.
-
- For the complete package list and provider-specific commands, see [Extension bundle list](./extensions-bundle-list).
-
-- PyTorch components are opt-in by default
-
- **CUGA**, **Code Agents**, and **Docling** local conversion are excluded from the default `uv pip install langflow` installation because they require PyTorch.
-
- To install these components, see [Torch opt-in installs](./components-bundle-components#torch-opt-in).
-
-- Workflow API request schema (Beta)
-
- The v2 [Workflow API (Beta)](/workflow-api) request body and interaction pattern changes in 1.11.
- Any client that calls `POST /api/v2/workflows` against 1.10.x must update as follows:
-
- Example 1.10.x request:
-
- ```json
- {
- "flow_id": "67ccd2be-17f0-8190-81ff-3bb2cf6508e6",
- "background": false,
- "inputs": {
- "ChatInput-abc.input_value": "what is 2+2",
- "LLMComponent-123.temperature": 0.7
- }
- }
- ```
-
- Example 1.11.x request:
-
- ```json
- {
- "flow_id": "67ccd2be-17f0-8190-81ff-3bb2cf6508e6",
- "input_value": "what is 2+2",
- "mode": "stream",
- "stream_protocol": "agui",
- "tweaks": {
- "LLMComponent-123": {
- "temperature": 0.7
- }
- }
- }
- ```
+ For more information, see [OrcaRouter](./bundles-orcarouter).
- For more information, see [Workflow API (Beta)](/workflow-api).
+- IBM Confluent bundle
-- Input Schema pane replaced by in-component Parameters
+ The **IBM Confluent** bundle adds Kafka, Tableflow, and Real-Time Context Engine components.
- The **Input Schema** pane under **Share** > **API access** is removed, but the fields can still be exposed to requests.
- The `tweaks` object in API requests is unchanged.
- **Endpoint Name** remains available from the **API access** pane.
+ For more information, see [IBM Confluent](./bundles-confluent).
- For details, see [Tweaks (API inputs)](/concepts-publish#input-schema).
+- Deployment tweak policy
-### New features and enhancements
+ Set `LANGFLOW_TWEAKS_POLICY` to control which component fields an API caller can override at run time.
-- Human-in-the-Loop (HITL)
+ For more information, see [Restrict API tweaks](./deployment-tweaks-policy).
- Human-in-the-Loop (HITL) pauses an agent when the agent calls a tool and creates a stateful checkpoint.
- After a human responds by approving, rejecting, or editing the request, the agent resumes from the checkpoint.
+- Catalog and model policy APIs
- For more information, see [Human-in-the-Loop](./human-in-the-loop).
+ Superusers can block or allow components, starter templates, model providers, and specific models.
-- Agent2Agent (A2A) protocol support
+ For more information, see [Catalog and model policy](./api-governance-policy).
- Publish a flow as an A2A agent so other agents can discover and call it, and call remote A2A agents from inside a flow with the **A2A Agent** component.
-
- For more information, see [Use Langflow as an A2A server](./a2a-server) and the [**A2A Agent** component](./a2a-agent-component).
-
-- AG-UI compatible streaming for the Workflow API
-
- The v2 [Workflow API](/workflow-api) now supports streaming with the [AG-UI (Agent–User Interaction) protocol](https://docs.ag-ui.com/introduction) streaming format.
-
- For more information, see [Workflow API (Beta)](/workflow-api#stream-with-ag-ui).
-
-- OpenAI Compatible model provider
-
- Point Langflow's model provider at any OpenAI-compatible endpoint, and Langflow discovers models live from the `/v1/models` endpoint.
- These models can power flows, Langflow Assistant, and any component that uses Langflow’s global model providers.
-
- For more information, see [OpenAI Compatible](./bundles-openai-compatible).
-
-- Unified **Data Operations** component
-
- **Text Operations**, **JSON Operations**, and **Table Operations** are consolidated into a single [**Data Operations** component](./operations).
- Saved flows that use the separate components continue to work.
- For more information, see the [**Data Operations** component](./operations).
-
-- IBM watsonx Orchestrate: Python 3.14 compatibility
-
- The `ibm-watsonx-orchestrate-core` and `ibm-watsonx-orchestrate-clients` packages are upgraded to version 2.12, which supports Python 3.14.
- IBM watsonx Orchestrate is no longer excluded from Python 3.14 installs.
-
- For more information, see [Deploy flows on watsonx Orchestrate](/deployment-wxo).
-
- The following optional integrations remain excluded from installations on Python 3.14:
-
- - [ALTK](/bundles-altk)
- - [CUGA](/bundles-cuga)
- - [LangWatch](/integrations-langwatch)
- - [Pinecone](/bundles-pinecone)
- - [OpenDsStar](/bundles-files-ingestion)
- - [litellm](/bundles-lite-llm)
- - [opik](/integrations-opik)
- - [toolguard](/policies)
-
-- NextPlaid multi-vector bundle
-
- The **NextPlaid** bundle adds two new components for ColBERT-style multi-vector retrieval.
-
- The **NextPlaid** vector store, backed by a running [NextPlaid](https://github.com/meetdoshi90/next-plaid) server, stores each document as a matrix of token embeddings, and the **vLLM Multivector Embeddings** component generates the token-level multi-vector embeddings required by NextPlaid.
-
- For more information, see [NextPlaid bundle](./bundles-nextplaid).
-
-- PaddleOCR bundle
-
- The **Paddle** bundle (`lfx-paddle`) adds a **PaddleOCR** component that calls the PaddleOCR AI Studio Job API for layout-aware document parsing into Markdown.
-
- For more information, see [Paddle bundle](./bundles-paddle).
-
-- Oracle Extension bundle
-
- The **Oracle** bundle adds Oracle Database integration for vector search, document loading, and embeddings.
-
- For more information, see [Oracle bundle](./bundles-oracle).
-
-- Valkey bundle
-
- The **Valkey** bundle adds a vector store and chat memory components for [Valkey](https://valkey.io/), an open-source Redis fork.
-
- For more information, see [Valkey bundle](./bundles-valkey).
-
-- LFX is now engine-only
-
- `uv pip install lfx` now installs the LFX executor only, with no bundle components included.
- `uv pip install langflow` installs the server and curated standalone providers, but not the long-tail `lfx-bundles` metapackage.
-
- If your flows use long-tail bundle components, install the required packages in the same environment.
-
- About 70 long-tail providers ship in the `lfx-bundles` metapackage.
- Install one provider with `uv pip install "lfx-bundles[]"`, or install every long-tail provider with `uv pip install "lfx[bundles]"`.
- Graduated providers, such as OpenAI, Anthropic, Cohere, and Exa, ship as individual packages and are installed separately with `uv pip install lfx-`.
+## 1.11.x
- The `lfx-bundles` long tail is opt-in for both `lfx` and `langflow` installations.
- For more information, see [Extensions overview](./extensions-overview).
+For 1.11.x release notes, see the [1.11.x documentation](https://docs.langflow.org/1.11.0/release-notes).
## 1.10.x
diff --git a/docs/docs/Support/troubleshooting.mdx b/docs/docs/Support/troubleshooting.mdx
index 7552a110f87e..033d0cc70e08 100644
--- a/docs/docs/Support/troubleshooting.mdx
+++ b/docs/docs/Support/troubleshooting.mdx
@@ -440,7 +440,8 @@ Therefore, you are locked out of this Langflow instance.
If you aren't an administrator, then a superuser must create and activate a non-superuser account before you can sign in.
-If you are the administrator, sign in with a superuser account, or restart Langflow with `LANGFLOW_AUTO_LOGIN=true`.
+If you are the administrator, sign in with a superuser account, and then create and activate users with the [Users API](/api-users).
+Alternatively, restart Langflow with `LANGFLOW_AUTO_LOGIN=true`.
For more information, see [Start Langflow Server with authentication enabled](/api-keys-and-authentication#start-a-langflow-server-with-authentication-enabled).
diff --git a/docs/docs/_partial-bundle-graduated-install.mdx b/docs/docs/_partial-bundle-graduated-install.mdx
index b8d929fa0126..4db59bd624ad 100644
--- a/docs/docs/_partial-bundle-graduated-install.mdx
+++ b/docs/docs/_partial-bundle-graduated-install.mdx
@@ -2,30 +2,31 @@ import Admonition from '@theme/Admonition';
export const GraduatedBundleInstall = ({ packageName }) => {
const providers = {
- 'amazon': { name: 'Amazon Bedrock', coreSupport: true },
- 'anthropic': { name: 'Anthropic', coreSupport: true },
- 'arxiv': { name: 'arXiv Search', coreSupport: false },
- 'azure': { name: 'Azure AI Foundry', coreSupport: true },
- 'cohere': { name: 'Cohere', coreSupport: true },
- 'confluent': { name: 'IBM Confluent', coreSupport: false },
- 'datastax': { name: 'DataStax', coreSupport: false },
- 'docling': { name: 'Docling', coreSupport: false },
- 'duckduckgo': { name: 'DuckDuckGo Search', coreSupport: false },
- 'empiriolabs': { name: 'EmpirioLabs', coreSupport: false },
- 'exa': { name: 'Exa', coreSupport: false },
- 'firecrawl': { name: 'Firecrawl', coreSupport: false },
- 'ibm': { name: 'IBM', coreSupport: true },
- 'nextplaid': { name: 'NextPlaid', coreSupport: false },
- 'ollama': { name: 'Ollama', coreSupport: true },
- 'openai': { name: 'OpenAI', coreSupport: true },
- 'openai-compatible': { name: 'OpenAI Compatible', coreSupport: false },
- 'oracle': { name: 'Oracle', coreSupport: false },
- 'paddle': { name: 'PaddleOCR', coreSupport: false },
- 'valkey': { name: 'Valkey', coreSupport: false },
- 'vllm': { name: 'vLLM', coreSupport: false },
+ 'amazon': { name: 'Amazon Bedrock', coreSupport: true, inDefault: true },
+ 'anthropic': { name: 'Anthropic', coreSupport: true, inDefault: true },
+ 'arxiv': { name: 'arXiv Search', coreSupport: false, inDefault: false },
+ 'azure': { name: 'Azure AI Foundry', coreSupport: true, inDefault: true },
+ 'cohere': { name: 'Cohere', coreSupport: true, inDefault: true },
+ 'confluent': { name: 'IBM Confluent', coreSupport: false, inDefault: false },
+ 'datastax': { name: 'DataStax', coreSupport: false, inDefault: true },
+ 'docling': { name: 'Docling', coreSupport: false, inDefault: true },
+ 'duckduckgo': { name: 'DuckDuckGo Search', coreSupport: false, inDefault: false },
+ 'empiriolabs': { name: 'EmpirioLabs', coreSupport: false, inDefault: false },
+ 'exa': { name: 'Exa', coreSupport: false, inDefault: false },
+ 'firecrawl': { name: 'Firecrawl', coreSupport: false, inDefault: false },
+ 'google': { name: 'Google', coreSupport: true, inDefault: true },
+ 'ibm': { name: 'IBM', coreSupport: true, inDefault: true },
+ 'nextplaid': { name: 'NextPlaid', coreSupport: false, inDefault: false },
+ 'ollama': { name: 'Ollama', coreSupport: true, inDefault: true },
+ 'openai': { name: 'OpenAI', coreSupport: true, inDefault: true },
+ 'openai-compatible': { name: 'OpenAI Compatible', coreSupport: false, inDefault: true },
+ 'oracle': { name: 'Oracle', coreSupport: false, inDefault: true },
+ 'paddle': { name: 'PaddleOCR', coreSupport: false, inDefault: false },
+ 'valkey': { name: 'Valkey', coreSupport: false, inDefault: false },
+ 'vllm': { name: 'vLLM', coreSupport: false, inDefault: true },
};
- const { name, coreSupport } = providers[packageName] ?? { name: packageName, coreSupport: false };
+ const { name, coreSupport, inDefault } = providers[packageName] ?? { name: packageName, coreSupport: false, inDefault: false };
return (
@@ -35,15 +36,34 @@ export const GraduatedBundleInstall = ({ packageName }) => {
This bundle adds an enhanced {name} component with additional provider-specific parameters.
)}
-
- If you installed lfx directly (not as part of langflow), install the {name} bundle separately:
-
-
- - Run
uv pip install lfx-{packageName}.
- - Restart Langflow.
- - To confirm the bundle loaded, run
lfx extension list.
-
- If you installed Langflow with uv pip install langflow, these bundle components are already included.
+ {inDefault ? (
+ <>
+
+ If you installed lfx directly (not as part of langflow), install the {name} bundle separately:
+
+
+ - Run
uv pip install lfx-{packageName}.
+ - Restart Langflow.
+ - To confirm the bundle loaded, run
lfx extension list.
+
+ If you installed Langflow with uv pip install langflow, these bundle components are already included.
+ >
+ ) : (
+ <>
+
+ This bundle is not included in the default uv pip install langflow install. Add it with:
+
+
+ - Run
uv pip install lfx-{packageName}.
+ - Restart Langflow.
+ - To confirm the bundle loaded, run
lfx extension list.
+
+
+ To install every no-Torch opt-in provider at once, run uv pip install "langflow[bundles]".
+ For the full opt-in list, see Additional bundles.
+
+ >
+ )}
For more information, see Install LFX with bundle components.
);
diff --git a/docs/docs/_partial-bundle-lfx-bundles-install.mdx b/docs/docs/_partial-bundle-lfx-bundles-install.mdx
index cc3d4a459b4b..086f4c403670 100644
--- a/docs/docs/_partial-bundle-lfx-bundles-install.mdx
+++ b/docs/docs/_partial-bundle-lfx-bundles-install.mdx
@@ -1,5 +1,5 @@
:::tip
-Long-tail providers are opt-in for both Langflow and standalone LFX installs. Install this provider from the long-tail metapackage:
+This provider is an extra of the `lfx-bundles` metapackage. It is opt-in for both Langflow and standalone LFX installs:
```bash
uv pip install "lfx-bundles[]"
@@ -7,6 +7,6 @@ uv pip install "lfx-bundles[]"
Replace `` with this page's provider name, for example `qdrant`.
For a torch-free full Langflow install, run `uv pip install "langflow[bundles]"`.
-For standalone LFX with every long-tail provider, including torch-based providers, run `uv pip install "lfx[bundles]"`.
-See the [Bundle list](./extensions-bundle-list) for the exact extra name.
+For standalone LFX with every provider in `lfx-bundles`, including PyTorch-based providers, run `uv pip install "lfx[bundles]"`.
+See [Additional bundles](/extensions-bundle-list#additional-bundles) for the exact extra name.
:::
diff --git a/docs/docs/_partial-extension-bundle-install.mdx b/docs/docs/_partial-extension-bundle-install.mdx
index c75a7c0b6438..8d9642d2f292 100644
--- a/docs/docs/_partial-extension-bundle-install.mdx
+++ b/docs/docs/_partial-extension-bundle-install.mdx
@@ -1,4 +1,6 @@
-`uv pip install langflow` installs bundle components automatically.
+`uv pip install langflow` installs a curated provider set.
+Other providers are opt-in.
+For more information, see [Additional bundles](/extensions-bundle-list#additional-bundles).
`uv pip install lfx` installs the core LFX executor _only_, with no provider bundles included.
@@ -6,24 +8,24 @@ If your flows use bundle components, install the required packages in the same v
Some components require an additional [torch opt-in installation](./components-bundle-components#torch-opt-in).
-_Long-tail bundles_ are third-party provider integrations like vector stores or model providers that ship together in the `lfx-bundles` package.
+Providers in `lfx-bundles` are extras of that metapackage, such as additional model providers and vector stores.
-_Standalone bundles_ are graduated providers with their own release cadences, such as OpenAI, Anthropic, and Exa.
+Standalone packages are providers with their own `lfx-` package and release cadence, such as OpenAI, Anthropic, and Exa.
-To install one long-tail provider:
+To install one provider from `lfx-bundles`:
```bash
-uv pip install "lfx-bundles[]"
+uv pip install "lfx-bundles[]"
```
-To install every long-tail provider:
+To install every provider in `lfx-bundles`:
```bash
uv pip install "lfx[bundles]"
```
`lfx[bundles]` is equivalent to `lfx` plus `lfx-bundles[all]`.
-It does **not** install graduated standalone packages such as `lfx-openai`.
+It does **not** install standalone packages such as `lfx-openai`.
To install a standalone provider package:
diff --git a/docs/docs/_partial-opt-in-bundles.mdx b/docs/docs/_partial-opt-in-bundles.mdx
new file mode 100644
index 000000000000..1cd7d05e0f62
--- /dev/null
+++ b/docs/docs/_partial-opt-in-bundles.mdx
@@ -0,0 +1,38 @@
+Starting in Langflow 1.12, `uv pip install langflow` includes a curated provider set only.
+The following bundles are **not** installed by default.
+
+To install one provider from `lfx-bundles`, run:
+
+```bash
+uv pip install "lfx-bundles[]"
+```
+
+To install one opt-in standalone package, run:
+
+```bash
+uv pip install lfx-
+```
+
+To install every no-Torch opt-in provider at once, including the standalone packages:
+
+```bash
+uv pip install "langflow[bundles]"
+```
+
+Restart Langflow after installing. To confirm a bundle loaded, run `lfx extension list`.
+The extra name is the identifier shown, such as `groq` or `exa`.
+
+Knowledge bases still use local Chroma storage in the default install.
+The **Chroma DB** bundle component in the visual editor is opt-in.
+
+### Model providers
+
+[`aiml`](/bundles-aiml) · [`baidu`](/bundles-baidu) · [`cloudflare`](/bundles-cloudflare) · [`cometapi`](/bundles-cometapi) · [`deepseek`](/bundles-deepseek) · [`empiriolabs`](/bundles-empiriolabs) · [`groq`](/bundles-groq) · [`huggingface`](/bundles-huggingface) · [`litellm`](/bundles-lite-llm) · [`lmstudio`](/bundles-lmstudio) · [`maritalk`](/bundles-maritalk) · [`mistral`](/bundles-mistralai) · `notdiamond` · [`novita`](/bundles-novita) · [`nvidia`](/bundles-nvidia) · [`openrouter`](/bundles-openrouter) · [`orcarouter`](./bundles-orcarouter) · [`perplexity`](/bundles-perplexity) · [`sambanova`](/bundles-sambanova) · [`vertexai`](/bundles-vertexai) · [`xai`](/bundles-xai)
+
+### Vector stores and memory
+
+[`chroma`](/bundles-chroma) · [`clickhouse`](/bundles-clickhouse) · [`couchbase`](/bundles-couchbase) · [`elastic`](/bundles-elastic) · [`faiss`](/bundles-faiss) · [`mem0`](/bundles-mem0) · [`milvus`](/bundles-milvus) · [`mongodb`](/bundles-mongodb) · `needle` · [`pgvector`](/bundles-pgvector) · [`pinecone`](/bundles-pinecone) · [`qdrant`](/bundles-qdrant) · [`redis`](/bundles-redis) · [`supabase`](/bundles-supabase) · [`upstash`](/bundles-upstash) · [`valkey`](/bundles-valkey) · [`vectara`](/bundles-vectara) · [`weaviate`](/bundles-weaviate) · `zep`
+
+### Tools, search, and integrations
+
+`agentql` · [`altk`](/bundles-altk) · [`apify`](/bundles-apify) · [`arxiv`](/bundles-arxiv) · [`assemblyai`](/bundles-assemblyai) · [`bing`](/bundles-bing) · [`cleanlab`](/bundles-cleanlab) · [`composio`](/bundles-composio) · [`confluent`](./bundles-confluent) · `confluence` · [`duckduckgo`](/bundles-duckduckgo) · [`exa`](/bundles-exa) · [`firecrawl`](/bundles-firecrawl) · `git` · [`glean`](/bundles-glean) · `homeassistant` · [`icosacomputing`](/bundles-icosacomputing) · `jigsawstack` · `langwatch` · [`mrscraper`](./bundles-mrscraper) · [`nextplaid`](/bundles-nextplaid) · [`notion`](/bundles-notion) · `olivya` · [`paddle`](/bundles-paddle) · `scrapegraph` · [`searchapi`](/bundles-searchapi) · `serpapi` · `spider` · `tavily` · `twelvelabs` · `unstructured` · `vlmrun` · [`wikipedia`](/bundles-wikipedia) · `wolframalpha` · `yahoosearch` · `youtube`
diff --git a/docs/sidebars.js b/docs/sidebars.js
index c0e6fcdc9523..0c4963883895 100644
--- a/docs/sidebars.js
+++ b/docs/sidebars.js
@@ -180,10 +180,9 @@ module.exports = {
"Develop/traces",
{
type: "category",
- label: "Monitoring",
+ label: "LLM tracing",
items: [
"Develop/integrations-arize",
- "Develop/observability-grafana-loki",
"Develop/integrations-langfuse",
"Develop/integrations-langsmith",
"Develop/integrations-langwatch",
@@ -326,6 +325,11 @@ module.exports = {
id: "Deployment/deployment-block-custom-components",
label: "Block custom components",
},
+ {
+ type: "doc",
+ id: "Deployment/deployment-tweaks-policy",
+ label: "Restrict API tweaks",
+ },
{
type: "doc",
id: "Deployment/security",
@@ -623,6 +627,7 @@ module.exports = {
"API-Reference/api-monitor",
"API-Reference/api-build",
"API-Reference/api-users",
+ "API-Reference/api-governance-policy",
{
type: "link",
label: "Langflow API specification",