From 2f713cd077be36a3a2104852b13f40e2e01dc528 Mon Sep 17 00:00:00 2001 From: "github-merge-queue[bot]" Date: Mon, 18 Aug 2025 14:00:17 +0000 Subject: [PATCH] deploy: cfb29134bb72f85911864aa766b4ce0753168852 --- 404.html | 4 +- about-langflow.html | 4 +- agent-tutorial.html | 4 +- agents-tools.html | 4 +- agents.html | 4 +- api-build.html | 4 +- api-files.html | 4 +- api-flows-run.html | 4 +- api-flows.html | 4 +- api-keys-and-authentication.html | 6 +- api-logs.html | 4 +- api-monitor.html | 4 +- api-projects.html | 4 +- api-reference-api-examples.html | 4 +- api-users.html | 4 +- api.html | 4 +- api/add-server.html | 4 +- api/add-user.html | 4 +- api/auto-login.html | 4 +- api/build-flow.html | 4 +- api/build-public-tmp.html | 4 +- api/build-vertex-stream.html | 4 +- api/build-vertex.html | 4 +- api/cancel-build.html | 4 +- api/check-if-store-has-api-key.html | 4 +- api/check-if-store-is-enabled.html | 4 +- api/check-installed-mcp-servers.html | 4 +- api/create-api-key-route.html | 4 +- api/create-flow.html | 4 +- api/create-flows.html | 4 +- api/create-folder-redirect.html | 4 +- api/create-project.html | 4 +- api/create-upload-file.html | 4 +- api/create-variable.html | 4 +- api/custom-component-update.html | 4 +- api/custom-component.html | 4 +- api/delete-all-files-1.html | 4 +- api/delete-all-files.html | 4 +- api/delete-api-key-route.html | 4 +- api/delete-file-1.html | 4 +- api/delete-file.html | 4 +- api/delete-files-batch.html | 4 +- api/delete-flow.html | 4 +- api/delete-folder-redirect.html | 4 +- api/delete-messages-session.html | 4 +- api/delete-messages.html | 4 +- api/delete-multiple-flows.html | 4 +- api/delete-project.html | 4 +- api/delete-server.html | 4 +- api/delete-user.html | 4 +- api/delete-variable.html | 4 +- api/delete-vertex-builds.html | 4 +- api/download-component.html | 4 +- api/download-file-1.html | 4 +- api/download-file-2.html | 4 +- api/download-file-redirect.html | 4 +- api/download-file.html | 4 +- api/download-files-batch.html | 4 +- api/download-image.html | 4 +- api/download-multiple-file.html | 4 +- api/download-profile-picture.html | 4 +- api/edit-file-name.html | 4 +- api/experimental-run-flow.html | 4 +- api/get-all.html | 4 +- api/get-api-keys-route.html | 4 +- api/get-build-events.html | 4 +- api/get-components.html | 4 +- api/get-config.html | 4 +- api/get-elevenlabs-voice-ids.html | 4 +- api/get-list-of-components-liked-by-user.html | 4 +- api/get-message-sessions.html | 4 +- api/get-messages.html | 4 +- api/get-server-endpoint.html | 4 +- api/get-servers.html | 4 +- api/get-starter-projects.html | 4 +- api/get-tags.html | 4 +- api/get-task-status.html | 4 +- api/get-transactions.html | 4 +- api/get-version.html | 4 +- api/get-vertex-builds.html | 4 +- api/handle-messages-1.html | 4 +- api/handle-messages.html | 4 +- api/handle-project-messages-with-slash.html | 4 +- api/handle-project-messages.html | 4 +- api/handle-project-sse.html | 4 +- api/handle-sse-1.html | 4 +- api/handle-sse.html | 4 +- api/health-check.html | 4 +- api/health.html | 4 +- api/install-mcp-config.html | 4 +- api/like-component.html | 4 +- api/list-files-1.html | 4 +- api/list-files-2.html | 4 +- api/list-files.html | 4 +- api/list-profile-pictures.html | 4 +- api/list-project-tools.html | 4 +- api/login-to-get-access-token.html | 4 +- api/logout.html | 4 +- api/logs.html | 4 +- api/patch-user.html | 4 +- api/post-validate-code.html | 4 +- api/post-validate-prompt.html | 4 +- api/process-1.html | 4 +- api/process.html | 4 +- api/read-all-users.html | 4 +- api/read-basic-examples.html | 4 +- api/read-current-user.html | 4 +- api/read-flow.html | 4 +- api/read-flows.html | 4 +- api/read-folder-redirect.html | 4 +- api/read-folders-redirect.html | 4 +- api/read-project.html | 4 +- api/read-projects.html | 4 +- api/read-public-flow.html | 4 +- api/read-variables.html | 4 +- api/refresh-token.html | 4 +- api/reset-password.html | 4 +- api/retrieve-vertices-order.html | 4 +- api/save-store-api-key.html | 4 +- api/share-component.html | 4 +- api/simplified-run-flow.html | 4 +- api/stream-logs.html | 4 +- api/update-flow.html | 4 +- api/update-folder-redirect.html | 4 +- api/update-message.html | 4 +- api/update-project-mcp-settings.html | 4 +- api/update-project.html | 4 +- api/update-server-endpoint.html | 4 +- api/update-session-id.html | 4 +- api/update-shared-component.html | 4 +- api/update-variable.html | 4 +- api/upload-file-1.html | 4 +- api/upload-file-2.html | 4 +- api/upload-file-redirect.html | 4 +- api/upload-file.html | 4 +- api/upload-user-file-1.html | 4 +- api/upload-user-file.html | 4 +- api/webhook-run-flow.html | 4 +- ...-file-67ebbb733732670897bedd9fd1b87583.png | Bin 278862 -> 0 bytes ...oping-756b330b8dc690b3dab1c44cc2fb05db.png | Bin 0 -> 194185 bytes assets/js/0132780e.dfc30bb5.js | 1 - assets/js/0132780e.f18fc120.js | 1 + assets/js/16ceb5d2.6bd2bb0b.js | 1 + assets/js/16ceb5d2.ea0de0ca.js | 1 - ...d74f7.480455be.js => 22dd74f7.31163c52.js} | 2 +- ...0d4f5.9736bba1.js => 2ab0d4f5.9ee70b69.js} | 2 +- ...c45a3.48bfc372.js => 393c45a3.a88f2240.js} | 2 +- assets/js/46d346a5.79a83d87.js | 1 - assets/js/46d346a5.cf5052ec.js | 1 + assets/js/7819cc1c.3fe39d05.js | 1 - assets/js/7819cc1c.ff17ecfc.js | 1 + ...93c41.0ec74f4e.js => 7f193c41.0846ef5d.js} | 2 +- assets/js/8a484c94.1a0cb6a7.js | 1 - assets/js/8a484c94.ac2a10e3.js | 1 + assets/js/8bd4a540.1111abcf.js | 1 + assets/js/8bd4a540.41d943d9.js | 1 - ...0f423.a52f998f.js => e1a0f423.93ae2054.js} | 2 +- ...6a4d2.2332c420.js => e6c6a4d2.6642715a.js} | 2 +- assets/js/main.35957350.js | 2 + ...CENSE.txt => main.35957350.js.LICENSE.txt} | 0 assets/js/main.6e50f663.js | 2 - ...n.a1afa176.js => runtime~main.f7d3d7de.js} | 2 +- bundles-aiml.html | 4 +- bundles-amazon.html | 4 +- bundles-anthropic.html | 4 +- bundles-arxiv.html | 4 +- bundles-azure.html | 4 +- bundles-baidu.html | 4 +- bundles-bing.html | 4 +- bundles-cloudflare.html | 4 +- bundles-cohere.html | 4 +- bundles-datastax.html | 4 +- bundles-deepseek.html | 4 +- bundles-duckduckgo.html | 4 +- bundles-exa.html | 4 +- bundles-glean.html | 4 +- bundles-google.html | 4 +- bundles-groq.html | 4 +- bundles-huggingface.html | 4 +- bundles-ibm.html | 4 +- bundles-icosacomputing.html | 4 +- bundles-langchain.html | 4 +- bundles-lmstudio.html | 4 +- bundles-maritalk.html | 4 +- bundles-mem0.html | 4 +- bundles-mistralai.html | 4 +- bundles-novita.html | 4 +- bundles-nvidia.html | 4 +- bundles-ollama.html | 4 +- bundles-openai.html | 4 +- bundles-openrouter.html | 4 +- bundles-perplexity.html | 4 +- bundles-redis.html | 4 +- bundles-sambanova.html | 4 +- bundles-searchapi.html | 4 +- bundles-vertexai.html | 4 +- bundles-wikipedia.html | 4 +- bundles-xai.html | 4 +- chat-with-files.html | 4 +- chat-with-rag.html | 4 +- components-agents.html | 6 +- components-bundle-components.html | 4 +- components-custom-components.html | 4 +- components-data.html | 6 +- components-embedding-models.html | 4 +- components-helpers.html | 4 +- components-io.html | 4 +- components-logic.html | 31 +- components-memories.html | 4 +- components-models.html | 4 +- components-processing.html | 629 +++++++++++------- components-prompts.html | 4 +- components-tools.html | 4 +- components-vector-stores.html | 531 ++++++++++----- concepts-components.html | 4 +- concepts-file-management.html | 4 +- concepts-flows-import.html | 4 +- concepts-flows.html | 4 +- concepts-overview.html | 4 +- concepts-playground.html | 4 +- concepts-publish.html | 4 +- concepts-voice-mode.html | 4 +- configuration-cli.html | 4 +- configuration-custom-database.html | 4 +- configuration-global-variables.html | 4 +- contributing-bundles.html | 4 +- contributing-community.html | 4 +- contributing-component-tests.html | 4 +- contributing-components.html | 4 +- contributing-github-issues.html | 4 +- contributing-how-to-contribute.html | 4 +- contributing-telemetry.html | 4 +- contributing-templates.html | 4 +- data-types.html | 21 +- deployment-architecture.html | 4 +- deployment-caddyfile.html | 4 +- deployment-docker.html | 4 +- deployment-gcp.html | 4 +- deployment-hugging-face-spaces.html | 4 +- deployment-kubernetes-dev.html | 4 +- deployment-kubernetes-prod.html | 4 +- deployment-overview.html | 4 +- deployment-prod-best-practices.html | 4 +- deployment-public-server.html | 4 +- deployment-railway.html | 4 +- deployment-render.html | 4 +- develop-application.html | 4 +- enterprise-database-guide.html | 4 +- environment-variables.html | 6 +- get-started-installation.html | 4 +- get-started-quickstart.html | 4 +- img/conditional-looping.png | Bin 0 -> 194185 bytes index.html | 4 +- install-custom-dependencies.html | 4 +- integrations-apify.html | 4 +- integrations-arize.html | 4 +- integrations-assemblyai.html | 4 +- integrations-cleanlab.html | 4 +- integrations-composio.html | 4 +- integrations-docling.html | 4 +- integrations-google-big-query.html | 4 +- integrations-langfuse.html | 4 +- integrations-langsmith.html | 4 +- integrations-langwatch.html | 4 +- integrations-nvidia-g-assist.html | 4 +- integrations-nvidia-ingest-wsl2.html | 4 +- integrations-nvidia-ingest.html | 4 +- integrations-opik.html | 4 +- .../notion/notion-agent-conversational.html | 4 +- .../notion/notion-agent-meeting-notes.html | 4 +- integrations/notion/setup.html | 4 +- logging.html | 4 +- luna-for-langflow.html | 4 +- mcp-client.html | 4 +- mcp-component-astra.html | 4 +- mcp-server.html | 4 +- mcp-tutorial.html | 4 +- memory.html | 4 +- release-notes.html | 4 +- search.html | 4 +- session-id.html | 4 +- sitemap.xml | 2 +- troubleshoot.html | 6 +- typescript-client.html | 4 +- webhook.html | 4 +- 285 files changed, 1329 insertions(+), 945 deletions(-) delete mode 100644 assets/images/component-save-to-file-67ebbb733732670897bedd9fd1b87583.png create mode 100644 assets/images/conditional-looping-756b330b8dc690b3dab1c44cc2fb05db.png delete mode 100644 assets/js/0132780e.dfc30bb5.js create mode 100644 assets/js/0132780e.f18fc120.js create mode 100644 assets/js/16ceb5d2.6bd2bb0b.js delete mode 100644 assets/js/16ceb5d2.ea0de0ca.js rename assets/js/{22dd74f7.480455be.js => 22dd74f7.31163c52.js} (63%) rename assets/js/{2ab0d4f5.9736bba1.js => 2ab0d4f5.9ee70b69.js} (50%) rename assets/js/{393c45a3.48bfc372.js => 393c45a3.a88f2240.js} (79%) delete mode 100644 assets/js/46d346a5.79a83d87.js create mode 100644 assets/js/46d346a5.cf5052ec.js delete mode 100644 assets/js/7819cc1c.3fe39d05.js create mode 100644 assets/js/7819cc1c.ff17ecfc.js rename assets/js/{7f193c41.0ec74f4e.js => 7f193c41.0846ef5d.js} (78%) delete mode 100644 assets/js/8a484c94.1a0cb6a7.js create mode 100644 assets/js/8a484c94.ac2a10e3.js create mode 100644 assets/js/8bd4a540.1111abcf.js delete mode 100644 assets/js/8bd4a540.41d943d9.js rename assets/js/{e1a0f423.a52f998f.js => e1a0f423.93ae2054.js} (88%) rename assets/js/{e6c6a4d2.2332c420.js => e6c6a4d2.6642715a.js} (56%) create mode 100644 assets/js/main.35957350.js rename assets/js/{main.6e50f663.js.LICENSE.txt => main.35957350.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.6e50f663.js rename assets/js/{runtime~main.a1afa176.js => runtime~main.f7d3d7de.js} (95%) create mode 100644 img/conditional-looping.png diff --git a/404.html b/404.html index e37c96cdcf..d9e38271b1 100644 --- a/404.html +++ b/404.html @@ -23,8 +23,8 @@ - - + + diff --git a/about-langflow.html b/about-langflow.html index 2468e592f3..19c6830de5 100644 --- a/about-langflow.html +++ b/about-langflow.html @@ -23,8 +23,8 @@ - - + + diff --git a/agent-tutorial.html b/agent-tutorial.html index 85df41025b..8d05c2832e 100644 --- a/agent-tutorial.html +++ b/agent-tutorial.html @@ -23,8 +23,8 @@ - - + + diff --git a/agents-tools.html b/agents-tools.html index 084fd7deac..33046bef04 100644 --- a/agents-tools.html +++ b/agents-tools.html @@ -23,8 +23,8 @@ - - + + diff --git a/agents.html b/agents.html index 67a233cd8c..df9bb8f1b2 100644 --- a/agents.html +++ b/agents.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-build.html b/api-build.html index ca818332eb..88bf200c5b 100644 --- a/api-build.html +++ b/api-build.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-files.html b/api-files.html index 4fab97bc1a..21b2fa9545 100644 --- a/api-files.html +++ b/api-files.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-flows-run.html b/api-flows-run.html index 96d3326150..32c3f67124 100644 --- a/api-flows-run.html +++ b/api-flows-run.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-flows.html b/api-flows.html index e6d3f24b11..096b5c45dd 100644 --- a/api-flows.html +++ b/api-flows.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-keys-and-authentication.html b/api-keys-and-authentication.html index bba2149f2c..4e4d2b213c 100644 --- a/api-keys-and-authentication.html +++ b/api-keys-and-authentication.html @@ -23,8 +23,8 @@ - - + + @@ -225,7 +225,7 @@ Strong, securely-stored credentials are recommended in genuine development and p
  • Start Langflow with the configuration from your .env file:


    _10
    uv run langflow run --env-file .env

    -

    Starting Langflow with an .env file automatically authenticates you as the superuser set in LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD. +

    Starting Langflow with a .env file automatically authenticates you as the superuser set in LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD. If you don't explicitly set these variables, the default values are langflow and langflow for system auto-login.

  • diff --git a/api-logs.html b/api-logs.html index 2371656d18..6dee3c23f9 100644 --- a/api-logs.html +++ b/api-logs.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-monitor.html b/api-monitor.html index 33b05adaa1..db4f897791 100644 --- a/api-monitor.html +++ b/api-monitor.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-projects.html b/api-projects.html index a33f3079bc..7a118e1ab9 100644 --- a/api-projects.html +++ b/api-projects.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-reference-api-examples.html b/api-reference-api-examples.html index 598ed3ba8c..801cd34c87 100644 --- a/api-reference-api-examples.html +++ b/api-reference-api-examples.html @@ -23,8 +23,8 @@ - - + + diff --git a/api-users.html b/api-users.html index f0c31819f9..9e680fe6ac 100644 --- a/api-users.html +++ b/api-users.html @@ -23,8 +23,8 @@ - - + + diff --git a/api.html b/api.html index 09e839b435..58df75f7ed 100644 --- a/api.html +++ b/api.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/add-server.html b/api/add-server.html index 186b8e4ee5..8b4af949a8 100644 --- a/api/add-server.html +++ b/api/add-server.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/add-user.html b/api/add-user.html index 2e7996e536..6ab878ce92 100644 --- a/api/add-user.html +++ b/api/add-user.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/auto-login.html b/api/auto-login.html index b951853c6e..18461532aa 100644 --- a/api/auto-login.html +++ b/api/auto-login.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/build-flow.html b/api/build-flow.html index d0f1d21f5d..399b389220 100644 --- a/api/build-flow.html +++ b/api/build-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/build-public-tmp.html b/api/build-public-tmp.html index 8b6c234bb8..9f7a87c165 100644 --- a/api/build-public-tmp.html +++ b/api/build-public-tmp.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/build-vertex-stream.html b/api/build-vertex-stream.html index 912779084c..c8ee7333c5 100644 --- a/api/build-vertex-stream.html +++ b/api/build-vertex-stream.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/build-vertex.html b/api/build-vertex.html index 1eac372929..7dc95b38a3 100644 --- a/api/build-vertex.html +++ b/api/build-vertex.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/cancel-build.html b/api/cancel-build.html index 6e27ffcc1b..2f9d8d97bf 100644 --- a/api/cancel-build.html +++ b/api/cancel-build.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/check-if-store-has-api-key.html b/api/check-if-store-has-api-key.html index db3c0ba774..728827a7f2 100644 --- a/api/check-if-store-has-api-key.html +++ b/api/check-if-store-has-api-key.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/check-if-store-is-enabled.html b/api/check-if-store-is-enabled.html index 4863653213..38e9d897b7 100644 --- a/api/check-if-store-is-enabled.html +++ b/api/check-if-store-is-enabled.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/check-installed-mcp-servers.html b/api/check-installed-mcp-servers.html index f4c6d2b378..00f1dcaafc 100644 --- a/api/check-installed-mcp-servers.html +++ b/api/check-installed-mcp-servers.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-api-key-route.html b/api/create-api-key-route.html index af48025568..9f1961bf04 100644 --- a/api/create-api-key-route.html +++ b/api/create-api-key-route.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-flow.html b/api/create-flow.html index d1eae4ff24..d99926f071 100644 --- a/api/create-flow.html +++ b/api/create-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-flows.html b/api/create-flows.html index f89f9099c3..83823d8525 100644 --- a/api/create-flows.html +++ b/api/create-flows.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-folder-redirect.html b/api/create-folder-redirect.html index 532e870739..81855b2dbd 100644 --- a/api/create-folder-redirect.html +++ b/api/create-folder-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-project.html b/api/create-project.html index ae09e572d3..cd810e3032 100644 --- a/api/create-project.html +++ b/api/create-project.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-upload-file.html b/api/create-upload-file.html index 9dfe345c9b..d94b004091 100644 --- a/api/create-upload-file.html +++ b/api/create-upload-file.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/create-variable.html b/api/create-variable.html index 8f9d97d0de..46659f9c14 100644 --- a/api/create-variable.html +++ b/api/create-variable.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/custom-component-update.html b/api/custom-component-update.html index c1df4c886d..1b97f80b0d 100644 --- a/api/custom-component-update.html +++ b/api/custom-component-update.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/custom-component.html b/api/custom-component.html index b26312ab76..91fa1e2ab1 100644 --- a/api/custom-component.html +++ b/api/custom-component.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-all-files-1.html b/api/delete-all-files-1.html index 8c8c930ff6..5521c0563a 100644 --- a/api/delete-all-files-1.html +++ b/api/delete-all-files-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-all-files.html b/api/delete-all-files.html index a268d93783..67e9458c01 100644 --- a/api/delete-all-files.html +++ b/api/delete-all-files.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-api-key-route.html b/api/delete-api-key-route.html index 342aaf2031..43d0cef35f 100644 --- a/api/delete-api-key-route.html +++ b/api/delete-api-key-route.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-file-1.html b/api/delete-file-1.html index 19df96dc43..96bb4b0fb9 100644 --- a/api/delete-file-1.html +++ b/api/delete-file-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-file.html b/api/delete-file.html index 770edc62c8..3c3650ce73 100644 --- a/api/delete-file.html +++ b/api/delete-file.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-files-batch.html b/api/delete-files-batch.html index 3f9539e876..ee666676ce 100644 --- a/api/delete-files-batch.html +++ b/api/delete-files-batch.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-flow.html b/api/delete-flow.html index ff22b79d75..182aaae6f0 100644 --- a/api/delete-flow.html +++ b/api/delete-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-folder-redirect.html b/api/delete-folder-redirect.html index 51f053465b..01927ab704 100644 --- a/api/delete-folder-redirect.html +++ b/api/delete-folder-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-messages-session.html b/api/delete-messages-session.html index 40cd261121..8a231a882f 100644 --- a/api/delete-messages-session.html +++ b/api/delete-messages-session.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-messages.html b/api/delete-messages.html index a034807e62..fe07926777 100644 --- a/api/delete-messages.html +++ b/api/delete-messages.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-multiple-flows.html b/api/delete-multiple-flows.html index 680c26eac8..97f55f6a23 100644 --- a/api/delete-multiple-flows.html +++ b/api/delete-multiple-flows.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-project.html b/api/delete-project.html index af6873e13f..d5193dbdf7 100644 --- a/api/delete-project.html +++ b/api/delete-project.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-server.html b/api/delete-server.html index 792571f3f2..064c059f25 100644 --- a/api/delete-server.html +++ b/api/delete-server.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-user.html b/api/delete-user.html index 84633e3ce0..8fa6ca2f7f 100644 --- a/api/delete-user.html +++ b/api/delete-user.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-variable.html b/api/delete-variable.html index f5096f2f83..3ca58b8fc9 100644 --- a/api/delete-variable.html +++ b/api/delete-variable.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/delete-vertex-builds.html b/api/delete-vertex-builds.html index e5329c1548..552f904aa1 100644 --- a/api/delete-vertex-builds.html +++ b/api/delete-vertex-builds.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-component.html b/api/download-component.html index 3840620c29..56b91f4f66 100644 --- a/api/download-component.html +++ b/api/download-component.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-file-1.html b/api/download-file-1.html index 8675bae15f..19106546a9 100644 --- a/api/download-file-1.html +++ b/api/download-file-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-file-2.html b/api/download-file-2.html index b7ff0da553..4ec419285a 100644 --- a/api/download-file-2.html +++ b/api/download-file-2.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-file-redirect.html b/api/download-file-redirect.html index e14895ff8d..6c8b592a88 100644 --- a/api/download-file-redirect.html +++ b/api/download-file-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-file.html b/api/download-file.html index 49c8f63a40..015ed771d6 100644 --- a/api/download-file.html +++ b/api/download-file.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-files-batch.html b/api/download-files-batch.html index 7caf7c99eb..6f03a660a6 100644 --- a/api/download-files-batch.html +++ b/api/download-files-batch.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-image.html b/api/download-image.html index 9d6802b1a4..7572b6575e 100644 --- a/api/download-image.html +++ b/api/download-image.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-multiple-file.html b/api/download-multiple-file.html index 42e767be8c..b7e2e397a6 100644 --- a/api/download-multiple-file.html +++ b/api/download-multiple-file.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/download-profile-picture.html b/api/download-profile-picture.html index 0f9de7bfce..f8c9662d48 100644 --- a/api/download-profile-picture.html +++ b/api/download-profile-picture.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/edit-file-name.html b/api/edit-file-name.html index c2900ed0d0..2927155fd4 100644 --- a/api/edit-file-name.html +++ b/api/edit-file-name.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/experimental-run-flow.html b/api/experimental-run-flow.html index ab32838663..f7bb886a56 100644 --- a/api/experimental-run-flow.html +++ b/api/experimental-run-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-all.html b/api/get-all.html index 88f97027b4..d2179325a0 100644 --- a/api/get-all.html +++ b/api/get-all.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-api-keys-route.html b/api/get-api-keys-route.html index be0a2b308c..5ae5b8b2f6 100644 --- a/api/get-api-keys-route.html +++ b/api/get-api-keys-route.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-build-events.html b/api/get-build-events.html index 3a04bf12c0..e5b581c69d 100644 --- a/api/get-build-events.html +++ b/api/get-build-events.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-components.html b/api/get-components.html index dca58a0bd5..6ba295fe15 100644 --- a/api/get-components.html +++ b/api/get-components.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-config.html b/api/get-config.html index f5b05e21e3..2c9ae3111f 100644 --- a/api/get-config.html +++ b/api/get-config.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-elevenlabs-voice-ids.html b/api/get-elevenlabs-voice-ids.html index d3089a199b..c830b35949 100644 --- a/api/get-elevenlabs-voice-ids.html +++ b/api/get-elevenlabs-voice-ids.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-list-of-components-liked-by-user.html b/api/get-list-of-components-liked-by-user.html index 32bf6adcb6..a14d5d61ec 100644 --- a/api/get-list-of-components-liked-by-user.html +++ b/api/get-list-of-components-liked-by-user.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-message-sessions.html b/api/get-message-sessions.html index 4c2ca24813..e27f10ec78 100644 --- a/api/get-message-sessions.html +++ b/api/get-message-sessions.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-messages.html b/api/get-messages.html index 9e4813b41c..579b5633bf 100644 --- a/api/get-messages.html +++ b/api/get-messages.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-server-endpoint.html b/api/get-server-endpoint.html index 283bfbde24..238a20b665 100644 --- a/api/get-server-endpoint.html +++ b/api/get-server-endpoint.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-servers.html b/api/get-servers.html index b989fe4a16..4c1ce06d83 100644 --- a/api/get-servers.html +++ b/api/get-servers.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-starter-projects.html b/api/get-starter-projects.html index 3d72f05aec..b1db871001 100644 --- a/api/get-starter-projects.html +++ b/api/get-starter-projects.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-tags.html b/api/get-tags.html index b0e1a41a71..815772f5c9 100644 --- a/api/get-tags.html +++ b/api/get-tags.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-task-status.html b/api/get-task-status.html index 4d30bd29a1..5e3cff3d24 100644 --- a/api/get-task-status.html +++ b/api/get-task-status.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-transactions.html b/api/get-transactions.html index dd96351f75..31346fe1c0 100644 --- a/api/get-transactions.html +++ b/api/get-transactions.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-version.html b/api/get-version.html index 958f246b99..b9627de9a5 100644 --- a/api/get-version.html +++ b/api/get-version.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/get-vertex-builds.html b/api/get-vertex-builds.html index 3278876219..9319afd860 100644 --- a/api/get-vertex-builds.html +++ b/api/get-vertex-builds.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-messages-1.html b/api/handle-messages-1.html index 34583fbf27..2caf6dacc9 100644 --- a/api/handle-messages-1.html +++ b/api/handle-messages-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-messages.html b/api/handle-messages.html index 3a8cf5e455..ecf0032b72 100644 --- a/api/handle-messages.html +++ b/api/handle-messages.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-project-messages-with-slash.html b/api/handle-project-messages-with-slash.html index 07924ae23b..c21e556473 100644 --- a/api/handle-project-messages-with-slash.html +++ b/api/handle-project-messages-with-slash.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-project-messages.html b/api/handle-project-messages.html index 7673ec6455..be486796b7 100644 --- a/api/handle-project-messages.html +++ b/api/handle-project-messages.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-project-sse.html b/api/handle-project-sse.html index 28f9974196..4df4cf7625 100644 --- a/api/handle-project-sse.html +++ b/api/handle-project-sse.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-sse-1.html b/api/handle-sse-1.html index 7267f52791..ddd3fa1084 100644 --- a/api/handle-sse-1.html +++ b/api/handle-sse-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/handle-sse.html b/api/handle-sse.html index 9828f9482a..132b44d850 100644 --- a/api/handle-sse.html +++ b/api/handle-sse.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/health-check.html b/api/health-check.html index 59639f12b6..30a075d0f0 100644 --- a/api/health-check.html +++ b/api/health-check.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/health.html b/api/health.html index bda1de494d..e76bf9ed28 100644 --- a/api/health.html +++ b/api/health.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/install-mcp-config.html b/api/install-mcp-config.html index f72fb867aa..a8de05601f 100644 --- a/api/install-mcp-config.html +++ b/api/install-mcp-config.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/like-component.html b/api/like-component.html index cc1a003598..2252cb4798 100644 --- a/api/like-component.html +++ b/api/like-component.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/list-files-1.html b/api/list-files-1.html index c80c18dd96..0e1cecffe4 100644 --- a/api/list-files-1.html +++ b/api/list-files-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/list-files-2.html b/api/list-files-2.html index 872ae65909..3b709129bd 100644 --- a/api/list-files-2.html +++ b/api/list-files-2.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/list-files.html b/api/list-files.html index 4fb0a99574..aa6aa6958f 100644 --- a/api/list-files.html +++ b/api/list-files.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/list-profile-pictures.html b/api/list-profile-pictures.html index cca2df0bcd..593f0eb545 100644 --- a/api/list-profile-pictures.html +++ b/api/list-profile-pictures.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/list-project-tools.html b/api/list-project-tools.html index 0a05180069..78ea40514b 100644 --- a/api/list-project-tools.html +++ b/api/list-project-tools.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/login-to-get-access-token.html b/api/login-to-get-access-token.html index 157bdbadab..bddd40e0df 100644 --- a/api/login-to-get-access-token.html +++ b/api/login-to-get-access-token.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/logout.html b/api/logout.html index 20dd6fb8ca..5589a1c6b7 100644 --- a/api/logout.html +++ b/api/logout.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/logs.html b/api/logs.html index ae1ae36f83..41580cd8a7 100644 --- a/api/logs.html +++ b/api/logs.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/patch-user.html b/api/patch-user.html index afb04f0c8e..18a515f27e 100644 --- a/api/patch-user.html +++ b/api/patch-user.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/post-validate-code.html b/api/post-validate-code.html index f8d47327f0..a6f1a76f5f 100644 --- a/api/post-validate-code.html +++ b/api/post-validate-code.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/post-validate-prompt.html b/api/post-validate-prompt.html index 427abfe694..d2a136aeaa 100644 --- a/api/post-validate-prompt.html +++ b/api/post-validate-prompt.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/process-1.html b/api/process-1.html index 2f77a8d672..9cf95e7651 100644 --- a/api/process-1.html +++ b/api/process-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/process.html b/api/process.html index 7387b7b92b..d8c78accf8 100644 --- a/api/process.html +++ b/api/process.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-all-users.html b/api/read-all-users.html index f918a07166..99a0296c77 100644 --- a/api/read-all-users.html +++ b/api/read-all-users.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-basic-examples.html b/api/read-basic-examples.html index 809e778b2a..0a32948a5c 100644 --- a/api/read-basic-examples.html +++ b/api/read-basic-examples.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-current-user.html b/api/read-current-user.html index f501776f09..c591511133 100644 --- a/api/read-current-user.html +++ b/api/read-current-user.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-flow.html b/api/read-flow.html index 2c8ffbd522..e961fa4fb9 100644 --- a/api/read-flow.html +++ b/api/read-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-flows.html b/api/read-flows.html index a048d99194..f53aabd333 100644 --- a/api/read-flows.html +++ b/api/read-flows.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-folder-redirect.html b/api/read-folder-redirect.html index 6fe27eac3b..083afe46a4 100644 --- a/api/read-folder-redirect.html +++ b/api/read-folder-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-folders-redirect.html b/api/read-folders-redirect.html index fd2155ec4b..0262e3a02c 100644 --- a/api/read-folders-redirect.html +++ b/api/read-folders-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-project.html b/api/read-project.html index 2d22e6b08c..1acc1c06f9 100644 --- a/api/read-project.html +++ b/api/read-project.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-projects.html b/api/read-projects.html index 7c1d5e06c3..03ba268429 100644 --- a/api/read-projects.html +++ b/api/read-projects.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-public-flow.html b/api/read-public-flow.html index 961179a5ff..31981e554c 100644 --- a/api/read-public-flow.html +++ b/api/read-public-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/read-variables.html b/api/read-variables.html index 79e6d86062..cc816712d7 100644 --- a/api/read-variables.html +++ b/api/read-variables.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/refresh-token.html b/api/refresh-token.html index d08ba8d18d..a6cc7bb6a3 100644 --- a/api/refresh-token.html +++ b/api/refresh-token.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/reset-password.html b/api/reset-password.html index a2d5d2479a..d13e1a684f 100644 --- a/api/reset-password.html +++ b/api/reset-password.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/retrieve-vertices-order.html b/api/retrieve-vertices-order.html index 4ace660ac3..268c01d987 100644 --- a/api/retrieve-vertices-order.html +++ b/api/retrieve-vertices-order.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/save-store-api-key.html b/api/save-store-api-key.html index 3c6e918139..e069214dd6 100644 --- a/api/save-store-api-key.html +++ b/api/save-store-api-key.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/share-component.html b/api/share-component.html index b6d2327e22..e7b2217333 100644 --- a/api/share-component.html +++ b/api/share-component.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/simplified-run-flow.html b/api/simplified-run-flow.html index 1b900abca5..8a843f41e7 100644 --- a/api/simplified-run-flow.html +++ b/api/simplified-run-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/stream-logs.html b/api/stream-logs.html index 07f245b638..076f0df526 100644 --- a/api/stream-logs.html +++ b/api/stream-logs.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-flow.html b/api/update-flow.html index b6f42ce115..535867815d 100644 --- a/api/update-flow.html +++ b/api/update-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-folder-redirect.html b/api/update-folder-redirect.html index d958582f95..b3e1d68b0f 100644 --- a/api/update-folder-redirect.html +++ b/api/update-folder-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-message.html b/api/update-message.html index 74473e2e44..8cdf3da0b8 100644 --- a/api/update-message.html +++ b/api/update-message.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-project-mcp-settings.html b/api/update-project-mcp-settings.html index 9b5677bd35..be4e167a5a 100644 --- a/api/update-project-mcp-settings.html +++ b/api/update-project-mcp-settings.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-project.html b/api/update-project.html index 9d300ceda9..84342eb078 100644 --- a/api/update-project.html +++ b/api/update-project.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-server-endpoint.html b/api/update-server-endpoint.html index 31358d4aad..ed550b661c 100644 --- a/api/update-server-endpoint.html +++ b/api/update-server-endpoint.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-session-id.html b/api/update-session-id.html index 1fe0336bab..53d07e7cd2 100644 --- a/api/update-session-id.html +++ b/api/update-session-id.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-shared-component.html b/api/update-shared-component.html index e4ac74cb11..6a1f464b4e 100644 --- a/api/update-shared-component.html +++ b/api/update-shared-component.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/update-variable.html b/api/update-variable.html index 6c6c7ca11e..503964bb2e 100644 --- a/api/update-variable.html +++ b/api/update-variable.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/upload-file-1.html b/api/upload-file-1.html index 71c7768456..995535b828 100644 --- a/api/upload-file-1.html +++ b/api/upload-file-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/upload-file-2.html b/api/upload-file-2.html index 6b11312907..4bcbe89cfe 100644 --- a/api/upload-file-2.html +++ b/api/upload-file-2.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/upload-file-redirect.html b/api/upload-file-redirect.html index d78c62f6db..373a9e23c6 100644 --- a/api/upload-file-redirect.html +++ b/api/upload-file-redirect.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/upload-file.html b/api/upload-file.html index 95949cd72b..15d18edced 100644 --- a/api/upload-file.html +++ b/api/upload-file.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/upload-user-file-1.html b/api/upload-user-file-1.html index 521ff2ce14..9e2c644519 100644 --- a/api/upload-user-file-1.html +++ b/api/upload-user-file-1.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/upload-user-file.html b/api/upload-user-file.html index 771c004534..ea584f80e1 100644 --- a/api/upload-user-file.html +++ b/api/upload-user-file.html @@ -23,8 +23,8 @@ - - + + diff --git a/api/webhook-run-flow.html b/api/webhook-run-flow.html index 5a9f0c517c..eba8bfd9b7 100644 --- a/api/webhook-run-flow.html +++ b/api/webhook-run-flow.html @@ -23,8 +23,8 @@ - - + + diff --git a/assets/images/component-save-to-file-67ebbb733732670897bedd9fd1b87583.png b/assets/images/component-save-to-file-67ebbb733732670897bedd9fd1b87583.png deleted file mode 100644 index c767c10b96a203f7684f8ccf04110b714a89682f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278862 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%0DWYImPePP1)$Gpd8uCese&(<8pB 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 Be9<=Uh927AJ4~fPpGE4;uT63N)i&1E6Pf8 z+9V`oT_hyuGcH{OTg=i@pOcWBW+}_b=z5rL)Oq^oju1{ylaVDn8!{C)C|mu%R9(fs z-^BPoGaBw+xp`9dJinq1AFopIEKGh-@50Mx>tUKFw?^rtrKK;(j?;Y#ls-RkDQQDY z+3Kkkd}}NEQS4IREmud&d)>!J9*gH(`@OCD?D{0PT>FmGTnk%m%bjmr^8ZgiA->cY zba3g-2^Y38^P3FZbQff<{>PtIP5<*t|8WEOz4gQU|DU({FH|`ewOs77vtunLq{w-h(OV1r-Ryv_&VnP*-;a8<>+WNcD97HLRDrl~4pz>6x*{YOEC^)O4 zBE}GImv>H0ZGOM{7l*m_CFG!Wc?njGMQ!_NeE+_S=;);=VIm@Xwzr zR>&7Gn9NHj0ux%a^~Wv+G7pr7!$W8u6oazPVB9twer zPtX^sZ20kmdl2ta-+|w7b3>Bg)1%8zlGDc&pF)fX7vAozbjz>S+>(XgEQJO%-BE!* zdv-;NLmbH@sN1-N7_%;a9+c2RXM$v@`sE02qBRaKPgYZp_d38|AI8kXAL7vQC=aAP zuC%_M)~oKFGHTF9_Q@0a()w_w%&a07y}Y}YZyBTTc!jbGmbpE7j#%bM?%}ZqB9ZXc zPjF@B>!tNwUA6`S`S?S8=g$V#%V&QSU2~QAti|7u4rOFvXudZu2=DIstCSpXW!LQ&jS??xc0K#v{fAZjo6* zgXcQd$QcUiQn_L*SV1hRs?rUtw_V0hjDM4V8vd@+FIm;$TONH*bh#gsj_;**nKBL|o!#FO!Yruhm+tSR;F z3hc=#I8}VlvfJ=z3C_>4(gQg^i84UO5OO+)-%m~|WG5z0ZOXiOQGV%^R~>b@YcVp` zm|ygT>j&Pz#@1HBwKOfaFR9nzTP|(p7F{V+gwT@p^uCRq9g`__xCC;u2QQVjx-OP7 zm9(CtH+4R>@L8bW%aCzc;FUQ3Ym|4cQ7YY{1H;Ls`Z8bq`ODcKlx}I}#(hw^9>MwU zd4a#NAU$`We3rIs#s@GA})Txix6tjZmr zlI1T)SHbr>U@QlLpPqfyRH$*K+L*JJ?UNb7vJ>n<69>0MYV*QZ44?@@FosfSyb489 zMDM4u9Ls!^%bj@pC7xJi`B4oK{J28^F4hEMbfkQX4s6Gret^t3XT*AjaPAPsMZj3F3!|Z_!?{6!lE^W6BQXirr}-%d1ahzQ1=EQH09JU(>v^sESh(q`_;L ztK30Mp%QnjH6h*7rh-hFLI$uP-VCKIZ7p2vR;eM5_eMf@(*6!HRt*9k#R`q~H(f9^ zMMP|uMZ}7t3r?<45-ZJeyKA8pM^CJeM3~7>p5EKv!NnFpmRA(*D{7&)Ek#Fn!_5m( z^X=9$r`IL>Q*mN0X^${tF%E+wE9OH?`$7VDuAS6|n?SIKs&sc6I#5(GNb#cRyZwWF z4YQwvpP>?oCb^bdGXVtBaEF}wjtXsFn4k3+#?+UO0fI8?R4n#0LoXfMXKlL}+@e#S zb&oo!UR|A;@OhuOyMPh0N3uX*7Ae@L4-tGZSW!9bf`j4iprLPboTfkC0DljSKiuI- zfjV1A9_)l03o>Oz_mihUMRsKBeM=_826?hi!26kO2+u=ppyhnk8<+Q%Tq<_LK_L%{ z`0N9PeARy0`ru}KL_b#HVi!FfoZfl+AQCANkQ+<&9^ z847V##Nu{0qqAIhjtR38QM~=vfp*T zu#pD??PK7GHtXS|hspbIM8|RR-7B&6>KALEAsfMMt9xF^51m|CD!h~M>Vkx?J$v7Z z>pL>CCO?1z6#p5bE`4dBy=-4PkWwJ5`P;iA^*`YkfU}E|*Y5EA8?3#*_y1y>Iq8yD z9j$l@I~#@~R<_t6UpQ%UcJBy)SCz3Nz^_@H7x>+YEjXK-T`H}kf@ENL_;Nz`-C8!r zfTl|+y^IXVf`Sb^3v0R7kac<3(8^y$MM(JFFW>t|$&pZi44@in4O_qHDjl&67__k} zc~cXxDfAHkSv>)aw+Mw;8zdCIC>1`!lkIC;eiszZYF}^^nWy1UTl_dShk`LYQVaDg zu726-v1^*==^8Dlcm_y4{u%&F*W{7*6^QkmCNsv2{!yWQQ2KG`eHz5RrxeG%2bH2& zI~$v@FlgrB2oCi=cxx0|LqJ`R6Un*hDr7g;x(6$ zzh#Ova>5-!AuAoUQSg2=btoSJEqdUEPfnS@C8;`m!J#9RYfa(9IJB8)c@u&*v!9s( ziNi&5?XS%_NdREv(nAe)jGlVdL2b(K_7LFraG|-V!4Zr&F(M7B2-%mfAbX3)b6X+r z-bLUH6Za=Jsh4+>`Z34-Hmi1yjzPcvTm`o|G0g#RWGrlir|_h8Si>1VISEitbd4Sk zYg?t)haCq)MQ}Qw>kr(hh7wyH-KC4HhgSA*@{p7w2glJCM|a^!c#qW%p6lqO_}wnp z>$7@=47zvu?T9TIM!qj@YV+O1bo+ia8z!SXzToZEOMevUSX=EKtvT*Z+DA!iJ}!Yq zV@NY&)F32f70I)IOR*LOx(*JX-aP~{fEx5lA3`9K@-C|~bUEVO8h zG;^@$YxIJ|y$7s`EH}?Ly(&uRT}$fSI0N(S{)L@J%dj-)D20FLFm-UiU7MGckIc$T zewFQc)Cwn!JF<{mWzZeNUg>!=VPDZW=X5UQvvticURlT%{7Xi^nXssP*XE|4M5?+1 zQgAu_HXJsUxGsABpTWXGW0Y$5s`BDR_L#jUY^m5p*cj#yEK-5q^>pmFzt6Bh|oHP8d`wggBDG(2bwqrC#Um8BIoZ~1soFog_!1w5CrJX7g|j_yqewCFk& zKB1%HYHsvjA;i99(g|Bp^c$b$E7SKv?5Ri!3N9}1T!;HY|An$(2ey;L2sH@I*L=)6 zA`BYdMj71FrW?&hO}?iVqmGPm;QZMD`W+7`4sK-Au0@9^_{-$fgd@xA(f+fufSYXE zv>LHCPka4{t?#X0Xv7#csM8WLikaCrAF{reJm*##4L>9bi3%oAZElLsEfssz{gxj1 zs0N33MU#Q^r9|FcU3&d+aMa5Ddp8*9MSkuzk5xBY5oi%|HBhA|C&wpI;Gh#dzfa4{ zR+Eqg5=g!AO?%h#IYShs6U~;`z0efM&V$|w`?l56=MKda<6Yp8WoN8`wWqg zJbykOu&!Xide#*-9bkT1KVoY-U^;TGGxbY98Q<*@dTw5NKWQ?tJGux3p6u(3Qz+rv z*HHcBnS-syu(qC8o=C@RsVVynB6$4EFoLf$zExoIUdmJ=lmCRh&#^_*+UtzER5esT zrV=KCH<+?5_AN0hpG>si%g5gW4PiH0Fv$dI!30plwvP$hM<)QI zo4;O_hzbCMTqWxocTn4=+ml?&(#S$6arYzaA9DzO)uym4>3E|a0c}79^slfx;cwANb6X68QN=0RFPOjz8ljh5 zn>!vi;=69d$`_)16g%YQQA2C~&kN|l6b5IP<+T2ZNeGQohCrmakeAM2Lz8b}64V6c ztbC%F7q|>2-S6E+8pfxMl`!#BW&97WcE2!ozpyok0md3&+ro~5Jc`*!1k^5w1T{ex z;(a;>+n4Y6!=JbK*x|{Tsj+cre`9^m>v50ojUV`1s)XalVGPuF4kw@Ew@QO=-S;D4 z8jAnEBq*bd1ufWOJwm$j5Tb%`aj)#Fie_og#VN&qBU=|lLNcT!|1&AO zAoBJ9#Wo7oJMIrtx4r5B57_aLa;l!5l~7N-<`0H`%Us~h784j4R;A%3xFa91M`#)p zehnw71SfIE*8{6 zh1);H{}_VoANiadCg1Ky;C2WtOJgf;iW(3|@QdzJ17tq&HVeM_VpraG+ku}5GrGay zVgDaLE@o5D*p_G3p3v!hXxsXm`E6AS0I@KyKwI03;)xCL2y(xFmjP@;8KpM`_E+FW zil@v?&OduIfr7nO^E#KYx7RDXPd?8<-ob%XXLbTS%K=R2us#a| z@}UWptsQI9MRUX%Qx&rw$Hm9Rh5j6y{BHf-^`VJaDYT|e2tPgv*dDI{V+!a7zUSEu z{%rnUbQ_SlsmV=hUEN|Vzkq=GsJ^lB#k^+`^?KaM-rl?4azPC&mDJR74poMbe3rb~ z?)OOyJ7lvyFg@M12=hb&rnTWl-qoEqyHmWj&>dY)h;KolDFL;~oa+|SUZEg)XkwRs z0=Qqzuh5c`@SY`o1B0IYqN+p__?tH-=>&8fm||v?kCF&fcz^@}5HKM$eeLlE-TiY{ zjeIuv{AU8W0=5!2$jAH71{-jQ5hgK;t2d%_}Ul*cDRGq0h>S2ZOHp zYjMaL1R%_2QFb;*Z*Tt6SlIgd^K22veMa->z{$z?(#PSStpl1u)@>^ec=Tr0hOCot@$n{s6Vu#)82)$&7{QvD z2-dZF`W?Qr5WvYLAbQlEaH(=v5M@3?Zwi`xH)lar8#~6u=?Wjq{cZ?3qYtlDi9=?> zp~Dzc7!_rh{AwOTumO*6mp($T+C6y||Ndp)x|_G$+QKnR9Ld1&OqgY2e`JIV2Wqi` zg%Lm^T=g$|0x1k?F=j1Vj+=yC7+POv865wHeFh&GwOQ;gvLjsn%TAX!!ss%x^RZ@zCZnA3QzHia5W+{VYLE-6N3Ba`I!6c&sz_E;t^TBKa z{X(kXoon{^T2rFn{L*M}V`PBMT5R`=58XG%B++2AknZ;_eR$bP&dgTuRPQM9#!u^z z9eGkM6sTd(3&K>6oY}~;K4$rr9BYIK(1Ssp$n1th;Dej;`>{A6Hi@lcA;cj7fPC?y zc+f{qJJNuw1A}s(25EXou*VH;{cTxt@!P_CoHiFmm!F1bLxWo=0AGETaK0F+PQ&f-xBQJ(TP({8)#TJ zw~j|w{<=C<8*2?(S3b(nD?MVWoC3gdJ}Ckq+NtO^s9>fZb-v$pRe(G(Psq9A?CcB% zI_(s!V@cZz3D8*O#l3xW0?mRhNtap+2gaGDKE(Hig%mqh})NUt6 z|7vhzBhQKb)ey3IYJgpl9$tCV8T^xv3W2KecH+dE=nZt?&PHb~igqVD)csb6QOSU};N@ot-RnbAV9PY3P?8)R0<^72|}&Jd_N8FjxV$&rkp$zNPv&Zw@wPl;!7 z23Kq>D2}YIKI$R97%O}w7Y}z8GdfCrq#qW}bYFEddQ87Z7j~DC)x~wsyu2iSrZ05^ z4}KqZ)3bYxTYG(1bqQcCBT$j>>(~@cfQrM!d_8{f zxx^`OgyVtH_E91=1bQwts(=7SN=C`YXYiYpRQ)3BrJ+A7ErJaIiPG2Behje(~>Z zxF>Gwj4xwGVluU1(HxIMv$Giw2{GN#WA34b5W6G5mKPW06lc&DJfN)sw;8asvLjcB zQd4{Q8H&`4gN`PGi=7D>aHound}xJST1rR+>iN3U`n8(+0P<*&O4tr)JZ6HZ81C@r zA$En-)Osb5KQ2)R>m&|e2_3PeI(o6`Mjoefd(kBcK-(;dY?d}9U>06=PSsK&;o-EP zYeb;AI5|x{Bn245uk7rgfusr=Bo8EI$C3-U6Tl4UDAILH)?8~IheWbV;15Y|G2KRr z-@4UG0s4@9Acvky0u&MBtcnAi9n3hfwFL=ky}VRI)QGL3k54|BX{~Fn0Sg9GC>p@> zoSgxqb!HP_WTm5@SkD=;ePYaJbR@~9ekb0A8##Xh*z5)F?7;!+$~{1pAa;aBTy+v5 zhZ%_g|2YLk0SIdudU>EUg!~oSAnF(&g$`kyLE()7tuIs}bpxl9Uq3$1tdwQGg>-)c z1W7!vDd>V4vEf0wEY&A$)I8THM-Kq+X2v-JPI6# zs$qsHo+wibbvxx%K=rR!@WC2pXo6d=-v@fB$cN7HE+H0T?AVGlxN#J>0)UVC*FSE= zDrackIlHSt%(2G7uAN=!4PIUu@LJ|^oy^#k#vz^xf@hs+YwI^4V}-o(W4y&(vR-kL}J2mfxvS5mlgygYw9^q z0kq6)Df;?y+Kbl!csM$;9vHO(`rOl(FK?GkGAbY=zkUDNxUh2xfJw@f^B=aF`r6v_ z**5FDskIPYcxuG0*E18)^X!La`N+a#^eoat@~z}8`85-N#@d)F|?%daGL zZyoLoX$_4He+B(`WaM*Qy^>Fm8Ysz^{nUqVJ{iId4H;NiCqM(dcK*x^3YY&}Z-G${ z9nilJo2v$f5#T;H_QMJ?D7CVGK+;eP&%#m`u_^Qol=ZUbnK@hgFHONT29v+5TZpU+ zD9xap>FOFIhOOnbv?%^Xm=vSaEDKRN8mJ&3f&SFja;CU)MXd+l)oqBI_>x_eKFb!N zPzq)|AK!QRwY+at7b+jQ9G6bmOSmo{kLep4Mgp-gTci|lvRxNFq}yjno#ttx2l7n# z2^kq17`RaMz~u;(?>j<8VPW+*71f2$h!bOm20fUAz#x34N+2yNO04$X#gDIBo12SV zzDOVISM8w{Q9mkuR1K!a_$Ku=Mg_&0B(XMO7DL>#%)%&8haXga$&V=T1zhafwa?)n z>*+vW!Hon)*zgGYC}G*E?#yD`+Mc5?em*e?K6@K94WNCS!`&Cf^53oN$UnQaGkY|Mlz!#}XEX@iUTXB&; zK!Kth=SQpWd-f`SX0Z&9ii3N*TVS~k`K+GPv1{>H2-K=w>@d)cE6SL`OB@4^-ffkc zn45@w6KT7=@!jzJqVi{-0S^jGv_Q<`uFw8e96jqNl9MkU`Usq%yrodx{w_R_iGh-g zj(#CSmk$&a(0{hJx62gh$#BJ7iml;{SD~fPR4_I+mNO#J%+*y=Reh`5g~*fB);|CB zXEFNJ5fuJgw~E(eIR(`}*B^R_BW>^3K(juYpky4z3SSToVv<5NHVOiR4 zNYNyLbRqFC1;Ap{&b1VT)eB+(2w<(*;#9H#??{R;LFuv#WAuREMX9Vz!DT;j<_wv@ zeWdcB%D}W5<%v=H@?8j;RsdcrB55D^XRWQpYXKd*I(!UDDk_%4JWM0R)_AyT+&*v2 z=bmMF>po4bU#Prl#6twsQq-BKlcmimnWTnN8DT;SY-)5FgX`iQwqnvH*@p@XxoE7JiugY6j&9ZYWuDE zVeu;OT3h85PI)UptpLwKYg0p&u()!;9{&(HWw=gDQSdHrh>Mp%bK@W=`KNGgx)f+q zzAN$STB+x0^C$Vn$6i6t(iNHL&w22fwd-Iz=(y9@AF>U zjoNwowVzQ3cKgc;a2j}%usOzsSD*Q!(fLa}eGT76Ha3gwPB}VF1y_#Afik)q9%|Fw zA05ZlZVjx=--8W`B{Tm~LM73;oE<(~O&K|(2C&qzsSKw>(< zhqcvL5aX;>8WiGF%yr<}wrm)2S8g$Y0gd7p?;k8?AYH>oCHly9>s|g@^a!y_d)FwW zm?rUGmnexq;Zod_hHfknbkbIvAftcIfkptLFW-OmY#(GJDSEv=PA&=3|=)*}%tnCRarc221|u0XGe4 zkE;=zhHFA7{?RmWRo%8{pUQvCkANkN{9iwIb{!YJ1%+W23;*_|6Vb&sK6m`(B}O=!sEcCt+YiZwP}$)0McG7#W!#6o;hs3 z4UqpW8pQ$iq}K|V{7+3xZi1R!S`TcvT2mBgO6ymFhz2P9*)Ahph5a`7nzmLz-2!Ta$MKVRhOXggx%vyC-ty$`NGYPo8MP7k9;&RlgOzLa;Q* z8KK&m^aJvPl=MGe_f9P4AHh&Sa zPd64!07BN2Gw_oA0MZT2VrIGQ9?>MZT1uNuIr$=#sATYl(f_@_t6y%Dc4 z3T$6l%hUxNdSodbL^%Em<>PcHvpyD>-k23Lz~$;vS|PzTRiAv-zOKvXh9qQxoK4Ig zXM7kh>^F}}mc8e)AC;St9@yzTWza`u$P9>h9POS(c1}RAVU?$OCkeL$6sv|k3wCk% z1rpnGN*75ZaDBc4jUQ?1PYjSy@6*0xCO4$dY2WuV`t8%PR10N<-ALHO#m-rf;^VZ2 zcoMo3FYeYtM|Z;SX^w*A!^7_ACId^tV)v7-ufX2Q$NO(;B+`Y+(d`ReZf7Szj12dX zEOtj^7-Mj)R>Xk`m|O)JN%`|$V_%iqFh;W>Oag=oWKvH1=CL`+oXf@L!-1+iww7P+pq(1RT+SX7vOICK@rae(va`8G-BsWKk9 za*8fD`Ux7PJzCj{aR_id{|T)Q-w(a++G(ksE#)2s=bBQ<@;SxGIuSA7H45~^0JK=! z13zHmnF;*#yNG#cj~`!n3SKG{wh9O1QKhZ$%n%J>ZwLv`y(4$1 zfyR#mTX10^z`mks$FOW4T`|(PW4H*OoX_c1Wz>Jjc8KRN)$;d?9?eQn`!=8qi$Sm> z?c~_UR4L2;%CD6@&|3*F8Ri2k3S)fuPu5~VA}Y5pbYunRmE_Qdja9I(U5$mpT!T3Q z;WPR_Lj^(PoT`7 zwAEhqM8?Z;iuG#J|0$CQKq-Kk^1p!B6PEuk+s>4W<4c;AQ&$qYNkirQO*!aPuFl-_ zC7}Zeux}$O=JOx?7bHOH5U8Ni-tm{zF3o!@a?L%W2jsWfSWuPwKO|6A8KOiqf2E`f zM=nS>u`#jS`Fo5kp7{Jh`_ z$C1s|1q~OYXj0tyCAo&cg%hWTCdE^!ACx3o+uA79z^OvENPxBu1O!0y8yZ$9F39-6 zfrH**dE(FfquTdq`^>L9tPqMB@OiiDr~aT$S@{UwhqbUm;zfC!4Xlp5S?M>~(UDc}uGLR#Q#snOC zKn?!5d4uGK`Qi4pjwR6y&r5(U z@*yscBq{%|l>7Qqt1ef-QZp4ISC{*}WOM9fTwLgeZQ}u`zsoIR=qQ2LT+#i>DMqBk+b+i-#R$k2xKE}E!kacncaQ+NAt}i_f0(Z` zQyfx%iJkc3Rwnc@kiiJys@(EEK0d8G<;882Sf{DVTkKIzvS+TE3aS?c3E^f zqZhGi@TcJ%J3ICugDI|*l>i5Y;>pve_i$~T+zP)I5+#`zmvPFpOiWB}J=6D@1&5hL zH2a*{K%QlO9uf0FI`1UpU2yl(`-$n%yN%P+`N3103byO3A(3NNr5PC+*JF7!LL@wv zB&b*V;t}}$yhQ(3Ab*-D<#~RHauP_~;Ne(|7cUlHc^oo^4QQEb?1;JPRem#s7}jJ4 zJRwD6IR+)h_S%1272MI$tOUCYL8?MZ*A=$c!Ty?m+!Vh6dMQn4{IcMS-GKzug~JanL#u- zJm1AX`f3HG3$y`RwZ}?apmVw(Vv~YAKIp-K_V6kVA^obC+2~-1Ny5> zg)7k#z9P)3z&$o=4&>*;GbMCKe&@SV_`_B-){j>}puOy+4p24c{!;1GSO_NqGEJ4G zeck!wCEDOjgJ5N)->C$p6qw3Nsu9sPz-$AR2#l?-R~s0jmY4M|L;4tX9{|IJQvTk4 z^@l{}YT)oenIi{>z~Jt_7QP-{9~gKT;`ztuC`%f&ae@hdA2JFGH3SZ3DuQ{2#z>I| zOoQU`LFMRx=}#q=6#c0&fp;87I~A z`<{;`U2cK0hiQQ{jneykn5K+Z35tueG#8cG_s-X2&DZm;WWSEUy8~znm1~}EaAnK$ zn~V0}C?LF%S3L!VKV7qs6eKxcK*{1JUw7+1qBLs;&+SRIej7)@dL>n>oJMN zU7UnlqMD-N64?iL6hL0wzk4Z2mHVA>-|~Y?^T%)D!)?(E-jhp9ZZ(_<{9Y#KAeUYC z2oNuOKa+qtD2m1xHb(2ZdS8>n*u1%jJK9Gv?FOD7xU2x7c6OWtezbaLjmAjUtZs# z6{#A;Mgm0sHUc1*OB5u@ZgIDB3Pv%GUL~c^86qpKPJOvDstM%!#+3z|u}dOmppSEK z0NJ~!55Eusmq@4U24fwnu*62a2*-?LC-=2Wh#O5a*I7>Jr5k26ti$L6&Iid3Ix8lv zvT{T-fuEN5S(+a{Gi!qL+~nn@RnMuhFjF!11utZ1?frB1BPA~X)qYScftMbfI!%{x z=mS;CO1~i~lCG6^w6HA2;hQ5d$ez%B1r^;ALfdjjN&PbOEjo&ivGf2i$b(xZw(xIw zf5`pxHX2pGO8Rd0LUF_WvhFJwE$Mg6Y)ZEpZ@enh!mKU!cUnBIcn@A3paUWzeB+zy z=5)^2=Om;HvdKhR8{aP-p8G-%91ORok7O?2yGAK_;``iyo*GQm#l^r6775@s&&~%J zPH+pSD&90>RPL<3BaNF)`YJ$kn=6E<0+0waiUoYpbZi(Iu8gz8T7MG=sWv_&oV3JJ zAkuHfD9!E-GRuTaZN5KC)XVdChQ51>;DXVtY9PH)-hCw{qQj%3ZYN}rWTmsCx4H+6 zb;DM}Z(J1B&bbcCIdz#@ZMU2bA%tOu8pHD zIyyUL5C|@k*}S6q=6*k-s}x~>NL6F&cF6BpeJBn&601HoxiI8PP6fIRFw8)Ia+Ny> zOy=!r*M1NpXmPB}M5Af-P2Mn&n4KK%c1-;_DWCe7I_cR)`rdI6;bhD#77c{M} ze}f8?chE-x-4b+c%$guc42s&CPw$p_K*c1|(MSkSgW?RlFD9E_8v!AYmFdLdao3WkKTOo$X-)Cdb9J1Wm z6-344G=uy*SG|(f;@bZ>I3nUQ=*L(fekabY@k_~nx8&CkhZ|=^7jKaFNBCWo>}V=E z!e-FczgvZ@9?Um19A1q^qN%sA&9(KaK6`4^2V1bfQN23h(AAqY?py8tWK_kz1h13L zSAH$O+-D+j*f9$N9tZppx@4*W1mQ&YYm^4&7gd7!CNYg_D)&KV4!zZrDP)}RiUq-9 z?B<&joWZ^$w5P7-rrT$$#DWt)*EF>@vEaaq1R9f_oGR;gsB3Z;EQ^ z>jysxrarrj#whkjn#RTvLiLB|;XXTLf~K{1?$IJ>KXz4K7(V$OEyY@p#*U@0HD zcVF^3o>Rl*^hc|MFq`57%u_QWlA|nHN}yD*Y5EOIBQ|hiBd}D8TyiOO%Q?CGgX_1; z%Z;~lCNAeZ3;2AV9TmJMIj)l)K(C%yDWK5KdL;blU4(vj@p46@H%r(Dopfy4E0fvh z+u`{Sud(y_3mzKz@RYSkop7F5bZs|c<$6+%Z~W0#YlQtt305YdW;Y4Ol)zdb4V2Rx zKbPm%?iMYirFuK-9S$8dw}#RKEO98;R|DX>{gzibcBsKsDpu2P*d?I=WyD)tdN`BD3>>TAOj(Q9k1b2(uVb-G;x9G%`n1{6J)*_ODD2t>>3!a2{}y2TueO7RJ%^Gv9S^ zXU_YydF8W9J6=ezs!O$k1Y|jq`n5`?*tfkV(uOx*|Crq|{>^$JQ!%<7JXjIOX^C4r zJQnk}S%i&_fw z1Qv4A)AV^a^f`cq2}!dDPlpQ!r?;W5Nx(t$V|^Y4P^2hR3pYaPg5CB7QiA-1(GihaqAUOEl{DI+#aG(^$O zO}wPE^pR=!(PjS-Mt~q3(FwUwkhoeVK28R1%;_JO>ddqBz37T0U3GPJM|XFNJ{(C_ zITabsB!n2sR_o~NYtMR`5V-scZJW;Ec1~Tai+U+N|LHycliu~l$QN_Rq1_ra=l7O- zF&cqmq{F(aB3t!2=%Xe>Vf}SkQ&Km!F2i7NC_ECDW<5jpT`vzX?zgqIvEOoY>AAzR zVPzmrAoQIOih>nKDtjO~vZaDstV-W_KL$eu1lvBt{5Z(S$bS8leYsk1&{oU5H#4?F zY+PTQ@>6vBfkj+veEIu*TV;W)@0gAI$nzdT>h*5wml==CE-z=fqAR|8Yfiru2Q2x^ zYUE{s-_55mOLJ8-wCd~?VWUS(4dcO!=dI^tllMB>NDuopP)#XaUW>s3`Mk|PHvVqU zc*9zTCXTg8(`&b%NNpe4N`2D*wV*!l6u~UQ78$7~;r>U8jXGGkx_?_SyyWkecuK0L z`c->B0f(+lt5<$d2+Yr{6NG*dgIFARu=J+fAzSRhExca{I~cmsaqt$-L?1%kly9E& z(ar(}?RV-60OPa~ZGlPb597z%OMWUch+5iOxpC`q;Z$Tk*L}@0a``^XMfNZ6r(oOZ zC)?I{P`G<(N)&&eH$IC-;0*58_j%Lwe=4KWxycoyBy4X$DaEl>`S3l60?U9X@X!sQ z8GxKIm$6_aFc6~_&LUQ9)c=YaXZ7S+gRCc5>lYkymt6oK(b8qz4GbA zsG$^RSFi^6*+(a{M z{@2|L$HZy4;&jdjA=Qh*%h@?QfwdPwX zu_He)@aswEjmYMWe5tKv<5B;->On}EIZ?0?oW1%fQUkO>Sm!OBZuFdwMqW*G(dC7~ z3sEkVCj_W%urRtvj{Yg;)?*KQW51RtdPP{P8hqnY{)M4Af2 zHy@8I`~lhC^txYMAcF>WiNV_@IevbWs{T*hx#+?7@86wv7nM6KMFF#`-T(RYa5Xbp z*kSS>sO1Zd??_eYW2kG74BSS1@?Q;b?llyxxM#5&y)W~`9;J+wrnPeL`;|Tw#Ll|Q@~u5#`Q_nuPXDY%Y;54G zt$6-I=5R?@NB>Ss1sNGyu-dAh-XC1qyMqI_?1zRrIy40pNx6PtY0|gC!WZi^?9@EK zR7#rqC+UoQ0rZB+sk;$)mh_R5ql7dGm&Hp&T#?@#{1nd=79JjxoJ<+e^tPyh_~Y-$ zQu)klc>ZpV*!Z4}D9MeL&83c)9Zg~j5V=p!s+ey>mcNS)B;S|N8JWd zsIu63N|iFjVR?z^r)p#30l~oCQRuf#*-eS8En|a)a|+Nv9t8bPX$-@7p`D^HQXnnm z^z!d&M^#Kt@l__K@D#@%=O`#BKo0a4h^7Q`Bb%38GQS4aoj!WAE&x`O5$p0dxPYPt zaws5}k&f2Ftin~leFrh_hHd;f;pr_wlOKV#wNjrSxdUY^wFUGgI}_F@b5O)(ha4AA z>bnn-K786jLouB{HoKkv?(2T-H+k>y%zo)7&-+7lI?nrG6#l3$lE0EsSjeFmwb-;^ zp0ZM+Y3fVMt;5Rv12#Oev)R8DJ)Nz}E%yEUJ=){HuNW$-@#}eyh^@ja?x@+=XlN6U zUt084CRPY3F3}skIP%N@cc2$nm?l&P6woeco7#Q1I3{FR!>5YidPeO!h6ahEfKJk{ z?V;X{Al40JBr-leLBw*8ozt&3Vu9Q}5!c1&UcOw&(3Io2?{B{@@vwQfHL^?Bwk)($^k?v#6HI%<0O;PiAef_yuLJiuI?v$gP z?Sxj){jS2`zPtf(or_4|ymgb?l(c}FpTpVYb>J~=UQ)3Hf9H;{UCjemV=?lq5jM2E?Zf&wql4bTCW z4*by`CG}+pls&XFmdCs&Q41`hb&m#p zo80rs3)#U@z#h2qIQ3VZi;d&gjct7Iqu{?7%wHJ%wTSmulq8EX_wsfWQsj73ctH&HE8sI9kJ;TP zeZRl-SW>Lx+gffN-&rZsrvba+X^Z^b9y!V5$VnOxyt$8DUK$Xb8vwC zDI;SRv$~+IqbP#&1NYV#$4j4t|C^Y|Z0y>r+u9nqX(*fc*qeKg^u2XYVp!a@3hB9c zef6tZTV4D-vbhl(@YZ$gmC}ib!$Xg0pS|9yx%aG^CMJ=?!@AS2ht#SF2UF(d&*$92 z6N^zDt!av53w4T2h>=Gpg=HtF8%^`>GcC=E`g3)d-4C9ZNIs&sgPs{2uJYx3N|2K= zG}Ca^KOG)IwMSLw4jAOjkFe4|F(rjHrnsvq7`CaO%%?15P@%Yh!V$bSRHOisbS!EG z!bwSx6EhZV?T?)19*r{KT}7}zVsY_YJa~X;bpmSat!$!6fu2Qs#LJ$|Xh=ixV~?$5 zyX>%m2ORpwBFUW%foJLg==_);IIFv87fL(tc$#aYz_%fMnVeC3VA4HJ1nO;ju{p2m=BwsFXXXcj@q-OtXTRrhi{Z9v z>(_elUS~iA^c3>G)JMTzzHnV*U^tuFo12@o?%};iBPs_Z$EVxm?K|F#H|58Ud_;5V zgH6~k{gN4VMvie=+V@La#V}fz6kV&`!j@TK!4t}}i;QTB zb|fdRqoT8NN%oI-Fb)81>rnIWUWLtWEI5kf#KM0yLfX7MxweP0O@e^tp1531&m93~ zgav0TZrJek$B!RDbel`@yjLR@2lVZtjl-vEYA=3FvBw++8SITaN*!+R8Ticn@~8`W zldK>YzowB%V0yYUr-5om{RG272$r#DdH&rsQjk=M|o zmqNEKu#cLg@p=L&enO(l`LcKj+N%xr+n+CXK;$Tm za6c~JLj0c2*+F55{zw?|>fT3%*-+HowysBM?e(6e=@*5!qR55U$Z5>hXgC^|AGMqH zY=FJ1_ljRPi5alCkc&xyYWdtj41lZfi!Mu08_Ggb)iuEPM=T!%OQ#?}8cioRPBp-o z1gvN6@dDB71-L?HdzSef@BXZc8lN8f_{Oh)mhZ41;B=LF zm?k-z)bLyHOBTUH(q;dJ!F{Y(e!=W2LU8I*t4;KN_3raoi< zD~cqXW=X{D$KRgeQq_DI|Mm*(^g4E|2y^AZG)a8euLPOY%hpfKeprD^pi?i8Je?t=QDk`)rkFhm^p zU%XTX8~rtQa`LW#&}lip4C0PBg_kdRIXo9>PnI7vG%ZBKqA(CYHc-YBAH3qwD>UZ4 z7u}IIV`VntN%H%#fzK3+4NLRJ`X$%tmmfagl{Yx~c|JmmbX|lBongZu%8VIdpK<7I z{xUTx9q_OER{-kYlU5|LDU=#Z`8KO^Z3lyte>)Z>q7Qrf5)ErC+Qc}o8f`G905__z z&g~*trQ&p8PqEjRn|5`Gct}ijAPOdQr)$e|z@Gv)XXWoP(8>M>V`m)|)xW>{p+Q=@ zOArNV=@L{FK@gOVp;a1$p@;5N5R{e@>5id?ZbZqUTN zz|5Y#XMaBL=XqX_pqJaN(d;E4xq=yZYbZHKy7IUW zeezo`yIGPcC;1($ccpXN6-cqn14EDFm*E{sOVE9bmEMPEfwX`NU_o<#0$Y zrpkI8(=ThZQttt?$2uFNMN>^CC`R`D*wEG9Gy1@(sE@pRrnh#1?uMvcb$$` zS*`kT3*VIZn+cb`eM)D)_A7H;oy6(bzUBP#(6Q7Uqk5p0!E?3$3B7M+dP!U1(Au~4 z9E}EPVn3=SLs{!5bU(GTGexX1j-@|Gms91qG5Z~(e=%oYJ&o{O%Z5CZ=tfwJDPM~) zK{DKVnELV(*bkfJ$FSUIqCEHeYlSB+L+J;HcAo_AQ1MP4K}1#RX*QfF2EB4So%+~q zQeOqGSn!)kLaf|Ljv0F&ttwe(`uz5Lv(h>=i`+z|N8U{jZ{0~H%sjS3e$%BdoFYLn zbi?)#L+E*z?8{j{3;qY4==7nE5Bte{kIPQ>NK~4aFjU@8$6UiK>8~7V_Qv^#=Ho6{ zTJGFC^*czsyAPtPrWXqYNx`2We_qKR(ebM0cV!+No}S>yr0JY;+mZXY(SoEWFo%E* zs2b%0{Bk5hXq8O5l(;!krSkjDWl z(^*B1uQfjf&xk2H+p$88BW*4Epyw+`I>qT&E?;m-cY2YBX2SdyzazE!kx$70CJIiRf zmvo^hAB6ifFyzE6&+jmZ%_kbOw0yIEw{>QiG0xxsf`r_ZP6pmb2}uH(OS~^ERdPk$ z8jW5NS_ETi6@W-*889t)VSyw_i;bw+a`#SS0dhh9#S22Nmnjq59^CYWsb!3#FN6eH zAS5yYo1_mO&Hi1f)oy0STeD!lJjoZYaAx~8#*6Yyq;5{Bz=hk@($H~02Ck(0XBcP? zIo2tZ_tEiu#+lQ;2)fSSIThosUa+S~`jjsfqUJ`Wxm&G+5>NNM;p-d6D6&U2SSMbZ zQO}Xm;>(Q`2{muaUc!Z;-;pAt_vWpJ=J_;nNDS|{;SrndEe!3L*RyHq>f+>RggyVn z1%bRw*}b0L-HOoaoo`QpB_=v(fq!JH@ykU=VIG!uN6@?@^-Vz*iDG+=q2MWKGZ z`t`z_MIjJebzDh!=S}jFV(vjApJ5xz)gB&tffU|yezbYBiFRq=rz17}T~JW^Co5p$vS84D*O8MR zq6)Pr(6v`kM!#)u&s&_GD+c?;aWm^4J)e0NX@z{t2SPq?0yjwcyM6>IxL_=rWsnp@ zoh403EVYw%C9KsyH!~Ag{O^|(D4tel*jrm>8W zpI7R)1}Vjj@@=SAS?LbtiaNife(6Reg{|p|0*Up1a*c{A zl6qnCjrA$VJ%g!$_=wLbGWmk?&RsrIU|mTTwN-fe@CZgOUeIix z26sLm~X+3OUYKJx2XZgh5P<}AT}clb>+yoNV(4|zooFA3oDxB zge6g}V2`9{QmxF92=erT^DVq))`Jido0y1Kq!oe3;zb78+cdtWPxm?qn`bhdjCk@9 zr<*R3h!ux!$gU+=u3uqRQ>KK-6OO)*M$5fR5^f@r;EagXE{9Cl7eC&p{u(GZn>}q+ z#JxE|e7pRcmox4$zIHyY*7v`aw+H@eN$$)@Ful8{mvT?JE4W-upxNYs(9U#t<;Kh9 z7@Z*Dbj%n2Jc~u1d&`9@!?O>W#4Cw=?4@GA+}5e9_9k#*Uf53A6mrK{H~X(rkB<~Q?M){z!$r@OU;?t5aa9Zz_VhX?t016^F?6JbYcG?x&b2!B|6 zuI(S96(6G1AAVrb_c=2+7kAtk?%nkeF%zAgeFx~~GD#B7mSPv`*gU-$@kP&+JkFfN zuPVs?{HS_%T?f_fN=b=jGDiW>i|ex*pOf2vv6$-axynZ1!iYAZS!W!yZ@!d2YGp@1$X2jKTRT!`b)AoF-mUIm?ZhL1!Ty6 z`ZXF4tX;T^8xE9N9U?6?G;S|0U6dlb-aWkvCu)G{Lv2*MQb~00^AxD->&HY!CO?r0 z$>ITovrukfO59=a0GE)G``R^>ARg<6Plc&u4q3-nK7Qvb-7>uG&4kc2?p)jqy!ROH zi@7oqfVt8RHT~zg{QDF1e0iQ-f5hFA15S-D0qdJ30KtIdE~hNzvLRh?{y#Yae@2)U$hh= zTwx$};~-|({vm#vf#|yquPDeq0(SvX*2o<&0&i<`2BYME0HNgV86D>Dkv9SODHh1q ztT!1oA$->L4hge#_?Xre+vhm(e-iCgz!(9t9X|>-9Y9R{ANnS~rLz>sQDYj0_Nvsp3qjmr`S0XGOug11ZrWHs87G9aqNdppah%ndT6D=I`GFBo zT)+sIk}6f{O#-egh=czVKK}$ylee#|(T`0|9x9As#U;E+n{V%;>Vym$zMIe+kB^IG zmX;>vU+NZ#f@pf{dkbs06l}-rm>>Md;SD{c9Vv~5fkAMuvZyzxoAmvbwl#2E#a>mi&;V)FSOENPFaB$X=&=DXO^K#Jf&s-Q=SD9HJ zfT^0jhXVv@1|ZmsqBF~0g^cD!+@w05&twSqhCNamuOOVUyRo$@Q=O^21SYM-zJb5l zM$t>qvWeKF?qi5_!S6vY+=`hUU*#NM6)qYs7kR6Aih!Vbx|R1;x9w^|&bA&!bc6?D zS07uIO(YEo6Q`X$NbCc_n!T%zp%1y`0N?>=KL`By%MxsC2krsD=K`_^z_j}>pUVx+ z)E(^gz#s|Oe}29He7qKdY`x+Q1U4+^YrBd`G799X@jq$m4p?!_AUN+S47<*>c;>DE z>GAk(h{5dPsbpx^lHX9**v+p1-mS$&_LE6`RIQnJaj4EUdtzVxz{*CXlWFPjDBX(b zG>E$5goPDu|0l#eP$MTnd5ijbF=%KF!Fv^S^G68VgnMm88GgNYiPfJcc=)`rmL&zOtxmS1jyHF z`!?C?PZE5>1Kmall4Mc4HU=Kqr^PRmq6K_-pRtKHq6I~5``dE2Iib^!|FKm8GtJGH zU@ZX+(Qa6Ab$OzZ#~J?(c59)g;iR&%@sn1{gIJT!DnHxVv0GbSCs;Q9H70-i3k0Uz zFq3Cz{I_#%_oqB0DSL2tul3J^Zrk5&Tg|wzs0ST*_Le5vitLugQuM7ZiowX_z16(A z3@*Wy3rdKMy&2!~Bh~A- z@eg1YONEC191LOe;N=y^hFw{?8+qR zs|Lf*w82ipp#5ltEop{`{67^Yo9|%ok?_=XrpF7#C8d2r)MCb|n1>6hZik18-;dNf zT|ViR9nLUKxb*txQ&gp%eX(gPJ~EyUbrvaRS_-jle?vPr)|e{ll@R3}bP?M)9$cx< z#c{ldQK+97Bz6!bhL1 ztNwp3PyaQ}(fbCb8B4${12C)F$s|;O1Qf4~vrWx`D-FzoPIZNIk(w8!-x{P6u4N(8 zjf`+lJ-;nA<@wJ!3r%w}K~|cCWjVc3-d{Ltj}mfpM0rSXA*vE*Eyx$8TeJJ>IO#6) z;^F-V5;|vp2;JP0=z@PRP2_oj-*V{))u&c2q>p#AZ>i{G!8>O5J&2x;6ZB->`LNr< z*M;SFTyqG$wB-NlQJ&laAIO$kWivb8uDz}oUyo2tIzyE>sOcx|I?ec7l%RaSPQ7#6 zIO_6S{K$M%|3i7cX+c}(>`tjQO!)qFBiFL@qY%3cc+j1M4XD(qX@ zq&i#QyovrgUt#*A{#xtFLa!ffwn!H18n+W{H^_2AgcjRHM299_hpbR4OW}{Tk|*6{ zWZRz+H?Om$mM1hmm*>jnZ`CsH?Wy+O+y8$06swZ?sh7FZ|HnVI`|x4busCs_4^00A zT{#F2R1?Mt+6$NR&C2((;A%~8$A_I)LmGt*b=bOjzW$9?0!uLd`Hjs*DXp21_vYc??qo${B`%=MkPw0FSb<_|QlK0Nm=Hhgx>I#a@ zlxB^!mr{`nt{vgOcu|I%eC>GYZ$4Dvzi>F2uHh*6Nqea}cU>&Ch(J=*Bjd_^s2eT> zZw1mc6SujtKd!V7r?#W?N{Slf_KTHIj>ygnn14BP##BgD5`~*PW|FSf> zWEjl-=?n$Rcvc*Q;eNGuWIxg>qwH&j?Zejjm#q$Tz9#o*NuXPbFZL)-Fl-F!$U~+u zSxiOR==;(OM5Mj%2iJ%qQz`LSN!~r5kD ze7v`~Eznkhmwa>r?4O&>^0&%spMS4eayD0P+4gIy!tqcgP!`D&ya=8T$WVFf)PC5E zq*{uFR=GBn@GLad&eH?omKcb=5&z%X+=Un&mWG2yshs)uo> zg9D>wFHT-FmE6NxSb6Ysi_E4+qzi0SLPXAR<4FyX!RV}%&ux|V7DDjUbxd%l`iJp8Aq`l-RmluDWn*qOGgvzbF5B#>2|QKv z$6s_tE|MAD!8hGo3YebqMfKa5+sgXUPpFrB%NXe%3A%osfS9qB&tB4&c)h}S(PPw5 z@t$eSro{Jni`o3rlh8G-s@1`b!su*M(nb$Vtum?SmujuO&{5_2 z%GCDh&fslXdBb{|$sD^@tGA_xGpag=JFjRl?RU>-Qk7!dp>Gf6A6kmshSc(qKnMB? zN-g17?@8<*jWyS>*6_XU+w|C9IhxQl4OrPSGS^OmxUylFl8@SY?+eP<3Moj7n^&Jnm}meH4ZQSa0~Y=zMgmI=@G<2Avk7i~g(h+Ta?M-{#)*zdF>MnUew zc2=3CpIglb$XxKg5fX+ZQ+TSW)7htECBsUQ+%-*sW~fqHMKly$8B4ZJ1_t z$_VNt#gtu{S7@M>Y4Wa#$tnxe&olUnbfQQ}#9;P!gG4i?tzbv0ekZHDPqfB78p=KR zk8O=ZXp9FH9w|xvvC%fXd=zT@GqokRxp?z?MXO{z7Z1ba*(&p&!rNi_j_P!TahH?P zgJ|6KJqcn=8HMyIKfK;|hkK_KFG>#v-gLkE36Wslc zUo~Csc8|3``a&5KIL}wg;}a+~pnJ+HMaW+)2|=oon*D4&>K-(TAx)@ZRouIjzlEYX zVYlx`cE5cPJgXC3!mmeu&RyYa*p(qpMBZE=MTgm_Aar#?O?xYH*jPN$$$C#Ga-?=w zltLD5jwh>Q=wARAD!xee$m&8zb$TCasB73h9v#8_^?1t8S@UGB_da(>ubLJI;?*ga zsYAx&wo-Eox}MMu5miSU7? z&F309!1Trqp-hMhOoU31l&E$6RyR@C?{P@b8e(@s!;og!%h2EyjSmaLbRb4x4DlI9 zv!tNfHt&RDjH<%|WoI38#SRxxQ_G|9?9a@q9EUw?ZwY`(*fg+cyqN{t8 z%e-0GRLkhm8ht!ZGVr`rH1Ym0$KU)^mXPB=3d^gE9k~H5Tlwg!9e0MA8Es`(XySom zq1Ta;dKzyCb86F1vht;>i(Ad{{N~7cuJyND$Xii}?#H*y4PJ>C{Vr0i;X`I?&KORdUC$%^>TNmHk^sY@mlAQ{A6-4rj~Q4sb`zJ-02(@g$kEz?rBUfSQ0P( zI=w&mbf*Xw?ckw^QN!s>crungx8%AtgKWI|X^rZ{w4O&880<%L7;tns8oZFL;neP` zqS;-z+Mk+6=}-689rL9-3)+*yP%StI2V6Ca0Z^l32P(!cN177{DL$u^0x!9fu@@zd z_THLv_rfZiI;Llru1g)^ zPzj%+ZM(doX{3c^Q&*9jGwI1ubxoaIQ+!WqwF9Hoy*1ZD_hkM3LFVF#pJx(t4?(bW z5GoM-%klgIPyrm9`c`gVZJB&u-ZU*WT4@}3pbHO_`ml!&TZc;ImCUpiO&AP0ri5Lb zSJl+@2jHN_H)ofHtT)|RM)x>Rx|+S{O8MtST%(<<;+?^h?RjvP(XgZ+-MlXfO95$r zp4C~s#39Ej{o0!9t%X@VZN^pMz{`d`M8LQ^qI1ChaNK~acyXTEuA_pXZn4-la>=F9 zC;r-gzdojRiLr}mt|90|AA?@Zo?tm{>AtMbr@n^LbkEDG2dK;j4wT$gd64xo=2y?& zm^~>;AF1e3uXE-aWXsygDFeULwK(l*6n~N=JlS_{y*p&Qyn=ek`-dn!lN{y63w?60j|$4Ex*;4bl1+RRoH`lJ5-JM|aiLc@+< z?6G~6kjy(p14sTtEk1_0pr#+4que&VqJgFuzWaq(ZSNtdAU@;f!gRFKb1V!k`^hfK9?)8_pErHFZ>V zXawoyitUbD;_-vOWlYVQta5GRsXj{U_7@(rqQ&lItSo(Jy796RdcO>UD)=-RV__k&c7 z+Te_+5d;??ED}*rrzjOJL1VQT4eyU>W@w&7QX#OHV6EbB(rZHcPzU5S?BdbHx4Y-` zS((!)HA9q8~Y zzYNvi*UPX8aQ-G|zaS(A`?C4L>vOEY;cZ*ln*FGnGxzAsr0LVG2voRjhk@t#rs1lT zDX=<+T_-ObEPTHE_k;?iZ#J@n&Q}Titl0l@aI_6EKySCPT zeCp*pNEIDazc+-3U*liiB3Z>u&4IpN zZi)5T1eJ?nSbA{2EtO2kw@p_=aD!^F1)D!qJ>QT&?buAT%WtMf5XeW=_X$@_)wUTW zCfqXhj)`HrLit%;3SYN&>%+2953>_PL+a7x5aybLuyI80*qil zx5aByIqQoE-nVQ^^D*>*1YnxeGmwaforDFw#Yk=;qbina5O0sVztAEFu(Z zk%A5qA7EAl@dZ1CP&4sK51{4_&Q?eOlZ zERg%S4vP_NV}G#MKG?Zx8JXcHfVI!T@`zaq4PwNE2p8J+WXC4ulSgmyovdqOSlBQI zlfHPWkXV9088`J?d-kt@<#KTw1N@TKn9y~Y(7VuKyf`+}{a&|TBbJohq#q{a^JT&Q z%fvE5!4|gq*H>;FlFu@Z9D=UuFT!p5e{YCCOK

    QH)W0f7ptonSrhdPu(APtAHuw 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 literal 0 HcmV?d00001 diff --git a/assets/js/0132780e.dfc30bb5.js b/assets/js/0132780e.dfc30bb5.js deleted file mode 100644 index 1a8915b24c..0000000000 --- a/assets/js/0132780e.dfc30bb5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[7841],{17886:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var s=t(64058),o=t(74848);function r({name:e,...n}){const t=s[e];return t?(0,o.jsx)(t,{...n}):null}},57373:(e,n,t)=>{t.r(n),t.d(n,{CH:()=>h,assets:()=>a,chCodeConfig:()=>p,contentTitle:()=>d,default:()=>j,frontMatter:()=>l,metadata:()=>s,toc:()=>x});const s=JSON.parse('{"id":"Components/components-logic","title":"Logic","description":"Langflow\'s Logic components provide functionalities for routing, conditional processing, and flow management.","source":"@site/docs/Components/components-logic.mdx","sourceDirName":"Components","slug":"/components-logic","permalink":"/components-logic","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Logic","slug":"/components-logic"},"sidebar":"docs","previous":{"title":"Prompt Template","permalink":"/components-prompts"},"next":{"title":"Helpers","permalink":"/components-helpers"}}');var o=t(74848),r=t(28453),i=t(24754),c=t(17886);const l={title:"Logic",slug:"/components-logic"},d=void 0,a={},h={annotations:i.hk,Code:i.Cy},p={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},x=[{value:"If-Else (conditional router)",id:"if-else",level:2},{value:"Use the If-Else component in a flow",id:"use-the-if-else-component-in-a-flow",level:3},{value:"If-Else parameters",id:"if-else-parameters",level:3},{value:"Loop",id:"loop",level:2},{value:"Notify and Listen",id:"notify-and-listen",level:2},{value:"Run flow",id:"run-flow",level:2},{value:"Run Flow parameters",id:"run-flow-parameters",level:3},{value:"Legacy Logic components",id:"legacy-logic-components",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components},{Details:s}=n;return h||g("CH",!1),h.Code||g("CH.Code",!0),s||g("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,o.jsxs)(n.p,{children:["Langflow's ",(0,o.jsx)(n.strong,{children:"Logic"})," components provide functionalities for routing, conditional processing, and flow management."]}),"\n",(0,o.jsx)(n.h2,{id:"if-else",children:"If-Else (conditional router)"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"If-Else"})," component is a conditional router that routes messages by comparing two strings.\nIt evaluates a condition by comparing two text inputs using the specified operator, and then routes the message to ",(0,o.jsx)(n.code,{children:"true_result"})," or ",(0,o.jsx)(n.code,{children:"false_result"})," depending on the evaluation."]}),"\n",(0,o.jsxs)(n.p,{children:["The operator looks for single strings in the input (",(0,o.jsx)(n.code,{children:"input_text"}),") based on an operator and match text (",(0,o.jsx)(n.code,{children:"match_text"}),"), but it can also search for multiple words by matching a regex.\nAvailable operators include:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"equals"}),": Exact match comparison"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"not equals"}),": Inverse of exact match"]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"contains"}),": Checks if the ",(0,o.jsx)(n.code,{children:"match_text"})," is found within ",(0,o.jsx)(n.code,{children:"input_text"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"starts with"}),": Checks if ",(0,o.jsx)(n.code,{children:"input_text"})," begins with ",(0,o.jsx)(n.code,{children:"match_text"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"ends with"}),": Checks if ",(0,o.jsx)(n.code,{children:"input_text"})," ends with ",(0,o.jsx)(n.code,{children:"match_text"})]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"regex"}),": Matches on a case-sensitive pattern"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["By default, all operators are case insensitive except ",(0,o.jsx)(n.strong,{children:"regex"}),".\n",(0,o.jsx)(n.strong,{children:"regex"})," is always case sensitive, and you can enable case sensitivity for all other operators in the ",(0,o.jsx)(n.a,{href:"#if-else-parameters",children:"If-Else parameters"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"use-the-if-else-component-in-a-flow",children:"Use the If-Else component in a flow"}),"\n",(0,o.jsxs)(n.p,{children:["The following example uses the ",(0,o.jsx)(n.strong,{children:"If-Else"})," component to check incoming chat messages with regex matching, and then output a different response depending on whether the match evaluated to true or false."]}),"\n",(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"A conditional router connected to two OpenAI components",src:t(89329).A+"",width:"3532",height:"3044"})}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Add an ",(0,o.jsx)(n.strong,{children:"If-Else"})," component to your flow, and then configure it as follows:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Text Input"}),": Connect the ",(0,o.jsx)(n.strong,{children:"Text Input"})," port to a ",(0,o.jsx)(n.strong,{children:"Chat Input"})," component."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Match Text"}),": Enter ",(0,o.jsx)(n.code,{children:".*(urgent|warning|caution).*"})," so the component looks for these values in incoming input. The regex match is case sensitive, so if you need to look for all permutations of ",(0,o.jsx)(n.code,{children:"warning"}),", enter ",(0,o.jsx)(n.code,{children:"warning|Warning|WARNING"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Operator"}),": Select ",(0,o.jsx)(n.strong,{children:"regex"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Case True"}),": In the ",(0,o.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,o.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Controls"}),", enable the ",(0,o.jsx)(n.strong,{children:"Case True"})," parameter, click ",(0,o.jsx)(n.strong,{children:"Close"}),", and then enter ",(0,o.jsx)(n.code,{children:"New Message Detected"})," in the field."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Case True"})," message is sent from the ",(0,o.jsx)(n.strong,{children:"True"})," output port when the match condition evaluates to true."]}),"\n",(0,o.jsxs)(n.p,{children:["No message is set for ",(0,o.jsx)(n.strong,{children:"Case False"})," so the component doesn't emit a message when the condition evaluates to false."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Depending on what you want to happen when the outcome is ",(0,o.jsx)(n.strong,{children:"True"}),", add components to your flow to execute that logic:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Add a ",(0,o.jsx)(n.strong,{children:"Language Model"}),", ",(0,o.jsx)(n.strong,{children:"Prompt Template"}),", and ",(0,o.jsx)(n.strong,{children:"Chat Output"})," component to your flow."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the ",(0,o.jsx)(n.strong,{children:"Language Model"})," component, enter your OpenAI API key or select a different provider and model."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Connect the ",(0,o.jsx)(n.strong,{children:"If-Else"})," component's ",(0,o.jsx)(n.strong,{children:"True"})," output port to the ",(0,o.jsx)(n.strong,{children:"Language Model"})," component's ",(0,o.jsx)(n.strong,{children:"Input"})," port."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the ",(0,o.jsx)(n.strong,{children:"Prompt Template"})," component, enter instructions for the model when the evaluation is true, such as ",(0,o.jsx)(n.code,{children:"Send a message that a new warning, caution, or urgent message was received"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Connect the ",(0,o.jsx)(n.strong,{children:"Prompt Template"})," component to the ",(0,o.jsx)(n.strong,{children:"Language Model"})," component's ",(0,o.jsx)(n.strong,{children:"System Message"})," port."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Connect the ",(0,o.jsx)(n.strong,{children:"Language Model"})," component's output to the ",(0,o.jsx)(n.strong,{children:"Chat Output"})," component."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Repeat the same process with another set of ",(0,o.jsx)(n.strong,{children:"Language Model"}),", ",(0,o.jsx)(n.strong,{children:"Prompt Template"}),", and ",(0,o.jsx)(n.strong,{children:"Chat Output"})," components for the ",(0,o.jsx)(n.strong,{children:"False"})," outcome."]}),"\n",(0,o.jsxs)(n.p,{children:["Connect the ",(0,o.jsx)(n.strong,{children:"If-Else"})," component's ",(0,o.jsx)(n.strong,{children:"False"})," output port to the second ",(0,o.jsx)(n.strong,{children:"Language Model"})," component's ",(0,o.jsx)(n.strong,{children:"Input"})," port.\nIn the second ",(0,o.jsx)(n.strong,{children:"Prompt Template"}),", enter instructions for the model when the evaluation is false, such as ",(0,o.jsx)(n.code,{children:"Send a message that a new low-priority message was received"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["To test the flow, open the ",(0,o.jsx)(n.strong,{children:"Playground"}),", and then send the flow some messages with and without your regex strings.\nThe chat output should reflect the instructions in your prompts based on the regex evaluation."]}),"\n",(0,o.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"User: A new user was created.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"AI: A new low-priority message was received.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"User: Sign-in warning: new user locked out.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"AI: A new warning, caution, or urgent message was received. Please review it at your earliest convenience.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(n.h3,{id:"if-else-parameters",children:"If-Else parameters"}),"\n",(0,o.jsxs)(n.p,{children:["Some ",(0,o.jsx)(n.strong,{children:"If-Else"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,o.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Controls"})," in the ",(0,o.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Name"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"input_text"}),(0,o.jsx)(n.td,{children:"String"}),(0,o.jsx)(n.td,{children:"Input parameter. The primary text input for the operation."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"match_text"}),(0,o.jsx)(n.td,{children:"String"}),(0,o.jsx)(n.td,{children:"Input parameter. The text to compare against."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"operator"}),(0,o.jsx)(n.td,{children:"Dropdown"}),(0,o.jsxs)(n.td,{children:["Input parameter. The operator used to compare texts. Options include ",(0,o.jsx)(n.code,{children:"equals"}),", ",(0,o.jsx)(n.code,{children:"not equals"}),", ",(0,o.jsx)(n.code,{children:"contains"}),", ",(0,o.jsx)(n.code,{children:"starts with"}),", ",(0,o.jsx)(n.code,{children:"ends with"}),", and ",(0,o.jsx)(n.code,{children:"regex"}),". The default is ",(0,o.jsx)(n.code,{children:"equals"}),"."]})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"case_sensitive"}),(0,o.jsx)(n.td,{children:"Boolean"}),(0,o.jsx)(n.td,{children:"Input parameter. When true, the comparison is case sensitive. The default is false. This setting doesn't apply to regex comparisons."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"message"}),(0,o.jsx)(n.td,{children:"Message"}),(0,o.jsx)(n.td,{children:"Input parameter. The message to pass through either route."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"max_iterations"}),(0,o.jsx)(n.td,{children:"Integer"}),(0,o.jsx)(n.td,{children:"Input parameter. The maximum number of iterations allowed for the conditional router. The default is 10."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"default_route"}),(0,o.jsx)(n.td,{children:"Dropdown"}),(0,o.jsxs)(n.td,{children:["Input parameter. The route to take when max iterations are reached. Options include ",(0,o.jsx)(n.code,{children:"true_result"})," or ",(0,o.jsx)(n.code,{children:"false_result"}),". The default is ",(0,o.jsx)(n.code,{children:"false_result"}),"."]})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"true_result"}),(0,o.jsx)(n.td,{children:"Message"}),(0,o.jsx)(n.td,{children:"Output parameter. The output produced when the condition is true."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"false_result"}),(0,o.jsx)(n.td,{children:"Message"}),(0,o.jsx)(n.td,{children:"Output parameter. The output produced when the condition is false."})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"loop",children:"Loop"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Loop"})," component iterates over a list of input by passing individual items to other components attached at the ",(0,o.jsx)(n.strong,{children:"Item"})," output port until there are no items left to process. Then, the ",(0,o.jsx)(n.strong,{children:"Loop"})," component passes the aggregated result of all looping to the component connected to the ",(0,o.jsx)(n.strong,{children:"Done"})," port."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Loop"})," component is like a miniature flow within your flow.\nHere's a breakdown of the looping process:"]}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Accepts a list of ",(0,o.jsx)(n.a,{href:"/data-types#data",children:(0,o.jsx)(n.code,{children:"Data"})})," or ",(0,o.jsx)(n.a,{href:"/data-types#dataframe",children:(0,o.jsx)(n.code,{children:"DataFrame"})})," objects, such as a CSV file, through the ",(0,o.jsx)(n.strong,{children:"Loop"})," component's ",(0,o.jsx)(n.strong,{children:"Inputs"})," port."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Splits the input into individual items. For example, a CSV file is broken down by rows."}),"\n",(0,o.jsxs)(n.p,{children:["Specifically, the ",(0,o.jsx)(n.strong,{children:"Loop"})," component repeatedly extracts items by ",(0,o.jsx)(n.code,{children:"text"})," key in the ",(0,o.jsx)(n.code,{children:"Data"})," or ",(0,o.jsx)(n.code,{children:"DataFrame"})," objects until there are no more items to extract.\nEach ",(0,o.jsx)(n.code,{children:"item"})," output is a ",(0,o.jsx)(n.code,{children:"Data"})," objects."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Iterates over each ",(0,o.jsx)(n.code,{children:"item"})," by passing them to the ",(0,o.jsx)(n.strong,{children:"Item"})," output port."]}),"\n",(0,o.jsxs)(n.p,{children:["This port connects to one or more components that perform actions on each item.\nThe final component in the ",(0,o.jsx)(n.strong,{children:"Item"})," loop connects back to the ",(0,o.jsx)(n.strong,{children:"Loop"})," component's ",(0,o.jsx)(n.strong,{children:"Looping"})," port to process the next item."]}),"\n",(0,o.jsxs)(n.p,{children:["Only one component connects to the ",(0,o.jsx)(n.strong,{children:"Item"})," port, but you can pass the data through as many components as you need, as long as the last component in the chain connects back to the ",(0,o.jsx)(n.strong,{children:"Looping"})," port."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["After processing all items, the results are aggregated into a single ",(0,o.jsx)(n.code,{children:"Data"})," object that is passed from the ",(0,o.jsx)(n.strong,{children:"Loop"})," component's ",(0,o.jsx)(n.strong,{children:"Done"})," port to the next component in the flow."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["In terms of simplified code, the ",(0,o.jsx)(n.strong,{children:"Loop"})," component works like this:"]}),"\n",(0,o.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"for",props:{style:{color:"#FF7B72"}}},{content:" i ",props:{style:{color:"#C9D1D9"}}},{content:"in ",props:{style:{color:"#FF7B72"}}},{content:"input",props:{style:{color:"#79C0FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"# Receive input data as a list",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" process_item(i) ",props:{style:{color:"#C9D1D9"}}},{content:"# Process each item through components connected at the Item port",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" if",props:{style:{color:"#FF7B72"}}},{content:" has_more_items():",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" continue ",props:{style:{color:"#FF7B72"}}},{content:"# Loop back to Looping port to process the next item",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" else",props:{style:{color:"#FF7B72"}}},{content:":",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" break ",props:{style:{color:"#FF7B72"}}},{content:"# Exit the loop when no more items are left",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"done ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" aggregate_results() ",props:{style:{color:"#C9D1D9"}}},{content:"# Compile all returned items",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(done) ",props:{style:{color:"#C9D1D9"}}},{content:"# Send the aggregated results from the Done port to another component",props:{style:{color:"#8B949E"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Loop example"}),(0,o.jsxs)(n.p,{children:["In the follow example, the ",(0,o.jsx)(n.strong,{children:"Loop"})," component iterates over a CSV file until there are no rows left to process.\nIn this case, the ",(0,o.jsx)(n.strong,{children:"Item"})," port passes each row to a ",(0,o.jsx)(n.strong,{children:"Type Convert"})," component to convert the row into a ",(0,o.jsx)(n.code,{children:"Message"})," object, passes the ",(0,o.jsx)(n.code,{children:"Message"})," to a ",(0,o.jsx)(n.strong,{children:"Structured Output"})," component to be processed into structured data that is then passed back to the ",(0,o.jsx)(n.strong,{children:"Loop"})," component's ",(0,o.jsx)(n.strong,{children:"Looping"})," port.\nAfter processing all rows, the ",(0,o.jsx)(n.strong,{children:"Loop"})," component loads the aggregated list of structured data into a Chroma DB database through the ",(0,o.jsx)(n.strong,{children:"Chroma DB"})," component connected to the ",(0,o.jsx)(n.strong,{children:"Done"})," port."]}),(0,o.jsx)(n.p,{children:(0,o.jsx)(n.img,{alt:"Loop CSV parser",src:t(91110).A+"",width:"3876",height:"3300"})}),(0,o.jsx)(n.admonition,{type:"tip",children:(0,o.jsxs)(n.p,{children:["For more examples of the ",(0,o.jsx)(n.strong,{children:"Loop"})," component, try the ",(0,o.jsx)(n.strong,{children:"Research Translation Loop"})," template in Langflow, or see the video tutorial ",(0,o.jsx)(n.a,{href:"https://www.youtube.com/watch?v=9Wx7WODSKTo",children:"Mastering the Loop Component & Agentic RAG in Langflow"}),"."]})})]}),"\n",(0,o.jsx)(n.h2,{id:"notify-and-listen",children:"Notify and Listen"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Notify"})," and ",(0,o.jsx)(n.strong,{children:"Listen"})," components are used together."]}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Notify"})," component builds a notification from the current flow's context, including specific data content and a status identifier."]}),"\n",(0,o.jsxs)(n.p,{children:["The resulting notification is sent to the ",(0,o.jsx)(n.strong,{children:"Listen"})," component.\nThe notification data can then be passed to other components in the flow, such as the ",(0,o.jsx)(n.strong,{children:"If-Else"})," component."]}),"\n",(0,o.jsx)(n.h2,{id:"run-flow",children:"Run flow"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Run Flow"})," component runs another Langflow flow as a subprocess of the current flow."]}),"\n",(0,o.jsxs)(n.p,{children:["You can use this component to chain flows together, run flows conditionally, and attach flows to ",(0,o.jsxs)(n.a,{href:"/components-agents",children:[(0,o.jsx)(n.strong,{children:"Agent"})," components"]})," as ",(0,o.jsx)(n.a,{href:"/agents-tools",children:"tools for agents"})," to run as needed."]}),"\n",(0,o.jsxs)(n.p,{children:["When used with an agent, the ",(0,o.jsx)(n.code,{children:"name"})," and ",(0,o.jsx)(n.code,{children:"description"})," metadata that the agent uses to register the tool are created automatically."]}),"\n",(0,o.jsxs)(n.p,{children:["When you select a flow for the ",(0,o.jsx)(n.strong,{children:"Run Flow"})," component, it uses the target flow's graph structure to dynamically generate input and output fields on the ",(0,o.jsx)(n.strong,{children:"Run Flow"})," component."]}),"\n",(0,o.jsx)(n.h3,{id:"run-flow-parameters",children:"Run Flow parameters"}),"\n",(0,o.jsxs)(n.p,{children:["Some ",(0,o.jsx)(n.strong,{children:"Run Flow"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,o.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Controls"})," in the ",(0,o.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Name"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"flow_name_selected"}),(0,o.jsx)(n.td,{children:"Dropdown"}),(0,o.jsx)(n.td,{children:"Input parameter. The name of the flow to run."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"session_id"}),(0,o.jsx)(n.td,{children:"String"}),(0,o.jsx)(n.td,{children:"Input parameter. The session ID for the flow run, if you want to pass a custom session ID for the subflow."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"flow_tweak_data"}),(0,o.jsx)(n.td,{children:"Dict"}),(0,o.jsx)(n.td,{children:"Input parameter. Dictionary of tweaks to customize the flow's behavior. Available tweaks depend on the selected flow."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"dynamic inputs"}),(0,o.jsx)(n.td,{children:"Various"}),(0,o.jsx)(n.td,{children:"Input parameter. Additional inputs are generated based on the selected flow."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"run_outputs"}),(0,o.jsxs)(n.td,{children:["A ",(0,o.jsx)(n.code,{children:"List"})," of types (",(0,o.jsx)(n.code,{children:"Data"}),", ",(0,o.jsx)(n.code,{children:"Message"}),", or ",(0,o.jsx)(n.code,{children:"DataFrame"}),")"]}),(0,o.jsx)(n.td,{children:"Output parameter. All outputs are generated from running the flow."})]})]})]}),"\n",(0,o.jsx)(n.h2,{id:"legacy-logic-components",children:"Legacy Logic components"}),"\n",(0,o.jsxs)(n.p,{children:["The following ",(0,o.jsx)(n.strong,{children:"Logic"})," components are legacy components.\nYou can still use them in your flows, but they are no longer supported and can be removed in a future release."]}),"\n",(0,o.jsx)(n.p,{children:"Replace these components with suggested alternatives as soon as possible.\nComponents marked deprecated in addition to legacy should be replaced immediately."}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Condition/Data Conditional Router"}),(0,o.jsxs)(n.p,{children:["As an alternative to this legacy component, see the ",(0,o.jsxs)(n.a,{href:"#if-else",children:[(0,o.jsx)(n.strong,{children:"If-Else"})," component"]}),"."]}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Condition"})," component routes ",(0,o.jsx)(n.code,{children:"Data"})," objects based on a condition applied to a specified key, including Boolean validation.\nIt supports ",(0,o.jsx)(n.code,{children:"true_output"})," and ",(0,o.jsx)(n.code,{children:"false_output"})," for routing the results based on the condition evaluation."]}),(0,o.jsx)(n.p,{children:"This component is useful in workflows that require conditional routing of complex data structures, enabling dynamic decision-making based on data content."}),(0,o.jsxs)(n.p,{children:["It can process either a single ",(0,o.jsx)(n.code,{children:"Data"})," object or a list of ",(0,o.jsx)(n.code,{children:"Data"})," objects.\nThe following actions occur when processing a list of ",(0,o.jsx)(n.code,{children:"Data"})," objects:"]}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Each object in the list is evaluated individually."}),"\n",(0,o.jsxs)(n.li,{children:["Objects meeting the condition go to ",(0,o.jsx)(n.code,{children:"true_output"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Objects not meeting the condition go to ",(0,o.jsx)(n.code,{children:"false_output"}),"."]}),"\n",(0,o.jsx)(n.li,{children:"If all objects go to one output, the other output is empty."}),"\n"]}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Condition"})," component accepts the following parameters:"]}),(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Name"}),(0,o.jsx)(n.th,{children:"Type"}),(0,o.jsx)(n.th,{children:"Description"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"data_input"}),(0,o.jsx)(n.td,{children:"Data"}),(0,o.jsx)(n.td,{children:"Input parameter. The Data object or list of Data objects to process. This input can handle both single items and lists."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"key_name"}),(0,o.jsx)(n.td,{children:"String"}),(0,o.jsx)(n.td,{children:"Input parameter. The name of the key in the Data object to check."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"operator"}),(0,o.jsx)(n.td,{children:"Dropdown"}),(0,o.jsxs)(n.td,{children:["Input parameter. The operator to apply. Options: ",(0,o.jsx)(n.code,{children:"equals"}),", ",(0,o.jsx)(n.code,{children:"not equals"}),", ",(0,o.jsx)(n.code,{children:"contains"}),", ",(0,o.jsx)(n.code,{children:"starts with"}),", ",(0,o.jsx)(n.code,{children:"ends with"}),", ",(0,o.jsx)(n.code,{children:"boolean validator"}),". Default: ",(0,o.jsx)(n.code,{children:"equals"}),"."]})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"compare_value"}),(0,o.jsx)(n.td,{children:"String"}),(0,o.jsxs)(n.td,{children:["Input parameter. The value to compare against. Not shown/used when operator is ",(0,o.jsx)(n.code,{children:"boolean validator"}),"."]})]})]})]}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.code,{children:"operator"})," options have the following behaviors:"]}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"equals"}),": Exact match comparison between the key's value and compare_value."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"not equals"}),": Inverse of exact match."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"contains"}),": Checks if compare_value is found within the key's value."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"starts with"}),": Checks if the key's value begins with compare_value."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"ends with"}),": Checks if the key's value ends with compare_value."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.code,{children:"boolean validator"}),": Treats the key's value as a Boolean. The following values are considered true:","\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["Boolean ",(0,o.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:["Strings: ",(0,o.jsx)(n.code,{children:"true"}),", ",(0,o.jsx)(n.code,{children:"1"}),", ",(0,o.jsx)(n.code,{children:"yes"}),", ",(0,o.jsx)(n.code,{children:"y"}),", ",(0,o.jsx)(n.code,{children:"on"})," (case-insensitive)"]}),"\n",(0,o.jsxs)(n.li,{children:["Any other value is converted using Python's ",(0,o.jsx)(n.code,{children:"bool()"})," function"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Pass"}),(0,o.jsxs)(n.p,{children:["As an alternative to this legacy component, use the ",(0,o.jsxs)(n.a,{href:"#if-else",children:[(0,o.jsx)(n.strong,{children:"If-Else"})," component"]})," to pass a message without modification."]}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"Pass"})," component forwards the input message without modification."]}),(0,o.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,o.jsxs)(n.table,{children:[(0,o.jsx)(n.thead,{children:(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.th,{children:"Name"}),(0,o.jsx)(n.th,{children:"Display Name"}),(0,o.jsx)(n.th,{children:"Info"})]})}),(0,o.jsxs)(n.tbody,{children:[(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"input_message"}),(0,o.jsx)(n.td,{children:"Input Message"}),(0,o.jsx)(n.td,{children:"Input parameter. The message to forward."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"ignored_message"}),(0,o.jsx)(n.td,{children:"Ignored Message"}),(0,o.jsx)(n.td,{children:"Input parameter. A second message that is ignored. Used as a workaround for continuity."})]}),(0,o.jsxs)(n.tr,{children:[(0,o.jsx)(n.td,{children:"output_message"}),(0,o.jsx)(n.td,{children:"Output Message"}),(0,o.jsx)(n.td,{children:"Output parameter. The forwarded message from the input."})]})]})]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Flow As Tool (deprecated)"}),(0,o.jsx)(n.p,{children:"This component constructed a tool from a function that ran a loaded flow."}),(0,o.jsxs)(n.p,{children:["It was deprecated in Langflow version 1.1.2 and replaced by the ",(0,o.jsxs)(n.a,{href:"#run-flow",children:[(0,o.jsx)(n.strong,{children:"Run Flow"})," component"]}),"."]})]}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Sub Flow (deprecated)"}),(0,o.jsx)(n.p,{children:"This component integrated entire flows as components within a larger workflow.\nIt dynamically generated inputs based on the selected flow and executed the flow with provided parameters."}),(0,o.jsxs)(n.p,{children:["It was deprecated in Langflow version 1.1.2 and replaced by the ",(0,o.jsxs)(n.a,{href:"#run-flow",children:[(0,o.jsx)(n.strong,{children:"Run Flow"})," component"]}),"."]})]})]})}function j(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},89329:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/component-conditional-router-1fb27526613395545592fc9166c75c27.png"},91110:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/component-loop-csv-66c1b53f0722b36a900632806cb32d78.png"}}]); \ No newline at end of file diff --git a/assets/js/0132780e.f18fc120.js b/assets/js/0132780e.f18fc120.js new file mode 100644 index 0000000000..73a34221b2 --- /dev/null +++ b/assets/js/0132780e.f18fc120.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[7841],{12260:(e,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/conditional-looping-756b330b8dc690b3dab1c44cc2fb05db.png"},17886:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(64058),s=t(74848);function r({name:e,...n}){const t=o[e];return t?(0,s.jsx)(t,{...n}):null}},57373:(e,n,t)=>{t.r(n),t.d(n,{CH:()=>h,assets:()=>a,chCodeConfig:()=>p,contentTitle:()=>d,default:()=>j,frontMatter:()=>l,metadata:()=>o,toc:()=>x});const o=JSON.parse('{"id":"Components/components-logic","title":"Logic","description":"Langflow\'s Logic components provide functionalities for routing, conditional processing, and flow management.","source":"@site/docs/Components/components-logic.mdx","sourceDirName":"Components","slug":"/components-logic","permalink":"/components-logic","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Logic","slug":"/components-logic"},"sidebar":"docs","previous":{"title":"Prompt Template","permalink":"/components-prompts"},"next":{"title":"Helpers","permalink":"/components-helpers"}}');var s=t(74848),r=t(28453),i=t(24754),c=t(17886);const l={title:"Logic",slug:"/components-logic"},d=void 0,a={},h={annotations:i.hk,Code:i.Cy},p={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},x=[{value:"If-Else (conditional router)",id:"if-else",level:2},{value:"Use the If-Else component in a flow",id:"use-the-if-else-component-in-a-flow",level:3},{value:"If-Else parameters",id:"if-else-parameters",level:3},{value:"Loop",id:"loop",level:2},{value:"The looping process",id:"the-looping-process",level:3},{value:"Loop example",id:"loop-example",level:3},{value:"Conditional looping",id:"conditional-looping",level:3},{value:"Notify and Listen",id:"notify-and-listen",level:2},{value:"Run flow",id:"run-flow",level:2},{value:"Run Flow parameters",id:"run-flow-parameters",level:3},{value:"Legacy Logic components",id:"legacy-logic-components",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components},{Details:o}=n;return h||g("CH",!1),h.Code||g("CH.Code",!0),o||g("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsxs)(n.p,{children:["Langflow's ",(0,s.jsx)(n.strong,{children:"Logic"})," components provide functionalities for routing, conditional processing, and flow management."]}),"\n",(0,s.jsx)(n.h2,{id:"if-else",children:"If-Else (conditional router)"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"If-Else"})," component is a conditional router that routes messages by comparing two strings.\nIt evaluates a condition by comparing two text inputs using the specified operator, and then routes the message to ",(0,s.jsx)(n.code,{children:"true_result"})," or ",(0,s.jsx)(n.code,{children:"false_result"})," depending on the evaluation."]}),"\n",(0,s.jsxs)(n.p,{children:["The operator looks for single strings in the input (",(0,s.jsx)(n.code,{children:"input_text"}),") based on an operator and match text (",(0,s.jsx)(n.code,{children:"match_text"}),"), but it can also search for multiple words by matching a regex.\nAvailable operators include:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"equals"}),": Exact match comparison"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"not equals"}),": Inverse of exact match"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"contains"}),": Checks if the ",(0,s.jsx)(n.code,{children:"match_text"})," is found within ",(0,s.jsx)(n.code,{children:"input_text"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"starts with"}),": Checks if ",(0,s.jsx)(n.code,{children:"input_text"})," begins with ",(0,s.jsx)(n.code,{children:"match_text"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ends with"}),": Checks if ",(0,s.jsx)(n.code,{children:"input_text"})," ends with ",(0,s.jsx)(n.code,{children:"match_text"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"regex"}),": Matches on a case-sensitive pattern"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["By default, all operators are case insensitive except ",(0,s.jsx)(n.strong,{children:"regex"}),".\n",(0,s.jsx)(n.strong,{children:"regex"})," is always case sensitive, and you can enable case sensitivity for all other operators in the ",(0,s.jsx)(n.a,{href:"#if-else-parameters",children:"If-Else parameters"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"use-the-if-else-component-in-a-flow",children:"Use the If-Else component in a flow"}),"\n",(0,s.jsxs)(n.p,{children:["The following example uses the ",(0,s.jsx)(n.strong,{children:"If-Else"})," component to check incoming chat messages with regex matching, and then output a different response depending on whether the match evaluated to true or false."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"A conditional router connected to two OpenAI components",src:t(89329).A+"",width:"3532",height:"3044"})}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Add an ",(0,s.jsx)(n.strong,{children:"If-Else"})," component to your flow, and then configure it as follows:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Text Input"}),": Connect the ",(0,s.jsx)(n.strong,{children:"Text Input"})," port to a ",(0,s.jsx)(n.strong,{children:"Chat Input"})," component or another ",(0,s.jsx)(n.code,{children:"Message"})," input."]}),"\n",(0,s.jsxs)(n.p,{children:["If your input isn't in ",(0,s.jsx)(n.code,{children:"Message"})," format, you can use another component to transform it, such as the ",(0,s.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,s.jsx)(n.strong,{children:"Type Convert"})," component"]})," or ",(0,s.jsxs)(n.a,{href:"/components-processing#parser",children:[(0,s.jsx)(n.strong,{children:"Parser"})," component"]}),".\nIf your input isn't appropriate for ",(0,s.jsx)(n.code,{children:"Message"})," format, consider using another component for conditional routing, such as the ",(0,s.jsxs)(n.a,{href:"/components-processing#data-operations",children:[(0,s.jsx)(n.strong,{children:"Data Operations"})," component"]}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Match Text"}),": Enter ",(0,s.jsx)(n.code,{children:".*(urgent|warning|caution).*"})," so the component looks for these values in incoming input. The regex match is case sensitive, so if you need to look for all permutations of ",(0,s.jsx)(n.code,{children:"warning"}),", enter ",(0,s.jsx)(n.code,{children:"warning|Warning|WARNING"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Operator"}),": Select ",(0,s.jsx)(n.strong,{children:"regex"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Case True"}),": In the ",(0,s.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,s.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Controls"}),", enable the ",(0,s.jsx)(n.strong,{children:"Case True"})," parameter, click ",(0,s.jsx)(n.strong,{children:"Close"}),", and then enter ",(0,s.jsx)(n.code,{children:"New Message Detected"})," in the field."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Case True"})," message is sent from the ",(0,s.jsx)(n.strong,{children:"True"})," output port when the match condition evaluates to true."]}),"\n",(0,s.jsxs)(n.p,{children:["No message is set for ",(0,s.jsx)(n.strong,{children:"Case False"})," so the component doesn't emit a message when the condition evaluates to false."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Depending on what you want to happen when the outcome is ",(0,s.jsx)(n.strong,{children:"True"}),", add components to your flow to execute that logic:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Add a ",(0,s.jsx)(n.strong,{children:"Language Model"}),", ",(0,s.jsx)(n.strong,{children:"Prompt Template"}),", and ",(0,s.jsx)(n.strong,{children:"Chat Output"})," component to your flow."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.strong,{children:"Language Model"})," component, enter your OpenAI API key or select a different provider and model."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Connect the ",(0,s.jsx)(n.strong,{children:"If-Else"})," component's ",(0,s.jsx)(n.strong,{children:"True"})," output port to the ",(0,s.jsx)(n.strong,{children:"Language Model"})," component's ",(0,s.jsx)(n.strong,{children:"Input"})," port."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["In the ",(0,s.jsx)(n.strong,{children:"Prompt Template"})," component, enter instructions for the model when the evaluation is true, such as ",(0,s.jsx)(n.code,{children:"Send a message that a new warning, caution, or urgent message was received"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Connect the ",(0,s.jsx)(n.strong,{children:"Prompt Template"})," component to the ",(0,s.jsx)(n.strong,{children:"Language Model"})," component's ",(0,s.jsx)(n.strong,{children:"System Message"})," port."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Connect the ",(0,s.jsx)(n.strong,{children:"Language Model"})," component's output to the ",(0,s.jsx)(n.strong,{children:"Chat Output"})," component."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Repeat the same process with another set of ",(0,s.jsx)(n.strong,{children:"Language Model"}),", ",(0,s.jsx)(n.strong,{children:"Prompt Template"}),", and ",(0,s.jsx)(n.strong,{children:"Chat Output"})," components for the ",(0,s.jsx)(n.strong,{children:"False"})," outcome."]}),"\n",(0,s.jsxs)(n.p,{children:["Connect the ",(0,s.jsx)(n.strong,{children:"If-Else"})," component's ",(0,s.jsx)(n.strong,{children:"False"})," output port to the second ",(0,s.jsx)(n.strong,{children:"Language Model"})," component's ",(0,s.jsx)(n.strong,{children:"Input"})," port.\nIn the second ",(0,s.jsx)(n.strong,{children:"Prompt Template"}),", enter instructions for the model when the evaluation is false, such as ",(0,s.jsx)(n.code,{children:"Send a message that a new low-priority message was received"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To test the flow, open the ",(0,s.jsx)(n.strong,{children:"Playground"}),", and then send the flow some messages with and without your regex strings.\nThe chat output should reflect the instructions in your prompts based on the regex evaluation."]}),"\n",(0,s.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"User: A new user was created.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"AI: A new low-priority message was received.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"User: Sign-in warning: new user locked out.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"AI: A new warning, caution, or urgent message was received. Please review it at your earliest convenience.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"if-else-parameters",children:"If-Else parameters"}),"\n",(0,s.jsxs)(n.p,{children:["Some ",(0,s.jsx)(n.strong,{children:"If-Else"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,s.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Controls"})," in the ",(0,s.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"input_text"}),(0,s.jsx)(n.td,{children:"String"}),(0,s.jsx)(n.td,{children:"Input parameter. The primary text input for the operation."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"match_text"}),(0,s.jsx)(n.td,{children:"String"}),(0,s.jsx)(n.td,{children:"Input parameter. The text to compare against."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"operator"}),(0,s.jsx)(n.td,{children:"Dropdown"}),(0,s.jsxs)(n.td,{children:["Input parameter. The operator used to compare texts. Options include ",(0,s.jsx)(n.code,{children:"equals"}),", ",(0,s.jsx)(n.code,{children:"not equals"}),", ",(0,s.jsx)(n.code,{children:"contains"}),", ",(0,s.jsx)(n.code,{children:"starts with"}),", ",(0,s.jsx)(n.code,{children:"ends with"}),", and ",(0,s.jsx)(n.code,{children:"regex"}),". The default is ",(0,s.jsx)(n.code,{children:"equals"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"case_sensitive"}),(0,s.jsx)(n.td,{children:"Boolean"}),(0,s.jsx)(n.td,{children:"Input parameter. When true, the comparison is case sensitive. The default is false. This setting doesn't apply to regex comparisons."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"message"}),(0,s.jsx)(n.td,{children:"Message"}),(0,s.jsx)(n.td,{children:"Input parameter. The message to pass through either route."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"max_iterations"}),(0,s.jsx)(n.td,{children:"Integer"}),(0,s.jsx)(n.td,{children:"Input parameter. The maximum number of iterations allowed for the conditional router. The default is 10."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"default_route"}),(0,s.jsx)(n.td,{children:"Dropdown"}),(0,s.jsxs)(n.td,{children:["Input parameter. The route to take when max iterations are reached. Options include ",(0,s.jsx)(n.code,{children:"true_result"})," or ",(0,s.jsx)(n.code,{children:"false_result"}),". The default is ",(0,s.jsx)(n.code,{children:"false_result"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"true_result"}),(0,s.jsx)(n.td,{children:"Message"}),(0,s.jsx)(n.td,{children:"Output parameter. The output produced when the condition is true."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"false_result"}),(0,s.jsx)(n.td,{children:"Message"}),(0,s.jsx)(n.td,{children:"Output parameter. The output produced when the condition is false."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"loop",children:"Loop"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Loop"})," component iterates over a list of input by passing individual items to other components attached at the ",(0,s.jsx)(n.strong,{children:"Item"})," output port until there are no items left to process.\nThen, the ",(0,s.jsx)(n.strong,{children:"Loop"})," component passes the aggregated result of all looping to the component connected to the ",(0,s.jsx)(n.strong,{children:"Done"})," port."]}),"\n",(0,s.jsx)(n.h3,{id:"the-looping-process",children:"The looping process"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Loop"})," component is like a miniature flow within your flow.\nHere's a breakdown of the looping process:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Accepts a list of ",(0,s.jsx)(n.a,{href:"/data-types#data",children:(0,s.jsx)(n.code,{children:"Data"})})," or ",(0,s.jsx)(n.a,{href:"/data-types#dataframe",children:(0,s.jsx)(n.code,{children:"DataFrame"})})," objects, such as a CSV file, through the ",(0,s.jsx)(n.strong,{children:"Loop"})," component's ",(0,s.jsx)(n.strong,{children:"Inputs"})," port."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Splits the input into individual items. For example, a CSV file is broken down by rows."}),"\n",(0,s.jsxs)(n.p,{children:["Specifically, the ",(0,s.jsx)(n.strong,{children:"Loop"})," component repeatedly extracts items by ",(0,s.jsx)(n.code,{children:"text"})," key in the ",(0,s.jsx)(n.code,{children:"Data"})," or ",(0,s.jsx)(n.code,{children:"DataFrame"})," objects until there are no more items to extract.\nEach ",(0,s.jsx)(n.code,{children:"item"})," output is a ",(0,s.jsx)(n.code,{children:"Data"})," objects."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Iterates over each ",(0,s.jsx)(n.code,{children:"item"})," by passing them to the ",(0,s.jsx)(n.strong,{children:"Item"})," output port."]}),"\n",(0,s.jsxs)(n.p,{children:["This port connects to one or more components that perform actions on each item.\nThe final component in the ",(0,s.jsx)(n.strong,{children:"Item"})," loop connects back to the ",(0,s.jsx)(n.strong,{children:"Loop"})," component's ",(0,s.jsx)(n.strong,{children:"Looping"})," port to process the next item."]}),"\n",(0,s.jsxs)(n.p,{children:["Only one component connects to the ",(0,s.jsx)(n.strong,{children:"Item"})," port, but you can pass the data through as many components as you need, as long as the last component in the chain connects back to the ",(0,s.jsx)(n.strong,{children:"Looping"})," port."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"If-Else"})," component isn't compatible with the ",(0,s.jsx)(n.strong,{children:"Loop"})," component.\nFor more information, see ",(0,s.jsx)(n.a,{href:"#conditional-looping",children:"Conditional looping"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["After processing all items, the results are aggregated into a single ",(0,s.jsx)(n.code,{children:"Data"})," object that is passed from the ",(0,s.jsx)(n.strong,{children:"Loop"})," component's ",(0,s.jsx)(n.strong,{children:"Done"})," port to the next component in the flow."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["The following simplified Python code summarizes how the ",(0,s.jsx)(n.strong,{children:"Loop"})," component works.\nThis ",(0,s.jsx)(n.em,{children:"isn't"})," the actual component code; it is only meant to help you understand the general process."]}),"\n",(0,s.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"for",props:{style:{color:"#FF7B72"}}},{content:" i ",props:{style:{color:"#C9D1D9"}}},{content:"in ",props:{style:{color:"#FF7B72"}}},{content:"input",props:{style:{color:"#79C0FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"# Receive input data as a list",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" process_item(i) ",props:{style:{color:"#C9D1D9"}}},{content:"# Process each item through components connected at the Item port",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" if",props:{style:{color:"#FF7B72"}}},{content:" has_more_items():",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" continue ",props:{style:{color:"#FF7B72"}}},{content:"# Loop back to Looping port to process the next item",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" else",props:{style:{color:"#FF7B72"}}},{content:":",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" break ",props:{style:{color:"#FF7B72"}}},{content:"# Exit the loop when no more items are left",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"done ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" aggregate_results() ",props:{style:{color:"#C9D1D9"}}},{content:"# Compile all returned items",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(done) ",props:{style:{color:"#C9D1D9"}}},{content:"# Send the aggregated results from the Done port to another component",props:{style:{color:"#8B949E"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsx)(n.h3,{id:"loop-example",children:"Loop example"}),"\n",(0,s.jsxs)(n.p,{children:["In the follow example, the ",(0,s.jsx)(n.strong,{children:"Loop"})," component iterates over a CSV file until there are no rows left to process.\nIn this case, the ",(0,s.jsx)(n.strong,{children:"Item"})," port passes each row to a ",(0,s.jsx)(n.strong,{children:"Type Convert"})," component to convert the row into a ",(0,s.jsx)(n.code,{children:"Message"})," object, passes the ",(0,s.jsx)(n.code,{children:"Message"})," to a ",(0,s.jsx)(n.strong,{children:"Structured Output"})," component to be processed into structured data that is then passed back to the ",(0,s.jsx)(n.strong,{children:"Loop"})," component's ",(0,s.jsx)(n.strong,{children:"Looping"})," port.\nAfter processing all rows, the ",(0,s.jsx)(n.strong,{children:"Loop"})," component loads the aggregated list of structured data into a Chroma DB database through the ",(0,s.jsx)(n.strong,{children:"Chroma DB"})," component connected to the ",(0,s.jsx)(n.strong,{children:"Done"})," port."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"Loop CSV parser",src:t(91110).A+"",width:"3876",height:"3300"})}),"\n",(0,s.jsx)(n.admonition,{type:"tip",children:(0,s.jsxs)(n.p,{children:["For more examples of the ",(0,s.jsx)(n.strong,{children:"Loop"})," component, try the ",(0,s.jsx)(n.strong,{children:"Research Translation Loop"})," template in Langflow, or see the video tutorial ",(0,s.jsx)(n.a,{href:"https://www.youtube.com/watch?v=9Wx7WODSKTo",children:"Mastering the Loop Component & Agentic RAG in Langflow"}),"."]})}),"\n",(0,s.jsx)(n.h3,{id:"conditional-looping",children:"Conditional looping"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"If-Else"})," component isn't compatible with the ",(0,s.jsx)(n.strong,{children:"Loop"})," component.\nIf you need conditional loop events, redesign your flow to process conditions before the loop.\nFor example, if you are looping over a ",(0,s.jsx)(n.code,{children:"DataFrame"}),", you could use multiple ",(0,s.jsxs)(n.a,{href:"/components-processing#dataframe-operations",children:[(0,s.jsx)(n.strong,{children:"DataFrame Operations"})," components"]})," to conditionally filter data, and then run separate loops on each set of filtered data."]}),"\n",(0,s.jsx)(n.p,{children:(0,s.jsx)(n.img,{alt:"A flow with conditional looping.",src:t(12260).A+"",width:"1482",height:"673"})}),"\n",(0,s.jsx)(n.h2,{id:"notify-and-listen",children:"Notify and Listen"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Notify"})," and ",(0,s.jsx)(n.strong,{children:"Listen"})," components are used together."]}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Notify"})," component builds a notification from the current flow's context, including specific data content and a status identifier."]}),"\n",(0,s.jsxs)(n.p,{children:["The resulting notification is sent to the ",(0,s.jsx)(n.strong,{children:"Listen"})," component.\nThe notification data can then be passed to other components in the flow, such as the ",(0,s.jsx)(n.strong,{children:"If-Else"})," component."]}),"\n",(0,s.jsx)(n.h2,{id:"run-flow",children:"Run flow"}),"\n",(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Run Flow"})," component runs another Langflow flow as a subprocess of the current flow."]}),"\n",(0,s.jsxs)(n.p,{children:["You can use this component to chain flows together, run flows conditionally, and attach flows to ",(0,s.jsxs)(n.a,{href:"/components-agents",children:[(0,s.jsx)(n.strong,{children:"Agent"})," components"]})," as ",(0,s.jsx)(n.a,{href:"/agents-tools",children:"tools for agents"})," to run as needed."]}),"\n",(0,s.jsxs)(n.p,{children:["When used with an agent, the ",(0,s.jsx)(n.code,{children:"name"})," and ",(0,s.jsx)(n.code,{children:"description"})," metadata that the agent uses to register the tool are created automatically."]}),"\n",(0,s.jsxs)(n.p,{children:["When you select a flow for the ",(0,s.jsx)(n.strong,{children:"Run Flow"})," component, it uses the target flow's graph structure to dynamically generate input and output fields on the ",(0,s.jsx)(n.strong,{children:"Run Flow"})," component."]}),"\n",(0,s.jsx)(n.h3,{id:"run-flow-parameters",children:"Run Flow parameters"}),"\n",(0,s.jsxs)(n.p,{children:["Some ",(0,s.jsx)(n.strong,{children:"Run Flow"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,s.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Controls"})," in the ",(0,s.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flow_name_selected"}),(0,s.jsx)(n.td,{children:"Dropdown"}),(0,s.jsx)(n.td,{children:"Input parameter. The name of the flow to run."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"session_id"}),(0,s.jsx)(n.td,{children:"String"}),(0,s.jsx)(n.td,{children:"Input parameter. The session ID for the flow run, if you want to pass a custom session ID for the subflow."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"flow_tweak_data"}),(0,s.jsx)(n.td,{children:"Dict"}),(0,s.jsx)(n.td,{children:"Input parameter. Dictionary of tweaks to customize the flow's behavior. Available tweaks depend on the selected flow."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"dynamic inputs"}),(0,s.jsx)(n.td,{children:"Various"}),(0,s.jsx)(n.td,{children:"Input parameter. Additional inputs are generated based on the selected flow."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"run_outputs"}),(0,s.jsxs)(n.td,{children:["A ",(0,s.jsx)(n.code,{children:"List"})," of types (",(0,s.jsx)(n.code,{children:"Data"}),", ",(0,s.jsx)(n.code,{children:"Message"}),", or ",(0,s.jsx)(n.code,{children:"DataFrame"}),")"]}),(0,s.jsx)(n.td,{children:"Output parameter. All outputs are generated from running the flow."})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"legacy-logic-components",children:"Legacy Logic components"}),"\n",(0,s.jsxs)(n.p,{children:["The following ",(0,s.jsx)(n.strong,{children:"Logic"})," components are legacy components.\nYou can still use them in your flows, but they are no longer supported and can be removed in a future release."]}),"\n",(0,s.jsx)(n.p,{children:"Replace these components with suggested alternatives as soon as possible.\nComponents marked deprecated in addition to legacy should be replaced immediately."}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:"Condition/Data Conditional Router"}),(0,s.jsxs)(n.p,{children:["As an alternative to this legacy component, see the ",(0,s.jsxs)(n.a,{href:"#if-else",children:[(0,s.jsx)(n.strong,{children:"If-Else"})," component"]}),"."]}),(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Condition"})," component routes ",(0,s.jsx)(n.code,{children:"Data"})," objects based on a condition applied to a specified key, including Boolean validation.\nIt supports ",(0,s.jsx)(n.code,{children:"true_output"})," and ",(0,s.jsx)(n.code,{children:"false_output"})," for routing the results based on the condition evaluation."]}),(0,s.jsx)(n.p,{children:"This component is useful in workflows that require conditional routing of complex data structures, enabling dynamic decision-making based on data content."}),(0,s.jsxs)(n.p,{children:["It can process either a single ",(0,s.jsx)(n.code,{children:"Data"})," object or a list of ",(0,s.jsx)(n.code,{children:"Data"})," objects.\nThe following actions occur when processing a list of ",(0,s.jsx)(n.code,{children:"Data"})," objects:"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Each object in the list is evaluated individually."}),"\n",(0,s.jsxs)(n.li,{children:["Objects meeting the condition go to ",(0,s.jsx)(n.code,{children:"true_output"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Objects not meeting the condition go to ",(0,s.jsx)(n.code,{children:"false_output"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"If all objects go to one output, the other output is empty."}),"\n"]}),(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Condition"})," component accepts the following parameters:"]}),(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"data_input"}),(0,s.jsx)(n.td,{children:"Data"}),(0,s.jsx)(n.td,{children:"Input parameter. The Data object or list of Data objects to process. This input can handle both single items and lists."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"key_name"}),(0,s.jsx)(n.td,{children:"String"}),(0,s.jsx)(n.td,{children:"Input parameter. The name of the key in the Data object to check."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"operator"}),(0,s.jsx)(n.td,{children:"Dropdown"}),(0,s.jsxs)(n.td,{children:["Input parameter. The operator to apply. Options: ",(0,s.jsx)(n.code,{children:"equals"}),", ",(0,s.jsx)(n.code,{children:"not equals"}),", ",(0,s.jsx)(n.code,{children:"contains"}),", ",(0,s.jsx)(n.code,{children:"starts with"}),", ",(0,s.jsx)(n.code,{children:"ends with"}),", ",(0,s.jsx)(n.code,{children:"boolean validator"}),". Default: ",(0,s.jsx)(n.code,{children:"equals"}),"."]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"compare_value"}),(0,s.jsx)(n.td,{children:"String"}),(0,s.jsxs)(n.td,{children:["Input parameter. The value to compare against. Not shown/used when operator is ",(0,s.jsx)(n.code,{children:"boolean validator"}),"."]})]})]})]}),(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.code,{children:"operator"})," options have the following behaviors:"]}),(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"equals"}),": Exact match comparison between the key's value and compare_value."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"not equals"}),": Inverse of exact match."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"contains"}),": Checks if compare_value is found within the key's value."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"starts with"}),": Checks if the key's value begins with compare_value."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"ends with"}),": Checks if the key's value ends with compare_value."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.code,{children:"boolean validator"}),": Treats the key's value as a Boolean. The following values are considered true:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Boolean ",(0,s.jsx)(n.code,{children:"true"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Strings: ",(0,s.jsx)(n.code,{children:"true"}),", ",(0,s.jsx)(n.code,{children:"1"}),", ",(0,s.jsx)(n.code,{children:"yes"}),", ",(0,s.jsx)(n.code,{children:"y"}),", ",(0,s.jsx)(n.code,{children:"on"})," (case-insensitive)"]}),"\n",(0,s.jsxs)(n.li,{children:["Any other value is converted using Python's ",(0,s.jsx)(n.code,{children:"bool()"})," function"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:"Pass"}),(0,s.jsxs)(n.p,{children:["As an alternative to this legacy component, use the ",(0,s.jsxs)(n.a,{href:"#if-else",children:[(0,s.jsx)(n.strong,{children:"If-Else"})," component"]})," to pass a message without modification."]}),(0,s.jsxs)(n.p,{children:["The ",(0,s.jsx)(n.strong,{children:"Pass"})," component forwards the input message without modification."]}),(0,s.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Name"}),(0,s.jsx)(n.th,{children:"Display Name"}),(0,s.jsx)(n.th,{children:"Info"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"input_message"}),(0,s.jsx)(n.td,{children:"Input Message"}),(0,s.jsx)(n.td,{children:"Input parameter. The message to forward."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"ignored_message"}),(0,s.jsx)(n.td,{children:"Ignored Message"}),(0,s.jsx)(n.td,{children:"Input parameter. A second message that is ignored. Used as a workaround for continuity."})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"output_message"}),(0,s.jsx)(n.td,{children:"Output Message"}),(0,s.jsx)(n.td,{children:"Output parameter. The forwarded message from the input."})]})]})]})]}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:"Flow As Tool (deprecated)"}),(0,s.jsx)(n.p,{children:"This component constructed a tool from a function that ran a loaded flow."}),(0,s.jsxs)(n.p,{children:["It was deprecated in Langflow version 1.1.2 and replaced by the ",(0,s.jsxs)(n.a,{href:"#run-flow",children:[(0,s.jsx)(n.strong,{children:"Run Flow"})," component"]}),"."]})]}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:"Sub Flow (deprecated)"}),(0,s.jsx)(n.p,{children:"This component integrated entire flows as components within a larger workflow.\nIt dynamically generated inputs based on the selected flow and executed the flow with provided parameters."}),(0,s.jsxs)(n.p,{children:["It was deprecated in Langflow version 1.1.2 and replaced by the ",(0,s.jsxs)(n.a,{href:"#run-flow",children:[(0,s.jsx)(n.strong,{children:"Run Flow"})," component"]}),"."]})]})]})}function j(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}function g(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},89329:(e,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/component-conditional-router-1fb27526613395545592fc9166c75c27.png"},91110:(e,n,t)=>{t.d(n,{A:()=>o});const o=t.p+"assets/images/component-loop-csv-66c1b53f0722b36a900632806cb32d78.png"}}]); \ No newline at end of file diff --git a/assets/js/16ceb5d2.6bd2bb0b.js b/assets/js/16ceb5d2.6bd2bb0b.js new file mode 100644 index 0000000000..6256a975d3 --- /dev/null +++ b/assets/js/16ceb5d2.6bd2bb0b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[1399],{11470:(e,o,n)=>{n.d(o,{A:()=>E});var t=n(96540),s=n(18215),r=n(23104),l=n(56347),c=n(205),i=n(57485),d=n(31682),a=n(70679);function p(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:o}=e;return!!o&&"object"==typeof o&&"value"in o}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:o,children:n}=e;return(0,t.useMemo)(()=>{const e=o??function(e){return p(e).map(({props:{value:e,label:o,attributes:n,default:t}})=>({value:e,label:o,attributes:n,default:t}))}(n);return function(e){const o=(0,d.XI)(e,(e,o)=>e.value===o.value);if(o.length>0)throw new Error(`Docusaurus error: Duplicate values "${o.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[o,n])}function x({value:e,tabValues:o}){return o.some(o=>o.value===e)}function j({queryString:e=!1,groupId:o}){const n=(0,l.W6)(),s=function({queryString:e=!1,groupId:o}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!o)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return o??null}({queryString:e,groupId:o});return[(0,i.aZ)(s),(0,t.useCallback)(e=>{if(!s)return;const o=new URLSearchParams(n.location.search);o.set(s,e),n.replace({...n.location,search:o.toString()})},[s,n])]}function L(e){const{defaultValue:o,queryString:n=!1,groupId:s}=e,r=h(e),[l,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:o}){if(0===o.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:o}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${o.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=o.find(e=>e.default)??o[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:o,tabValues:r})),[d,p]=j({queryString:n,groupId:s}),[L,u]=function({groupId:e}){const o=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,s]=(0,a.Dv)(o);return[n,(0,t.useCallback)(e=>{o&&s.set(e)},[o,s])]}({groupId:s}),F=(()=>{const e=d??L;return x({value:e,tabValues:r})?e:null})();(0,c.A)(()=>{F&&i(F)},[F]);return{selectedValue:l,selectValue:(0,t.useCallback)(e=>{if(!x({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),p(e),u(e)},[p,u,r]),tabValues:r}}var u=n(92303);const F={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=n(74848);function A({className:e,block:o,selectedValue:n,selectValue:t,tabValues:l}){const c=[],{blockElementScrollPositionUntilNextRender:i}=(0,r.a_)(),d=e=>{const o=e.currentTarget,s=c.indexOf(o),r=l[s].value;r!==n&&(i(o),t(r))},a=e=>{let o=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;o=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;o=c[n]??c[c.length-1];break}}o?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":o},e),children:l.map(({value:e,label:o,attributes:t})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{c.push(e)},onKeyDown:a,onClick:d,...t,className:(0,s.A)("tabs__item",F.tabItem,t?.className,{"tabs__item--active":n===e}),children:o??e},e))})}function D({lazy:e,children:o,selectedValue:n}){const r=(Array.isArray(o)?o:[o]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===n);return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:r.map((e,o)=>(0,t.cloneElement)(e,{key:o,hidden:e.props.value!==n}))})}function _(e){const o=L(e);return(0,y.jsxs)("div",{className:(0,s.A)("tabs-container",F.tabList),children:[(0,y.jsx)(A,{...o,...e}),(0,y.jsx)(D,{...o,...e})]})}function E(e){const o=(0,u.A)();return(0,y.jsx)(_,{...e,children:p(e.children)},String(o))}},19365:(e,o,n)=>{n.d(o,{A:()=>l});n(96540);var t=n(18215);const s={tabItem:"tabItem_Ymn6"};var r=n(74848);function l({children:e,hidden:o,className:n}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,n),hidden:o,children:e})}},28453:(e,o,n)=>{n.d(o,{R:()=>l,x:()=>c});var t=n(96540);const s={},r=t.createContext(s);function l(e){const o=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:o},e.children)}},33439:(e,o,n)=>{n.r(o),n.d(o,{CH:()=>h,assets:()=>p,chCodeConfig:()=>x,contentTitle:()=>a,default:()=>u,frontMatter:()=>d,metadata:()=>t,toc:()=>j});const t=JSON.parse('{"id":"Configuration/environment-variables","title":"Environment variables","description":"Langflow uses environment variables to configure certain settings.","source":"@site/docs/Configuration/environment-variables.mdx","sourceDirName":"Configuration","slug":"/environment-variables","permalink":"/environment-variables","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Environment variables","slug":"/environment-variables"},"sidebar":"docs","previous":{"title":"Global variables","permalink":"/configuration-global-variables"},"next":{"title":"Manage files","permalink":"/concepts-file-management"}}');var s=n(74848),r=n(28453),l=n(24754),c=n(11470),i=n(19365);n(28774);const d={title:"Environment variables",slug:"/environment-variables"},a=void 0,p={},h={annotations:l.hk,Code:l.Cy},x={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},j=[{value:"Precedence",id:"precedence",level:2},{value:"Configure environment variables",id:"configure-environment-variables",level:2},{value:"Set environment variables in your terminal",id:"configure-variables-terminal",level:3},{value:"Import environment variables from a .env file",id:"configure-variables-env-file",level:3},{value:"Supported environment variables",id:"supported-variables",level:2},{value:"Configure .env, override.conf, and tasks.json files",id:"configure-env-overrideconf-and-tasksjson-files",level:2},{value:"Set environment variables for Langflow Desktop",id:"set-environment-variables-for-langflow-desktop",level:2}];function L(e){const o={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return h||F("CH",!1),h.Code||F("CH.Code",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(o.p,{children:"Langflow uses environment variables to configure certain settings.\nYou can also import environment variables for use in your deployment, such as environment variables used by certain components in your flows."}),"\n",(0,s.jsxs)(o.p,{children:["You can set Langflow environment variables in your terminal, in ",(0,s.jsx)(o.code,{children:".env"}),", and with the ",(0,s.jsx)(o.a,{href:"./configuration-cli",children:"Langflow CLI"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"precedence",children:"Precedence"}),"\n",(0,s.jsx)(o.p,{children:"If an environment variable is set in multiple places, the following hierarchy applies:"}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["Langflow CLI options override ",(0,s.jsx)(o.code,{children:".env"})," and terminal variables."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:".env"})," overrides terminal variables."]}),"\n",(0,s.jsxs)(o.li,{children:["Terminal variables are used only if the variable isn't set in ",(0,s.jsx)(o.code,{children:".env"})," or Langflow CLI options."]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["For example, if you set ",(0,s.jsx)(o.code,{children:"LANGFLOW_PORT"})," in ",(0,s.jsx)(o.code,{children:".env"})," and your terminal, then Langflow uses the value from ",(0,s.jsx)(o.code,{children:".env"}),".\nSimilarly, if you run a Langflow CLI command with ",(0,s.jsx)(o.code,{children:"--port"}),", Langflow uses that port number instead of the ",(0,s.jsx)(o.code,{children:"LANGFLOW_PORT"})," in ",(0,s.jsx)(o.code,{children:".env"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"configure-environment-variables",children:"Configure environment variables"}),"\n",(0,s.jsxs)(o.p,{children:["Langflow recognizes ",(0,s.jsx)(o.a,{href:"#supported-variables",children:"supported environment variables"})," from the following sources:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Environment variables that you've set in your terminal."}),"\n",(0,s.jsxs)(o.li,{children:["Environment variables that you've imported from a ",(0,s.jsx)(o.code,{children:".env"})," file when starting Langflow or using the ",(0,s.jsx)(o.code,{children:"--env-file"})," option in the Langflow CLI."]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["You can choose to use one or both sources.\nHowever, environment variables imported from a ",(0,s.jsx)(o.code,{children:".env"})," file take ",(0,s.jsx)(o.a,{href:"#precedence",children:"precedence"})," over those set in your terminal."]}),"\n",(0,s.jsx)(o.h3,{id:"configure-variables-terminal",children:"Set environment variables in your terminal"}),"\n",(0,s.jsx)(o.p,{children:"Run the following commands to set environment variables for your current terminal session:"}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsx)(i.A,{value:"linux-macos",label:"Linux or macOS",default:!0,children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"export",props:{style:{color:"#FF7B72"}}},{content:" VARIABLE_NAME",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"'VALUE'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})}),(0,s.jsx)(i.A,{value:"windows",label:"Windows",children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"set VARIABLE_NAME='VALUE'",props:{}}]}],lang:"text"},annotations:[]}]})}),(0,s.jsx)(i.A,{value:"docker",label:"Docker",children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"docker ",props:{style:{color:"#FFA657"}}},{content:"run ",props:{style:{color:"#A5D6FF"}}},{content:"-it --rm \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -p ",props:{style:{color:"#79C0FF"}}},{content:"7860:",props:{style:{color:"#A5D6FF"}}},{content:"7860 \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -e ",props:{style:{color:"#79C0FF"}}},{content:"VARIABLE_NAME='VALUE' ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" langflowai/langflow:latest",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})})]}),"\n",(0,s.jsxs)(o.p,{children:["When you start Langflow, it looks for environment variables that you've set in your terminal.\nIf it detects a supported environment variable, then it automatically adopts the specified value, subject to ",(0,s.jsx)(o.a,{href:"#precedence",children:"precedence rules"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"configure-variables-env-file",children:"Import environment variables from a .env file"}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"If Langflow is running, quit Langflow."}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Create a ",(0,s.jsx)(o.code,{children:".env"})," file, and then open it in your preferred editor."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Define ",(0,s.jsx)(o.a,{href:"#supported-variables",children:"Langflow environment variables"})," in the ",(0,s.jsx)(o.code,{children:".env"})," file. For example:"]}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"DO_NOT_TRACK=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING_INTERVAL=1000",props:{}}]},{tokens:[{content:"LANGFLOW_BACKEND_ONLY=False",props:{}}]},{tokens:[{content:'LANGFLOW_BUNDLE_URLS=["https://github.com/user/repo/commit/hash"]',props:{}}]},{tokens:[{content:"LANGFLOW_CACHE_TYPE=async",props:{}}]},{tokens:[{content:"LANGFLOW_COMPONENTS_PATH=/path/to/components/",props:{}}]},{tokens:[{content:"LANGFLOW_CONFIG_DIR=/path/to/config/",props:{}}]},{tokens:[{content:"LANGFLOW_DATABASE_URL=postgresql://user:password@localhost:5432/langflow",props:{}}]},{tokens:[{content:"LANGFLOW_DEV=False",props:{}}]},{tokens:[{content:"LANGFLOW_FALLBACK_TO_ENV_VAR=False",props:{}}]},{tokens:[{content:"LANGFLOW_HEALTH_CHECK_MAX_RETRIES=5",props:{}}]},{tokens:[{content:"LANGFLOW_HOST=localhost",props:{}}]},{tokens:[{content:"LANGFLOW_LANGCHAIN_CACHE=InMemoryCache",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_FILE_SIZE_UPLOAD=10000",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_ITEMS_LENGTH=100",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_TEXT_LENGTH=1000",props:{}}]},{tokens:[{content:"LANGFLOW_LOG_LEVEL=error",props:{}}]},{tokens:[{content:"LANGFLOW_OPEN_BROWSER=False",props:{}}]},{tokens:[{content:"LANGFLOW_PORT=7860",props:{}}]},{tokens:[{content:"LANGFLOW_REMOVE_API_KEYS=False",props:{}}]},{tokens:[{content:"LANGFLOW_SAVE_DB_IN_CONFIG_DIR=True",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=somesecretkey",props:{}}]},{tokens:[{content:"LANGFLOW_STORE=True",props:{}}]},{tokens:[{content:"LANGFLOW_STORE_ENVIRONMENT_VARIABLES=True",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=adminuser",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=adminpass",props:{}}]},{tokens:[{content:"LANGFLOW_WORKER_TIMEOUT=60000",props:{}}]},{tokens:[{content:"LANGFLOW_WORKERS=3",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(o.p,{children:["For additional examples, see the ",(0,s.jsx)(o.a,{href:"https://github.com/langflow-ai/langflow/blob/main/.env.example",children:(0,s.jsx)(o.code,{children:".env.example"})})," file in the Langflow repository."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Save and close ",(0,s.jsx)(o.code,{children:".env"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Start Langflow with your ",(0,s.jsx)(o.code,{children:".env"})," file:"]}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsx)(i.A,{value:"local",label:"Local",default:!0,children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python ",props:{style:{color:"#FFA657"}}},{content:"-m ",props:{style:{color:"#79C0FF"}}},{content:"langflow run ",props:{style:{color:"#A5D6FF"}}},{content:"--env-file ",props:{style:{color:"#79C0FF"}}},{content:".env",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})}),(0,s.jsx)(i.A,{value:"docker",label:"Docker",children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"docker ",props:{style:{color:"#FFA657"}}},{content:"run ",props:{style:{color:"#A5D6FF"}}},{content:"-it --rm \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -p ",props:{style:{color:"#79C0FF"}}},{content:"7860:",props:{style:{color:"#A5D6FF"}}},{content:"7860 \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" --env-file ",props:{style:{color:"#79C0FF"}}},{content:".env ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" langflowai/langflow:latest",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})})]}),"\n",(0,s.jsxs)(o.p,{children:["If your ",(0,s.jsx)(o.code,{children:".env"})," file isn't in the same directory, provide the path to your ",(0,s.jsx)(o.code,{children:".env"})," file."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["On startup, Langflow imports the environment variables from your ",(0,s.jsx)(o.code,{children:".env"})," file, as well as any others that you set in your terminal, and then adopts their specified values."]}),"\n",(0,s.jsx)(o.h2,{id:"supported-variables",children:"Supported environment variables"}),"\n",(0,s.jsx)(o.p,{children:"The following table lists the environment variables supported by Langflow."}),"\n",(0,s.jsxs)(o.table,{children:[(0,s.jsx)(o.thead,{children:(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.th,{children:"Variable"}),(0,s.jsx)(o.th,{children:"Format"}),(0,s.jsx)(o.th,{children:"Default"}),(0,s.jsx)(o.th,{children:"Description"})]})}),(0,s.jsxs)(o.tbody,{children:[(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"DO_NOT_TRACK"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["Whether to report ",(0,s.jsx)(o.a,{href:"/contributing-telemetry",children:"Langflow telemetry data"}),". If true, Langflow telemetry is disabled."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-auto-login",children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_SAVING"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"Enable flow auto-saving."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_SAVING_INTERVAL"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"1000"})}),(0,s.jsx)(o.td,{children:"Set the interval for flow auto-saving in milliseconds."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_BACKEND_ONLY"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Run only the Langflow backend service (no frontend)."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_BUNDLE_URLS"})}),(0,s.jsx)(o.td,{children:"List[String]"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"[]"})}),(0,s.jsx)(o.td,{children:"A list of URLs from which to load component bundles and flows. Supports GitHub URLs. If LANGFLOW_AUTO_LOGIN is enabled, flows from these bundles are loaded into the database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"async"})}),(0,s.jsxs)(o.td,{children:["Set the cache type for Langflow. Possible values: ",(0,s.jsx)(o.code,{children:"async"}),", ",(0,s.jsx)(o.code,{children:"redis"}),", ",(0,s.jsx)(o.code,{children:"memory"}),", ",(0,s.jsx)(o.code,{children:"disk"}),". If you set the type to ",(0,s.jsx)(o.code,{children:"redis"}),", then you must also set the following environment variables: ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_HOST"}),", ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_PORT"}),", ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_DB"}),", and ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_CACHE_EXPIRE"}),". See also ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-run",children:(0,s.jsx)(o.code,{children:"langflow run"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_COMPONENTS_PATH"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the directory containing custom components."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Varies"}),(0,s.jsxs)(o.td,{children:["Set the Langflow configuration directory where files, logs, and the Langflow database are stored. Default path depends on your installation. See ",(0,s.jsx)(o.a,{href:"/concepts-flows#flow-storage-and-logs",children:"Flow storage and logs"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DATABASE_URL"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Set the database URL for Langflow. If not provided, Langflow uses a SQLite database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DATABASE_CONNECTION_RETRY"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Whether to retry lost connections to the Langflow database. If true, Langflow tries to connect to the database again if the connection fails."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_POOL_SIZE"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"20"})}),(0,s.jsxs)(o.td,{children:[(0,s.jsx)(o.strong,{children:"DEPRECATED:"})," Use ",(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECTION_SETTINGS"})," instead. The number of connections to keep open in the connection pool."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_MAX_OVERFLOW"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"30"})}),(0,s.jsxs)(o.td,{children:[(0,s.jsx)(o.strong,{children:"DEPRECATED:"})," Use ",(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECTION_SETTINGS"})," instead. The number of connections to allow that can be opened beyond the pool size."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECT_TIMEOUT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"30"})}),(0,s.jsx)(o.td,{children:"The number of seconds to wait before giving up on a lock to be released or establishing a connection to the database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECTION_SETTINGS"})}),(0,s.jsx)(o.td,{children:"JSON"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsxs)(o.td,{children:["A JSON dictionary to centralize database connection parameters. Example: ",(0,s.jsx)(o.code,{children:'{"pool_size": 20, "max_overflow": 30}'})]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DISABLE_TRACK_APIKEY_USAGE"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["Whether to track API key usage. If true, disables tracking of API key usage (",(0,s.jsx)(o.code,{children:"total_uses"})," and ",(0,s.jsx)(o.code,{children:"last_used_at"}),") to avoid database contention under high concurrency."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["Allow creation of superusers with the Langflow CLI command ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-superuser",children:(0,s.jsx)(o.code,{children:"langflow superuser"})}),". Recommended to be disabled (false) in production for security reasons."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_FALLBACK_TO_ENV_VAR"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["If enabled, ",(0,s.jsx)(o.a,{href:"/configuration-global-variables",children:"global variables"})," set in your Langflow ",(0,s.jsx)(o.strong,{children:"Settings"})," can use an environment variable with the same name if Langflow can't retrieve the variable value from the global variables."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_FRONTEND_PATH"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"./frontend"})}),(0,s.jsxs)(o.td,{children:["Path to the frontend directory containing build files. This is for development purposes only. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-run",children:(0,s.jsx)(o.code,{children:"langflow run"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_HEALTH_CHECK_MAX_RETRIES"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"5"})}),(0,s.jsxs)(o.td,{children:["Set the maximum number of retries for the health check. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-run",children:(0,s.jsx)(o.code,{children:"langflow run"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_HOST"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"localhost"})}),(0,s.jsxs)(o.td,{children:["The host on which the Langflow server will run. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-run",children:(0,s.jsx)(o.code,{children:"langflow run"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LANGCHAIN_CACHE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"InMemoryCache"})}),(0,s.jsxs)(o.td,{children:["Type of cache storage to use, separate from ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),". Possible values: ",(0,s.jsx)(o.code,{children:"InMemoryCache"}),", ",(0,s.jsx)(o.code,{children:"SQLiteCache"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOG_LEVEL"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"INFO"})}),(0,s.jsxs)(o.td,{children:["Set the logging level for Langflow. Possible values: ",(0,s.jsx)(o.code,{children:"DEBUG"}),", ",(0,s.jsx)(o.code,{children:"INFO"}),", ",(0,s.jsx)(o.code,{children:"WARNING"}),", ",(0,s.jsx)(o.code,{children:"ERROR"}),", ",(0,s.jsx)(o.code,{children:"CRITICAL"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOG_FILE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the log file. If this option isn't set, logs are written to stdout."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOG_RETRIEVER_BUFFER_SIZE"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"10000"})}),(0,s.jsxs)(o.td,{children:["Set the buffer size for log retrieval. Only used if ",(0,s.jsx)(o.code,{children:"LANGFLOW_ENABLE_LOG_RETRIEVAL"})," is enabled."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MAX_FILE_SIZE_UPLOAD"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"100"})}),(0,s.jsxs)(o.td,{children:["Set the maximum file size for the upload in megabytes. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-run",children:(0,s.jsx)(o.code,{children:"langflow run"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MAX_ITEMS_LENGTH"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"100"})}),(0,s.jsx)(o.td,{children:"Maximum number of items to store and display in the visual editor. Lists longer than this will be truncated when displayed in the visual editor. Doesn't affect data passed between components nor outputs."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MAX_TEXT_LENGTH"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"1000"})}),(0,s.jsx)(o.td,{children:"Maximum number of characters to store and display in the visual editor. Responses longer than this will be truncated when displayed in the visual editor. Doesn't truncate responses between components nor outputs."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MCP_SERVER_ENABLED"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"If this option is set to False, Langflow doesn't enable the MCP server."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MCP_SERVER_ENABLE_PROGRESS_NOTIFICATIONS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"If this option is set to True, Langflow sends progress notifications in the MCP server."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-new-user-is-active",children:(0,s.jsx)(o.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_OPEN_BROWSER"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Open the system web browser on startup."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_PORT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"7860"})}),(0,s.jsx)(o.td,{children:"The port on which the Langflow server runs. The server automatically selects a free port if the specified port is in use."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_PROMETHEUS_ENABLED"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Expose Prometheus metrics."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_PROMETHEUS_PORT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"9090"})}),(0,s.jsx)(o.td,{children:"Set the port on which Langflow exposes Prometheus metrics."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_CACHE_EXPIRE"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"3600"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_DB"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"0"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_HOST"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"localhost"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_PORT"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"6379"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_PASSWORD"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Password for Redis authentication when using Redis cache type."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REMOVE_API_KEYS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Remove API keys from the projects saved in the database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SAVE_DB_IN_CONFIG_DIR"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["If false (default), the Langflow database is saved in the ",(0,s.jsx)(o.code,{children:"langflow"})," root directory. This means the database isn't shared between different virtual environments, and the database is deleted when you uninstall Langflow. If true, the database is saved in the ",(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SECRET_KEY"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Automated"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-secret-key",children:(0,s.jsx)(o.code,{children:"LANGFLOW_SECRET_KEY"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_STORE"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"Whether to enable the Langflow Store features."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_STORE_ENVIRONMENT_VARIABLES"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["Whether to store environment variables as ",(0,s.jsx)(o.a,{href:"/configuration-global-variables",children:"global variables"})," in the database."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_CREATE_STARTER_PROJECTS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["Whether to create templates during initialization. If false, Langflow doesn't create templates, and ",(0,s.jsx)(o.code,{children:"LANGFLOW_UPDATE_STARTER_PROJECTS"})," is treated as false."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_UPDATE_STARTER_PROJECTS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"Whether to update templates with the latest component versions when initializing after an upgrade."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"langflow"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsxs)(o.a,{href:"/api-keys-and-authentication#langflow-superuser",children:[(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"langflow"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsxs)(o.a,{href:"/api-keys-and-authentication#langflow-superuser",children:[(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsxs)(o.td,{children:["Comma-separated list of environment variables to get from the environment and store as ",(0,s.jsx)(o.a,{href:"/configuration-global-variables",children:"global variables"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOAD_FLOWS_PATH"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsxs)(o.td,{children:["Path to a directory containing flow JSON files to be loaded on startup. Note that this feature only works if ",(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})," is enabled."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_WORKER_TIMEOUT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"300"})}),(0,s.jsx)(o.td,{children:"Worker timeout in seconds."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_WORKERS"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"1"})}),(0,s.jsx)(o.td,{children:"Number of worker processes."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SSL_CERT_FILE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the SSL certificate file on the local system."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SSL_KEY_FILE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the SSL key file on the local system."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-auto-login",children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})}),"."]})]})]})]}),"\n",(0,s.jsx)(o.h2,{id:"configure-env-overrideconf-and-tasksjson-files",children:"Configure .env, override.conf, and tasks.json files"}),"\n",(0,s.jsx)(o.p,{children:"The following examples show how to configure Langflow using environment variables in different scenarios."}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsxs)(i.A,{value:"env",label:".env file",default:!0,children:[(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.code,{children:".env"})," file is a text file that contains key-value pairs of environment variables."]}),(0,s.jsxs)(o.p,{children:["Create or edit a ",(0,s.jsx)(o.code,{children:".env"})," file in the root directory of your application or Langflow environment, and then add your configuration variables to the file:"]}),(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",title:'".env"',focus:"",code:{lines:[{tokens:[{content:"DO_NOT_TRACK=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING_INTERVAL=1000",props:{}}]},{tokens:[{content:"LANGFLOW_BACKEND_ONLY=False",props:{}}]},{tokens:[{content:'LANGFLOW_BUNDLE_URLS=["https://github.com/user/repo/commit/hash"]',props:{}}]},{tokens:[{content:"LANGFLOW_CACHE_TYPE=async",props:{}}]},{tokens:[{content:"LANGFLOW_COMPONENTS_PATH=/path/to/components/",props:{}}]},{tokens:[{content:"LANGFLOW_CONFIG_DIR=/path/to/config/",props:{}}]},{tokens:[{content:"LANGFLOW_DATABASE_URL=postgresql://user:password@localhost:5432/langflow",props:{}}]},{tokens:[{content:"LANGFLOW_DEV=False",props:{}}]},{tokens:[{content:"LANGFLOW_FALLBACK_TO_ENV_VAR=False",props:{}}]},{tokens:[{content:"LANGFLOW_HEALTH_CHECK_MAX_RETRIES=5",props:{}}]},{tokens:[{content:"LANGFLOW_HOST=localhost",props:{}}]},{tokens:[{content:"LANGFLOW_LANGCHAIN_CACHE=InMemoryCache",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_FILE_SIZE_UPLOAD=10000",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_ITEMS_LENGTH=100",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_TEXT_LENGTH=1000",props:{}}]},{tokens:[{content:"LANGFLOW_LOG_LEVEL=error",props:{}}]},{tokens:[{content:"LANGFLOW_OPEN_BROWSER=False",props:{}}]},{tokens:[{content:"LANGFLOW_PORT=7860",props:{}}]},{tokens:[{content:"LANGFLOW_REMOVE_API_KEYS=False",props:{}}]},{tokens:[{content:"LANGFLOW_SAVE_DB_IN_CONFIG_DIR=True",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=somesecretkey",props:{}}]},{tokens:[{content:"LANGFLOW_STORE=True",props:{}}]},{tokens:[{content:"LANGFLOW_STORE_ENVIRONMENT_VARIABLES=True",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=adminuser",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=adminpass",props:{}}]},{tokens:[{content:"LANGFLOW_WORKER_TIMEOUT=60000",props:{}}]},{tokens:[{content:"LANGFLOW_WORKERS=3",props:{}}]}],lang:"text"},annotations:[]}]})]}),(0,s.jsxs)(i.A,{value:"systemd",label:"Systemd service",children:[(0,s.jsx)(o.p,{children:"A systemd service configuration file configures Linux system services."}),(0,s.jsxs)(o.p,{children:["To add environment variables, create or edit a service configuration file and add an ",(0,s.jsx)(o.code,{children:"override.conf"})," file. This file allows you to override the default environment variables for the service."]}),(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",title:'"override.conf"',focus:"",code:{lines:[{tokens:[{content:"[Service]",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"DO_NOT_TRACK=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_AUTO_LOGIN=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_AUTO_SAVING=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_AUTO_SAVING_INTERVAL=1000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_BACKEND_ONLY=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_BUNDLE_URLS=[\\"',props:{style:{color:"#A5D6FF"}}},{content:"https://github.com/user/repo/commit/hash\\",props:{style:{color:"#C9D1D9"}}},{content:'"]"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CACHE_TYPE=async"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_COMPONENTS_PATH=/path/to/components/"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CONFIG_DIR=/path/to/config"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_DATABASE_URL=postgresql://user:password@localhost:5432/langflow"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_DEV=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_FALLBACK_TO_ENV_VAR=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_HEALTH_CHECK_MAX_RETRIES=5"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_HOST=localhost"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LANGCHAIN_CACHE=InMemoryCache"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_MAX_FILE_SIZE_UPLOAD=10000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_MAX_ITEMS_LENGTH=100"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_MAX_TEXT_LENGTH=1000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LOG_ENV=container_json"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LOG_FILE=logs/langflow.log"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LOG_LEVEL=error"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_OPEN_BROWSER=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_PORT=7860"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_REMOVE_API_KEYS=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SAVE_DB_IN_CONFIG_DIR=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SECRET_KEY=somesecretkey"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_STORE=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_STORE_ENVIRONMENT_VARIABLES=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SUPERUSER=adminuser"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SUPERUSER_PASSWORD=adminpass"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_WORKER_TIMEOUT=60000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_WORKERS=3"',props:{style:{color:"#A5D6FF"}}}]}],lang:"ini"},annotations:[]}]}),(0,s.jsxs)(o.p,{children:["For more information on systemd, see the ",(0,s.jsx)(o.a,{href:"https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/using_systemd_unit_files_to_customize_and_optimize_your_system/assembly_working-with-systemd-unit-files_working-with-systemd",children:"Red Hat documentation"}),"."]})]}),(0,s.jsxs)(i.A,{value:"vscode",label:"VSCode tasks.json",children:[(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.code,{children:"tasks.json"})," file located in ",(0,s.jsx)(o.code,{children:".vscode/tasks.json"})," is a configuration file for development environments using Visual Studio Code."]}),(0,s.jsxs)(o.p,{children:["Create or edit the ",(0,s.jsx)(o.code,{children:".vscode/tasks.json"})," file in your project root:"]}),(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",title:'".vscode/tasks.json"',focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "version"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"2.0.0"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "options"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "env"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "DO_NOT_TRACK"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_AUTO_LOGIN"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_AUTO_SAVING"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_AUTO_SAVING_INTERVAL"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"1000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_BACKEND_ONLY"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_BUNDLE_URLS"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"[',props:{style:{color:"#A5D6FF"}}},{content:'\\"',props:{style:{color:"#79C0FF"}}},{content:"https://github.com/user/repo/commit/hash",props:{style:{color:"#A5D6FF"}}},{content:'\\"',props:{style:{color:"#79C0FF"}}},{content:']"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_CACHE_TYPE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"async"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_COMPONENTS_PATH"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"D:/path/to/components/"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_CONFIG_DIR"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"D:/path/to/config/"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_DATABASE_URL"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"postgresql://postgres:password@localhost:5432/langflow"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_DEV"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_FALLBACK_TO_ENV_VAR"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_HEALTH_CHECK_MAX_RETRIES"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"5"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_HOST"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"localhost"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LANGCHAIN_CACHE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"InMemoryCache"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_MAX_FILE_SIZE_UPLOAD"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"10000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_MAX_ITEMS_LENGTH"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"100"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_MAX_TEXT_LENGTH"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"1000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LOG_ENV"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"container_csv"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LOG_FILE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"langflow.log"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LOG_LEVEL"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"error"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_OPEN_BROWSER"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_PORT"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"7860"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_REMOVE_API_KEYS"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SAVE_DB_IN_CONFIG_DIR"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SECRET_KEY"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"somesecretkey"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_STORE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_STORE_ENVIRONMENT_VARIABLES"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SUPERUSER"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"adminuser"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SUPERUSER_PASSWORD"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"adminpass"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_WORKER_TIMEOUT"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"60000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_WORKERS"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"3"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "tasks"',props:{style:{color:"#7EE787"}}},{content:": [",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "label"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"langflow backend"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "type"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"shell"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "command"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'". ./langflownightly/Scripts/activate && langflow run"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "isBackground"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"true",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "problemMatcher"',props:{style:{color:"#7EE787"}}},{content:": []",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),(0,s.jsxs)(o.p,{children:["To run Langflow using the above VSCode ",(0,s.jsx)(o.code,{children:"tasks.json"})," file, in the VSCode command palette, select ",(0,s.jsx)(o.strong,{children:"Tasks: Run Task"})," > ",(0,s.jsx)(o.strong,{children:"langflow backend"}),"."]})]})]}),"\n",(0,s.jsx)(o.h2,{id:"set-environment-variables-for-langflow-desktop",children:"Set environment variables for Langflow Desktop"}),"\n",(0,s.jsx)(o.p,{children:"Environment variables set in your terminal aren't automatically available to GUI-based applications like Langflow Desktop when you launch them from the Windows or macOS GUI."}),"\n",(0,s.jsx)(o.p,{children:"For Windows, this means any GUI-based app launched from the Start menu, desktop shortcuts, or Windows Explorer."}),"\n",(0,s.jsx)(o.p,{children:"For macOS, this means any GUI-based app launched from Finder, Spotlight, Launchpad, or the Dock."}),"\n",(0,s.jsx)(o.p,{children:"To set environment variables for Langflow Desktop, you need to use specific commands or files, depending on your OS."}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsxs)(i.A,{value:"macos",label:"macOS",default:!0,children:[(0,s.jsxs)(o.p,{children:["Langflow Desktop for macOS cannot automatically use variables set in your terminal, such as those in",(0,s.jsx)(o.code,{children:".zshrc"})," or ",(0,s.jsx)(o.code,{children:".bash_profile"}),", when launched from the macOS GUI."]}),(0,s.jsxs)(o.p,{children:["To make environment variables available to GUI apps on macOS, you need to use ",(0,s.jsx)(o.code,{children:"launchctl"})," with a ",(0,s.jsx)(o.code,{children:"plist"})," file:"]}),(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Create the ",(0,s.jsx)(o.code,{children:"LaunchAgents"})," directory if it doesn't exist:"]}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"mkdir ",props:{style:{color:"#FFA657"}}},{content:"-p ",props:{style:{color:"#79C0FF"}}},{content:"~/Library/LaunchAgents",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["In the ",(0,s.jsx)(o.code,{children:"LaunchAgents"})," directory, create a ",(0,s.jsx)(o.code,{children:".plist"})," file called ",(0,s.jsx)(o.code,{children:"dev.langflow.env"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Add the following content to ",(0,s.jsx)(o.code,{children:"dev.langflow.env.plist"}),", and then add, change, or remove Langflow environment variables as needed for your configuration."]}),"\n",(0,s.jsx)(o.p,{children:"This example sets multiple environmental variables for all GUI apps launched from the macOS GUI."}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ',props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"plist ",props:{style:{color:"#7EE787"}}},{content:"version",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"1.0"',props:{style:{color:"#A5D6FF"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"dict",props:{style:{color:"#7EE787"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"key",props:{style:{color:"#7EE787"}}},{content:">Label",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">dev.langflow.env",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"key",props:{style:{color:"#7EE787"}}},{content:">ProgramArguments",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"array",props:{style:{color:"#7EE787"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">/bin/sh",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">-c",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" launchctl setenv LANGFLOW_CONFIG_DIR /Users/your_user/custom/config ",props:{style:{color:"#C9D1D9"}}},{content:"&&",props:{style:{color:"#FFA198",fontStyle:"italic"}}}]},{tokens:[{content:" launchctl setenv LANGFLOW_PORT 7860 ",props:{style:{color:"#C9D1D9"}}},{content:"&&",props:{style:{color:"#FFA198",fontStyle:"italic"}}}]},{tokens:[{content:" launchctl setenv LANGFLOW_HOST localhost ",props:{style:{color:"#C9D1D9"}}},{content:"&&",props:{style:{color:"#FFA198",fontStyle:"italic"}}}]},{tokens:[{content:" launchctl setenv ARIZE_API_KEY ak-...",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"key",props:{style:{color:"#7EE787"}}},{content:">RunAtLoad",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"true",props:{style:{color:"#7EE787"}}},{content:"/>",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]}],lang:"xml"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Load the file with ",(0,s.jsx)(o.code,{children:"launchctl"}),":"]}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"launchctl ",props:{style:{color:"#FFA657"}}},{content:"load ~/Library/LaunchAgents/dev.langflow.env.plist",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]})]}),(0,s.jsxs)(i.A,{value:"windows1",label:"Window System Properties",children:[(0,s.jsxs)(o.p,{children:["Langflow Desktop for Windows cannot automatically use variables set in your terminal, such as those defined with ",(0,s.jsx)(o.code,{children:"set"})," in ",(0,s.jsx)(o.code,{children:"cmd"})," or ",(0,s.jsx)(o.code,{children:"$env:VAR=..."})," in PowerShell, when launched from the Windows GUI."]}),(0,s.jsxs)(o.p,{children:["To make environment variables available to the Langflow Desktop app, you must set them at the user or system level using the ",(0,s.jsx)(o.strong,{children:"System Properties"})," interface or the Terminal."]}),(0,s.jsx)(o.p,{children:"To set environment variables using the System Properties interface, do the following:"}),(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Press ",(0,s.jsx)("kbd",{children:"Win + R"}),", enter ",(0,s.jsx)(o.code,{children:"SystemPropertiesAdvanced"}),", and then press ",(0,s.jsx)("kbd",{children:"Enter"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Click ",(0,s.jsx)(o.strong,{children:"Environment Variables"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Under ",(0,s.jsx)(o.strong,{children:"User variables"}),", click ",(0,s.jsx)(o.strong,{children:"New"}),"."]}),"\n",(0,s.jsx)(o.admonition,{type:"tip",children:(0,s.jsxs)(o.p,{children:["To apply the setting to all users, select ",(0,s.jsx)(o.strong,{children:"System variables"}),"."]})}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Enter the name of the Langflow variable you want to set, such as ",(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"}),", and the desired value, such as ",(0,s.jsx)(o.code,{children:"C:\\Users\\your_user\\.langflow_config"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Click ",(0,s.jsx)(o.strong,{children:"OK"})," to save the variable."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Repeat until you have set all necessary Langflow environment variables."}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Launch or restart Langflow Desktop to apply the environment variables."}),"\n"]}),"\n"]})]}),(0,s.jsxs)(i.A,{value:"windows2",label:"Powershell",children:[(0,s.jsx)(o.p,{children:"To define environment variables for Windows using PowerShell, do the following:"}),(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Enter the name of the Langflow variable you want to set, such as ",(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"}),", and the desired value, such as ",(0,s.jsx)(o.code,{children:"C:\\Users\\your_user\\.langflow_config"}),"."]}),"\n",(0,s.jsx)(o.p,{children:"To set an environment variable for the current user:"}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}},{content:"System.Environment",props:{style:{color:"#FF7B72"}}},{content:"]::SetEnvironmentVariable(",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CONFIG_DIR"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"C:\\Users\\your_user\\.langflow_config"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"powershell"},annotations:[]}]}),"\n",(0,s.jsx)(o.p,{children:"To set an environment variable for all users (you must have Administrator priveleges):"}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}},{content:"System.Environment",props:{style:{color:"#FF7B72"}}},{content:"]::SetEnvironmentVariable(",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CONFIG_DIR"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"C:\\Langflow\\Config"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"Machine"',props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"powershell"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Repeat until you have set all necessary Langflow environment variables."}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Launch or restart Langflow Desktop to apply the environment variables."}),"\n"]}),"\n"]})]})]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(L,{...e})}):L(e)}function F(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/16ceb5d2.ea0de0ca.js b/assets/js/16ceb5d2.ea0de0ca.js deleted file mode 100644 index 92b1e22fb9..0000000000 --- a/assets/js/16ceb5d2.ea0de0ca.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[1399],{11470:(e,o,n)=>{n.d(o,{A:()=>E});var t=n(96540),s=n(18215),r=n(23104),l=n(56347),c=n(205),i=n(57485),d=n(31682),a=n(70679);function p(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:o}=e;return!!o&&"object"==typeof o&&"value"in o}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:o,children:n}=e;return(0,t.useMemo)(()=>{const e=o??function(e){return p(e).map(({props:{value:e,label:o,attributes:n,default:t}})=>({value:e,label:o,attributes:n,default:t}))}(n);return function(e){const o=(0,d.XI)(e,(e,o)=>e.value===o.value);if(o.length>0)throw new Error(`Docusaurus error: Duplicate values "${o.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[o,n])}function x({value:e,tabValues:o}){return o.some(o=>o.value===e)}function j({queryString:e=!1,groupId:o}){const n=(0,l.W6)(),s=function({queryString:e=!1,groupId:o}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!o)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return o??null}({queryString:e,groupId:o});return[(0,i.aZ)(s),(0,t.useCallback)(e=>{if(!s)return;const o=new URLSearchParams(n.location.search);o.set(s,e),n.replace({...n.location,search:o.toString()})},[s,n])]}function L(e){const{defaultValue:o,queryString:n=!1,groupId:s}=e,r=h(e),[l,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:o}){if(0===o.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:o}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${o.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=o.find(e=>e.default)??o[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:o,tabValues:r})),[d,p]=j({queryString:n,groupId:s}),[L,u]=function({groupId:e}){const o=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,s]=(0,a.Dv)(o);return[n,(0,t.useCallback)(e=>{o&&s.set(e)},[o,s])]}({groupId:s}),F=(()=>{const e=d??L;return x({value:e,tabValues:r})?e:null})();(0,c.A)(()=>{F&&i(F)},[F]);return{selectedValue:l,selectValue:(0,t.useCallback)(e=>{if(!x({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);i(e),p(e),u(e)},[p,u,r]),tabValues:r}}var u=n(92303);const F={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=n(74848);function A({className:e,block:o,selectedValue:n,selectValue:t,tabValues:l}){const c=[],{blockElementScrollPositionUntilNextRender:i}=(0,r.a_)(),d=e=>{const o=e.currentTarget,s=c.indexOf(o),r=l[s].value;r!==n&&(i(o),t(r))},a=e=>{let o=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const n=c.indexOf(e.currentTarget)+1;o=c[n]??c[0];break}case"ArrowLeft":{const n=c.indexOf(e.currentTarget)-1;o=c[n]??c[c.length-1];break}}o?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":o},e),children:l.map(({value:e,label:o,attributes:t})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{c.push(e)},onKeyDown:a,onClick:d,...t,className:(0,s.A)("tabs__item",F.tabItem,t?.className,{"tabs__item--active":n===e}),children:o??e},e))})}function D({lazy:e,children:o,selectedValue:n}){const r=(Array.isArray(o)?o:[o]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===n);return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:r.map((e,o)=>(0,t.cloneElement)(e,{key:o,hidden:e.props.value!==n}))})}function _(e){const o=L(e);return(0,y.jsxs)("div",{className:(0,s.A)("tabs-container",F.tabList),children:[(0,y.jsx)(A,{...o,...e}),(0,y.jsx)(D,{...o,...e})]})}function E(e){const o=(0,u.A)();return(0,y.jsx)(_,{...e,children:p(e.children)},String(o))}},19365:(e,o,n)=>{n.d(o,{A:()=>l});n(96540);var t=n(18215);const s={tabItem:"tabItem_Ymn6"};var r=n(74848);function l({children:e,hidden:o,className:n}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,n),hidden:o,children:e})}},28453:(e,o,n)=>{n.d(o,{R:()=>l,x:()=>c});var t=n(96540);const s={},r=t.createContext(s);function l(e){const o=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(o):{...o,...e}},[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:l(e.components),t.createElement(r.Provider,{value:o},e.children)}},33439:(e,o,n)=>{n.r(o),n.d(o,{CH:()=>h,assets:()=>p,chCodeConfig:()=>x,contentTitle:()=>a,default:()=>u,frontMatter:()=>d,metadata:()=>t,toc:()=>j});const t=JSON.parse('{"id":"Configuration/environment-variables","title":"Environment variables","description":"Langflow uses environment variables to configure certain settings.","source":"@site/docs/Configuration/environment-variables.mdx","sourceDirName":"Configuration","slug":"/environment-variables","permalink":"/environment-variables","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Environment variables","slug":"/environment-variables"},"sidebar":"docs","previous":{"title":"Global variables","permalink":"/configuration-global-variables"},"next":{"title":"Manage files","permalink":"/concepts-file-management"}}');var s=n(74848),r=n(28453),l=n(24754),c=n(11470),i=n(19365);n(28774);const d={title:"Environment variables",slug:"/environment-variables"},a=void 0,p={},h={annotations:l.hk,Code:l.Cy},x={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},j=[{value:"Precedence",id:"precedence",level:2},{value:"Configure environment variables",id:"configure-environment-variables",level:2},{value:"Set environment variables in your terminal",id:"configure-variables-terminal",level:3},{value:"Import environment variables from a .env file",id:"configure-variables-env-file",level:3},{value:"Supported environment variables",id:"supported-variables",level:2},{value:"Configure .env, override.conf, and tasks.json files",id:"configure-env-overrideconf-and-tasksjson-files",level:2},{value:"Set environment variables for Langflow Desktop",id:"set-environment-variables-for-langflow-desktop",level:2}];function L(e){const o={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,r.R)(),...e.components};return h||F("CH",!1),h.Code||F("CH.Code",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(o.p,{children:"Langflow uses environment variables to configure certain settings.\nYou can also import environment variables for use in your deployment, such as environment variables used by certain components in your flows."}),"\n",(0,s.jsxs)(o.p,{children:["You can set Langflow environment variables in your terminal, in ",(0,s.jsx)(o.code,{children:".env"}),", and with the ",(0,s.jsx)(o.a,{href:"./configuration-cli",children:"Langflow CLI"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"precedence",children:"Precedence"}),"\n",(0,s.jsx)(o.p,{children:"If an environment variable is set in multiple places, the following hierarchy applies:"}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["Langflow CLI options override ",(0,s.jsx)(o.code,{children:".env"})," and terminal variables."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:".env"})," overrides terminal variables."]}),"\n",(0,s.jsxs)(o.li,{children:["Terminal variables are used only if the variable isn't set in ",(0,s.jsx)(o.code,{children:".env"})," or Langflow CLI options."]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["For example, if you set ",(0,s.jsx)(o.code,{children:"LANGFLOW_PORT"})," in ",(0,s.jsx)(o.code,{children:".env"})," and your terminal, then Langflow uses the value from ",(0,s.jsx)(o.code,{children:".env"}),".\nSimilarly, if you run a Langflow CLI command with ",(0,s.jsx)(o.code,{children:"--port"}),", Langflow uses that port number instead of the ",(0,s.jsx)(o.code,{children:"LANGFLOW_PORT"})," in ",(0,s.jsx)(o.code,{children:".env"}),"."]}),"\n",(0,s.jsx)(o.h2,{id:"configure-environment-variables",children:"Configure environment variables"}),"\n",(0,s.jsxs)(o.p,{children:["Langflow recognizes ",(0,s.jsx)(o.a,{href:"#supported-variables",children:"supported environment variables"})," from the following sources:"]}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:"Environment variables that you've set in your terminal."}),"\n",(0,s.jsxs)(o.li,{children:["Environment variables that you've imported from a ",(0,s.jsx)(o.code,{children:".env"})," file when starting Langflow or using the ",(0,s.jsx)(o.code,{children:"--env-file"})," option in the Langflow CLI."]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["You can choose to use one or both sources.\nHowever, environment variables imported from a ",(0,s.jsx)(o.code,{children:".env"})," file take ",(0,s.jsx)(o.a,{href:"#precedence",children:"precedence"})," over those set in your terminal."]}),"\n",(0,s.jsx)(o.h3,{id:"configure-variables-terminal",children:"Set environment variables in your terminal"}),"\n",(0,s.jsx)(o.p,{children:"Run the following commands to set environment variables for your current terminal session:"}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsx)(i.A,{value:"linux-macos",label:"Linux or macOS",default:!0,children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"export",props:{style:{color:"#FF7B72"}}},{content:" VARIABLE_NAME",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"'VALUE'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})}),(0,s.jsx)(i.A,{value:"windows",label:"Windows",children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"set VARIABLE_NAME='VALUE'",props:{}}]}],lang:"text"},annotations:[]}]})}),(0,s.jsx)(i.A,{value:"docker",label:"Docker",children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"docker ",props:{style:{color:"#FFA657"}}},{content:"run ",props:{style:{color:"#A5D6FF"}}},{content:"-it --rm \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -p ",props:{style:{color:"#79C0FF"}}},{content:"7860:",props:{style:{color:"#A5D6FF"}}},{content:"7860 \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -e ",props:{style:{color:"#79C0FF"}}},{content:"VARIABLE_NAME='VALUE' ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" langflowai/langflow:latest",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})})]}),"\n",(0,s.jsxs)(o.p,{children:["When you start Langflow, it looks for environment variables that you've set in your terminal.\nIf it detects a supported environment variable, then it automatically adopts the specified value, subject to ",(0,s.jsx)(o.a,{href:"#precedence",children:"precedence rules"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"configure-variables-env-file",children:"Import environment variables from a .env file"}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"If Langflow is running, quit Langflow."}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Create a ",(0,s.jsx)(o.code,{children:".env"})," file, and then open it in your preferred editor."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Define ",(0,s.jsx)(o.a,{href:"#supported-variables",children:"Langflow environment variables"})," in the ",(0,s.jsx)(o.code,{children:".env"})," file. For example:"]}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"DO_NOT_TRACK=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING_INTERVAL=1000",props:{}}]},{tokens:[{content:"LANGFLOW_BACKEND_ONLY=False",props:{}}]},{tokens:[{content:'LANGFLOW_BUNDLE_URLS=["https://github.com/user/repo/commit/hash"]',props:{}}]},{tokens:[{content:"LANGFLOW_CACHE_TYPE=async",props:{}}]},{tokens:[{content:"LANGFLOW_COMPONENTS_PATH=/path/to/components/",props:{}}]},{tokens:[{content:"LANGFLOW_CONFIG_DIR=/path/to/config/",props:{}}]},{tokens:[{content:"LANGFLOW_DATABASE_URL=postgresql://user:password@localhost:5432/langflow",props:{}}]},{tokens:[{content:"LANGFLOW_DEV=False",props:{}}]},{tokens:[{content:"LANGFLOW_FALLBACK_TO_ENV_VAR=False",props:{}}]},{tokens:[{content:"LANGFLOW_HEALTH_CHECK_MAX_RETRIES=5",props:{}}]},{tokens:[{content:"LANGFLOW_HOST=localhost",props:{}}]},{tokens:[{content:"LANGFLOW_LANGCHAIN_CACHE=InMemoryCache",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_FILE_SIZE_UPLOAD=10000",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_ITEMS_LENGTH=100",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_TEXT_LENGTH=1000",props:{}}]},{tokens:[{content:"LANGFLOW_LOG_LEVEL=error",props:{}}]},{tokens:[{content:"LANGFLOW_OPEN_BROWSER=False",props:{}}]},{tokens:[{content:"LANGFLOW_PORT=7860",props:{}}]},{tokens:[{content:"LANGFLOW_REMOVE_API_KEYS=False",props:{}}]},{tokens:[{content:"LANGFLOW_SAVE_DB_IN_CONFIG_DIR=True",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=somesecretkey",props:{}}]},{tokens:[{content:"LANGFLOW_STORE=True",props:{}}]},{tokens:[{content:"LANGFLOW_STORE_ENVIRONMENT_VARIABLES=True",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=adminuser",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=adminpass",props:{}}]},{tokens:[{content:"LANGFLOW_WORKER_TIMEOUT=60000",props:{}}]},{tokens:[{content:"LANGFLOW_WORKERS=3",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(o.p,{children:["For additional examples, see the ",(0,s.jsx)(o.a,{href:"https://github.com/langflow-ai/langflow/blob/main/.env.example",children:(0,s.jsx)(o.code,{children:".env.example"})})," file in the Langflow repository."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Save and close ",(0,s.jsx)(o.code,{children:".env"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Start Langflow with your ",(0,s.jsx)(o.code,{children:".env"})," file:"]}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsx)(i.A,{value:"local",label:"Local",default:!0,children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python ",props:{style:{color:"#FFA657"}}},{content:"-m ",props:{style:{color:"#79C0FF"}}},{content:"langflow run ",props:{style:{color:"#A5D6FF"}}},{content:"--env-file ",props:{style:{color:"#79C0FF"}}},{content:".env",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})}),(0,s.jsx)(i.A,{value:"docker",label:"Docker",children:(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"docker ",props:{style:{color:"#FFA657"}}},{content:"run ",props:{style:{color:"#A5D6FF"}}},{content:"-it --rm \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -p ",props:{style:{color:"#79C0FF"}}},{content:"7860:",props:{style:{color:"#A5D6FF"}}},{content:"7860 \\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" --env-file ",props:{style:{color:"#79C0FF"}}},{content:".env ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" langflowai/langflow:latest",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]})})]}),"\n",(0,s.jsxs)(o.p,{children:["If your ",(0,s.jsx)(o.code,{children:".env"})," file isn't in the same directory, provide the path to your ",(0,s.jsx)(o.code,{children:".env"})," file."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.p,{children:["On startup, Langflow imports the environment variables from your ",(0,s.jsx)(o.code,{children:".env"})," file, as well as any others that you set in your terminal, and then adopts their specified values."]}),"\n",(0,s.jsx)(o.h2,{id:"supported-variables",children:"Supported environment variables"}),"\n",(0,s.jsx)(o.p,{children:"The following table lists the environment variables supported by Langflow."}),"\n",(0,s.jsxs)(o.table,{children:[(0,s.jsx)(o.thead,{children:(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.th,{children:"Variable"}),(0,s.jsx)(o.th,{children:"Format"}),(0,s.jsx)(o.th,{children:"Default"}),(0,s.jsx)(o.th,{children:"Description"})]})}),(0,s.jsxs)(o.tbody,{children:[(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"DO_NOT_TRACK"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["Whether to report ",(0,s.jsx)(o.a,{href:"/contributing-telemetry",children:"Langflow telemetry data"}),". If true, Langflow telemetry is disabled."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-auto-login",children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_SAVING"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"Enable flow auto-saving."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_SAVING_INTERVAL"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"1000"})}),(0,s.jsx)(o.td,{children:"Set the interval for flow auto-saving in milliseconds."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_BACKEND_ONLY"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Run only the Langflow backend service (no frontend)."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_BUNDLE_URLS"})}),(0,s.jsx)(o.td,{children:"List[String]"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"[]"})}),(0,s.jsx)(o.td,{children:"A list of URLs from which to load component bundles and flows. Supports GitHub URLs. If LANGFLOW_AUTO_LOGIN is enabled, flows from these bundles are loaded into the database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"async"})}),(0,s.jsxs)(o.td,{children:["Set the cache type for Langflow. Possible values: ",(0,s.jsx)(o.code,{children:"async"}),", ",(0,s.jsx)(o.code,{children:"redis"}),", ",(0,s.jsx)(o.code,{children:"memory"}),", ",(0,s.jsx)(o.code,{children:"disk"}),". If you set the type to ",(0,s.jsx)(o.code,{children:"redis"}),", then you must also set the following environment variables: ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_HOST"}),", ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_PORT"}),", ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_DB"}),", and ",(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_CACHE_EXPIRE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_COMPONENTS_PATH"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the directory containing custom components."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Varies"}),(0,s.jsxs)(o.td,{children:["Set the Langflow configuration directory where files, logs, and the Langflow database are stored. Default path depends on your installation. See ",(0,s.jsx)(o.a,{href:"/concepts-flows#flow-storage-and-logs",children:"Flow storage and logs"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DATABASE_URL"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Set the database URL for Langflow. If not provided, Langflow uses a SQLite database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DATABASE_CONNECTION_RETRY"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Whether to retry lost connections to the Langflow database. If true, Langflow tries to connect to the database again if the connection fails."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_POOL_SIZE"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"20"})}),(0,s.jsxs)(o.td,{children:[(0,s.jsx)(o.strong,{children:"DEPRECATED:"})," Use ",(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECTION_SETTINGS"})," instead. The number of connections to keep open in the connection pool."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_MAX_OVERFLOW"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"30"})}),(0,s.jsxs)(o.td,{children:[(0,s.jsx)(o.strong,{children:"DEPRECATED:"})," Use ",(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECTION_SETTINGS"})," instead. The number of connections to allow that can be opened beyond the pool size."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECT_TIMEOUT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"30"})}),(0,s.jsx)(o.td,{children:"The number of seconds to wait before giving up on a lock to be released or establishing a connection to the database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DB_CONNECTION_SETTINGS"})}),(0,s.jsx)(o.td,{children:"JSON"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsxs)(o.td,{children:["A JSON dictionary to centralize database connection parameters. Example: ",(0,s.jsx)(o.code,{children:'{"pool_size": 20, "max_overflow": 30}'})]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_DISABLE_TRACK_APIKEY_USAGE"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["Whether to track API key usage. If true, disables tracking of API key usage (",(0,s.jsx)(o.code,{children:"total_uses"})," and ",(0,s.jsx)(o.code,{children:"last_used_at"}),") to avoid database contention under high concurrency."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["Allow creation of superusers with the Langflow CLI command ",(0,s.jsx)(o.a,{href:"/configuration-cli#langflow-superuser",children:(0,s.jsx)(o.code,{children:"langflow superuser"})}),". Recommended to be disabled (false) in production for security reasons."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_FALLBACK_TO_ENV_VAR"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["If enabled, ",(0,s.jsx)(o.a,{href:"/configuration-global-variables",children:"global variables"})," set in your Langflow ",(0,s.jsx)(o.strong,{children:"Settings"})," can use an environment variable with the same name if Langflow can't retrieve the variable value from the global variables."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_FRONTEND_PATH"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"./frontend"})}),(0,s.jsxs)(o.td,{children:["Path to the frontend directory containing build files. This is for development purposes only. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#run-frontend-path",children:(0,s.jsx)(o.code,{children:"--frontend-path"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_HEALTH_CHECK_MAX_RETRIES"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"5"})}),(0,s.jsxs)(o.td,{children:["Set the maximum number of retries for the health check. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#run-health-check-max-retries",children:(0,s.jsx)(o.code,{children:"--health-check-max-retries"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_HOST"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"localhost"})}),(0,s.jsxs)(o.td,{children:["The host on which the Langflow server will run. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#run-host",children:(0,s.jsx)(o.code,{children:"--host"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LANGCHAIN_CACHE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"InMemoryCache"})}),(0,s.jsxs)(o.td,{children:["Type of cache to use. Possible values: ",(0,s.jsx)(o.code,{children:"InMemoryCache"}),", ",(0,s.jsx)(o.code,{children:"SQLiteCache"}),". See ",(0,s.jsx)(o.a,{href:"/configuration-cli#run-cache",children:(0,s.jsx)(o.code,{children:"--cache"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOG_LEVEL"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"INFO"})}),(0,s.jsxs)(o.td,{children:["Set the logging level for Langflow. Possible values: ",(0,s.jsx)(o.code,{children:"DEBUG"}),", ",(0,s.jsx)(o.code,{children:"INFO"}),", ",(0,s.jsx)(o.code,{children:"WARNING"}),", ",(0,s.jsx)(o.code,{children:"ERROR"}),", ",(0,s.jsx)(o.code,{children:"CRITICAL"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOG_FILE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the log file. If this option isn't set, logs are written to stdout."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOG_RETRIEVER_BUFFER_SIZE"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"10000"})}),(0,s.jsxs)(o.td,{children:["Set the buffer size for log retrieval. Only used if ",(0,s.jsx)(o.code,{children:"LANGFLOW_ENABLE_LOG_RETRIEVAL"})," is enabled."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MAX_FILE_SIZE_UPLOAD"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"100"})}),(0,s.jsxs)(o.td,{children:["Set the maximum file size for the upload in megabytes. See ",(0,s.jsx)(o.a,{href:"/configuration-cli#run-max-file-size-upload",children:(0,s.jsx)(o.code,{children:"--max-file-size-upload"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MAX_ITEMS_LENGTH"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"100"})}),(0,s.jsx)(o.td,{children:"Maximum number of items to store and display in the visual editor. Lists longer than this will be truncated when displayed in the visual editor. Doesn't affect data passed between components nor outputs."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MAX_TEXT_LENGTH"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"1000"})}),(0,s.jsx)(o.td,{children:"Maximum number of characters to store and display in the visual editor. Responses longer than this will be truncated when displayed in the visual editor. Doesn't truncate responses between components nor outputs."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MCP_SERVER_ENABLED"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"If this option is set to False, Langflow doesn't enable the MCP server."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_MCP_SERVER_ENABLE_PROGRESS_NOTIFICATIONS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"If this option is set to True, Langflow sends progress notifications in the MCP server."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-new-user-is-active",children:(0,s.jsx)(o.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_OPEN_BROWSER"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Open the system web browser on startup."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_PORT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"7860"})}),(0,s.jsx)(o.td,{children:"The port on which the Langflow server runs. The server automatically selects a free port if the specified port is in use."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_PROMETHEUS_ENABLED"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Expose Prometheus metrics."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_PROMETHEUS_PORT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"9090"})}),(0,s.jsx)(o.td,{children:"Set the port on which Langflow exposes Prometheus metrics."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_CACHE_EXPIRE"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"3600"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_DB"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"0"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_HOST"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"localhost"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_PORT"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"6379"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.code,{children:"LANGFLOW_CACHE_TYPE"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REDIS_PASSWORD"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Password for Redis authentication when using Redis cache type."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_REMOVE_API_KEYS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsx)(o.td,{children:"Remove API keys from the projects saved in the database."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SAVE_DB_IN_CONFIG_DIR"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"False"}),(0,s.jsxs)(o.td,{children:["If false (default), the Langflow database is saved in the ",(0,s.jsx)(o.code,{children:"langflow"})," root directory. This means the database isn't shared between different virtual environments, and the database is deleted when you uninstall Langflow. If true, the database is saved in the ",(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SECRET_KEY"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Automated"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-secret-key",children:(0,s.jsx)(o.code,{children:"LANGFLOW_SECRET_KEY"})}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_STORE"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"Whether to enable the Langflow Store features."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_STORE_ENVIRONMENT_VARIABLES"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["Whether to store environment variables as ",(0,s.jsx)(o.a,{href:"/configuration-global-variables",children:"global variables"})," in the database."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_CREATE_STARTER_PROJECTS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["Whether to create templates during initialization. If false, Langflow doesn't create templates, and ",(0,s.jsx)(o.code,{children:"LANGFLOW_UPDATE_STARTER_PROJECTS"})," is treated as false."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_UPDATE_STARTER_PROJECTS"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsx)(o.td,{children:"Whether to update templates with the latest component versions when initializing after an upgrade."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"langflow"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsxs)(o.a,{href:"/api-keys-and-authentication#langflow-superuser",children:[(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"langflow"})}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsxs)(o.a,{href:"/api-keys-and-authentication#langflow-superuser",children:[(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(o.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsxs)(o.td,{children:["Comma-separated list of environment variables to get from the environment and store as ",(0,s.jsx)(o.a,{href:"/configuration-global-variables",children:"global variables"}),"."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_LOAD_FLOWS_PATH"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsxs)(o.td,{children:["Path to a directory containing flow JSON files to be loaded on startup. Note that this feature only works if ",(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})," is enabled."]})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_WORKER_TIMEOUT"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"300"})}),(0,s.jsx)(o.td,{children:"Worker timeout in seconds."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_WORKERS"})}),(0,s.jsx)(o.td,{children:"Integer"}),(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"1"})}),(0,s.jsx)(o.td,{children:"Number of worker processes."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SSL_CERT_FILE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the SSL certificate file on the local system."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SSL_KEY_FILE"})}),(0,s.jsx)(o.td,{children:"String"}),(0,s.jsx)(o.td,{children:"Not set"}),(0,s.jsx)(o.td,{children:"Path to the SSL key file on the local system."})]}),(0,s.jsxs)(o.tr,{children:[(0,s.jsx)(o.td,{children:(0,s.jsx)(o.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN"})}),(0,s.jsx)(o.td,{children:"Boolean"}),(0,s.jsx)(o.td,{children:"True"}),(0,s.jsxs)(o.td,{children:["See ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication#langflow-auto-login",children:(0,s.jsx)(o.code,{children:"LANGFLOW_AUTO_LOGIN"})}),"."]})]})]})]}),"\n",(0,s.jsx)(o.h2,{id:"configure-env-overrideconf-and-tasksjson-files",children:"Configure .env, override.conf, and tasks.json files"}),"\n",(0,s.jsx)(o.p,{children:"The following examples show how to configure Langflow using environment variables in different scenarios."}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsxs)(i.A,{value:"env",label:".env file",default:!0,children:[(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.code,{children:".env"})," file is a text file that contains key-value pairs of environment variables."]}),(0,s.jsxs)(o.p,{children:["Create or edit a ",(0,s.jsx)(o.code,{children:".env"})," file in the root directory of your application or Langflow environment, and then add your configuration variables to the file:"]}),(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",title:'".env"',focus:"",code:{lines:[{tokens:[{content:"DO_NOT_TRACK=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING=True",props:{}}]},{tokens:[{content:"LANGFLOW_AUTO_SAVING_INTERVAL=1000",props:{}}]},{tokens:[{content:"LANGFLOW_BACKEND_ONLY=False",props:{}}]},{tokens:[{content:'LANGFLOW_BUNDLE_URLS=["https://github.com/user/repo/commit/hash"]',props:{}}]},{tokens:[{content:"LANGFLOW_CACHE_TYPE=async",props:{}}]},{tokens:[{content:"LANGFLOW_COMPONENTS_PATH=/path/to/components/",props:{}}]},{tokens:[{content:"LANGFLOW_CONFIG_DIR=/path/to/config/",props:{}}]},{tokens:[{content:"LANGFLOW_DATABASE_URL=postgresql://user:password@localhost:5432/langflow",props:{}}]},{tokens:[{content:"LANGFLOW_DEV=False",props:{}}]},{tokens:[{content:"LANGFLOW_FALLBACK_TO_ENV_VAR=False",props:{}}]},{tokens:[{content:"LANGFLOW_HEALTH_CHECK_MAX_RETRIES=5",props:{}}]},{tokens:[{content:"LANGFLOW_HOST=localhost",props:{}}]},{tokens:[{content:"LANGFLOW_LANGCHAIN_CACHE=InMemoryCache",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_FILE_SIZE_UPLOAD=10000",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_ITEMS_LENGTH=100",props:{}}]},{tokens:[{content:"LANGFLOW_MAX_TEXT_LENGTH=1000",props:{}}]},{tokens:[{content:"LANGFLOW_LOG_LEVEL=error",props:{}}]},{tokens:[{content:"LANGFLOW_OPEN_BROWSER=False",props:{}}]},{tokens:[{content:"LANGFLOW_PORT=7860",props:{}}]},{tokens:[{content:"LANGFLOW_REMOVE_API_KEYS=False",props:{}}]},{tokens:[{content:"LANGFLOW_SAVE_DB_IN_CONFIG_DIR=True",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=somesecretkey",props:{}}]},{tokens:[{content:"LANGFLOW_STORE=True",props:{}}]},{tokens:[{content:"LANGFLOW_STORE_ENVIRONMENT_VARIABLES=True",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=adminuser",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=adminpass",props:{}}]},{tokens:[{content:"LANGFLOW_WORKER_TIMEOUT=60000",props:{}}]},{tokens:[{content:"LANGFLOW_WORKERS=3",props:{}}]}],lang:"text"},annotations:[]}]})]}),(0,s.jsxs)(i.A,{value:"systemd",label:"Systemd service",children:[(0,s.jsx)(o.p,{children:"A systemd service configuration file configures Linux system services."}),(0,s.jsxs)(o.p,{children:["To add environment variables, create or edit a service configuration file and add an ",(0,s.jsx)(o.code,{children:"override.conf"})," file. This file allows you to override the default environment variables for the service."]}),(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",title:'"override.conf"',focus:"",code:{lines:[{tokens:[{content:"[Service]",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"DO_NOT_TRACK=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_AUTO_LOGIN=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_AUTO_SAVING=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_AUTO_SAVING_INTERVAL=1000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_BACKEND_ONLY=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_BUNDLE_URLS=[\\"',props:{style:{color:"#A5D6FF"}}},{content:"https://github.com/user/repo/commit/hash\\",props:{style:{color:"#C9D1D9"}}},{content:'"]"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CACHE_TYPE=async"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_COMPONENTS_PATH=/path/to/components/"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CONFIG_DIR=/path/to/config"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_DATABASE_URL=postgresql://user:password@localhost:5432/langflow"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_DEV=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_FALLBACK_TO_ENV_VAR=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_HEALTH_CHECK_MAX_RETRIES=5"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_HOST=localhost"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LANGCHAIN_CACHE=InMemoryCache"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_MAX_FILE_SIZE_UPLOAD=10000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_MAX_ITEMS_LENGTH=100"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_MAX_TEXT_LENGTH=1000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LOG_ENV=container_json"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LOG_FILE=logs/langflow.log"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_LOG_LEVEL=error"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_OPEN_BROWSER=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_PORT=7860"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_REMOVE_API_KEYS=false"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SAVE_DB_IN_CONFIG_DIR=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SECRET_KEY=somesecretkey"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_STORE=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_STORE_ENVIRONMENT_VARIABLES=true"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SUPERUSER=adminuser"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_SUPERUSER_PASSWORD=adminpass"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_WORKER_TIMEOUT=60000"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"Environment",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_WORKERS=3"',props:{style:{color:"#A5D6FF"}}}]}],lang:"ini"},annotations:[]}]}),(0,s.jsxs)(o.p,{children:["For more information on systemd, see the ",(0,s.jsx)(o.a,{href:"https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/using_systemd_unit_files_to_customize_and_optimize_your_system/assembly_working-with-systemd-unit-files_working-with-systemd",children:"Red Hat documentation"}),"."]})]}),(0,s.jsxs)(i.A,{value:"vscode",label:"VSCode tasks.json",children:[(0,s.jsxs)(o.p,{children:["The ",(0,s.jsx)(o.code,{children:"tasks.json"})," file located in ",(0,s.jsx)(o.code,{children:".vscode/tasks.json"})," is a configuration file for development environments using Visual Studio Code."]}),(0,s.jsxs)(o.p,{children:["Create or edit the ",(0,s.jsx)(o.code,{children:".vscode/tasks.json"})," file in your project root:"]}),(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",title:'".vscode/tasks.json"',focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "version"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"2.0.0"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "options"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "env"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "DO_NOT_TRACK"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_AUTO_LOGIN"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_AUTO_SAVING"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_AUTO_SAVING_INTERVAL"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"1000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_BACKEND_ONLY"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_BUNDLE_URLS"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"[',props:{style:{color:"#A5D6FF"}}},{content:'\\"',props:{style:{color:"#79C0FF"}}},{content:"https://github.com/user/repo/commit/hash",props:{style:{color:"#A5D6FF"}}},{content:'\\"',props:{style:{color:"#79C0FF"}}},{content:']"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_CACHE_TYPE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"async"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_COMPONENTS_PATH"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"D:/path/to/components/"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_CONFIG_DIR"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"D:/path/to/config/"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_DATABASE_URL"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"postgresql://postgres:password@localhost:5432/langflow"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_DEV"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_FALLBACK_TO_ENV_VAR"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_HEALTH_CHECK_MAX_RETRIES"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"5"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_HOST"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"localhost"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LANGCHAIN_CACHE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"InMemoryCache"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_MAX_FILE_SIZE_UPLOAD"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"10000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_MAX_ITEMS_LENGTH"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"100"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_MAX_TEXT_LENGTH"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"1000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LOG_ENV"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"container_csv"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LOG_FILE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"langflow.log"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_LOG_LEVEL"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"error"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_OPEN_BROWSER"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_PORT"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"7860"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_REMOVE_API_KEYS"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SAVE_DB_IN_CONFIG_DIR"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"false"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SECRET_KEY"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"somesecretkey"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_STORE"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_STORE_ENVIRONMENT_VARIABLES"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"true"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SUPERUSER"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"adminuser"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_SUPERUSER_PASSWORD"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"adminpass"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_WORKER_TIMEOUT"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"60000"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "LANGFLOW_WORKERS"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"3"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "tasks"',props:{style:{color:"#7EE787"}}},{content:": [",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "label"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"langflow backend"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "type"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"shell"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "command"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'". ./langflownightly/Scripts/activate && langflow run"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "isBackground"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"true",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "problemMatcher"',props:{style:{color:"#7EE787"}}},{content:": []",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),(0,s.jsxs)(o.p,{children:["To run Langflow using the above VSCode ",(0,s.jsx)(o.code,{children:"tasks.json"})," file, in the VSCode command palette, select ",(0,s.jsx)(o.strong,{children:"Tasks: Run Task"})," > ",(0,s.jsx)(o.strong,{children:"langflow backend"}),"."]})]})]}),"\n",(0,s.jsx)(o.h2,{id:"set-environment-variables-for-langflow-desktop",children:"Set environment variables for Langflow Desktop"}),"\n",(0,s.jsx)(o.p,{children:"Environment variables set in your terminal aren't automatically available to GUI-based applications like Langflow Desktop when you launch them from the Windows or macOS GUI."}),"\n",(0,s.jsx)(o.p,{children:"For Windows, this means any GUI-based app launched from the Start menu, desktop shortcuts, or Windows Explorer."}),"\n",(0,s.jsx)(o.p,{children:"For macOS, this means any GUI-based app launched from Finder, Spotlight, Launchpad, or the Dock."}),"\n",(0,s.jsx)(o.p,{children:"To set environment variables for Langflow Desktop, you need to use specific commands or files, depending on your OS."}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsxs)(i.A,{value:"macos",label:"macOS",default:!0,children:[(0,s.jsxs)(o.p,{children:["Langflow Desktop for macOS cannot automatically use variables set in your terminal, such as those in",(0,s.jsx)(o.code,{children:".zshrc"})," or ",(0,s.jsx)(o.code,{children:".bash_profile"}),", when launched from the macOS GUI."]}),(0,s.jsxs)(o.p,{children:["To make environment variables available to GUI apps on macOS, you need to use ",(0,s.jsx)(o.code,{children:"launchctl"})," with a ",(0,s.jsx)(o.code,{children:"plist"})," file:"]}),(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Create the ",(0,s.jsx)(o.code,{children:"LaunchAgents"})," directory if it doesn't exist:"]}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"mkdir ",props:{style:{color:"#FFA657"}}},{content:"-p ",props:{style:{color:"#79C0FF"}}},{content:"~/Library/LaunchAgents",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["In the ",(0,s.jsx)(o.code,{children:"LaunchAgents"})," directory, create a ",(0,s.jsx)(o.code,{children:".plist"})," file called ",(0,s.jsx)(o.code,{children:"dev.langflow.env"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Add the following content to ",(0,s.jsx)(o.code,{children:"dev.langflow.env.plist"}),", and then add, change, or remove Langflow environment variables as needed for your configuration."]}),"\n",(0,s.jsx)(o.p,{children:"This example sets multiple environmental variables for all GUI apps launched from the macOS GUI."}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ',props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"plist ",props:{style:{color:"#7EE787"}}},{content:"version",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#C9D1D9"}}},{content:'"1.0"',props:{style:{color:"#A5D6FF"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"dict",props:{style:{color:"#7EE787"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"key",props:{style:{color:"#7EE787"}}},{content:">Label",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">dev.langflow.env",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"key",props:{style:{color:"#7EE787"}}},{content:">ProgramArguments",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"array",props:{style:{color:"#7EE787"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">/bin/sh",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">-c",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"string",props:{style:{color:"#7EE787"}}},{content:">",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" launchctl setenv LANGFLOW_CONFIG_DIR /Users/your_user/custom/config ",props:{style:{color:"#C9D1D9"}}},{content:"&&",props:{style:{color:"#FFA198",fontStyle:"italic"}}}]},{tokens:[{content:" launchctl setenv LANGFLOW_PORT 7860 ",props:{style:{color:"#C9D1D9"}}},{content:"&&",props:{style:{color:"#FFA198",fontStyle:"italic"}}}]},{tokens:[{content:" launchctl setenv LANGFLOW_HOST localhost ",props:{style:{color:"#C9D1D9"}}},{content:"&&",props:{style:{color:"#FFA198",fontStyle:"italic"}}}]},{tokens:[{content:" launchctl setenv ARIZE_API_KEY ak-...",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"key",props:{style:{color:"#7EE787"}}},{content:">RunAtLoad",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" <",props:{style:{color:"#C9D1D9"}}},{content:"true",props:{style:{color:"#7EE787"}}},{content:"/>",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ",props:{style:{color:"#C9D1D9"}}}]}],lang:"xml"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Load the file with ",(0,s.jsx)(o.code,{children:"launchctl"}),":"]}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"launchctl ",props:{style:{color:"#FFA657"}}},{content:"load ~/Library/LaunchAgents/dev.langflow.env.plist",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]})]}),(0,s.jsxs)(i.A,{value:"windows1",label:"Window System Properties",children:[(0,s.jsxs)(o.p,{children:["Langflow Desktop for Windows cannot automatically use variables set in your terminal, such as those defined with ",(0,s.jsx)(o.code,{children:"set"})," in ",(0,s.jsx)(o.code,{children:"cmd"})," or ",(0,s.jsx)(o.code,{children:"$env:VAR=..."})," in PowerShell, when launched from the Windows GUI."]}),(0,s.jsxs)(o.p,{children:["To make environment variables available to the Langflow Desktop app, you must set them at the user or system level using the ",(0,s.jsx)(o.strong,{children:"System Properties"})," interface or the Terminal."]}),(0,s.jsx)(o.p,{children:"To set environment variables using the System Properties interface, do the following:"}),(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Press ",(0,s.jsx)("kbd",{children:"Win + R"}),", enter ",(0,s.jsx)(o.code,{children:"SystemPropertiesAdvanced"}),", and then press ",(0,s.jsx)("kbd",{children:"Enter"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Click ",(0,s.jsx)(o.strong,{children:"Environment Variables"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Under ",(0,s.jsx)(o.strong,{children:"User variables"}),", click ",(0,s.jsx)(o.strong,{children:"New"}),"."]}),"\n",(0,s.jsx)(o.admonition,{type:"tip",children:(0,s.jsxs)(o.p,{children:["To apply the setting to all users, select ",(0,s.jsx)(o.strong,{children:"System variables"}),"."]})}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Enter the name of the Langflow variable you want to set, such as ",(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"}),", and the desired value, such as ",(0,s.jsx)(o.code,{children:"C:\\Users\\your_user\\.langflow_config"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Click ",(0,s.jsx)(o.strong,{children:"OK"})," to save the variable."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Repeat until you have set all necessary Langflow environment variables."}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Launch or restart Langflow Desktop to apply the environment variables."}),"\n"]}),"\n"]})]}),(0,s.jsxs)(i.A,{value:"windows2",label:"Powershell",children:[(0,s.jsx)(o.p,{children:"To define environment variables for Windows using PowerShell, do the following:"}),(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Enter the name of the Langflow variable you want to set, such as ",(0,s.jsx)(o.code,{children:"LANGFLOW_CONFIG_DIR"}),", and the desired value, such as ",(0,s.jsx)(o.code,{children:"C:\\Users\\your_user\\.langflow_config"}),"."]}),"\n",(0,s.jsx)(o.p,{children:"To set an environment variable for the current user:"}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}},{content:"System.Environment",props:{style:{color:"#FF7B72"}}},{content:"]::SetEnvironmentVariable(",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CONFIG_DIR"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"C:\\Users\\your_user\\.langflow_config"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"powershell"},annotations:[]}]}),"\n",(0,s.jsx)(o.p,{children:"To set an environment variable for all users (you must have Administrator priveleges):"}),"\n",(0,s.jsx)(h.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}},{content:"System.Environment",props:{style:{color:"#FF7B72"}}},{content:"]::SetEnvironmentVariable(",props:{style:{color:"#C9D1D9"}}},{content:'"LANGFLOW_CONFIG_DIR"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"C:\\Langflow\\Config"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#FF7B72"}}},{content:'"Machine"',props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"powershell"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Repeat until you have set all necessary Langflow environment variables."}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Launch or restart Langflow Desktop to apply the environment variables."}),"\n"]}),"\n"]})]})]})]})}function u(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(L,{...e})}):L(e)}function F(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/22dd74f7.480455be.js b/assets/js/22dd74f7.31163c52.js similarity index 63% rename from assets/js/22dd74f7.480455be.js rename to assets/js/22dd74f7.31163c52.js index a530dd5057..6772c12d33 100644 --- a/assets/js/22dd74f7.480455be.js +++ b/assets/js/22dd74f7.31163c52.js @@ -1 +1 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[1567],{55226:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Welcome to Langflow","href":"/","docId":"Get-Started/welcome-to-langflow","unlisted":false},{"type":"category","label":"Get started","items":[{"type":"link","label":"About Langflow","href":"/about-langflow","docId":"Get-Started/about-langflow","unlisted":false},{"type":"link","label":"Install Langflow","href":"/get-started-installation","docId":"Get-Started/get-started-installation","unlisted":false},{"type":"link","label":"Quickstart","href":"/get-started-quickstart","docId":"Get-Started/get-started-quickstart","unlisted":false},{"type":"category","label":"Tutorials","items":[{"type":"link","label":"Create a vector RAG chatbot","href":"/chat-with-rag","docId":"Tutorials/chat-with-rag","unlisted":false},{"type":"link","label":"Create a chatbot that can ingest files","href":"/chat-with-files","docId":"Tutorials/chat-with-files","unlisted":false},{"type":"link","label":"Connect applications to agents","href":"/agent-tutorial","docId":"Tutorials/agent","unlisted":false},{"type":"link","label":"Connect to MCP servers from your application","href":"/mcp-tutorial","docId":"Tutorials/mcp-tutorial","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Flows","items":[{"type":"link","label":"Use the visual editor","href":"/concepts-overview","docId":"Concepts/concepts-overview","unlisted":false},{"type":"link","label":"Build flows","href":"/concepts-flows","docId":"Concepts/concepts-flows","unlisted":false},{"type":"category","label":"Run flows","items":[{"type":"link","label":"Trigger flows with the Langflow API","href":"/concepts-publish","docId":"Concepts/concepts-publish","unlisted":false},{"type":"link","label":"Trigger flows with webhooks","href":"/webhook","docId":"Develop/webhook","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Test flows","href":"/concepts-playground","docId":"Concepts/concepts-playground","unlisted":false},{"type":"link","label":"Import and export flows","href":"/concepts-flows-import","docId":"Concepts/concepts-flows-import","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Agents","items":[{"type":"link","label":"Use Langflow agents","href":"/agents","docId":"Agents/agents","unlisted":false},{"type":"link","label":"Configure tools for agents","href":"/agents-tools","docId":"Agents/agents-tools","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Model Context Protocol (MCP)","items":[{"type":"link","label":"Use Langflow as an MCP client","href":"/mcp-client","docId":"Components/mcp-client","unlisted":false},{"type":"link","label":"Use Langflow as an MCP server","href":"/mcp-server","docId":"Concepts/mcp-server","unlisted":false},{"type":"link","label":"Connect an Astra DB MCP server to Langflow","href":"/mcp-component-astra","docId":"Integrations/mcp-component-astra","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Develop","items":[{"type":"link","label":"API keys and authentication","href":"/api-keys-and-authentication","docId":"Configuration/api-keys-and-authentication","unlisted":false},{"type":"link","label":"Install custom dependencies","href":"/install-custom-dependencies","docId":"Develop/install-custom-dependencies","unlisted":false},{"type":"link","label":"Global variables","href":"/configuration-global-variables","docId":"Configuration/configuration-global-variables","unlisted":false},{"type":"link","label":"Environment variables","href":"/environment-variables","docId":"Configuration/environment-variables","unlisted":false},{"type":"category","label":"Storage and memory","items":[{"type":"link","label":"Manage files","href":"/concepts-file-management","docId":"Concepts/concepts-file-management","unlisted":false},{"type":"link","label":"Manage memory","href":"/memory","docId":"Develop/memory","unlisted":false},{"type":"link","label":"Use Session IDs","href":"/session-id","docId":"Develop/session-id","unlisted":false},{"type":"link","label":"Configure an external PostgreSQL database","href":"/configuration-custom-database","docId":"Configuration/configuration-custom-database","unlisted":false},{"type":"link","label":"Database guide for enterprise administrators","href":"/enterprise-database-guide","docId":"Develop/enterprise-database-guide","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Observability","items":[{"type":"link","label":"Logs","href":"/logging","docId":"Develop/logging","unlisted":false},{"type":"category","label":"Monitoring","items":[{"type":"link","label":"Arize","href":"/integrations-arize","docId":"Integrations/Arize/integrations-arize","unlisted":false},{"type":"link","label":"Langfuse","href":"/integrations-langfuse","docId":"Integrations/integrations-langfuse","unlisted":false},{"type":"link","label":"LangSmith","href":"/integrations-langsmith","docId":"Integrations/integrations-langsmith","unlisted":false},{"type":"link","label":"LangWatch","href":"/integrations-langwatch","docId":"Integrations/integrations-langwatch","unlisted":false},{"type":"link","label":"Opik","href":"/integrations-opik","docId":"Integrations/integrations-opik","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Telemetry","href":"/contributing-telemetry","docId":"Contributing/contributing-telemetry","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Use Langflow data types","href":"/data-types","docId":"Concepts/data-types","unlisted":false},{"type":"link","label":"Use voice mode","href":"/concepts-voice-mode","docId":"Concepts/concepts-voice-mode","unlisted":false},{"type":"link","label":"Use the Langflow CLI","href":"/configuration-cli","docId":"Configuration/configuration-cli","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Deploy","items":[{"type":"link","label":"Langflow deployment overview","href":"/deployment-overview","docId":"Deployment/deployment-overview","unlisted":false},{"type":"link","label":"Deploy a public Langflow server","href":"/deployment-public-server","docId":"Deployment/deployment-public-server","unlisted":false},{"type":"category","label":"Containerized deployments","items":[{"type":"link","label":"Containerize a Langflow application","href":"/develop-application","docId":"Develop/develop-application","unlisted":false},{"type":"link","label":"Langflow Docker images","href":"/deployment-docker","docId":"Deployment/deployment-docker","unlisted":false},{"type":"link","label":"Deploy Langflow on a remote server","href":"/deployment-caddyfile","docId":"Deployment/deployment-caddyfile","unlisted":false},{"type":"category","label":"Kubernetes","items":[{"type":"link","label":"Deployment architecture","href":"/deployment-architecture","docId":"Deployment/deployment-architecture","unlisted":false},{"type":"link","label":"Best practices","href":"/deployment-prod-best-practices","docId":"Deployment/deployment-prod-best-practices","unlisted":false},{"type":"link","label":"Deploy in development","href":"/deployment-kubernetes-dev","docId":"Deployment/deployment-kubernetes-dev","unlisted":false},{"type":"link","label":"Deploy in production","href":"/deployment-kubernetes-prod","docId":"Deployment/deployment-kubernetes-prod","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Cloud platforms","items":[{"type":"link","label":"Google Cloud Platform","href":"/deployment-gcp","docId":"Deployment/deployment-gcp","unlisted":false},{"type":"link","label":"Hugging Face Spaces","href":"/deployment-hugging-face-spaces","docId":"Deployment/deployment-hugging-face-spaces","unlisted":false},{"type":"link","label":"Railway","href":"/deployment-railway","docId":"Deployment/deployment-railway","unlisted":false},{"type":"link","label":"Render","href":"/deployment-render","docId":"Deployment/deployment-render","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Components reference","items":[{"type":"link","label":"Components overview","href":"/concepts-components","docId":"Concepts/concepts-components","unlisted":false},{"type":"category","label":"Core components","items":[{"type":"link","label":"Input / Output","href":"/components-io","docId":"Components/components-io","unlisted":false},{"type":"link","label":"Agents","href":"/components-agents","docId":"Components/components-agents","unlisted":false},{"type":"category","label":"Models","items":[{"type":"link","label":"Language Model","href":"/components-models","docId":"Components/components-models","unlisted":false},{"type":"link","label":"Embedding Model","href":"/components-embedding-models","docId":"Components/components-embedding-models","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Data","href":"/components-data","docId":"Components/components-data","unlisted":false},{"type":"link","label":"Vector Stores","href":"/components-vector-stores","docId":"Components/components-vector-stores","unlisted":false},{"type":"category","label":"Processing","items":[{"type":"link","label":"Processing components","href":"/components-processing","docId":"Components/components-processing","unlisted":false},{"type":"link","label":"Prompt Template","href":"/components-prompts","docId":"Components/components-prompts","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Logic","href":"/components-logic","docId":"Components/components-logic","unlisted":false},{"type":"link","label":"Helpers","href":"/components-helpers","docId":"Components/components-helpers","unlisted":false},{"type":"link","label":"Tools","href":"/components-tools","docId":"Components/components-tools","unlisted":false},{"type":"link","label":"Memories","href":"/components-memories","docId":"Components/components-memories","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Bundles","items":[{"type":"link","label":"About bundles","href":"/components-bundle-components","docId":"Components/components-bundles","unlisted":false},{"type":"link","label":"AI/ML API","href":"/bundles-aiml","docId":"Components/bundles-aiml","unlisted":false},{"type":"link","label":"Amazon","href":"/bundles-amazon","docId":"Components/bundles-amazon","unlisted":false},{"type":"link","label":"Anthropic","href":"/bundles-anthropic","docId":"Components/bundles-anthropic","unlisted":false},{"type":"link","label":"Apify","href":"/integrations-apify","docId":"Integrations/Apify/integrations-apify","unlisted":false},{"type":"link","label":"arXiv","href":"/bundles-arxiv","docId":"Components/bundles-arxiv","unlisted":false},{"type":"link","label":"AssemblyAI","href":"/integrations-assemblyai","docId":"Integrations/integrations-assemblyai","unlisted":false},{"type":"link","label":"Azure","href":"/bundles-azure","docId":"Components/bundles-azure","unlisted":false},{"type":"link","label":"Baidu","href":"/bundles-baidu","docId":"Components/bundles-baidu","unlisted":false},{"type":"link","label":"Bing","href":"/bundles-bing","docId":"Components/bundles-bing","unlisted":false},{"type":"link","label":"Cleanlab","href":"/integrations-cleanlab","docId":"Integrations/Cleanlab/integrations-cleanlab","unlisted":false},{"type":"link","label":"Cloudflare","href":"/bundles-cloudflare","docId":"Components/bundles-cloudflare","unlisted":false},{"type":"link","label":"Cohere","href":"/bundles-cohere","docId":"Components/bundles-cohere","unlisted":false},{"type":"link","label":"Composio","href":"/integrations-composio","docId":"Integrations/Composio/integrations-composio","unlisted":false},{"type":"link","label":"DataStax","href":"/bundles-datastax","docId":"Components/bundles-datastax","unlisted":false},{"type":"link","label":"DeepSeek","href":"/bundles-deepseek","docId":"Components/bundles-deepseek","unlisted":false},{"type":"link","label":"Docling","href":"/integrations-docling","docId":"Integrations/Docling/integrations-docling","unlisted":false},{"type":"link","label":"DuckDuckGo","href":"/bundles-duckduckgo","docId":"Components/bundles-duckduckgo","unlisted":false},{"type":"link","label":"Exa","href":"/bundles-exa","docId":"Components/bundles-exa","unlisted":false},{"type":"link","label":"Glean","href":"/bundles-glean","docId":"Components/bundles-glean","unlisted":false},{"type":"category","label":"Google","items":[{"type":"link","label":"Google components","href":"/bundles-google","docId":"Components/bundles-google","unlisted":false},{"type":"link","label":"Google BigQuery","href":"/integrations-google-big-query","docId":"Integrations/Google/integrations-google-big-query","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Groq","href":"/bundles-groq","docId":"Components/bundles-groq","unlisted":false},{"type":"link","label":"Hugging Face","href":"/bundles-huggingface","docId":"Components/bundles-huggingface","unlisted":false},{"type":"link","label":"IBM","href":"/bundles-ibm","docId":"Components/bundles-ibm","unlisted":false},{"type":"link","label":"Icosa Computing","href":"/bundles-icosacomputing","docId":"Components/bundles-icosacomputing","unlisted":false},{"type":"link","label":"LangChain","href":"/bundles-langchain","docId":"Components/bundles-langchain","unlisted":false},{"type":"link","label":"LM Studio","href":"/bundles-lmstudio","docId":"Components/bundles-lmstudio","unlisted":false},{"type":"link","label":"MariTalk","href":"/bundles-maritalk","docId":"Components/bundles-maritalk","unlisted":false},{"type":"link","label":"Mem0","href":"/bundles-mem0","docId":"Components/bundles-mem0","unlisted":false},{"type":"link","label":"MistralAI","href":"/bundles-mistralai","docId":"Components/bundles-mistralai","unlisted":false},{"type":"category","label":"Notion","items":[{"type":"link","label":"Set up a Notion App","href":"/integrations/notion/setup","docId":"Integrations/Notion/integrations-notion","unlisted":false},{"type":"link","label":"Notion Conversational Agent","href":"/integrations/notion/notion-agent-conversational","docId":"Integrations/Notion/notion-agent-conversational","unlisted":false},{"type":"link","label":"Notion Meeting Notes Agent","href":"/integrations/notion/notion-agent-meeting-notes","docId":"Integrations/Notion/notion-agent-meeting-notes","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Novita","href":"/bundles-novita","docId":"Components/bundles-novita","unlisted":false},{"type":"category","label":"NVIDIA","items":[{"type":"link","label":"NVIDIA components","href":"/bundles-nvidia","docId":"Components/bundles-nvidia","unlisted":false},{"type":"link","label":"NVIDIA Ingest","href":"/integrations-nvidia-ingest","docId":"Integrations/Nvidia/integrations-nvidia-ingest","unlisted":false},{"type":"link","label":"NVIDIA NIM on WSL2","href":"/integrations-nvidia-ingest-wsl2","docId":"Integrations/Nvidia/integrations-nvidia-nim-wsl2","unlisted":false},{"type":"link","label":"NVIDIA G-Assist","href":"/integrations-nvidia-g-assist","docId":"Integrations/Nvidia/integrations-nvidia-g-assist","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Ollama","href":"/bundles-ollama","docId":"Components/bundles-ollama","unlisted":false},{"type":"link","label":"OpenAI","href":"/bundles-openai","docId":"Components/bundles-openai","unlisted":false},{"type":"link","label":"OpenRouter","href":"/bundles-openrouter","docId":"Components/bundles-openrouter","unlisted":false},{"type":"link","label":"Perplexity","href":"/bundles-perplexity","docId":"Components/bundles-perplexity","unlisted":false},{"type":"link","label":"Redis","href":"/bundles-redis","docId":"Components/bundles-redis","unlisted":false},{"type":"link","label":"SambaNova","href":"/bundles-sambanova","docId":"Components/bundles-sambanova","unlisted":false},{"type":"link","label":"SearchApi","href":"/bundles-searchapi","docId":"Components/bundles-searchapi","unlisted":false},{"type":"link","label":"Vertex AI","href":"/bundles-vertexai","docId":"Components/bundles-vertexai","unlisted":false},{"type":"link","label":"Wikipedia","href":"/bundles-wikipedia","docId":"Components/bundles-wikipedia","unlisted":false},{"type":"link","label":"xAI","href":"/bundles-xai","docId":"Components/bundles-xai","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Create custom Python components","href":"/components-custom-components","docId":"Components/components-custom-components","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"API reference","items":[{"type":"link","label":"Get started with the Langflow API","href":"/api-reference-api-examples","docId":"API-Reference/api-reference-api-examples","unlisted":false},{"type":"link","label":"Use the TypeScript client","href":"/typescript-client","docId":"Develop/Clients/typescript-client","unlisted":false},{"type":"link","label":"Flow trigger endpoints","href":"/api-flows-run","docId":"API-Reference/api-flows-run","unlisted":false},{"type":"link","label":"Flow management endpoints","href":"/api-flows","docId":"API-Reference/api-flows","unlisted":false},{"type":"link","label":"Files endpoints","href":"/api-files","docId":"API-Reference/api-files","unlisted":false},{"type":"link","label":"Projects endpoints","href":"/api-projects","docId":"API-Reference/api-projects","unlisted":false},{"type":"link","label":"Logs endpoints","href":"/api-logs","docId":"API-Reference/api-logs","unlisted":false},{"type":"link","label":"Monitor endpoints","href":"/api-monitor","docId":"API-Reference/api-monitor","unlisted":false},{"type":"link","label":"Build endpoints","href":"/api-build","docId":"API-Reference/api-build","unlisted":false},{"type":"link","label":"Users endpoints","href":"/api-users","docId":"API-Reference/api-users","unlisted":false},{"type":"link","label":"Langflow API specification","href":"/api"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Contribute","items":[{"type":"link","label":"Join the Langflow community","href":"/contributing-community","docId":"Contributing/contributing-community","unlisted":false},{"type":"link","label":"Contribute to Langflow","href":"/contributing-how-to-contribute","docId":"Contributing/contributing-how-to-contribute","unlisted":false},{"type":"link","label":"Contribute components","href":"/contributing-components","docId":"Contributing/contributing-components","unlisted":false},{"type":"link","label":"Contribute component tests","href":"/contributing-component-tests","docId":"Contributing/contributing-component-tests","unlisted":false},{"type":"link","label":"Contribute templates","href":"/contributing-templates","docId":"Contributing/contributing-templates","unlisted":false},{"type":"link","label":"Contribute bundles","href":"/contributing-bundles","docId":"Contributing/contributing-bundles","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Release notes","items":[{"type":"link","label":"Release notes","href":"/release-notes","docId":"Support/release-notes","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Support","items":[{"type":"link","label":"Troubleshoot","href":"/troubleshoot","docId":"Support/troubleshooting","unlisted":false},{"type":"link","label":"Get help and request enhancements","href":"/contributing-github-issues","docId":"Contributing/contributing-github-issues","unlisted":false},{"type":"link","label":"Enterprise support","href":"/luna-for-langflow","docId":"Support/luna-for-langflow","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"html","className":"sidebar-ad","value":"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n

    \\n \\n "}]},"docs":{"Agents/agents":{"id":"Agents/agents","title":"Use Langflow agents","description":"Langflow\'s Agent component is critical for building agent flows.","sidebar":"docs"},"Agents/agents-tools":{"id":"Agents/agents-tools","title":"Configure tools for agents","description":"Configure tools connected to agents to extend their capabilities.","sidebar":"docs"},"API-Reference/api-build":{"id":"API-Reference/api-build","title":"Build endpoints","description":"The /build endpoints are used by Langflow\'s frontend visual editor code.","sidebar":"docs"},"API-Reference/api-files":{"id":"API-Reference/api-files","title":"Files endpoints","description":"Use the /files endpoints to move files between your local machine and Langflow.","sidebar":"docs"},"API-Reference/api-flows":{"id":"API-Reference/api-flows","title":"Flow management endpoints","description":"Use the /flows endpoint to create, read, update, and delete flows.","sidebar":"docs"},"API-Reference/api-flows-run":{"id":"API-Reference/api-flows-run","title":"Flow trigger endpoints","description":"Use the /run and /webhook endpoints to run flows.","sidebar":"docs"},"API-Reference/api-logs":{"id":"API-Reference/api-logs","title":"Logs endpoints","description":"Retrieve logs for your Langflow flow.","sidebar":"docs"},"API-Reference/api-monitor":{"id":"API-Reference/api-monitor","title":"Monitor endpoints","description":"The /monitor endpoints are for internal Langflow functionality, primarily related to running flows in the Playground, storing chat history, and generating flow logs.","sidebar":"docs"},"API-Reference/api-projects":{"id":"API-Reference/api-projects","title":"Projects endpoints","description":"Use the /projects endpoint to create, read, update, and delete Langflow projects.","sidebar":"docs"},"API-Reference/api-reference-api-examples":{"id":"API-Reference/api-reference-api-examples","title":"Get started with the Langflow API","description":"You can use the Langflow API for programmatic interactions with Langflow, such as the following:","sidebar":"docs"},"API-Reference/api-users":{"id":"API-Reference/api-users","title":"Users endpoints","description":"Use the /users endpoint to manage user accounts in Langflow.","sidebar":"docs"},"Components/bundles-aiml":{"id":"Components/bundles-aiml","title":"AI/ML API","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-amazon":{"id":"Components/bundles-amazon","title":"Amazon","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-anthropic":{"id":"Components/bundles-anthropic","title":"Anthropic","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-arxiv":{"id":"Components/bundles-arxiv","title":"arXiv","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-azure":{"id":"Components/bundles-azure","title":"Azure","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-baidu":{"id":"Components/bundles-baidu","title":"Baidu","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-bing":{"id":"Components/bundles-bing","title":"Bing","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-cloudflare":{"id":"Components/bundles-cloudflare","title":"Cloudflare","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-cohere":{"id":"Components/bundles-cohere","title":"Cohere","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-datastax":{"id":"Components/bundles-datastax","title":"DataStax","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-deepseek":{"id":"Components/bundles-deepseek","title":"DeepSeek","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-duckduckgo":{"id":"Components/bundles-duckduckgo","title":"DuckDuckGo","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-exa":{"id":"Components/bundles-exa","title":"Exa","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-glean":{"id":"Components/bundles-glean","title":"Glean","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-google":{"id":"Components/bundles-google","title":"Google components","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-groq":{"id":"Components/bundles-groq","title":"Groq","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-huggingface":{"id":"Components/bundles-huggingface","title":"Hugging Face","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-ibm":{"id":"Components/bundles-ibm","title":"IBM","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-icosacomputing":{"id":"Components/bundles-icosacomputing","title":"Icosa Computing","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-langchain":{"id":"Components/bundles-langchain","title":"LangChain","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-lmstudio":{"id":"Components/bundles-lmstudio","title":"LM Studio","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-maritalk":{"id":"Components/bundles-maritalk","title":"MariTalk","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-mem0":{"id":"Components/bundles-mem0","title":"Mem0","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-mistralai":{"id":"Components/bundles-mistralai","title":"MistralAI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-novita":{"id":"Components/bundles-novita","title":"Novita","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-nvidia":{"id":"Components/bundles-nvidia","title":"NVIDIA components","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-ollama":{"id":"Components/bundles-ollama","title":"Ollama","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-openai":{"id":"Components/bundles-openai","title":"OpenAI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-openrouter":{"id":"Components/bundles-openrouter","title":"OpenRouter","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-perplexity":{"id":"Components/bundles-perplexity","title":"Perplexity","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-redis":{"id":"Components/bundles-redis","title":"Redis","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-sambanova":{"id":"Components/bundles-sambanova","title":"SambaNova","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-searchapi":{"id":"Components/bundles-searchapi","title":"SearchApi","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-vertexai":{"id":"Components/bundles-vertexai","title":"Vertex AI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-wikipedia":{"id":"Components/bundles-wikipedia","title":"Wikipedia","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-xai":{"id":"Components/bundles-xai","title":"xAI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/components-agents":{"id":"Components/components-agents","title":"Agents","description":"Langflow\'s Agent and MCP Tools components are critical for building agent flows.","sidebar":"docs"},"Components/components-bundles":{"id":"Components/components-bundles","title":"About bundles","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/components-custom-components":{"id":"Components/components-custom-components","title":"Create custom Python components","description":"Custom components extend Langflow\'s functionality through Python classes that inherit from Component. This enables integration of new features, data manipulation, external services, and specialized tools.","sidebar":"docs"},"Components/components-data":{"id":"Components/components-data","title":"Data","description":"You can use Langflow\'s Data components to bring data into your flows from various sources like files, API endpoints, and URLs.","sidebar":"docs"},"Components/components-embedding-models":{"id":"Components/components-embedding-models","title":"Embedding Model","description":"Embedding Model components in Langflow generate text embeddings using a specified Large Language Model (LLM).","sidebar":"docs"},"Components/components-helpers":{"id":"Components/components-helpers","title":"Helpers","description":"Helper components provide utility functions to help manage data and perform simple tasks in your flow.","sidebar":"docs"},"Components/components-io":{"id":"Components/components-io","title":"Input / Output","description":"Langflow\'s Input and Output components define where data enters and exits your flow, but they don\'t have identical functionality.","sidebar":"docs"},"Components/components-logic":{"id":"Components/components-logic","title":"Logic","description":"Langflow\'s Logic components provide functionalities for routing, conditional processing, and flow management.","sidebar":"docs"},"Components/components-memories":{"id":"Components/components-memories","title":"Memories","description":"In Langflow version 1.5, the Memory category was removed.","sidebar":"docs"},"Components/components-models":{"id":"Components/components-models","title":"Language Model","description":"Language Model components in Langflow generate text using a specified Large Language Model (LLM).","sidebar":"docs"},"Components/components-processing":{"id":"Components/components-processing","title":"Processing components","description":"Langflow\'s Processing components process and transform data within a flow.","sidebar":"docs"},"Components/components-prompts":{"id":"Components/components-prompts","title":"Prompt Template","description":"Use the Prompt Template core component to create a prompt that supplies instructions and context to an LLM or agent, separate from other input like chat messages and file uploads.","sidebar":"docs"},"Components/components-tools":{"id":"Components/components-tools","title":"Tools","description":"In Langflow version 1.5, the Tools category was deprecated.","sidebar":"docs"},"Components/components-vector-stores":{"id":"Components/components-vector-stores","title":"Vector Stores","description":"Langflow\'s Vector Store components connect to your vector databases or create in-memory vector stores for storing and retrieving vector data in flows.","sidebar":"docs"},"Components/mcp-client":{"id":"Components/mcp-client","title":"Use Langflow as an MCP client","description":"Langflow integrates with the Model Context Protocol (MCP) as both an MCP server and an MCP client.","sidebar":"docs"},"Concepts/concepts-components":{"id":"Concepts/concepts-components","title":"Components overview","description":"Components are the building blocks of your flows.","sidebar":"docs"},"Concepts/concepts-file-management":{"id":"Concepts/concepts-file-management","title":"Manage files","description":"Each Langflow server has a file management system where you can store files that you want to use in your flows.","sidebar":"docs"},"Concepts/concepts-flows":{"id":"Concepts/concepts-flows","title":"Build flows","description":"A flow is a functional representation of an application workflow.","sidebar":"docs"},"Concepts/concepts-flows-import":{"id":"Concepts/concepts-flows-import","title":"Import and export flows","description":"You can export flows to transfer them between Langflow instances, share them with others, or create backups.","sidebar":"docs"},"Concepts/concepts-overview":{"id":"Concepts/concepts-overview","title":"Use the visual editor","description":"You use Langflow\'s visual editor to create, test, and share flows, which are functional representations of application workflows.","sidebar":"docs"},"Concepts/concepts-playground":{"id":"Concepts/concepts-playground","title":"Test flows in the Playground","description":"Langflow\'s Playground is a dynamic interface you can use to test your LLM-based flows in real-time.","sidebar":"docs"},"Concepts/concepts-publish":{"id":"Concepts/concepts-publish","title":"Trigger flows with the Langflow API","description":"After you build a flow, you probably want to run it within an application, such as a chatbot within a mobile app or website.","sidebar":"docs"},"Concepts/concepts-voice-mode":{"id":"Concepts/concepts-voice-mode","title":"Use voice mode","description":"You can use Langflow\'s voice mode to interact with your flows verbally through a microphone and speakers.","sidebar":"docs"},"Concepts/data-types":{"id":"Concepts/data-types","title":"Langflow data types","description":"Langflow components are designed to accept and produce specific types of inputs and outputs.","sidebar":"docs"},"Concepts/mcp-server":{"id":"Concepts/mcp-server","title":"Use Langflow as an MCP server","description":"Langflow integrates with the Model Context Protocol (MCP) as both an MCP server and an MCP client.","sidebar":"docs"},"Configuration/api-keys-and-authentication":{"id":"Configuration/api-keys-and-authentication","title":"API keys and authentication","description":"Never expose Langflow ports directly to the internet without proper security measures.","sidebar":"docs"},"Configuration/configuration-cli":{"id":"Configuration/configuration-cli","title":"Langflow CLI","description":"The Langflow command line interface is the main interface for managing and running the Langflow server.","sidebar":"docs"},"Configuration/configuration-custom-database":{"id":"Configuration/configuration-custom-database","title":"Configure an external PostgreSQL database","description":"Langflow\'s default database is SQLite, but you can configure Langflow to use PostgreSQL instead.","sidebar":"docs"},"Configuration/configuration-global-variables":{"id":"Configuration/configuration-global-variables","title":"Global variables","description":"Global variables let you store and reuse generic input values and credentials across your Langflow projects.","sidebar":"docs"},"Configuration/environment-variables":{"id":"Configuration/environment-variables","title":"Environment variables","description":"Langflow uses environment variables to configure certain settings.","sidebar":"docs"},"Contributing/contributing-bundles":{"id":"Contributing/contributing-bundles","title":"Contribute bundles","description":"Bundles are groups of components that are related to a specific service provider.","sidebar":"docs"},"Contributing/contributing-community":{"id":"Contributing/contributing-community","title":"Join the Langflow community","description":"There are several ways you can interact with the Langflow community and learn more about the Langflow codebase.","sidebar":"docs"},"Contributing/contributing-component-tests":{"id":"Contributing/contributing-component-tests","title":"Contribute component tests","description":"This guide outlines how to structure and implement tests for application components to ensure consistency and adequate coverage.","sidebar":"docs"},"Contributing/contributing-components":{"id":"Contributing/contributing-components","title":"Contribute components","description":"New components are added as objects of the Component class.","sidebar":"docs"},"Contributing/contributing-github-issues":{"id":"Contributing/contributing-github-issues","title":"Get help and request enhancements","description":"The Langflow GitHub repository is an integral part of the Langflow community.","sidebar":"docs"},"Contributing/contributing-how-to-contribute":{"id":"Contributing/contributing-how-to-contribute","title":"Contribute to Langflow","description":"This guide is intended to help you start contributing to Langflow.","sidebar":"docs"},"Contributing/contributing-telemetry":{"id":"Contributing/contributing-telemetry","title":"Telemetry","description":"Langflow uses anonymous telemetry to collect statistics about feature usage and performance.","sidebar":"docs"},"Contributing/contributing-templates":{"id":"Contributing/contributing-templates","title":"Contribute templates","description":"Follow these best practices when submitting a template to Langflow.","sidebar":"docs"},"Deployment/deployment-architecture":{"id":"Deployment/deployment-architecture","title":"Langflow architecture on Kubernetes","description":"There are two broad types of Langflow deployments:","sidebar":"docs"},"Deployment/deployment-caddyfile":{"id":"Deployment/deployment-caddyfile","title":"Deploy Langflow on a remote server","description":"Learn how to deploy Langflow on your own remote server with secure web access.","sidebar":"docs"},"Deployment/deployment-docker":{"id":"Deployment/deployment-docker","title":"Deploy Langflow on Docker","description":"Running applications in Docker containers ensures consistent behavior across different systems and eliminates dependency conflicts.","sidebar":"docs"},"Deployment/deployment-gcp":{"id":"Deployment/deployment-gcp","title":"Deploy Langflow on Google Cloud Platform","description":"This guide demonstrates how to deploy Langflow on Google Cloud Platform with a Cloud Shell script that walks through the process of setting up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow development environment in GCP.","sidebar":"docs"},"Deployment/deployment-hugging-face-spaces":{"id":"Deployment/deployment-hugging-face-spaces","title":"Deploy Langflow on Hugging Face Spaces","description":"This guide explains how to deploy Langflow on Hugging Face Spaces.","sidebar":"docs"},"Deployment/deployment-kubernetes-dev":{"id":"Deployment/deployment-kubernetes-dev","title":"Deploy the Langflow development environment on Kubernetes","description":"The Langflow integrated development environment (IDE) Helm chart is designed to provide a complete environment for developers to create, test, and debug their flows. It includes both the Langflow API and visual editor.","sidebar":"docs"},"Deployment/deployment-kubernetes-prod":{"id":"Deployment/deployment-kubernetes-prod","title":"Deploy the Langflow production environment on Kubernetes","description":"The Langflow runtime Helm chart is tailored for deploying applications in a production environment. It is focused on stability, performance, isolation, and security to ensure that applications run reliably and efficiently.","sidebar":"docs"},"Deployment/deployment-overview":{"id":"Deployment/deployment-overview","title":"Langflow deployment overview","description":"This section includes the different ways to bring your locally-built flows to the world.","sidebar":"docs"},"Deployment/deployment-prod-best-practices":{"id":"Deployment/deployment-prod-best-practices","title":"Best practices for Langflow on Kubernetes","description":"This guide provides best practices for deploying Langflow in production environments on Kubernetes.","sidebar":"docs"},"Deployment/deployment-public-server":{"id":"Deployment/deployment-public-server","title":"Deploy a public Langflow server","description":"By default, your Langflow server at http7860 isn\'t exposed to the public internet.","sidebar":"docs"},"Deployment/deployment-railway":{"id":"Deployment/deployment-railway","title":"Deploy Langflow on Railway","description":"Deploy Langflow to Railway using a one-click template","sidebar":"docs"},"Deployment/deployment-render":{"id":"Deployment/deployment-render","title":"Deploy Langflow on Render","description":"This guide explains how to deploy Langflow on Render, a cloud platform for deploying web applications and APIs.","sidebar":"docs"},"Develop/Clients/typescript-client":{"id":"Develop/Clients/typescript-client","title":"Langflow TypeScript client","description":"The Langflow TypeScript client allows your TypeScript applications to programmatically interact with the Langflow API.","sidebar":"docs"},"Develop/develop-application":{"id":"Develop/develop-application","title":"Containerize a Langflow application","description":"Designing flows in the visual editor is only the first step in building an application that uses Langflow.","sidebar":"docs"},"Develop/enterprise-database-guide":{"id":"Develop/enterprise-database-guide","title":"Langflow database guide for enterprise DBAs","description":"The Langflow database stores data that is essential for more Langflow operations, including startup, flow execution, user interactions, and administrative tasks.","sidebar":"docs"},"Develop/install-custom-dependencies":{"id":"Develop/install-custom-dependencies","title":"Install custom dependencies","description":"Langflow provides optional dependency groups and support for custom dependencies to extend Langflow functionality. This guide covers how to add dependencies for different Langflow installations, including Langflow Desktop and Langflow OSS.","sidebar":"docs"},"Develop/logging":{"id":"Develop/logging","title":"Logs","description":"This page provides information about Langflow logs, including logs for individual flows and the Langflow application itself.","sidebar":"docs"},"Develop/memory":{"id":"Develop/memory","title":"Memory management options","description":"Langflow provides flexible memory management options for storage and retrieval of data relevant to your flows and your Langflow server.","sidebar":"docs"},"Develop/session-id":{"id":"Develop/session-id","title":"Use session ID to manage communication between components","description":"Session ID is a unique identifier for client/server connections. A single session equals the duration of a client\'s connection to a server.","sidebar":"docs"},"Develop/webhook":{"id":"Develop/webhook","title":"Trigger flows with webhooks","description":"You can use the Webhook component to start a flow run in response to an external event.","sidebar":"docs"},"Get-Started/about-langflow":{"id":"Get-Started/about-langflow","title":"What is Langflow?","description":"Langflow is an open-source, Python-based, customizable framework for building AI applications.","sidebar":"docs"},"Get-Started/get-started-installation":{"id":"Get-Started/get-started-installation","title":"Install Langflow","description":"Langflow can be installed in multiple ways:","sidebar":"docs"},"Get-Started/get-started-quickstart":{"id":"Get-Started/get-started-quickstart","title":"Quickstart","description":"Get started with Langflow by loading a template flow, running it, and then serving it at the /run API endpoint.","sidebar":"docs"},"Get-Started/welcome-to-langflow":{"id":"Get-Started/welcome-to-langflow","title":"Welcome to Langflow","description":"Langflow empowers developers to rapidly prototype and build AI applications with a user-friendly visual interface and support for important AI functionality like agents and the MCP.","sidebar":"docs"},"Integrations/Apify/integrations-apify":{"id":"Integrations/Apify/integrations-apify","title":"Apify","description":"Apify is a web scraping and data extraction platform with more than 3,000 ready-made cloud tools called Actors.","sidebar":"docs"},"Integrations/Arize/integrations-arize":{"id":"Integrations/Arize/integrations-arize","title":"Arize","description":"Arize is a tool built on OpenTelemetry and OpenInference for monitoring and optimizing LLM applications.","sidebar":"docs"},"Integrations/Cleanlab/integrations-cleanlab":{"id":"Integrations/Cleanlab/integrations-cleanlab","title":"Cleanlab","description":"Cleanlab adds automation and trust to every data point going in and every prediction coming out of AI and RAG solutions.","sidebar":"docs"},"Integrations/Composio/integrations-composio":{"id":"Integrations/Composio/integrations-composio","title":"Composio","description":"Composio components in Langflow provide Composio tools to your Agent components.","sidebar":"docs"},"Integrations/Docling/integrations-docling":{"id":"Integrations/Docling/integrations-docling","title":"Docling","description":"Langflow integrates with Docling through a bundle of components for parsing documents.","sidebar":"docs"},"Integrations/Google/integrations-google-big-query":{"id":"Integrations/Google/integrations-google-big-query","title":"Google BigQuery","description":"Langflow integrates with Google BigQuery through the BigQuery component in the Google bundle, allowing you to execute SQL queries and retrieve data from your BigQuery datasets.","sidebar":"docs"},"Integrations/integrations-assemblyai":{"id":"Integrations/integrations-assemblyai","title":"AssemblyAI","description":"The AssemblyAI components allow you to apply powerful Speech AI models to your app for tasks like:","sidebar":"docs"},"Integrations/integrations-langfuse":{"id":"Integrations/integrations-langfuse","title":"Langfuse","description":"Langfuse is an open-source platform for LLM observability. It provides tracing and monitoring capabilities for AI applications, helping developers debug, analyze, and optimize their AI systems. Langfuse integrates with various tools and frameworks, including workflow builders and runtimes like Langflow.","sidebar":"docs"},"Integrations/integrations-langsmith":{"id":"Integrations/integrations-langsmith","title":"LangSmith","description":"LangSmith is a full-lifecycle DevOps service from LangChain that provides monitoring and observability. To integrate with Langflow, add your LangChain API key and configuration as Langflow environment variables, and then start Langflow.","sidebar":"docs"},"Integrations/integrations-langwatch":{"id":"Integrations/integrations-langwatch","title":"LangWatch","description":"LangWatch is an all-in-one LLMOps platform for monitoring, observability, analytics, evaluations and alerting for getting user insights and improve your LLM workflows.","sidebar":"docs"},"Integrations/integrations-opik":{"id":"Integrations/integrations-opik","title":"Opik","description":"Opik is an open-source platform designed for evaluating, testing, and monitoring large language model (LLM) applications. Developed by Comet, it aims to facilitate more intuitive collaboration, testing, and monitoring of LLM-based applications.","sidebar":"docs"},"Integrations/mcp-component-astra":{"id":"Integrations/mcp-component-astra","title":"Connect an Astra DB MCP server to Langflow","description":"This guide demonstrates how to use Langflow as an MCP client by using the MCP Tools component to run a DataStax Astra DB MCP server in an agent flow.","sidebar":"docs"},"Integrations/Notion/integrations-notion":{"id":"Integrations/Notion/integrations-notion","title":"Set up a Notion App","description":"To use Notion components in Langflow, you first need to create a Notion integration and configure it with the necessary capabilities. This guide will walk you through the process of setting up a Notion integration and granting it access to your Notion databases.","sidebar":"docs"},"Integrations/Notion/notion-agent-conversational":{"id":"Integrations/Notion/notion-agent-conversational","title":"Notion Conversational Agent","description":"The Notion Conversational Agent is an AI-powered assistant that interacts with your Notion workspace through natural language conversations. This flow performs Notion-related tasks like creating pages, searching for information, and managing content, all through a chat interface.","sidebar":"docs"},"Integrations/Notion/notion-agent-meeting-notes":{"id":"Integrations/Notion/notion-agent-meeting-notes","title":"Notion Meeting Notes Agent","description":"The Notion Agent for Meeting Notes is an AI-powered tool that automatically processes meeting transcripts and updates your Notion workspace. It identifies tasks, action items, and key points from your meetings, then creates new tasks or updates existing ones in Notion without manual input.","sidebar":"docs"},"Integrations/Nvidia/integrations-nvidia-g-assist":{"id":"Integrations/Nvidia/integrations-nvidia-g-assist","title":"Integrate NVIDIA G-Assist with Langflow","description":"The NVIDIA G-Assist component is available only for Langflow users with NVIDIA GPUs on Windows systems.","sidebar":"docs"},"Integrations/Nvidia/integrations-nvidia-ingest":{"id":"Integrations/Nvidia/integrations-nvidia-ingest","title":"Integrate NVIDIA Retriever Extraction with Langflow","description":"The NVIDIA Retriever Extraction component integrates with the NVIDIA nv-ingest microservice for data ingestion, processing, and extraction of text files.","sidebar":"docs"},"Integrations/Nvidia/integrations-nvidia-nim-wsl2":{"id":"Integrations/Nvidia/integrations-nvidia-nim-wsl2","title":"Integrate NVIDIA NIMs with Langflow","description":"Connect Langflow with NVIDIA NIM on an RTX Windows system with Windows Subsystem for Linux 2 (WSL2) installed.","sidebar":"docs"},"Support/luna-for-langflow":{"id":"Support/luna-for-langflow","title":"Enterprise support for Langflow","description":"With Luna for Langflow support, you can develop and deploy Langflow applications with confidence.","sidebar":"docs"},"Support/release-notes":{"id":"Support/release-notes","title":"Langflow release notes","description":"This page summarizes significant changes to Langflow in each release.","sidebar":"docs"},"Support/troubleshooting":{"id":"Support/troubleshooting","title":"Troubleshoot Langflow","description":"This page provides troubleshooting advice for issues you might encounter when using Langflow or contributing to Langflow.","sidebar":"docs"},"Tutorials/agent":{"id":"Tutorials/agent","title":"Connect applications to agents","description":"This tutorial shows you how to connect a JavaScript application to a Langflow agent.","sidebar":"docs"},"Tutorials/chat-with-files":{"id":"Tutorials/chat-with-files","title":"Create a chatbot that can ingest files","description":"This tutorial shows you how to build a chatbot that can read and answer questions about files you upload, such as meeting notes or job applications.","sidebar":"docs"},"Tutorials/chat-with-rag":{"id":"Tutorials/chat-with-rag","title":"Create a vector RAG chatbot","description":"This tutorial demonstrates how you can use Langflow to create a chatbot application that uses Retrieval Augmented Generation (RAG) to embed your data as vectors in a vector database, and then chat with the data.","sidebar":"docs"},"Tutorials/mcp-tutorial":{"id":"Tutorials/mcp-tutorial","title":"Connect to MCP servers from your application","description":"This tutorial shows you how to connect MCP servers to your applications using Langflow\'s MCP Tools component.","sidebar":"docs"}}}}')}}]); \ No newline at end of file +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[1567],{55226:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"noIndex":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"docs":[{"type":"link","label":"Welcome to Langflow","href":"/","docId":"Get-Started/welcome-to-langflow","unlisted":false},{"type":"category","label":"Get started","items":[{"type":"link","label":"About Langflow","href":"/about-langflow","docId":"Get-Started/about-langflow","unlisted":false},{"type":"link","label":"Install Langflow","href":"/get-started-installation","docId":"Get-Started/get-started-installation","unlisted":false},{"type":"link","label":"Quickstart","href":"/get-started-quickstart","docId":"Get-Started/get-started-quickstart","unlisted":false},{"type":"category","label":"Tutorials","items":[{"type":"link","label":"Create a vector RAG chatbot","href":"/chat-with-rag","docId":"Tutorials/chat-with-rag","unlisted":false},{"type":"link","label":"Create a chatbot that can ingest files","href":"/chat-with-files","docId":"Tutorials/chat-with-files","unlisted":false},{"type":"link","label":"Connect applications to agents","href":"/agent-tutorial","docId":"Tutorials/agent","unlisted":false},{"type":"link","label":"Connect to MCP servers from your application","href":"/mcp-tutorial","docId":"Tutorials/mcp-tutorial","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Flows","items":[{"type":"link","label":"Use the visual editor","href":"/concepts-overview","docId":"Concepts/concepts-overview","unlisted":false},{"type":"link","label":"Build flows","href":"/concepts-flows","docId":"Concepts/concepts-flows","unlisted":false},{"type":"category","label":"Run flows","items":[{"type":"link","label":"Trigger flows with the Langflow API","href":"/concepts-publish","docId":"Concepts/concepts-publish","unlisted":false},{"type":"link","label":"Trigger flows with webhooks","href":"/webhook","docId":"Develop/webhook","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Test flows","href":"/concepts-playground","docId":"Concepts/concepts-playground","unlisted":false},{"type":"link","label":"Import and export flows","href":"/concepts-flows-import","docId":"Concepts/concepts-flows-import","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Agents","items":[{"type":"link","label":"Use Langflow agents","href":"/agents","docId":"Agents/agents","unlisted":false},{"type":"link","label":"Configure tools for agents","href":"/agents-tools","docId":"Agents/agents-tools","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Model Context Protocol (MCP)","items":[{"type":"link","label":"Use Langflow as an MCP client","href":"/mcp-client","docId":"Components/mcp-client","unlisted":false},{"type":"link","label":"Use Langflow as an MCP server","href":"/mcp-server","docId":"Concepts/mcp-server","unlisted":false},{"type":"link","label":"Connect an Astra DB MCP server to Langflow","href":"/mcp-component-astra","docId":"Integrations/mcp-component-astra","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Develop","items":[{"type":"link","label":"API keys and authentication","href":"/api-keys-and-authentication","docId":"Configuration/api-keys-and-authentication","unlisted":false},{"type":"link","label":"Install custom dependencies","href":"/install-custom-dependencies","docId":"Develop/install-custom-dependencies","unlisted":false},{"type":"link","label":"Global variables","href":"/configuration-global-variables","docId":"Configuration/configuration-global-variables","unlisted":false},{"type":"link","label":"Environment variables","href":"/environment-variables","docId":"Configuration/environment-variables","unlisted":false},{"type":"category","label":"Storage and memory","items":[{"type":"link","label":"Manage files","href":"/concepts-file-management","docId":"Concepts/concepts-file-management","unlisted":false},{"type":"link","label":"Manage memory","href":"/memory","docId":"Develop/memory","unlisted":false},{"type":"link","label":"Use Session IDs","href":"/session-id","docId":"Develop/session-id","unlisted":false},{"type":"link","label":"Configure an external PostgreSQL database","href":"/configuration-custom-database","docId":"Configuration/configuration-custom-database","unlisted":false},{"type":"link","label":"Database guide for enterprise administrators","href":"/enterprise-database-guide","docId":"Develop/enterprise-database-guide","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Observability","items":[{"type":"link","label":"Logs","href":"/logging","docId":"Develop/logging","unlisted":false},{"type":"category","label":"Monitoring","items":[{"type":"link","label":"Arize","href":"/integrations-arize","docId":"Integrations/Arize/integrations-arize","unlisted":false},{"type":"link","label":"Langfuse","href":"/integrations-langfuse","docId":"Integrations/integrations-langfuse","unlisted":false},{"type":"link","label":"LangSmith","href":"/integrations-langsmith","docId":"Integrations/integrations-langsmith","unlisted":false},{"type":"link","label":"LangWatch","href":"/integrations-langwatch","docId":"Integrations/integrations-langwatch","unlisted":false},{"type":"link","label":"Opik","href":"/integrations-opik","docId":"Integrations/integrations-opik","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Telemetry","href":"/contributing-telemetry","docId":"Contributing/contributing-telemetry","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Use Langflow data types","href":"/data-types","docId":"Concepts/data-types","unlisted":false},{"type":"link","label":"Use voice mode","href":"/concepts-voice-mode","docId":"Concepts/concepts-voice-mode","unlisted":false},{"type":"link","label":"Use the Langflow CLI","href":"/configuration-cli","docId":"Configuration/configuration-cli","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Deploy","items":[{"type":"link","label":"Langflow deployment overview","href":"/deployment-overview","docId":"Deployment/deployment-overview","unlisted":false},{"type":"link","label":"Deploy a public Langflow server","href":"/deployment-public-server","docId":"Deployment/deployment-public-server","unlisted":false},{"type":"category","label":"Containerized deployments","items":[{"type":"link","label":"Containerize a Langflow application","href":"/develop-application","docId":"Develop/develop-application","unlisted":false},{"type":"link","label":"Langflow Docker images","href":"/deployment-docker","docId":"Deployment/deployment-docker","unlisted":false},{"type":"link","label":"Deploy Langflow on a remote server","href":"/deployment-caddyfile","docId":"Deployment/deployment-caddyfile","unlisted":false},{"type":"category","label":"Kubernetes","items":[{"type":"link","label":"Deployment architecture","href":"/deployment-architecture","docId":"Deployment/deployment-architecture","unlisted":false},{"type":"link","label":"Best practices","href":"/deployment-prod-best-practices","docId":"Deployment/deployment-prod-best-practices","unlisted":false},{"type":"link","label":"Deploy in development","href":"/deployment-kubernetes-dev","docId":"Deployment/deployment-kubernetes-dev","unlisted":false},{"type":"link","label":"Deploy in production","href":"/deployment-kubernetes-prod","docId":"Deployment/deployment-kubernetes-prod","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Cloud platforms","items":[{"type":"link","label":"Google Cloud Platform","href":"/deployment-gcp","docId":"Deployment/deployment-gcp","unlisted":false},{"type":"link","label":"Hugging Face Spaces","href":"/deployment-hugging-face-spaces","docId":"Deployment/deployment-hugging-face-spaces","unlisted":false},{"type":"link","label":"Railway","href":"/deployment-railway","docId":"Deployment/deployment-railway","unlisted":false},{"type":"link","label":"Render","href":"/deployment-render","docId":"Deployment/deployment-render","unlisted":false}],"collapsed":true,"collapsible":true}],"collapsed":true,"collapsible":true},{"type":"category","label":"Components reference","items":[{"type":"link","label":"Components overview","href":"/concepts-components","docId":"Concepts/concepts-components","unlisted":false},{"type":"category","label":"Core components","items":[{"type":"link","label":"Input / Output","href":"/components-io","docId":"Components/components-io","unlisted":false},{"type":"link","label":"Agents","href":"/components-agents","docId":"Components/components-agents","unlisted":false},{"type":"category","label":"Models","items":[{"type":"link","label":"Language Model","href":"/components-models","docId":"Components/components-models","unlisted":false},{"type":"link","label":"Embedding Model","href":"/components-embedding-models","docId":"Components/components-embedding-models","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Data","href":"/components-data","docId":"Components/components-data","unlisted":false},{"type":"link","label":"Vector Stores","href":"/components-vector-stores","docId":"Components/components-vector-stores","unlisted":false},{"type":"category","label":"Processing","items":[{"type":"link","label":"Processing components","href":"/components-processing","docId":"Components/components-processing","unlisted":false},{"type":"link","label":"Prompt Template","href":"/components-prompts","docId":"Components/components-prompts","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Logic","href":"/components-logic","docId":"Components/components-logic","unlisted":false},{"type":"link","label":"Helpers","href":"/components-helpers","docId":"Components/components-helpers","unlisted":false},{"type":"link","label":"Tools","href":"/components-tools","docId":"Components/components-tools","unlisted":false},{"type":"link","label":"Memories","href":"/components-memories","docId":"Components/components-memories","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Bundles","items":[{"type":"link","label":"About bundles","href":"/components-bundle-components","docId":"Components/components-bundles","unlisted":false},{"type":"link","label":"AI/ML API","href":"/bundles-aiml","docId":"Components/bundles-aiml","unlisted":false},{"type":"link","label":"Amazon","href":"/bundles-amazon","docId":"Components/bundles-amazon","unlisted":false},{"type":"link","label":"Anthropic","href":"/bundles-anthropic","docId":"Components/bundles-anthropic","unlisted":false},{"type":"link","label":"Apify","href":"/integrations-apify","docId":"Integrations/Apify/integrations-apify","unlisted":false},{"type":"link","label":"arXiv","href":"/bundles-arxiv","docId":"Components/bundles-arxiv","unlisted":false},{"type":"link","label":"AssemblyAI","href":"/integrations-assemblyai","docId":"Integrations/integrations-assemblyai","unlisted":false},{"type":"link","label":"Azure","href":"/bundles-azure","docId":"Components/bundles-azure","unlisted":false},{"type":"link","label":"Baidu","href":"/bundles-baidu","docId":"Components/bundles-baidu","unlisted":false},{"type":"link","label":"Bing","href":"/bundles-bing","docId":"Components/bundles-bing","unlisted":false},{"type":"link","label":"Cleanlab","href":"/integrations-cleanlab","docId":"Integrations/Cleanlab/integrations-cleanlab","unlisted":false},{"type":"link","label":"Cloudflare","href":"/bundles-cloudflare","docId":"Components/bundles-cloudflare","unlisted":false},{"type":"link","label":"Cohere","href":"/bundles-cohere","docId":"Components/bundles-cohere","unlisted":false},{"type":"link","label":"Composio","href":"/integrations-composio","docId":"Integrations/Composio/integrations-composio","unlisted":false},{"type":"link","label":"DataStax","href":"/bundles-datastax","docId":"Components/bundles-datastax","unlisted":false},{"type":"link","label":"DeepSeek","href":"/bundles-deepseek","docId":"Components/bundles-deepseek","unlisted":false},{"type":"link","label":"Docling","href":"/integrations-docling","docId":"Integrations/Docling/integrations-docling","unlisted":false},{"type":"link","label":"DuckDuckGo","href":"/bundles-duckduckgo","docId":"Components/bundles-duckduckgo","unlisted":false},{"type":"link","label":"Exa","href":"/bundles-exa","docId":"Components/bundles-exa","unlisted":false},{"type":"link","label":"Glean","href":"/bundles-glean","docId":"Components/bundles-glean","unlisted":false},{"type":"category","label":"Google","items":[{"type":"link","label":"Google components","href":"/bundles-google","docId":"Components/bundles-google","unlisted":false},{"type":"link","label":"Google BigQuery","href":"/integrations-google-big-query","docId":"Integrations/Google/integrations-google-big-query","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Groq","href":"/bundles-groq","docId":"Components/bundles-groq","unlisted":false},{"type":"link","label":"Hugging Face","href":"/bundles-huggingface","docId":"Components/bundles-huggingface","unlisted":false},{"type":"link","label":"IBM","href":"/bundles-ibm","docId":"Components/bundles-ibm","unlisted":false},{"type":"link","label":"Icosa Computing","href":"/bundles-icosacomputing","docId":"Components/bundles-icosacomputing","unlisted":false},{"type":"link","label":"LangChain","href":"/bundles-langchain","docId":"Components/bundles-langchain","unlisted":false},{"type":"link","label":"LM Studio","href":"/bundles-lmstudio","docId":"Components/bundles-lmstudio","unlisted":false},{"type":"link","label":"MariTalk","href":"/bundles-maritalk","docId":"Components/bundles-maritalk","unlisted":false},{"type":"link","label":"Mem0","href":"/bundles-mem0","docId":"Components/bundles-mem0","unlisted":false},{"type":"link","label":"MistralAI","href":"/bundles-mistralai","docId":"Components/bundles-mistralai","unlisted":false},{"type":"category","label":"Notion","items":[{"type":"link","label":"Set up a Notion App","href":"/integrations/notion/setup","docId":"Integrations/Notion/integrations-notion","unlisted":false},{"type":"link","label":"Notion Conversational Agent","href":"/integrations/notion/notion-agent-conversational","docId":"Integrations/Notion/notion-agent-conversational","unlisted":false},{"type":"link","label":"Notion Meeting Notes Agent","href":"/integrations/notion/notion-agent-meeting-notes","docId":"Integrations/Notion/notion-agent-meeting-notes","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Novita","href":"/bundles-novita","docId":"Components/bundles-novita","unlisted":false},{"type":"category","label":"NVIDIA","items":[{"type":"link","label":"NVIDIA components","href":"/bundles-nvidia","docId":"Components/bundles-nvidia","unlisted":false},{"type":"link","label":"NVIDIA Ingest","href":"/integrations-nvidia-ingest","docId":"Integrations/Nvidia/integrations-nvidia-ingest","unlisted":false},{"type":"link","label":"NVIDIA NIM on WSL2","href":"/integrations-nvidia-ingest-wsl2","docId":"Integrations/Nvidia/integrations-nvidia-nim-wsl2","unlisted":false},{"type":"link","label":"NVIDIA G-Assist","href":"/integrations-nvidia-g-assist","docId":"Integrations/Nvidia/integrations-nvidia-g-assist","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Ollama","href":"/bundles-ollama","docId":"Components/bundles-ollama","unlisted":false},{"type":"link","label":"OpenAI","href":"/bundles-openai","docId":"Components/bundles-openai","unlisted":false},{"type":"link","label":"OpenRouter","href":"/bundles-openrouter","docId":"Components/bundles-openrouter","unlisted":false},{"type":"link","label":"Perplexity","href":"/bundles-perplexity","docId":"Components/bundles-perplexity","unlisted":false},{"type":"link","label":"Redis","href":"/bundles-redis","docId":"Components/bundles-redis","unlisted":false},{"type":"link","label":"SambaNova","href":"/bundles-sambanova","docId":"Components/bundles-sambanova","unlisted":false},{"type":"link","label":"SearchApi","href":"/bundles-searchapi","docId":"Components/bundles-searchapi","unlisted":false},{"type":"link","label":"Vertex AI","href":"/bundles-vertexai","docId":"Components/bundles-vertexai","unlisted":false},{"type":"link","label":"Wikipedia","href":"/bundles-wikipedia","docId":"Components/bundles-wikipedia","unlisted":false},{"type":"link","label":"xAI","href":"/bundles-xai","docId":"Components/bundles-xai","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"link","label":"Create custom Python components","href":"/components-custom-components","docId":"Components/components-custom-components","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"API reference","items":[{"type":"link","label":"Get started with the Langflow API","href":"/api-reference-api-examples","docId":"API-Reference/api-reference-api-examples","unlisted":false},{"type":"link","label":"Use the TypeScript client","href":"/typescript-client","docId":"Develop/Clients/typescript-client","unlisted":false},{"type":"link","label":"Flow trigger endpoints","href":"/api-flows-run","docId":"API-Reference/api-flows-run","unlisted":false},{"type":"link","label":"Flow management endpoints","href":"/api-flows","docId":"API-Reference/api-flows","unlisted":false},{"type":"link","label":"Files endpoints","href":"/api-files","docId":"API-Reference/api-files","unlisted":false},{"type":"link","label":"Projects endpoints","href":"/api-projects","docId":"API-Reference/api-projects","unlisted":false},{"type":"link","label":"Logs endpoints","href":"/api-logs","docId":"API-Reference/api-logs","unlisted":false},{"type":"link","label":"Monitor endpoints","href":"/api-monitor","docId":"API-Reference/api-monitor","unlisted":false},{"type":"link","label":"Build endpoints","href":"/api-build","docId":"API-Reference/api-build","unlisted":false},{"type":"link","label":"Users endpoints","href":"/api-users","docId":"API-Reference/api-users","unlisted":false},{"type":"link","label":"Langflow API specification","href":"/api"}],"collapsed":true,"collapsible":true},{"type":"category","label":"Contribute","items":[{"type":"link","label":"Join the Langflow community","href":"/contributing-community","docId":"Contributing/contributing-community","unlisted":false},{"type":"link","label":"Contribute to Langflow","href":"/contributing-how-to-contribute","docId":"Contributing/contributing-how-to-contribute","unlisted":false},{"type":"link","label":"Contribute components","href":"/contributing-components","docId":"Contributing/contributing-components","unlisted":false},{"type":"link","label":"Contribute component tests","href":"/contributing-component-tests","docId":"Contributing/contributing-component-tests","unlisted":false},{"type":"link","label":"Contribute templates","href":"/contributing-templates","docId":"Contributing/contributing-templates","unlisted":false},{"type":"link","label":"Contribute bundles","href":"/contributing-bundles","docId":"Contributing/contributing-bundles","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Release notes","items":[{"type":"link","label":"Release notes","href":"/release-notes","docId":"Support/release-notes","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"category","label":"Support","items":[{"type":"link","label":"Troubleshoot","href":"/troubleshoot","docId":"Support/troubleshooting","unlisted":false},{"type":"link","label":"Get help and request enhancements","href":"/contributing-github-issues","docId":"Contributing/contributing-github-issues","unlisted":false},{"type":"link","label":"Enterprise support","href":"/luna-for-langflow","docId":"Support/luna-for-langflow","unlisted":false}],"collapsed":true,"collapsible":true},{"type":"html","className":"sidebar-ad","value":"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
    \\n Get started in minutes\\n Download Langflow Desktop\\n
    \\n
    \\n "}]},"docs":{"Agents/agents":{"id":"Agents/agents","title":"Use Langflow agents","description":"Langflow\'s Agent component is critical for building agent flows.","sidebar":"docs"},"Agents/agents-tools":{"id":"Agents/agents-tools","title":"Configure tools for agents","description":"Configure tools connected to agents to extend their capabilities.","sidebar":"docs"},"API-Reference/api-build":{"id":"API-Reference/api-build","title":"Build endpoints","description":"The /build endpoints are used by Langflow\'s frontend visual editor code.","sidebar":"docs"},"API-Reference/api-files":{"id":"API-Reference/api-files","title":"Files endpoints","description":"Use the /files endpoints to move files between your local machine and Langflow.","sidebar":"docs"},"API-Reference/api-flows":{"id":"API-Reference/api-flows","title":"Flow management endpoints","description":"Use the /flows endpoint to create, read, update, and delete flows.","sidebar":"docs"},"API-Reference/api-flows-run":{"id":"API-Reference/api-flows-run","title":"Flow trigger endpoints","description":"Use the /run and /webhook endpoints to run flows.","sidebar":"docs"},"API-Reference/api-logs":{"id":"API-Reference/api-logs","title":"Logs endpoints","description":"Retrieve logs for your Langflow flow.","sidebar":"docs"},"API-Reference/api-monitor":{"id":"API-Reference/api-monitor","title":"Monitor endpoints","description":"The /monitor endpoints are for internal Langflow functionality, primarily related to running flows in the Playground, storing chat history, and generating flow logs.","sidebar":"docs"},"API-Reference/api-projects":{"id":"API-Reference/api-projects","title":"Projects endpoints","description":"Use the /projects endpoint to create, read, update, and delete Langflow projects.","sidebar":"docs"},"API-Reference/api-reference-api-examples":{"id":"API-Reference/api-reference-api-examples","title":"Get started with the Langflow API","description":"You can use the Langflow API for programmatic interactions with Langflow, such as the following:","sidebar":"docs"},"API-Reference/api-users":{"id":"API-Reference/api-users","title":"Users endpoints","description":"Use the /users endpoint to manage user accounts in Langflow.","sidebar":"docs"},"Components/bundles-aiml":{"id":"Components/bundles-aiml","title":"AI/ML API","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-amazon":{"id":"Components/bundles-amazon","title":"Amazon","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-anthropic":{"id":"Components/bundles-anthropic","title":"Anthropic","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-arxiv":{"id":"Components/bundles-arxiv","title":"arXiv","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-azure":{"id":"Components/bundles-azure","title":"Azure","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-baidu":{"id":"Components/bundles-baidu","title":"Baidu","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-bing":{"id":"Components/bundles-bing","title":"Bing","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-cloudflare":{"id":"Components/bundles-cloudflare","title":"Cloudflare","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-cohere":{"id":"Components/bundles-cohere","title":"Cohere","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-datastax":{"id":"Components/bundles-datastax","title":"DataStax","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-deepseek":{"id":"Components/bundles-deepseek","title":"DeepSeek","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-duckduckgo":{"id":"Components/bundles-duckduckgo","title":"DuckDuckGo","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-exa":{"id":"Components/bundles-exa","title":"Exa","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-glean":{"id":"Components/bundles-glean","title":"Glean","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-google":{"id":"Components/bundles-google","title":"Google components","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-groq":{"id":"Components/bundles-groq","title":"Groq","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-huggingface":{"id":"Components/bundles-huggingface","title":"Hugging Face","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-ibm":{"id":"Components/bundles-ibm","title":"IBM","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-icosacomputing":{"id":"Components/bundles-icosacomputing","title":"Icosa Computing","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-langchain":{"id":"Components/bundles-langchain","title":"LangChain","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-lmstudio":{"id":"Components/bundles-lmstudio","title":"LM Studio","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-maritalk":{"id":"Components/bundles-maritalk","title":"MariTalk","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-mem0":{"id":"Components/bundles-mem0","title":"Mem0","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-mistralai":{"id":"Components/bundles-mistralai","title":"MistralAI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-novita":{"id":"Components/bundles-novita","title":"Novita","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-nvidia":{"id":"Components/bundles-nvidia","title":"NVIDIA components","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-ollama":{"id":"Components/bundles-ollama","title":"Ollama","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-openai":{"id":"Components/bundles-openai","title":"OpenAI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-openrouter":{"id":"Components/bundles-openrouter","title":"OpenRouter","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-perplexity":{"id":"Components/bundles-perplexity","title":"Perplexity","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-redis":{"id":"Components/bundles-redis","title":"Redis","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-sambanova":{"id":"Components/bundles-sambanova","title":"SambaNova","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-searchapi":{"id":"Components/bundles-searchapi","title":"SearchApi","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-vertexai":{"id":"Components/bundles-vertexai","title":"Vertex AI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-wikipedia":{"id":"Components/bundles-wikipedia","title":"Wikipedia","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/bundles-xai":{"id":"Components/bundles-xai","title":"xAI","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/components-agents":{"id":"Components/components-agents","title":"Agents","description":"Langflow\'s Agent and MCP Tools components are critical for building agent flows.","sidebar":"docs"},"Components/components-bundles":{"id":"Components/components-bundles","title":"About bundles","description":"Bundles contain custom components that support specific third-party integrations with Langflow.","sidebar":"docs"},"Components/components-custom-components":{"id":"Components/components-custom-components","title":"Create custom Python components","description":"Custom components extend Langflow\'s functionality through Python classes that inherit from Component. This enables integration of new features, data manipulation, external services, and specialized tools.","sidebar":"docs"},"Components/components-data":{"id":"Components/components-data","title":"Data","description":"You can use Langflow\'s Data components to bring data into your flows from various sources like files, API endpoints, and URLs.","sidebar":"docs"},"Components/components-embedding-models":{"id":"Components/components-embedding-models","title":"Embedding Model","description":"Embedding Model components in Langflow generate text embeddings using a specified Large Language Model (LLM).","sidebar":"docs"},"Components/components-helpers":{"id":"Components/components-helpers","title":"Helpers","description":"Helper components provide utility functions to help manage data and perform simple tasks in your flow.","sidebar":"docs"},"Components/components-io":{"id":"Components/components-io","title":"Input / Output","description":"Langflow\'s Input and Output components define where data enters and exits your flow, but they don\'t have identical functionality.","sidebar":"docs"},"Components/components-logic":{"id":"Components/components-logic","title":"Logic","description":"Langflow\'s Logic components provide functionalities for routing, conditional processing, and flow management.","sidebar":"docs"},"Components/components-memories":{"id":"Components/components-memories","title":"Memories","description":"In Langflow version 1.5, the Memory category was removed.","sidebar":"docs"},"Components/components-models":{"id":"Components/components-models","title":"Language Model","description":"Language Model components in Langflow generate text using a specified Large Language Model (LLM).","sidebar":"docs"},"Components/components-processing":{"id":"Components/components-processing","title":"Processing components","description":"Langflow\'s Processing components process and transform data within a flow.","sidebar":"docs"},"Components/components-prompts":{"id":"Components/components-prompts","title":"Prompt Template","description":"Use the Prompt Template core component to create a prompt that supplies instructions and context to an LLM or agent, separate from other input like chat messages and file uploads.","sidebar":"docs"},"Components/components-tools":{"id":"Components/components-tools","title":"Tools","description":"In Langflow version 1.5, the Tools category was deprecated.","sidebar":"docs"},"Components/components-vector-stores":{"id":"Components/components-vector-stores","title":"Vector Stores","description":"Langflow\'s Vector Store components are used to read and write vector data, including embedding storage, vector search, Graph RAG traversals, and specialized provider-specific search, such as OpenSearch, Elasticsearch, and Vectara.","sidebar":"docs"},"Components/mcp-client":{"id":"Components/mcp-client","title":"Use Langflow as an MCP client","description":"Langflow integrates with the Model Context Protocol (MCP) as both an MCP server and an MCP client.","sidebar":"docs"},"Concepts/concepts-components":{"id":"Concepts/concepts-components","title":"Components overview","description":"Components are the building blocks of your flows.","sidebar":"docs"},"Concepts/concepts-file-management":{"id":"Concepts/concepts-file-management","title":"Manage files","description":"Each Langflow server has a file management system where you can store files that you want to use in your flows.","sidebar":"docs"},"Concepts/concepts-flows":{"id":"Concepts/concepts-flows","title":"Build flows","description":"A flow is a functional representation of an application workflow.","sidebar":"docs"},"Concepts/concepts-flows-import":{"id":"Concepts/concepts-flows-import","title":"Import and export flows","description":"You can export flows to transfer them between Langflow instances, share them with others, or create backups.","sidebar":"docs"},"Concepts/concepts-overview":{"id":"Concepts/concepts-overview","title":"Use the visual editor","description":"You use Langflow\'s visual editor to create, test, and share flows, which are functional representations of application workflows.","sidebar":"docs"},"Concepts/concepts-playground":{"id":"Concepts/concepts-playground","title":"Test flows in the Playground","description":"Langflow\'s Playground is a dynamic interface you can use to test your LLM-based flows in real-time.","sidebar":"docs"},"Concepts/concepts-publish":{"id":"Concepts/concepts-publish","title":"Trigger flows with the Langflow API","description":"After you build a flow, you probably want to run it within an application, such as a chatbot within a mobile app or website.","sidebar":"docs"},"Concepts/concepts-voice-mode":{"id":"Concepts/concepts-voice-mode","title":"Use voice mode","description":"You can use Langflow\'s voice mode to interact with your flows verbally through a microphone and speakers.","sidebar":"docs"},"Concepts/data-types":{"id":"Concepts/data-types","title":"Langflow data types","description":"Langflow components are designed to accept and produce specific types of inputs and outputs.","sidebar":"docs"},"Concepts/mcp-server":{"id":"Concepts/mcp-server","title":"Use Langflow as an MCP server","description":"Langflow integrates with the Model Context Protocol (MCP) as both an MCP server and an MCP client.","sidebar":"docs"},"Configuration/api-keys-and-authentication":{"id":"Configuration/api-keys-and-authentication","title":"API keys and authentication","description":"Never expose Langflow ports directly to the internet without proper security measures.","sidebar":"docs"},"Configuration/configuration-cli":{"id":"Configuration/configuration-cli","title":"Langflow CLI","description":"The Langflow command line interface is the main interface for managing and running the Langflow server.","sidebar":"docs"},"Configuration/configuration-custom-database":{"id":"Configuration/configuration-custom-database","title":"Configure an external PostgreSQL database","description":"Langflow\'s default database is SQLite, but you can configure Langflow to use PostgreSQL instead.","sidebar":"docs"},"Configuration/configuration-global-variables":{"id":"Configuration/configuration-global-variables","title":"Global variables","description":"Global variables let you store and reuse generic input values and credentials across your Langflow projects.","sidebar":"docs"},"Configuration/environment-variables":{"id":"Configuration/environment-variables","title":"Environment variables","description":"Langflow uses environment variables to configure certain settings.","sidebar":"docs"},"Contributing/contributing-bundles":{"id":"Contributing/contributing-bundles","title":"Contribute bundles","description":"Bundles are groups of components that are related to a specific service provider.","sidebar":"docs"},"Contributing/contributing-community":{"id":"Contributing/contributing-community","title":"Join the Langflow community","description":"There are several ways you can interact with the Langflow community and learn more about the Langflow codebase.","sidebar":"docs"},"Contributing/contributing-component-tests":{"id":"Contributing/contributing-component-tests","title":"Contribute component tests","description":"This guide outlines how to structure and implement tests for application components to ensure consistency and adequate coverage.","sidebar":"docs"},"Contributing/contributing-components":{"id":"Contributing/contributing-components","title":"Contribute components","description":"New components are added as objects of the Component class.","sidebar":"docs"},"Contributing/contributing-github-issues":{"id":"Contributing/contributing-github-issues","title":"Get help and request enhancements","description":"The Langflow GitHub repository is an integral part of the Langflow community.","sidebar":"docs"},"Contributing/contributing-how-to-contribute":{"id":"Contributing/contributing-how-to-contribute","title":"Contribute to Langflow","description":"This guide is intended to help you start contributing to Langflow.","sidebar":"docs"},"Contributing/contributing-telemetry":{"id":"Contributing/contributing-telemetry","title":"Telemetry","description":"Langflow uses anonymous telemetry to collect statistics about feature usage and performance.","sidebar":"docs"},"Contributing/contributing-templates":{"id":"Contributing/contributing-templates","title":"Contribute templates","description":"Follow these best practices when submitting a template to Langflow.","sidebar":"docs"},"Deployment/deployment-architecture":{"id":"Deployment/deployment-architecture","title":"Langflow architecture on Kubernetes","description":"There are two broad types of Langflow deployments:","sidebar":"docs"},"Deployment/deployment-caddyfile":{"id":"Deployment/deployment-caddyfile","title":"Deploy Langflow on a remote server","description":"Learn how to deploy Langflow on your own remote server with secure web access.","sidebar":"docs"},"Deployment/deployment-docker":{"id":"Deployment/deployment-docker","title":"Deploy Langflow on Docker","description":"Running applications in Docker containers ensures consistent behavior across different systems and eliminates dependency conflicts.","sidebar":"docs"},"Deployment/deployment-gcp":{"id":"Deployment/deployment-gcp","title":"Deploy Langflow on Google Cloud Platform","description":"This guide demonstrates how to deploy Langflow on Google Cloud Platform with a Cloud Shell script that walks through the process of setting up a Debian-based VM with the Langflow package, Nginx, and the necessary configurations to run the Langflow development environment in GCP.","sidebar":"docs"},"Deployment/deployment-hugging-face-spaces":{"id":"Deployment/deployment-hugging-face-spaces","title":"Deploy Langflow on Hugging Face Spaces","description":"This guide explains how to deploy Langflow on Hugging Face Spaces.","sidebar":"docs"},"Deployment/deployment-kubernetes-dev":{"id":"Deployment/deployment-kubernetes-dev","title":"Deploy the Langflow development environment on Kubernetes","description":"The Langflow integrated development environment (IDE) Helm chart is designed to provide a complete environment for developers to create, test, and debug their flows. It includes both the Langflow API and visual editor.","sidebar":"docs"},"Deployment/deployment-kubernetes-prod":{"id":"Deployment/deployment-kubernetes-prod","title":"Deploy the Langflow production environment on Kubernetes","description":"The Langflow runtime Helm chart is tailored for deploying applications in a production environment. It is focused on stability, performance, isolation, and security to ensure that applications run reliably and efficiently.","sidebar":"docs"},"Deployment/deployment-overview":{"id":"Deployment/deployment-overview","title":"Langflow deployment overview","description":"This section includes the different ways to bring your locally-built flows to the world.","sidebar":"docs"},"Deployment/deployment-prod-best-practices":{"id":"Deployment/deployment-prod-best-practices","title":"Best practices for Langflow on Kubernetes","description":"This guide provides best practices for deploying Langflow in production environments on Kubernetes.","sidebar":"docs"},"Deployment/deployment-public-server":{"id":"Deployment/deployment-public-server","title":"Deploy a public Langflow server","description":"By default, your Langflow server at http7860 isn\'t exposed to the public internet.","sidebar":"docs"},"Deployment/deployment-railway":{"id":"Deployment/deployment-railway","title":"Deploy Langflow on Railway","description":"Deploy Langflow to Railway using a one-click template","sidebar":"docs"},"Deployment/deployment-render":{"id":"Deployment/deployment-render","title":"Deploy Langflow on Render","description":"This guide explains how to deploy Langflow on Render, a cloud platform for deploying web applications and APIs.","sidebar":"docs"},"Develop/Clients/typescript-client":{"id":"Develop/Clients/typescript-client","title":"Langflow TypeScript client","description":"The Langflow TypeScript client allows your TypeScript applications to programmatically interact with the Langflow API.","sidebar":"docs"},"Develop/develop-application":{"id":"Develop/develop-application","title":"Containerize a Langflow application","description":"Designing flows in the visual editor is only the first step in building an application that uses Langflow.","sidebar":"docs"},"Develop/enterprise-database-guide":{"id":"Develop/enterprise-database-guide","title":"Langflow database guide for enterprise DBAs","description":"The Langflow database stores data that is essential for more Langflow operations, including startup, flow execution, user interactions, and administrative tasks.","sidebar":"docs"},"Develop/install-custom-dependencies":{"id":"Develop/install-custom-dependencies","title":"Install custom dependencies","description":"Langflow provides optional dependency groups and support for custom dependencies to extend Langflow functionality. This guide covers how to add dependencies for different Langflow installations, including Langflow Desktop and Langflow OSS.","sidebar":"docs"},"Develop/logging":{"id":"Develop/logging","title":"Logs","description":"This page provides information about Langflow logs, including logs for individual flows and the Langflow application itself.","sidebar":"docs"},"Develop/memory":{"id":"Develop/memory","title":"Memory management options","description":"Langflow provides flexible memory management options for storage and retrieval of data relevant to your flows and your Langflow server.","sidebar":"docs"},"Develop/session-id":{"id":"Develop/session-id","title":"Use session ID to manage communication between components","description":"Session ID is a unique identifier for client/server connections. A single session equals the duration of a client\'s connection to a server.","sidebar":"docs"},"Develop/webhook":{"id":"Develop/webhook","title":"Trigger flows with webhooks","description":"You can use the Webhook component to start a flow run in response to an external event.","sidebar":"docs"},"Get-Started/about-langflow":{"id":"Get-Started/about-langflow","title":"What is Langflow?","description":"Langflow is an open-source, Python-based, customizable framework for building AI applications.","sidebar":"docs"},"Get-Started/get-started-installation":{"id":"Get-Started/get-started-installation","title":"Install Langflow","description":"Langflow can be installed in multiple ways:","sidebar":"docs"},"Get-Started/get-started-quickstart":{"id":"Get-Started/get-started-quickstart","title":"Quickstart","description":"Get started with Langflow by loading a template flow, running it, and then serving it at the /run API endpoint.","sidebar":"docs"},"Get-Started/welcome-to-langflow":{"id":"Get-Started/welcome-to-langflow","title":"Welcome to Langflow","description":"Langflow empowers developers to rapidly prototype and build AI applications with a user-friendly visual interface and support for important AI functionality like agents and the MCP.","sidebar":"docs"},"Integrations/Apify/integrations-apify":{"id":"Integrations/Apify/integrations-apify","title":"Apify","description":"Apify is a web scraping and data extraction platform with more than 3,000 ready-made cloud tools called Actors.","sidebar":"docs"},"Integrations/Arize/integrations-arize":{"id":"Integrations/Arize/integrations-arize","title":"Arize","description":"Arize is a tool built on OpenTelemetry and OpenInference for monitoring and optimizing LLM applications.","sidebar":"docs"},"Integrations/Cleanlab/integrations-cleanlab":{"id":"Integrations/Cleanlab/integrations-cleanlab","title":"Cleanlab","description":"Cleanlab adds automation and trust to every data point going in and every prediction coming out of AI and RAG solutions.","sidebar":"docs"},"Integrations/Composio/integrations-composio":{"id":"Integrations/Composio/integrations-composio","title":"Composio","description":"Composio components in Langflow provide Composio tools to your Agent components.","sidebar":"docs"},"Integrations/Docling/integrations-docling":{"id":"Integrations/Docling/integrations-docling","title":"Docling","description":"Langflow integrates with Docling through a bundle of components for parsing documents.","sidebar":"docs"},"Integrations/Google/integrations-google-big-query":{"id":"Integrations/Google/integrations-google-big-query","title":"Google BigQuery","description":"Langflow integrates with Google BigQuery through the BigQuery component in the Google bundle, allowing you to execute SQL queries and retrieve data from your BigQuery datasets.","sidebar":"docs"},"Integrations/integrations-assemblyai":{"id":"Integrations/integrations-assemblyai","title":"AssemblyAI","description":"The AssemblyAI components allow you to apply powerful Speech AI models to your app for tasks like:","sidebar":"docs"},"Integrations/integrations-langfuse":{"id":"Integrations/integrations-langfuse","title":"Langfuse","description":"Langfuse is an open-source platform for LLM observability. It provides tracing and monitoring capabilities for AI applications, helping developers debug, analyze, and optimize their AI systems. Langfuse integrates with various tools and frameworks, including workflow builders and runtimes like Langflow.","sidebar":"docs"},"Integrations/integrations-langsmith":{"id":"Integrations/integrations-langsmith","title":"LangSmith","description":"LangSmith is a full-lifecycle DevOps service from LangChain that provides monitoring and observability. To integrate with Langflow, add your LangChain API key and configuration as Langflow environment variables, and then start Langflow.","sidebar":"docs"},"Integrations/integrations-langwatch":{"id":"Integrations/integrations-langwatch","title":"LangWatch","description":"LangWatch is an all-in-one LLMOps platform for monitoring, observability, analytics, evaluations and alerting for getting user insights and improve your LLM workflows.","sidebar":"docs"},"Integrations/integrations-opik":{"id":"Integrations/integrations-opik","title":"Opik","description":"Opik is an open-source platform designed for evaluating, testing, and monitoring large language model (LLM) applications. Developed by Comet, it aims to facilitate more intuitive collaboration, testing, and monitoring of LLM-based applications.","sidebar":"docs"},"Integrations/mcp-component-astra":{"id":"Integrations/mcp-component-astra","title":"Connect an Astra DB MCP server to Langflow","description":"This guide demonstrates how to use Langflow as an MCP client by using the MCP Tools component to run a DataStax Astra DB MCP server in an agent flow.","sidebar":"docs"},"Integrations/Notion/integrations-notion":{"id":"Integrations/Notion/integrations-notion","title":"Set up a Notion App","description":"To use Notion components in Langflow, you first need to create a Notion integration and configure it with the necessary capabilities. This guide will walk you through the process of setting up a Notion integration and granting it access to your Notion databases.","sidebar":"docs"},"Integrations/Notion/notion-agent-conversational":{"id":"Integrations/Notion/notion-agent-conversational","title":"Notion Conversational Agent","description":"The Notion Conversational Agent is an AI-powered assistant that interacts with your Notion workspace through natural language conversations. This flow performs Notion-related tasks like creating pages, searching for information, and managing content, all through a chat interface.","sidebar":"docs"},"Integrations/Notion/notion-agent-meeting-notes":{"id":"Integrations/Notion/notion-agent-meeting-notes","title":"Notion Meeting Notes Agent","description":"The Notion Agent for Meeting Notes is an AI-powered tool that automatically processes meeting transcripts and updates your Notion workspace. It identifies tasks, action items, and key points from your meetings, then creates new tasks or updates existing ones in Notion without manual input.","sidebar":"docs"},"Integrations/Nvidia/integrations-nvidia-g-assist":{"id":"Integrations/Nvidia/integrations-nvidia-g-assist","title":"Integrate NVIDIA G-Assist with Langflow","description":"The NVIDIA G-Assist component is available only for Langflow users with NVIDIA GPUs on Windows systems.","sidebar":"docs"},"Integrations/Nvidia/integrations-nvidia-ingest":{"id":"Integrations/Nvidia/integrations-nvidia-ingest","title":"Integrate NVIDIA Retriever Extraction with Langflow","description":"The NVIDIA Retriever Extraction component integrates with the NVIDIA nv-ingest microservice for data ingestion, processing, and extraction of text files.","sidebar":"docs"},"Integrations/Nvidia/integrations-nvidia-nim-wsl2":{"id":"Integrations/Nvidia/integrations-nvidia-nim-wsl2","title":"Integrate NVIDIA NIMs with Langflow","description":"Connect Langflow with NVIDIA NIM on an RTX Windows system with Windows Subsystem for Linux 2 (WSL2) installed.","sidebar":"docs"},"Support/luna-for-langflow":{"id":"Support/luna-for-langflow","title":"Enterprise support for Langflow","description":"With Luna for Langflow support, you can develop and deploy Langflow applications with confidence.","sidebar":"docs"},"Support/release-notes":{"id":"Support/release-notes","title":"Langflow release notes","description":"This page summarizes significant changes to Langflow in each release.","sidebar":"docs"},"Support/troubleshooting":{"id":"Support/troubleshooting","title":"Troubleshoot Langflow","description":"This page provides troubleshooting advice for issues you might encounter when using Langflow or contributing to Langflow.","sidebar":"docs"},"Tutorials/agent":{"id":"Tutorials/agent","title":"Connect applications to agents","description":"This tutorial shows you how to connect a JavaScript application to a Langflow agent.","sidebar":"docs"},"Tutorials/chat-with-files":{"id":"Tutorials/chat-with-files","title":"Create a chatbot that can ingest files","description":"This tutorial shows you how to build a chatbot that can read and answer questions about files you upload, such as meeting notes or job applications.","sidebar":"docs"},"Tutorials/chat-with-rag":{"id":"Tutorials/chat-with-rag","title":"Create a vector RAG chatbot","description":"This tutorial demonstrates how you can use Langflow to create a chatbot application that uses Retrieval Augmented Generation (RAG) to embed your data as vectors in a vector database, and then chat with the data.","sidebar":"docs"},"Tutorials/mcp-tutorial":{"id":"Tutorials/mcp-tutorial","title":"Connect to MCP servers from your application","description":"This tutorial shows you how to connect MCP servers to your applications using Langflow\'s MCP Tools component.","sidebar":"docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/2ab0d4f5.9736bba1.js b/assets/js/2ab0d4f5.9ee70b69.js similarity index 50% rename from assets/js/2ab0d4f5.9736bba1.js rename to assets/js/2ab0d4f5.9ee70b69.js index 4d82148051..43c4a446fe 100644 --- a/assets/js/2ab0d4f5.9736bba1.js +++ b/assets/js/2ab0d4f5.9ee70b69.js @@ -1 +1 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[1845],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(96540);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}},83640:(e,n,t)=>{t.r(n),t.d(n,{contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"type":"api","id":"simplified-run-flow","title":"Simplified Run Flow","description":"","slug":"/simplified-run-flow","frontMatter":{},"api":{"tags":["Base"],"description":"Executes a specified flow by ID with support for streaming and telemetry.\\n\\nThis endpoint executes a flow identified by ID or name, with options for streaming the response\\nand tracking execution metrics. It handles both streaming and non-streaming execution modes.\\n\\nArgs:\\n background_tasks (BackgroundTasks): FastAPI background task manager\\n flow (FlowRead | None): The flow to execute, loaded via dependency\\n input_request (SimplifiedAPIRequest | None): Input parameters for the flow\\n stream (bool): Whether to stream the response\\n api_key_user (UserRead): Authenticated user from API key\\n request (Request): The incoming HTTP request\\n\\nReturns:\\n Union[StreamingResponse, RunResponse]: Either a streaming response for real-time results\\n or a RunResponse with the complete execution results\\n\\nRaises:\\n HTTPException: For flow not found (404) or invalid input (400)\\n APIException: For internal execution errors (500)\\n\\nNotes:\\n - Supports both streaming and non-streaming execution modes\\n - Tracks execution time and success/failure via telemetry\\n - Handles graceful client disconnection in streaming mode\\n - Provides detailed error handling with appropriate HTTP status codes\\n - In streaming mode, uses EventManager to handle events:\\n - \\"add_message\\": New messages during execution\\n - \\"token\\": Individual tokens during streaming\\n - \\"end\\": Final execution result","operationId":"simplified_run_flow_api_v1_run__flow_id_or_name__post","security":[{"API key query":[]},{"API key header":[]}],"parameters":[{"name":"flow_id_or_name","in":"path","required":true,"schema":{"type":"string","title":"Flow Id Or Name"}},{"name":"stream","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Stream"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"properties":{"input_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Value","description":"The input value"},"input_type":{"anyOf":[{"type":"string","enum":["chat","text","any"]},{"type":"null"}],"title":"Input Type","description":"The input type","default":"chat"},"output_type":{"anyOf":[{"type":"string","enum":["chat","text","any","debug"]},{"type":"null"}],"title":"Output Type","description":"The output type","default":"chat"},"output_component":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Component","description":"If there are multiple output components, you can specify the component to get the output from.","default":""},"tweaks":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"object"}]},"type":"object","title":"Tweaks","description":"A dictionary of tweaks to adjust the flow\'s execution. Allows customizing flow behavior dynamically. All tweaks are overridden by the input values.","examples":[{"Component Name":{"parameter_name":"value"},"component_id":{"parameter_name":"value"},"parameter_name":"value"}]},{"type":"null"}],"description":"The tweaks"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"The session id"}},"type":"object","title":"SimplifiedAPIRequest"},{"type":"null"}],"title":"Input Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}},"method":"post","path":"/api/v1/run/{flow_id_or_name}","securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"api/v1/login"}}},"API key query":{"type":"apiKey","in":"query","name":"x-api-key"},"API key header":{"type":"apiKey","in":"header","name":"x-api-key"}},"info":{"title":"Langflow","version":"1.5.0.post1"},"postman":{"name":"Simplified Run Flow","description":{"content":"Executes a specified flow by ID with support for streaming and telemetry.\\n\\nThis endpoint executes a flow identified by ID or name, with options for streaming the response\\nand tracking execution metrics. It handles both streaming and non-streaming execution modes.\\n\\nArgs:\\n background_tasks (BackgroundTasks): FastAPI background task manager\\n flow (FlowRead | None): The flow to execute, loaded via dependency\\n input_request (SimplifiedAPIRequest | None): Input parameters for the flow\\n stream (bool): Whether to stream the response\\n api_key_user (UserRead): Authenticated user from API key\\n request (Request): The incoming HTTP request\\n\\nReturns:\\n Union[StreamingResponse, RunResponse]: Either a streaming response for real-time results\\n or a RunResponse with the complete execution results\\n\\nRaises:\\n HTTPException: For flow not found (404) or invalid input (400)\\n APIException: For internal execution errors (500)\\n\\nNotes:\\n - Supports both streaming and non-streaming execution modes\\n - Tracks execution time and success/failure via telemetry\\n - Handles graceful client disconnection in streaming mode\\n - Provides detailed error handling with appropriate HTTP status codes\\n - In streaming mode, uses EventManager to handle events:\\n - \\"add_message\\": New messages during execution\\n - \\"token\\": Individual tokens during streaming\\n - \\"end\\": Final execution result","type":"text/plain"},"url":{"path":["api","v1","run",":flow_id_or_name"],"host":["{{baseUrl}}"],"query":[{"disabled":false,"key":"stream","value":"false"},{"disabled":false,"key":"user_id","value":""}],"variable":[{"disabled":false,"description":{"content":"(Required) ","type":"text/plain"},"type":"any","value":"","key":"flow_id_or_name"}]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"{\\n \\"input_value\\": \\"\\",\\n \\"input_type\\": \\"\\",\\n \\"output_type\\": \\"\\",\\n \\"output_component\\": \\"\\",\\n \\"tweaks\\": {\\n \\"dolor2fd\\": \\"\\",\\n \\"veniam_7\\": \\"\\",\\n \\"dolore7f\\": \\"\\"\\n },\\n \\"session_id\\": \\"\\"\\n}","options":{"raw":{"language":"json"}}},"auth":{"type":"apikey","apikey":[{"type":"any","value":"x-api-key","key":"key"},{"type":"any","value":"{{apiKey}}","key":"value"},{"type":"any","value":"query","key":"in"}]}}},"source":"@site/openapi.json","sourceDirName":".","permalink":"/api/simplified-run-flow","previous":{"title":"Get All","permalink":"/api/get-all"},"next":{"title":"Webhook Run Flow","permalink":"/api/webhook-run-flow"}}');var s=t(74848),r=t(28453);const a={},o="Simplified Run Flow",l=[];function d(e){const n={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"simplified-run-flow",children:"Simplified Run Flow"})}),"\n",(0,s.jsx)(n.p,{children:"Executes a specified flow by ID with support for streaming and telemetry."}),"\n",(0,s.jsx)(n.p,{children:"This endpoint executes a flow identified by ID or name, with options for streaming the response\nand tracking execution metrics. It handles both streaming and non-streaming execution modes."}),"\n",(0,s.jsx)(n.p,{children:"Args:\nbackground_tasks (BackgroundTasks): FastAPI background task manager\nflow (FlowRead | None): The flow to execute, loaded via dependency\ninput_request (SimplifiedAPIRequest | None): Input parameters for the flow\nstream (bool): Whether to stream the response\napi_key_user (UserRead): Authenticated user from API key\nrequest (Request): The incoming HTTP request"}),"\n",(0,s.jsx)(n.p,{children:"Returns:\nUnion[StreamingResponse, RunResponse]: Either a streaming response for real-time results\nor a RunResponse with the complete execution results"}),"\n",(0,s.jsx)(n.p,{children:"Raises:\nHTTPException: For flow not found (404) or invalid input (400)\nAPIException: For internal execution errors (500)"}),"\n",(0,s.jsx)(n.p,{children:"Notes:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Supports both streaming and non-streaming execution modes"}),"\n",(0,s.jsx)(n.li,{children:"Tracks execution time and success/failure via telemetry"}),"\n",(0,s.jsx)(n.li,{children:"Handles graceful client disconnection in streaming mode"}),"\n",(0,s.jsx)(n.li,{children:"Provides detailed error handling with appropriate HTTP status codes"}),"\n",(0,s.jsxs)(n.li,{children:["In streaming mode, uses EventManager to handle events:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'"add_message": New messages during execution'}),"\n",(0,s.jsx)(n.li,{children:'"token": Individual tokens during streaming'}),"\n",(0,s.jsx)(n.li,{children:'"end": Final execution result'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("th",{style:{textAlign:"left"},children:"Path Parameters"})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"flow_id_or_name"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Flow Id Or Name"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-required)"},children:" REQUIRED"})]})})})]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("th",{style:{textAlign:"left"},children:"Query Parameters"})})}),(0,s.jsxs)("tbody",{children:[(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"stream"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Stream"})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"user_id"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" User Id"})]})})]})]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("th",{style:{textAlign:"left"},children:[(0,s.jsx)("span",{children:"Request Body "}),(0,s.jsx)("div",{})]})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("td",{children:(0,s.jsx)("span",{style:{opacity:"0.6"},children:" undefined"})})})})]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("th",{style:{textAlign:"left"},children:"Responses"})})}),(0,s.jsxs)("tbody",{children:[(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsxs)("div",{style:{display:"flex"},children:[(0,s.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,s.jsx)("code",{children:"200"})}),(0,s.jsx)("div",{children:(0,s.jsx)(n.p,{children:"Successful Response"})})]}),(0,s.jsx)("div",{children:(0,s.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("th",{style:{textAlign:"left"},children:[(0,s.jsx)("span",{children:"Schema "}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,s.jsx)("div",{})]})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("td",{children:(0,s.jsx)("span",{style:{opacity:"0.6"},children:" undefined"})})})})]})})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsxs)("div",{style:{display:"flex"},children:[(0,s.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,s.jsx)("code",{children:"422"})}),(0,s.jsx)("div",{children:(0,s.jsx)(n.p,{children:"Validation Error"})})]}),(0,s.jsx)("div",{children:(0,s.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("th",{style:{textAlign:"left"},children:[(0,s.jsx)("span",{children:"Schema "}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,s.jsx)("div",{})]})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"detail"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" object[]"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,s.jsx)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:(0,s.jsxs)("tbody",{children:[(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"loc"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" undefined[]"})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"msg"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Message"})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"type"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Error Type"})]})})]})})]})})})]})})]})})]})]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[1845],{28453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>o});var i=t(96540);const s={},r=i.createContext(s);function a(e){const n=i.useContext(r);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:a(e.components),i.createElement(r.Provider,{value:n},e.children)}},83640:(e,n,t)=>{t.r(n),t.d(n,{contentTitle:()=>o,default:()=>c,frontMatter:()=>a,metadata:()=>i,toc:()=>l});const i=JSON.parse('{"type":"api","id":"simplified-run-flow","title":"Simplified Run Flow","description":"","slug":"/simplified-run-flow","frontMatter":{},"api":{"tags":["Base"],"description":"Executes a specified flow by ID with support for streaming and telemetry.\\n\\nThis endpoint executes a flow identified by ID or name, with options for streaming the response\\nand tracking execution metrics. It handles both streaming and non-streaming execution modes.\\n\\nArgs:\\n background_tasks (BackgroundTasks): FastAPI background task manager\\n flow (FlowRead | None): The flow to execute, loaded via dependency\\n input_request (SimplifiedAPIRequest | None): Input parameters for the flow\\n stream (bool): Whether to stream the response\\n api_key_user (UserRead): Authenticated user from API key\\n request (Request): The incoming HTTP request\\n\\nReturns:\\n Union[StreamingResponse, RunResponse]: Either a streaming response for real-time results\\n or a RunResponse with the complete execution results\\n\\nRaises:\\n HTTPException: For flow not found (404) or invalid input (400)\\n APIException: For internal execution errors (500)\\n\\nNotes:\\n - Supports both streaming and non-streaming execution modes\\n - Tracks execution time and success/failure via telemetry\\n - Handles graceful client disconnection in streaming mode\\n - Provides detailed error handling with appropriate HTTP status codes\\n - In streaming mode, uses EventManager to handle events:\\n - \\"add_message\\": New messages during execution\\n - \\"token\\": Individual tokens during streaming\\n - \\"end\\": Final execution result","operationId":"simplified_run_flow_api_v1_run__flow_id_or_name__post","security":[{"API key query":[]},{"API key header":[]}],"parameters":[{"name":"flow_id_or_name","in":"path","required":true,"schema":{"type":"string","title":"Flow Id Or Name"}},{"name":"stream","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Stream"}},{"name":"user_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"properties":{"input_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Value","description":"The input value"},"input_type":{"anyOf":[{"type":"string","enum":["chat","text","any"]},{"type":"null"}],"title":"Input Type","description":"The input type","default":"chat"},"output_type":{"anyOf":[{"type":"string","enum":["chat","text","any","debug"]},{"type":"null"}],"title":"Output Type","description":"The output type","default":"chat"},"output_component":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Output Component","description":"If there are multiple output components, you can specify the component to get the output from.","default":""},"tweaks":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"object"}]},"type":"object","title":"Tweaks","description":"A dictionary of tweaks to adjust the flow\'s execution. Allows customizing flow behavior dynamically. All tweaks are overridden by the input values.","examples":[{"Component Name":{"parameter_name":"value"},"component_id":{"parameter_name":"value"},"parameter_name":"value"}]},{"type":"null"}],"description":"The tweaks"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id","description":"The session id"}},"type":"object","title":"SimplifiedAPIRequest"},{"type":"null"}],"title":"Input Request"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}},"method":"post","path":"/api/v1/run/{flow_id_or_name}","securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"api/v1/login"}}},"API key query":{"type":"apiKey","in":"query","name":"x-api-key"},"API key header":{"type":"apiKey","in":"header","name":"x-api-key"}},"info":{"title":"Langflow","version":"1.5.0.post1"},"postman":{"name":"Simplified Run Flow","description":{"content":"Executes a specified flow by ID with support for streaming and telemetry.\\n\\nThis endpoint executes a flow identified by ID or name, with options for streaming the response\\nand tracking execution metrics. It handles both streaming and non-streaming execution modes.\\n\\nArgs:\\n background_tasks (BackgroundTasks): FastAPI background task manager\\n flow (FlowRead | None): The flow to execute, loaded via dependency\\n input_request (SimplifiedAPIRequest | None): Input parameters for the flow\\n stream (bool): Whether to stream the response\\n api_key_user (UserRead): Authenticated user from API key\\n request (Request): The incoming HTTP request\\n\\nReturns:\\n Union[StreamingResponse, RunResponse]: Either a streaming response for real-time results\\n or a RunResponse with the complete execution results\\n\\nRaises:\\n HTTPException: For flow not found (404) or invalid input (400)\\n APIException: For internal execution errors (500)\\n\\nNotes:\\n - Supports both streaming and non-streaming execution modes\\n - Tracks execution time and success/failure via telemetry\\n - Handles graceful client disconnection in streaming mode\\n - Provides detailed error handling with appropriate HTTP status codes\\n - In streaming mode, uses EventManager to handle events:\\n - \\"add_message\\": New messages during execution\\n - \\"token\\": Individual tokens during streaming\\n - \\"end\\": Final execution result","type":"text/plain"},"url":{"path":["api","v1","run",":flow_id_or_name"],"host":["{{baseUrl}}"],"query":[{"disabled":false,"key":"stream","value":"false"},{"disabled":false,"key":"user_id","value":""}],"variable":[{"disabled":false,"description":{"content":"(Required) ","type":"text/plain"},"type":"any","value":"","key":"flow_id_or_name"}]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"{\\n \\"input_value\\": \\"\\",\\n \\"input_type\\": \\"\\",\\n \\"output_type\\": \\"\\",\\n \\"output_component\\": \\"\\",\\n \\"tweaks\\": {\\n \\"ut_f65\\": \\"\\",\\n \\"laborum_60\\": \\"\\",\\n \\"dolore_75\\": \\"\\",\\n \\"sinta\\": \\"\\"\\n },\\n \\"session_id\\": \\"\\"\\n}","options":{"raw":{"language":"json"}}},"auth":{"type":"apikey","apikey":[{"type":"any","value":"x-api-key","key":"key"},{"type":"any","value":"{{apiKey}}","key":"value"},{"type":"any","value":"query","key":"in"}]}}},"source":"@site/openapi.json","sourceDirName":".","permalink":"/api/simplified-run-flow","previous":{"title":"Get All","permalink":"/api/get-all"},"next":{"title":"Webhook Run Flow","permalink":"/api/webhook-run-flow"}}');var s=t(74848),r=t(28453);const a={},o="Simplified Run Flow",l=[];function d(e){const n={h1:"h1",header:"header",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"simplified-run-flow",children:"Simplified Run Flow"})}),"\n",(0,s.jsx)(n.p,{children:"Executes a specified flow by ID with support for streaming and telemetry."}),"\n",(0,s.jsx)(n.p,{children:"This endpoint executes a flow identified by ID or name, with options for streaming the response\nand tracking execution metrics. It handles both streaming and non-streaming execution modes."}),"\n",(0,s.jsx)(n.p,{children:"Args:\nbackground_tasks (BackgroundTasks): FastAPI background task manager\nflow (FlowRead | None): The flow to execute, loaded via dependency\ninput_request (SimplifiedAPIRequest | None): Input parameters for the flow\nstream (bool): Whether to stream the response\napi_key_user (UserRead): Authenticated user from API key\nrequest (Request): The incoming HTTP request"}),"\n",(0,s.jsx)(n.p,{children:"Returns:\nUnion[StreamingResponse, RunResponse]: Either a streaming response for real-time results\nor a RunResponse with the complete execution results"}),"\n",(0,s.jsx)(n.p,{children:"Raises:\nHTTPException: For flow not found (404) or invalid input (400)\nAPIException: For internal execution errors (500)"}),"\n",(0,s.jsx)(n.p,{children:"Notes:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Supports both streaming and non-streaming execution modes"}),"\n",(0,s.jsx)(n.li,{children:"Tracks execution time and success/failure via telemetry"}),"\n",(0,s.jsx)(n.li,{children:"Handles graceful client disconnection in streaming mode"}),"\n",(0,s.jsx)(n.li,{children:"Provides detailed error handling with appropriate HTTP status codes"}),"\n",(0,s.jsxs)(n.li,{children:["In streaming mode, uses EventManager to handle events:","\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:'"add_message": New messages during execution'}),"\n",(0,s.jsx)(n.li,{children:'"token": Individual tokens during streaming'}),"\n",(0,s.jsx)(n.li,{children:'"end": Final execution result'}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("th",{style:{textAlign:"left"},children:"Path Parameters"})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"flow_id_or_name"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Flow Id Or Name"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-required)"},children:" REQUIRED"})]})})})]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("th",{style:{textAlign:"left"},children:"Query Parameters"})})}),(0,s.jsxs)("tbody",{children:[(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"stream"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Stream"})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"user_id"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" User Id"})]})})]})]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("th",{style:{textAlign:"left"},children:[(0,s.jsx)("span",{children:"Request Body "}),(0,s.jsx)("div",{})]})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("td",{children:(0,s.jsx)("span",{style:{opacity:"0.6"},children:" undefined"})})})})]}),"\n",(0,s.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("th",{style:{textAlign:"left"},children:"Responses"})})}),(0,s.jsxs)("tbody",{children:[(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsxs)("div",{style:{display:"flex"},children:[(0,s.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,s.jsx)("code",{children:"200"})}),(0,s.jsx)("div",{children:(0,s.jsx)(n.p,{children:"Successful Response"})})]}),(0,s.jsx)("div",{children:(0,s.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("th",{style:{textAlign:"left"},children:[(0,s.jsx)("span",{children:"Schema "}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,s.jsx)("div",{})]})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsx)("td",{children:(0,s.jsx)("span",{style:{opacity:"0.6"},children:" undefined"})})})})]})})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsxs)("div",{style:{display:"flex"},children:[(0,s.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,s.jsx)("code",{children:"422"})}),(0,s.jsx)("div",{children:(0,s.jsx)(n.p,{children:"Validation Error"})})]}),(0,s.jsx)("div",{children:(0,s.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,s.jsx)("thead",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("th",{style:{textAlign:"left"},children:[(0,s.jsx)("span",{children:"Schema "}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,s.jsx)("div",{})]})})}),(0,s.jsx)("tbody",{children:(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"detail"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" object[]"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,s.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,s.jsx)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:(0,s.jsxs)("tbody",{children:[(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"loc"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" undefined[]"})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"msg"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Message"})]})}),(0,s.jsx)("tr",{children:(0,s.jsxs)("td",{children:[(0,s.jsx)("code",{children:"type"}),(0,s.jsx)("span",{style:{opacity:"0.6"},children:" Error Type"})]})})]})})]})})})]})})]})})]})]})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/393c45a3.48bfc372.js b/assets/js/393c45a3.a88f2240.js similarity index 79% rename from assets/js/393c45a3.48bfc372.js rename to assets/js/393c45a3.a88f2240.js index 382f8ec9b4..f7ded940f3 100644 --- a/assets/js/393c45a3.48bfc372.js +++ b/assets/js/393c45a3.a88f2240.js @@ -1 +1 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[692],{10734:(e,n,t)=>{t.r(n),t.d(n,{CH:()=>p,assets:()=>u,chCodeConfig:()=>f,contentTitle:()=>h,default:()=>x,frontMatter:()=>d,metadata:()=>o,toc:()=>g});const o=JSON.parse('{"id":"Configuration/api-keys-and-authentication","title":"API keys and authentication","description":"Never expose Langflow ports directly to the internet without proper security measures.","source":"@site/docs/Configuration/api-keys-and-authentication.mdx","sourceDirName":"Configuration","slug":"/api-keys-and-authentication","permalink":"/api-keys-and-authentication","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"API keys and authentication","slug":"/api-keys-and-authentication"},"sidebar":"docs","previous":{"title":"Connect an Astra DB MCP server to Langflow","permalink":"/mcp-component-astra"},"next":{"title":"Install custom dependencies","permalink":"/install-custom-dependencies"}}');var s=t(74848),r=t(28453),a=t(24754),i=t(11470),l=t(19365),c=t(17886);const d={title:"API keys and authentication",slug:"/api-keys-and-authentication"},h=void 0,u={},p={annotations:a.hk,Code:a.Cy},f={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},g=[{value:"Langflow API keys",id:"langflow-api-keys",level:2},{value:"Langflow API key permissions",id:"langflow-api-key-permissions",level:3},{value:"Create a Langflow API key",id:"create-a-langflow-api-key",level:3},{value:"Use a Langflow API key",id:"use-a-langflow-api-key",level:3},{value:"Revoke an API key",id:"revoke-an-api-key",level:3},{value:"Component API keys",id:"component-api-keys",level:2},{value:"Authentication environment variables",id:"authentication-environment-variables",level:2},{value:"LANGFLOW_AUTO_LOGIN",id:"langflow-auto-login",level:3},{value:"AUTO_LOGIN and API authentication in version 1.5 and later",id:"auto_login-and-api-authentication-in-version-15-and-later",level:4},{value:"LANGFLOW_ENABLE_SUPERUSER_CLI",id:"langflow-enable-superuser-cli",level:3},{value:"LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD",id:"langflow-superuser",level:3},{value:"LANGFLOW_SECRET_KEY",id:"langflow-secret-key",level:3},{value:"LANGFLOW_NEW_USER_IS_ACTIVE",id:"langflow-new-user-is-active",level:3},{value:"Start a Langflow server with authentication enabled",id:"start-a-langflow-server-with-authentication-enabled",level:2},{value:"Start the Langflow server",id:"start-the-langflow-server",level:3},{value:"Manage users as an administrator",id:"manage-users-as-an-administrator",level:3}];function y(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:t}=n;return p||m("CH",!1),p.Code||m("CH.Code",!0),t||m("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Never expose Langflow ports directly to the internet without proper security measures.\nSet ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=False"}),", use a non-default ",(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"}),", and deploy your Langflow server behind a reverse proxy with authentication enabled.\nFor more information, see ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"Start a Langflow server with authentication enabled"}),"."]})}),"\n",(0,s.jsx)(n.p,{children:"Authentication credentials help prevent unauthorized access to your Langflow server, flows, and services connected through components."}),"\n",(0,s.jsx)(n.p,{children:"There are three types of credentials that you use in Langflow:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#langflow-api-keys",children:"Langflow API keys"}),": For authentication with the Langflow API and authorizing server-side Langflow actions like running flows and uploading files."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#component-api-keys",children:"Component API keys"}),": For authentication between Langflow and a service connected through a component, such as a model provider or third-party API."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#authentication-environment-variables",children:"Authentication environment variables"}),": These environment variables configure how Langflow handles user authentication and authorization."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-api-keys",children:"Langflow API keys"}),"\n",(0,s.jsx)(n.p,{children:"You can use Langflow API keys to interact with Langflow programmatically."}),"\n",(0,s.jsxs)(n.p,{children:["In Langflow version 1.5 and later, most API endpoints require a Langflow API key, even when ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," is ",(0,s.jsx)(n.code,{children:"True"}),".\nFor more information, see ",(0,s.jsx)(n.a,{href:"#langflow-auto-login",children:(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-api-key-permissions",children:"Langflow API key permissions"}),"\n",(0,s.jsx)(n.p,{children:"A Langflow API key adopts the privileges of the user who created it.\nThis means that API keys you create have the same permissions and access that you do, including access to your flows, components, and Langflow database.\nA Langflow API key cannot be used to access resources outside of your own Langflow server."}),"\n",(0,s.jsx)(n.p,{children:"In single-user environments, you are always a superuser, and your Langflow API keys always have superuser privileges."}),"\n",(0,s.jsxs)(n.p,{children:["In multi-user environments, users who aren't superusers cannot use their API keys to access other users' resources.\nYou must ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"start your Langflow server with authentication enabled"})," to allow user management and creation of non-superuser accounts."]}),"\n",(0,s.jsx)(n.h3,{id:"create-a-langflow-api-key",children:"Create a Langflow API key"}),"\n",(0,s.jsxs)(n.p,{children:["You can generate a Langflow API key in your Langflow ",(0,s.jsx)(n.strong,{children:"Settings"})," or with the Langflow CLI."]}),"\n",(0,s.jsxs)(n.p,{children:["The CLI option is required if your Langflow server is running in ",(0,s.jsx)(n.code,{children:"--backend-only"})," mode."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"settings",label:"Langflow Settings",default:!0,children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Langflow header, click your profile icon, and then select ",(0,s.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Langflow API Keys"}),", and then click ",(0,s.jsx)(n.strong,{children:"Add New"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Name your key, and then click ",(0,s.jsx)(n.strong,{children:"Create API Key"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Copy the API key and store it securely."}),"\n"]})}),(0,s.jsxs)(l.A,{value:"Langflow CLI",label:"Langflow CLI",children:[(0,s.jsxs)(n.p,{children:["If you're serving your flow with ",(0,s.jsx)(n.code,{children:"--backend-only=true"}),", you can't create API keys in your Langflow ",(0,s.jsx)(n.strong,{children:"Settings"})," because the frontend isn't running.\nIn this case, you must create API keys with the Langflow CLI."]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Recommended: ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"Start your Langflow server with authentication enabled"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This configuration is recommended for security reasons to prevent unauthorized API key and superuser creation, especially in production environments."}),"\n",(0,s.jsxs)(n.p,{children:["However, if authentication isn't enabled (",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"}),"), all users are effectively superusers, and they can create API keys with the Langflow CLI."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Create an API key with ",(0,s.jsx)(n.a,{href:"/configuration-cli#langflow-api-key",children:(0,s.jsx)(n.code,{children:"langflow api-key"})}),":"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"uv ",props:{style:{color:"#FFA657"}}},{content:"run langflow api-key",props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"All API keys created with the Langflow CLI have superuser privileges because the command requires superuser authentication, and Langflow API keys adopt the privileges of the user who created them."}),"\n"]}),"\n"]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"use-a-langflow-api-key",children:"Use a Langflow API key"}),"\n",(0,s.jsxs)(n.p,{children:["To authenticate Langflow API requests, pass your Langflow API key an ",(0,s.jsx)(n.code,{children:"x-api-key"})," header or query parameter."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"header",label:"HTTP header",default:!0,children:(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:"POST ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:' "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_ADDRESS",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/run/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:'?stream=false" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:'"Content-Type: application/json" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:'"x-api-key: ',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_API_KEY",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -d ",props:{style:{color:"#79C0FF"}}},{content:'\'{"inputs": {"text":""}, "tweaks": {}}\'',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]})}),(0,s.jsx)(l.A,{value:"parameter",label:"Query parameter",children:(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:"POST ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:' "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_ADDRESS",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/run/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:"?x-api-key=",props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_API_KEY",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:'"Content-Type: application/json" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -d ",props:{style:{color:"#79C0FF"}}},{content:'\'{"inputs": {"text":""}, "tweaks": {}}\'',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]})})]}),"\n",(0,s.jsxs)(n.p,{children:["For more information about forming Langflow API requests, see ",(0,s.jsx)(n.a,{href:"/api-reference-api-examples",children:"Get started with the Langflow API"})," and ",(0,s.jsx)(n.a,{href:"/concepts-publish",children:"Trigger flows with the Langflow API"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"revoke-an-api-key",children:"Revoke an API key"}),"\n",(0,s.jsx)(n.p,{children:"To revoke and delete an API key, do the following:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Langflow header, click your profile icon, and then select ",(0,s.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Langflow API Keys"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Select the keys you want to delete, and then click ",(0,s.jsx)(c.A,{name:"Trash2","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Delete"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This action immediately invalidates the key and prevents it from being used again."}),"\n",(0,s.jsx)(n.h2,{id:"component-api-keys",children:"Component API keys"}),"\n",(0,s.jsx)(n.p,{children:"Component API keys authorize access to external services that are called by components in your flows, such as model providers, databases, or third-party APIs.\nThese aren't Langflow API keys or general application credentials."}),"\n",(0,s.jsxs)(n.p,{children:["In Langflow, you can store component API keys in global variables in your ",(0,s.jsx)(n.strong,{children:"Settings"})," or import them from your Langflow ",(0,s.jsx)(n.code,{children:".env"})," file.\nWhen creating global variables, use the ",(0,s.jsx)(n.strong,{children:"Credential"})," type for secure handling of sensitive information.\nFor more information, see ",(0,s.jsx)(n.a,{href:"/configuration-global-variables",children:"Global variables"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"You create and manage component API keys within the service provider's platform.\nLangflow only stores the encrypted key value or a secure reference to a key stored elsewhere; it doesn't manage the actual credentials at the source.\nThis means that deleting a global variable from Langflow doesn't delete or invalidate the actual API key in the service provider's system.\nYou must delete or rotate component API keys directly using the service provider's interface or API."}),"\n",(0,s.jsx)(n.h2,{id:"authentication-environment-variables",children:"Authentication environment variables"}),"\n",(0,s.jsx)(n.p,{children:"This section describes the available authentication configuration variables."}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/langflow/blob/main/.env.example",children:(0,s.jsx)(n.code,{children:".env.example"})})," file in the Langflow repository as a template for your own ",(0,s.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-auto-login",children:"LANGFLOW_AUTO_LOGIN"}),"\n",(0,s.jsx)(n.p,{children:"This variable controls whether authentication is required to access your Langflow server, including the visual editor and API:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=False"}),", automatic login is disabled. Users must sign in to the visual editor and use a Langflow API key for Langflow API requests.\nIf false, you must also set ",(0,s.jsxs)(n.a,{href:"#langflow-superuser",children:[(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"}),", Langflow bypasses authentication for the visual editor and API requests.\nAll users can access the same environment without password protection.\nIf you don't have user management enabled, all users are effectively superusers."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Langflow doesn't allow users to simultaneously edit the same flow in real time.\nIf two users edit the same flow, Langflow saves only the work of the most recent editor based on the state of that user's ",(0,s.jsx)(n.a,{href:"/concepts-overview#workspace",children:"workspace"}),". Any changes made by the other user in the interim are overwritten."]}),"\n",(0,s.jsx)(n.h4,{id:"auto_login-and-api-authentication-in-version-15-and-later",children:"AUTO_LOGIN and API authentication in version 1.5 and later"}),"\n",(0,s.jsxs)(n.p,{children:["In Langflow versions 1.5 and later, most API endpoints require a Langflow API key, even when ",(0,s.jsx)(n.code,{children:"AUTO_LOGIN"})," is true.\nThe only exceptions are the MCP endpoints ",(0,s.jsx)(n.code,{children:"/v1/mcp"}),", ",(0,s.jsx)(n.code,{children:"/v1/mcp-projects"}),", and ",(0,s.jsx)(n.code,{children:"/v2/mcp"}),", which never require authentication."]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:"LANGFLOW_AUTO_LOGIN and LANGFLOW_SKIP_AUTH_AUTO_LOGIN options"}),(0,s.jsxs)(n.p,{children:["In Langflow versions earlier than 1.5, if ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"}),", then Langflow automatically logs users in as a superuser without requiring authentication.\nIn this case, API requests don't require a Langflow API key."]}),(0,s.jsxs)(n.p,{children:["In Langflow version 1.5, you can set ",(0,s.jsx)(n.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN=True"})," ",(0,s.jsx)(n.em,{children:"and"})," ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"})," to skip authentication for API requests ",(0,s.jsx)(n.em,{children:"and"})," allow automatic login as a superuser for all users.\nThis is a temporary bypass for backwards compatibility, and the ",(0,s.jsx)(n.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN"})," option will be removed in a future release."]}),(0,s.jsxs)(n.p,{children:["If either ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," or ",(0,s.jsx)(n.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN"})," are false, then authentication is required."]})]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-enable-superuser-cli",children:"LANGFLOW_ENABLE_SUPERUSER_CLI"}),"\n",(0,s.jsxs)(n.p,{children:["Controls the availability of the ",(0,s.jsx)(n.code,{children:"langflow superuser"})," command in the Langflow CLI.\nThe default is true, but false is recommended to prevent unrestricted superuser creation.\nFor more information, see ",(0,s.jsx)(n.a,{href:"/configuration-cli#langflow-superuser",children:(0,s.jsx)(n.code,{children:"langflow superuser"})}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-superuser",children:"LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD"}),"\n",(0,s.jsx)(n.p,{children:"These variables specify the username and password for the Langflow server's superuser."}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_SUPERUSER=administrator",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=securepassword",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["They are required if ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=False"}),".\nOtherwise, they aren't relevant."]}),"\n",(0,s.jsxs)(n.p,{children:["If required and not set in when you ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"start a Langflow server with authentication enabled"}),", then the default values are ",(0,s.jsx)(n.code,{children:"langflow"})," and ",(0,s.jsx)(n.code,{children:"langflow"})," for system auto-login behavior.\nThese defaults don't apply when using the Langflow CLI command ",(0,s.jsx)(n.a,{href:"/configuration-cli#langflow-superuser",children:(0,s.jsx)(n.code,{children:"langflow superuser"})}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-secret-key",children:"LANGFLOW_SECRET_KEY"}),"\n",(0,s.jsxs)(n.p,{children:["This environment variable stores a secret key used for encrypting sensitive data like API keys.\nLangflow uses the ",(0,s.jsx)(n.a,{href:"https://pypi.org/project/cryptography/",children:"Fernet"})," library for secret key encryption."]}),"\n",(0,s.jsx)(n.p,{children:"If no secret key is provided, Langflow automatically generates one."}),"\n",(0,s.jsx)(n.p,{children:"However, you should generate and explicitly set your own key in production environments.\nThis is particularly important for multi-instance deployments like Kubernetes to ensure consistent encryption across instances."}),"\n",(0,s.jsxs)(n.p,{children:["To generate a secret encryption key for ",(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"}),", do the following:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the command to generate and copy a secret to the clipboard."}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"unix",label:"macOS or Linux",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"macOS"}),": Generate a secret key and copy it to the clipboard:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python3 ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\" ",props:{style:{color:"#A5D6FF"}}},{content:"| ",props:{style:{color:"#FF7B72"}}},{content:"pbcopy",props:{style:{color:"#FFA657"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Linux"}),": Generate a secret key and copy it to the clipboard:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python3 ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\" ",props:{style:{color:"#A5D6FF"}}},{content:"| ",props:{style:{color:"#FF7B72"}}},{content:"xclip ",props:{style:{color:"#FFA657"}}},{content:"-selection ",props:{style:{color:"#79C0FF"}}},{content:"clipboard",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Unix"}),": Generate a secret key and print it to the terminal to manually copy it:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python3 ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\"",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]})}),(0,s.jsx)(l.A,{value:"windows",label:"Windows",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Generate a secret key and copy it to the clipboard:"}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\"",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Generate a secret key and print it to the terminal to manually copy it:"}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Or just print",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"python ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\"",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]})})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Paste the value into your ",(0,s.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_SECRET_KEY=dBuu...2kM2_fb",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-new-user-is-active",children:"LANGFLOW_NEW_USER_IS_ACTIVE"}),"\n",(0,s.jsxs)(n.p,{children:["When ",(0,s.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE=False"})," (default), a superuser must explicitly activate a new user's account before they can sign in to the visual editor.\nThe superuser can also deactivate a user's account as needed."]}),"\n",(0,s.jsxs)(n.p,{children:["When ",(0,s.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE=True"}),", new user accounts are automatically activated."]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_NEW_USER_IS_ACTIVE=False",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["Only superusers can manage user accounts for a Langflow server, but user management only matters if your server has authentication enabled.\nFor more information, see ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"Start a Langflow server with authentication enabled"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"start-a-langflow-server-with-authentication-enabled",children:"Start a Langflow server with authentication enabled"}),"\n",(0,s.jsxs)(n.p,{children:["This section shows you how to use the ",(0,s.jsx)(n.a,{href:"/api-keys-and-authentication#authentication-environment-variables",children:"authentication environment variables"})," to deploy a Langflow server with authentication enabled.\nThis involves disabling automatic login, setting superuser credentials, generating a secret encryption key, and enabling user management."]}),"\n",(0,s.jsx)(n.p,{children:"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."}),"\n",(0,s.jsxs)(n.p,{children:["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.\nAdditionally, you must sign in as a superuser to manage users and ",(0,s.jsx)(n.a,{href:"#create-a-langflow-api-key",children:"create a Langflow API key"})," with superuser privileges."]}),"\n",(0,s.jsx)(n.h3,{id:"start-the-langflow-server",children:"Start the Langflow server"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Create a ",(0,s.jsx)(n.code,{children:".env"})," file with the following variables:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=",props:{}}]},{tokens:[{content:"LANGFLOW_NEW_USER_IS_ACTIVE=False",props:{}}]},{tokens:[{content:"LANGFLOW_ENABLE_SUPERUSER_CLI=False",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["Your ",(0,s.jsx)(n.code,{children:".env"})," file can have other environment variables.\nThis example focuses on authentication variables."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Set ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," to your desired superuser credentials."]}),"\n",(0,s.jsxs)(n.p,{children:["For a one-time test, you can use basic credentials like ",(0,s.jsx)(n.code,{children:"administrator"})," and ",(0,s.jsx)(n.code,{children:"password"}),".\nStrong, securely-stored credentials are recommended in genuine development and production environments."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Recommended: Generate and set a ",(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})," for encrypting sensitive data."]}),"\n",(0,s.jsx)(n.p,{children:"If you don't set a secret key, Langflow generates one automatically, but this isn't recommended for production environments."}),"\n",(0,s.jsxs)(n.p,{children:["For instructions on generating at setting a secret key, see ",(0,s.jsx)(n.a,{href:"#langflow-secret-key",children:(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Save your ",(0,s.jsx)(n.code,{children:".env"})," file with the populated variables. For example:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=administrator",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=securepassword",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=dBuu...2kM2_fb",props:{}}]},{tokens:[{content:"LANGFLOW_NEW_USER_IS_ACTIVE=False",props:{}}]},{tokens:[{content:"LANGFLOW_ENABLE_SUPERUSER_CLI=False",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start Langflow with the configuration from your ",(0,s.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"uv run langflow run --env-file .env",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["Starting Langflow with an ",(0,s.jsx)(n.code,{children:".env"})," file automatically authenticates you as the superuser set in ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"}),".\nIf you don't explicitly set these variables, the default values are ",(0,s.jsx)(n.code,{children:"langflow"})," and ",(0,s.jsx)(n.code,{children:"langflow"})," for system auto-login."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Verify the server is running. The default location is ",(0,s.jsx)(n.code,{children:"http://localhost:7860"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Next, you can add users to your Langflow server to collaborate with others on flows."}),"\n",(0,s.jsx)(n.h3,{id:"manage-users-as-an-administrator",children:"Manage users as an administrator"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To complete your first-time login as a superuser, go to ",(0,s.jsx)(n.code,{children:"http://localhost:7860/login"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you aren't using the default location, replace ",(0,s.jsx)(n.code,{children:"localhost:7860"})," with your server's address."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Log in with the superuser credentials you set in your ",(0,s.jsx)(n.code,{children:".env"})," (",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"}),")."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To manage users on your server, navigate to ",(0,s.jsx)(n.code,{children:"/admin"}),", such as ",(0,s.jsx)(n.code,{children:"http://localhost:7860/admin"}),", click your profile icon, and then click ",(0,s.jsx)(n.strong,{children:"Admin Page"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"As a superuser, you can add users, set permissions, reset passwords, and delete accounts."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To add a user, click ",(0,s.jsx)(n.strong,{children:"New User"}),", and then complete the user account form:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Enter a username and password."}),"\n",(0,s.jsxs)(n.li,{children:["To activate the account immediately, select ",(0,s.jsx)(n.strong,{children:"Active"}),". Inactive users cannot sign in or access flows they created before becoming inactive."]}),"\n",(0,s.jsxs)(n.li,{children:["Deselect ",(0,s.jsx)(n.strong,{children:"Superuser"})," if you don't want the user to have full administrative privileges."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Save"}),". The new user appears in the ",(0,s.jsx)(n.strong,{children:"Admin Page"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"To test the new user's access, sign out of Langflow, and then sign in with the new user's credentials."}),"\n",(0,s.jsxs)(n.p,{children:["Try to access the ",(0,s.jsx)(n.code,{children:"/admin"})," page.\nYou are redirected to the ",(0,s.jsx)(n.code,{children:"/flows"})," page if the new user isn't a superuser."]}),"\n"]}),"\n"]})]})}function x(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(y,{...e})}):y(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},11470:(e,n,t)=>{t.d(n,{A:()=>L});var o=t(96540),s=t(18215),r=t(23104),a=t(56347),i=t(205),l=t(57485),c=t(31682),d=t(70679);function h(e){return o.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,o.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:o}})=>({value:e,label:n,attributes:t,default:o}))}(t);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,o.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,r=u(e),[a,l]=(0,o.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:r})),[c,h]=f({queryString:t,groupId:s}),[g,y]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,d.Dv)(n);return[t,(0,o.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),x=(()=>{const e=c??g;return p({value:e,tabValues:r})?e:null})();(0,i.A)(()=>{x&&l(x)},[x]);return{selectedValue:a,selectValue:(0,o.useCallback)(e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),y(e)},[h,y,r]),tabValues:r}}var y=t(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var m=t(74848);function v({className:e,block:n,selectedValue:t,selectValue:o,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:l}=(0,r.a_)(),c=e=>{const n=e.currentTarget,s=i.indexOf(n),r=a[s].value;r!==t&&(l(n),o(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,m.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:o})=>(0,m.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:c,...o,className:(0,s.A)("tabs__item",x.tabItem,o?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function j({lazy:e,children:n,selectedValue:t}){const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===t);return e?(0,o.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,m.jsx)("div",{className:"margin-top--md",children:r.map((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=g(e);return(0,m.jsxs)("div",{className:(0,s.A)("tabs-container",x.tabList),children:[(0,m.jsx)(v,{...n,...e}),(0,m.jsx)(j,{...n,...e})]})}function L(e){const n=(0,y.A)();return(0,m.jsx)(w,{...e,children:h(e.children)},String(n))}},17886:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(64058),s=t(74848);function r({name:e,...n}){const t=o[e];return t?(0,s.jsx)(t,{...n}):null}},19365:(e,n,t)=>{t.d(n,{A:()=>a});t(96540);var o=t(18215);const s={tabItem:"tabItem_Ymn6"};var r=t(74848);function a({children:e,hidden:n,className:t}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,o.A)(s.tabItem,t),hidden:n,children:e})}}}]); \ No newline at end of file +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[692],{10734:(e,n,t)=>{t.r(n),t.d(n,{CH:()=>p,assets:()=>u,chCodeConfig:()=>f,contentTitle:()=>h,default:()=>x,frontMatter:()=>d,metadata:()=>o,toc:()=>g});const o=JSON.parse('{"id":"Configuration/api-keys-and-authentication","title":"API keys and authentication","description":"Never expose Langflow ports directly to the internet without proper security measures.","source":"@site/docs/Configuration/api-keys-and-authentication.mdx","sourceDirName":"Configuration","slug":"/api-keys-and-authentication","permalink":"/api-keys-and-authentication","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"API keys and authentication","slug":"/api-keys-and-authentication"},"sidebar":"docs","previous":{"title":"Connect an Astra DB MCP server to Langflow","permalink":"/mcp-component-astra"},"next":{"title":"Install custom dependencies","permalink":"/install-custom-dependencies"}}');var s=t(74848),r=t(28453),a=t(24754),i=t(11470),l=t(19365),c=t(17886);const d={title:"API keys and authentication",slug:"/api-keys-and-authentication"},h=void 0,u={},p={annotations:a.hk,Code:a.Cy},f={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},g=[{value:"Langflow API keys",id:"langflow-api-keys",level:2},{value:"Langflow API key permissions",id:"langflow-api-key-permissions",level:3},{value:"Create a Langflow API key",id:"create-a-langflow-api-key",level:3},{value:"Use a Langflow API key",id:"use-a-langflow-api-key",level:3},{value:"Revoke an API key",id:"revoke-an-api-key",level:3},{value:"Component API keys",id:"component-api-keys",level:2},{value:"Authentication environment variables",id:"authentication-environment-variables",level:2},{value:"LANGFLOW_AUTO_LOGIN",id:"langflow-auto-login",level:3},{value:"AUTO_LOGIN and API authentication in version 1.5 and later",id:"auto_login-and-api-authentication-in-version-15-and-later",level:4},{value:"LANGFLOW_ENABLE_SUPERUSER_CLI",id:"langflow-enable-superuser-cli",level:3},{value:"LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD",id:"langflow-superuser",level:3},{value:"LANGFLOW_SECRET_KEY",id:"langflow-secret-key",level:3},{value:"LANGFLOW_NEW_USER_IS_ACTIVE",id:"langflow-new-user-is-active",level:3},{value:"Start a Langflow server with authentication enabled",id:"start-a-langflow-server-with-authentication-enabled",level:2},{value:"Start the Langflow server",id:"start-the-langflow-server",level:3},{value:"Manage users as an administrator",id:"manage-users-as-an-administrator",level:3}];function y(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:t}=n;return p||m("CH",!1),p.Code||m("CH.Code",!0),t||m("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(n.admonition,{type:"warning",children:(0,s.jsxs)(n.p,{children:["Never expose Langflow ports directly to the internet without proper security measures.\nSet ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=False"}),", use a non-default ",(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"}),", and deploy your Langflow server behind a reverse proxy with authentication enabled.\nFor more information, see ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"Start a Langflow server with authentication enabled"}),"."]})}),"\n",(0,s.jsx)(n.p,{children:"Authentication credentials help prevent unauthorized access to your Langflow server, flows, and services connected through components."}),"\n",(0,s.jsx)(n.p,{children:"There are three types of credentials that you use in Langflow:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#langflow-api-keys",children:"Langflow API keys"}),": For authentication with the Langflow API and authorizing server-side Langflow actions like running flows and uploading files."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#component-api-keys",children:"Component API keys"}),": For authentication between Langflow and a service connected through a component, such as a model provider or third-party API."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"#authentication-environment-variables",children:"Authentication environment variables"}),": These environment variables configure how Langflow handles user authentication and authorization."]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-api-keys",children:"Langflow API keys"}),"\n",(0,s.jsx)(n.p,{children:"You can use Langflow API keys to interact with Langflow programmatically."}),"\n",(0,s.jsxs)(n.p,{children:["In Langflow version 1.5 and later, most API endpoints require a Langflow API key, even when ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," is ",(0,s.jsx)(n.code,{children:"True"}),".\nFor more information, see ",(0,s.jsx)(n.a,{href:"#langflow-auto-login",children:(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-api-key-permissions",children:"Langflow API key permissions"}),"\n",(0,s.jsx)(n.p,{children:"A Langflow API key adopts the privileges of the user who created it.\nThis means that API keys you create have the same permissions and access that you do, including access to your flows, components, and Langflow database.\nA Langflow API key cannot be used to access resources outside of your own Langflow server."}),"\n",(0,s.jsx)(n.p,{children:"In single-user environments, you are always a superuser, and your Langflow API keys always have superuser privileges."}),"\n",(0,s.jsxs)(n.p,{children:["In multi-user environments, users who aren't superusers cannot use their API keys to access other users' resources.\nYou must ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"start your Langflow server with authentication enabled"})," to allow user management and creation of non-superuser accounts."]}),"\n",(0,s.jsx)(n.h3,{id:"create-a-langflow-api-key",children:"Create a Langflow API key"}),"\n",(0,s.jsxs)(n.p,{children:["You can generate a Langflow API key in your Langflow ",(0,s.jsx)(n.strong,{children:"Settings"})," or with the Langflow CLI."]}),"\n",(0,s.jsxs)(n.p,{children:["The CLI option is required if your Langflow server is running in ",(0,s.jsx)(n.code,{children:"--backend-only"})," mode."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"settings",label:"Langflow Settings",default:!0,children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Langflow header, click your profile icon, and then select ",(0,s.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Langflow API Keys"}),", and then click ",(0,s.jsx)(n.strong,{children:"Add New"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Name your key, and then click ",(0,s.jsx)(n.strong,{children:"Create API Key"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Copy the API key and store it securely."}),"\n"]})}),(0,s.jsxs)(l.A,{value:"Langflow CLI",label:"Langflow CLI",children:[(0,s.jsxs)(n.p,{children:["If you're serving your flow with ",(0,s.jsx)(n.code,{children:"--backend-only=true"}),", you can't create API keys in your Langflow ",(0,s.jsx)(n.strong,{children:"Settings"})," because the frontend isn't running.\nIn this case, you must create API keys with the Langflow CLI."]}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Recommended: ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"Start your Langflow server with authentication enabled"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"This configuration is recommended for security reasons to prevent unauthorized API key and superuser creation, especially in production environments."}),"\n",(0,s.jsxs)(n.p,{children:["However, if authentication isn't enabled (",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"}),"), all users are effectively superusers, and they can create API keys with the Langflow CLI."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Create an API key with ",(0,s.jsx)(n.a,{href:"/configuration-cli#langflow-api-key",children:(0,s.jsx)(n.code,{children:"langflow api-key"})}),":"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"uv ",props:{style:{color:"#FFA657"}}},{content:"run langflow api-key",props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"All API keys created with the Langflow CLI have superuser privileges because the command requires superuser authentication, and Langflow API keys adopt the privileges of the user who created them."}),"\n"]}),"\n"]})]})]}),"\n",(0,s.jsx)(n.h3,{id:"use-a-langflow-api-key",children:"Use a Langflow API key"}),"\n",(0,s.jsxs)(n.p,{children:["To authenticate Langflow API requests, pass your Langflow API key an ",(0,s.jsx)(n.code,{children:"x-api-key"})," header or query parameter."]}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"header",label:"HTTP header",default:!0,children:(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:"POST ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:' "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_ADDRESS",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/run/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:'?stream=false" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:'"Content-Type: application/json" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:'"x-api-key: ',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_API_KEY",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -d ",props:{style:{color:"#79C0FF"}}},{content:'\'{"inputs": {"text":""}, "tweaks": {}}\'',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]})}),(0,s.jsx)(l.A,{value:"parameter",label:"Query parameter",children:(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:"POST ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:' "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_ADDRESS",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/run/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:"?x-api-key=",props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_API_KEY",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:'"Content-Type: application/json" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -d ",props:{style:{color:"#79C0FF"}}},{content:'\'{"inputs": {"text":""}, "tweaks": {}}\'',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]})})]}),"\n",(0,s.jsxs)(n.p,{children:["For more information about forming Langflow API requests, see ",(0,s.jsx)(n.a,{href:"/api-reference-api-examples",children:"Get started with the Langflow API"})," and ",(0,s.jsx)(n.a,{href:"/concepts-publish",children:"Trigger flows with the Langflow API"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"revoke-an-api-key",children:"Revoke an API key"}),"\n",(0,s.jsx)(n.p,{children:"To revoke and delete an API key, do the following:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Langflow header, click your profile icon, and then select ",(0,s.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Langflow API Keys"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Select the keys you want to delete, and then click ",(0,s.jsx)(c.A,{name:"Trash2","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Delete"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"This action immediately invalidates the key and prevents it from being used again."}),"\n",(0,s.jsx)(n.h2,{id:"component-api-keys",children:"Component API keys"}),"\n",(0,s.jsx)(n.p,{children:"Component API keys authorize access to external services that are called by components in your flows, such as model providers, databases, or third-party APIs.\nThese aren't Langflow API keys or general application credentials."}),"\n",(0,s.jsxs)(n.p,{children:["In Langflow, you can store component API keys in global variables in your ",(0,s.jsx)(n.strong,{children:"Settings"})," or import them from your Langflow ",(0,s.jsx)(n.code,{children:".env"})," file.\nWhen creating global variables, use the ",(0,s.jsx)(n.strong,{children:"Credential"})," type for secure handling of sensitive information.\nFor more information, see ",(0,s.jsx)(n.a,{href:"/configuration-global-variables",children:"Global variables"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"You create and manage component API keys within the service provider's platform.\nLangflow only stores the encrypted key value or a secure reference to a key stored elsewhere; it doesn't manage the actual credentials at the source.\nThis means that deleting a global variable from Langflow doesn't delete or invalidate the actual API key in the service provider's system.\nYou must delete or rotate component API keys directly using the service provider's interface or API."}),"\n",(0,s.jsx)(n.h2,{id:"authentication-environment-variables",children:"Authentication environment variables"}),"\n",(0,s.jsx)(n.p,{children:"This section describes the available authentication configuration variables."}),"\n",(0,s.jsxs)(n.p,{children:["You can use the ",(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/langflow/blob/main/.env.example",children:(0,s.jsx)(n.code,{children:".env.example"})})," file in the Langflow repository as a template for your own ",(0,s.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-auto-login",children:"LANGFLOW_AUTO_LOGIN"}),"\n",(0,s.jsx)(n.p,{children:"This variable controls whether authentication is required to access your Langflow server, including the visual editor and API:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=False"}),", automatic login is disabled. Users must sign in to the visual editor and use a Langflow API key for Langflow API requests.\nIf false, you must also set ",(0,s.jsxs)(n.a,{href:"#langflow-superuser",children:[(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["If ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"}),", Langflow bypasses authentication for the visual editor and API requests.\nAll users can access the same environment without password protection.\nIf you don't have user management enabled, all users are effectively superusers."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["Langflow doesn't allow users to simultaneously edit the same flow in real time.\nIf two users edit the same flow, Langflow saves only the work of the most recent editor based on the state of that user's ",(0,s.jsx)(n.a,{href:"/concepts-overview#workspace",children:"workspace"}),". Any changes made by the other user in the interim are overwritten."]}),"\n",(0,s.jsx)(n.h4,{id:"auto_login-and-api-authentication-in-version-15-and-later",children:"AUTO_LOGIN and API authentication in version 1.5 and later"}),"\n",(0,s.jsxs)(n.p,{children:["In Langflow versions 1.5 and later, most API endpoints require a Langflow API key, even when ",(0,s.jsx)(n.code,{children:"AUTO_LOGIN"})," is true.\nThe only exceptions are the MCP endpoints ",(0,s.jsx)(n.code,{children:"/v1/mcp"}),", ",(0,s.jsx)(n.code,{children:"/v1/mcp-projects"}),", and ",(0,s.jsx)(n.code,{children:"/v2/mcp"}),", which never require authentication."]}),"\n",(0,s.jsxs)(t,{children:[(0,s.jsx)("summary",{children:"LANGFLOW_AUTO_LOGIN and LANGFLOW_SKIP_AUTH_AUTO_LOGIN options"}),(0,s.jsxs)(n.p,{children:["In Langflow versions earlier than 1.5, if ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"}),", then Langflow automatically logs users in as a superuser without requiring authentication.\nIn this case, API requests don't require a Langflow API key."]}),(0,s.jsxs)(n.p,{children:["In Langflow version 1.5, you can set ",(0,s.jsx)(n.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN=True"})," ",(0,s.jsx)(n.em,{children:"and"})," ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=True"})," to skip authentication for API requests ",(0,s.jsx)(n.em,{children:"and"})," allow automatic login as a superuser for all users.\nThis is a temporary bypass for backwards compatibility, and the ",(0,s.jsx)(n.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN"})," option will be removed in a future release."]}),(0,s.jsxs)(n.p,{children:["If either ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," or ",(0,s.jsx)(n.code,{children:"LANGFLOW_SKIP_AUTH_AUTO_LOGIN"})," are false, then authentication is required."]})]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-enable-superuser-cli",children:"LANGFLOW_ENABLE_SUPERUSER_CLI"}),"\n",(0,s.jsxs)(n.p,{children:["Controls the availability of the ",(0,s.jsx)(n.code,{children:"langflow superuser"})," command in the Langflow CLI.\nThe default is true, but false is recommended to prevent unrestricted superuser creation.\nFor more information, see ",(0,s.jsx)(n.a,{href:"/configuration-cli#langflow-superuser",children:(0,s.jsx)(n.code,{children:"langflow superuser"})}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-superuser",children:"LANGFLOW_SUPERUSER and LANGFLOW_SUPERUSER_PASSWORD"}),"\n",(0,s.jsx)(n.p,{children:"These variables specify the username and password for the Langflow server's superuser."}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_SUPERUSER=administrator",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=securepassword",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["They are required if ",(0,s.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN=False"}),".\nOtherwise, they aren't relevant."]}),"\n",(0,s.jsxs)(n.p,{children:["If required and not set in when you ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"start a Langflow server with authentication enabled"}),", then the default values are ",(0,s.jsx)(n.code,{children:"langflow"})," and ",(0,s.jsx)(n.code,{children:"langflow"})," for system auto-login behavior.\nThese defaults don't apply when using the Langflow CLI command ",(0,s.jsx)(n.a,{href:"/configuration-cli#langflow-superuser",children:(0,s.jsx)(n.code,{children:"langflow superuser"})}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-secret-key",children:"LANGFLOW_SECRET_KEY"}),"\n",(0,s.jsxs)(n.p,{children:["This environment variable stores a secret key used for encrypting sensitive data like API keys.\nLangflow uses the ",(0,s.jsx)(n.a,{href:"https://pypi.org/project/cryptography/",children:"Fernet"})," library for secret key encryption."]}),"\n",(0,s.jsx)(n.p,{children:"If no secret key is provided, Langflow automatically generates one."}),"\n",(0,s.jsx)(n.p,{children:"However, you should generate and explicitly set your own key in production environments.\nThis is particularly important for multi-instance deployments like Kubernetes to ensure consistent encryption across instances."}),"\n",(0,s.jsxs)(n.p,{children:["To generate a secret encryption key for ",(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"}),", do the following:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Run the command to generate and copy a secret to the clipboard."}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(l.A,{value:"unix",label:"macOS or Linux",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"macOS"}),": Generate a secret key and copy it to the clipboard:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python3 ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\" ",props:{style:{color:"#A5D6FF"}}},{content:"| ",props:{style:{color:"#FF7B72"}}},{content:"pbcopy",props:{style:{color:"#FFA657"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Linux"}),": Generate a secret key and copy it to the clipboard:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python3 ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\" ",props:{style:{color:"#A5D6FF"}}},{content:"| ",props:{style:{color:"#FF7B72"}}},{content:"xclip ",props:{style:{color:"#FFA657"}}},{content:"-selection ",props:{style:{color:"#79C0FF"}}},{content:"clipboard",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Unix"}),": Generate a secret key and print it to the terminal to manually copy it:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python3 ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\"",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]})}),(0,s.jsx)(l.A,{value:"windows",label:"Windows",children:(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Generate a secret key and copy it to the clipboard:"}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"python ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\"",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Generate a secret key and print it to the terminal to manually copy it:"}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Or just print",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"python ",props:{style:{color:"#FFA657"}}},{content:"-c ",props:{style:{color:"#79C0FF"}}},{content:"\"from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')\"",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]})})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Paste the value into your ",(0,s.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_SECRET_KEY=dBuu...2kM2_fb",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-new-user-is-active",children:"LANGFLOW_NEW_USER_IS_ACTIVE"}),"\n",(0,s.jsxs)(n.p,{children:["When ",(0,s.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE=False"})," (default), a superuser must explicitly activate a new user's account before they can sign in to the visual editor.\nThe superuser can also deactivate a user's account as needed."]}),"\n",(0,s.jsxs)(n.p,{children:["When ",(0,s.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE=True"}),", new user accounts are automatically activated."]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_NEW_USER_IS_ACTIVE=False",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["Only superusers can manage user accounts for a Langflow server, but user management only matters if your server has authentication enabled.\nFor more information, see ",(0,s.jsx)(n.a,{href:"#start-a-langflow-server-with-authentication-enabled",children:"Start a Langflow server with authentication enabled"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"start-a-langflow-server-with-authentication-enabled",children:"Start a Langflow server with authentication enabled"}),"\n",(0,s.jsxs)(n.p,{children:["This section shows you how to use the ",(0,s.jsx)(n.a,{href:"/api-keys-and-authentication#authentication-environment-variables",children:"authentication environment variables"})," to deploy a Langflow server with authentication enabled.\nThis involves disabling automatic login, setting superuser credentials, generating a secret encryption key, and enabling user management."]}),"\n",(0,s.jsx)(n.p,{children:"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."}),"\n",(0,s.jsxs)(n.p,{children:["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.\nAdditionally, you must sign in as a superuser to manage users and ",(0,s.jsx)(n.a,{href:"#create-a-langflow-api-key",children:"create a Langflow API key"})," with superuser privileges."]}),"\n",(0,s.jsx)(n.h3,{id:"start-the-langflow-server",children:"Start the Langflow server"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Create a ",(0,s.jsx)(n.code,{children:".env"})," file with the following variables:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=",props:{}}]},{tokens:[{content:"LANGFLOW_NEW_USER_IS_ACTIVE=False",props:{}}]},{tokens:[{content:"LANGFLOW_ENABLE_SUPERUSER_CLI=False",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["Your ",(0,s.jsx)(n.code,{children:".env"})," file can have other environment variables.\nThis example focuses on authentication variables."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Set ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," to your desired superuser credentials."]}),"\n",(0,s.jsxs)(n.p,{children:["For a one-time test, you can use basic credentials like ",(0,s.jsx)(n.code,{children:"administrator"})," and ",(0,s.jsx)(n.code,{children:"password"}),".\nStrong, securely-stored credentials are recommended in genuine development and production environments."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Recommended: Generate and set a ",(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})," for encrypting sensitive data."]}),"\n",(0,s.jsx)(n.p,{children:"If you don't set a secret key, Langflow generates one automatically, but this isn't recommended for production environments."}),"\n",(0,s.jsxs)(n.p,{children:["For instructions on generating at setting a secret key, see ",(0,s.jsx)(n.a,{href:"#langflow-secret-key",children:(0,s.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Save your ",(0,s.jsx)(n.code,{children:".env"})," file with the populated variables. For example:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"LANGFLOW_AUTO_LOGIN=False",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER=administrator",props:{}}]},{tokens:[{content:"LANGFLOW_SUPERUSER_PASSWORD=securepassword",props:{}}]},{tokens:[{content:"LANGFLOW_SECRET_KEY=dBuu...2kM2_fb",props:{}}]},{tokens:[{content:"LANGFLOW_NEW_USER_IS_ACTIVE=False",props:{}}]},{tokens:[{content:"LANGFLOW_ENABLE_SUPERUSER_CLI=False",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Start Langflow with the configuration from your ",(0,s.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,s.jsx)(p.Code,{codeConfig:f,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"uv run langflow run --env-file .env",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["Starting Langflow with a ",(0,s.jsx)(n.code,{children:".env"})," file automatically authenticates you as the superuser set in ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"}),".\nIf you don't explicitly set these variables, the default values are ",(0,s.jsx)(n.code,{children:"langflow"})," and ",(0,s.jsx)(n.code,{children:"langflow"})," for system auto-login."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Verify the server is running. The default location is ",(0,s.jsx)(n.code,{children:"http://localhost:7860"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"Next, you can add users to your Langflow server to collaborate with others on flows."}),"\n",(0,s.jsx)(n.h3,{id:"manage-users-as-an-administrator",children:"Manage users as an administrator"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To complete your first-time login as a superuser, go to ",(0,s.jsx)(n.code,{children:"http://localhost:7860/login"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you aren't using the default location, replace ",(0,s.jsx)(n.code,{children:"localhost:7860"})," with your server's address."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Log in with the superuser credentials you set in your ",(0,s.jsx)(n.code,{children:".env"})," (",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,s.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"}),")."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To manage users on your server, navigate to ",(0,s.jsx)(n.code,{children:"/admin"}),", such as ",(0,s.jsx)(n.code,{children:"http://localhost:7860/admin"}),", click your profile icon, and then click ",(0,s.jsx)(n.strong,{children:"Admin Page"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"As a superuser, you can add users, set permissions, reset passwords, and delete accounts."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["To add a user, click ",(0,s.jsx)(n.strong,{children:"New User"}),", and then complete the user account form:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsx)(n.li,{children:"Enter a username and password."}),"\n",(0,s.jsxs)(n.li,{children:["To activate the account immediately, select ",(0,s.jsx)(n.strong,{children:"Active"}),". Inactive users cannot sign in or access flows they created before becoming inactive."]}),"\n",(0,s.jsxs)(n.li,{children:["Deselect ",(0,s.jsx)(n.strong,{children:"Superuser"})," if you don't want the user to have full administrative privileges."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Save"}),". The new user appears in the ",(0,s.jsx)(n.strong,{children:"Admin Page"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"To test the new user's access, sign out of Langflow, and then sign in with the new user's credentials."}),"\n",(0,s.jsxs)(n.p,{children:["Try to access the ",(0,s.jsx)(n.code,{children:"/admin"})," page.\nYou are redirected to the ",(0,s.jsx)(n.code,{children:"/flows"})," page if the new user isn't a superuser."]}),"\n"]}),"\n"]})]})}function x(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(y,{...e})}):y(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},11470:(e,n,t)=>{t.d(n,{A:()=>L});var o=t(96540),s=t(18215),r=t(23104),a=t(56347),i=t(205),l=t(57485),c=t(31682),d=t(70679);function h(e){return o.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,o.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function u(e){const{values:n,children:t}=e;return(0,o.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:t,default:o}})=>({value:e,label:n,attributes:t,default:o}))}(t);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,a.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,o.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function g(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,r=u(e),[a,l]=(0,o.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:r})),[c,h]=f({queryString:t,groupId:s}),[g,y]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,d.Dv)(n);return[t,(0,o.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),x=(()=>{const e=c??g;return p({value:e,tabValues:r})?e:null})();(0,i.A)(()=>{x&&l(x)},[x]);return{selectedValue:a,selectValue:(0,o.useCallback)(e=>{if(!p({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),h(e),y(e)},[h,y,r]),tabValues:r}}var y=t(92303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var m=t(74848);function v({className:e,block:n,selectedValue:t,selectValue:o,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:l}=(0,r.a_)(),c=e=>{const n=e.currentTarget,s=i.indexOf(n),r=a[s].value;r!==t&&(l(n),o(r))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=i.indexOf(e.currentTarget)+1;n=i[t]??i[0];break}case"ArrowLeft":{const t=i.indexOf(e.currentTarget)-1;n=i[t]??i[i.length-1];break}}n?.focus()};return(0,m.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:o})=>(0,m.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:c,...o,className:(0,s.A)("tabs__item",x.tabItem,o?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function j({lazy:e,children:n,selectedValue:t}){const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===t);return e?(0,o.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,m.jsx)("div",{className:"margin-top--md",children:r.map((e,n)=>(0,o.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=g(e);return(0,m.jsxs)("div",{className:(0,s.A)("tabs-container",x.tabList),children:[(0,m.jsx)(v,{...n,...e}),(0,m.jsx)(j,{...n,...e})]})}function L(e){const n=(0,y.A)();return(0,m.jsx)(w,{...e,children:h(e.children)},String(n))}},17886:(e,n,t)=>{t.d(n,{A:()=>r});t(96540);var o=t(64058),s=t(74848);function r({name:e,...n}){const t=o[e];return t?(0,s.jsx)(t,{...n}):null}},19365:(e,n,t)=>{t.d(n,{A:()=>a});t(96540);var o=t(18215);const s={tabItem:"tabItem_Ymn6"};var r=t(74848);function a({children:e,hidden:n,className:t}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,o.A)(s.tabItem,t),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/46d346a5.79a83d87.js b/assets/js/46d346a5.79a83d87.js deleted file mode 100644 index fa1966d9dc..0000000000 --- a/assets/js/46d346a5.79a83d87.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[3094],{11470:(e,t,o)=>{o.d(t,{A:()=>C});var n=o(96540),s=o(18215),r=o(23104),c=o(56347),a=o(205),l=o(57485),i=o(31682),d=o(70679);function p(e){return n.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:t,children:o}=e;return(0,n.useMemo)(()=>{const e=t??function(e){return p(e).map(({props:{value:e,label:t,attributes:o,default:n}})=>({value:e,label:t,attributes:o,default:n}))}(o);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,o])}function u({value:e,tabValues:t}){return t.some(t=>t.value===e)}function m({queryString:e=!1,groupId:t}){const o=(0,c.W6)(),s=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(s),(0,n.useCallback)(e=>{if(!s)return;const t=new URLSearchParams(o.location.search);t.set(s,e),o.replace({...o.location,search:t.toString()})},[s,o])]}function y(e){const{defaultValue:t,queryString:o=!1,groupId:s}=e,r=h(e),[c,l]=(0,n.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!u({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const o=t.find(e=>e.default)??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:r})),[i,p]=m({queryString:o,groupId:s}),[y,x]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[o,s]=(0,d.Dv)(t);return[o,(0,n.useCallback)(e=>{t&&s.set(e)},[t,s])]}({groupId:s}),g=(()=>{const e=i??y;return u({value:e,tabValues:r})?e:null})();(0,a.A)(()=>{g&&l(g)},[g]);return{selectedValue:c,selectValue:(0,n.useCallback)(e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),x(e)},[p,x,r]),tabValues:r}}var x=o(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=o(74848);function f({className:e,block:t,selectedValue:o,selectValue:n,tabValues:c}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,r.a_)(),i=e=>{const t=e.currentTarget,s=a.indexOf(t),r=c[s].value;r!==o&&(l(t),n(r))},d=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const o=a.indexOf(e.currentTarget)+1;t=a[o]??a[0];break}case"ArrowLeft":{const o=a.indexOf(e.currentTarget)-1;t=a[o]??a[a.length-1];break}}t?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},e),children:c.map(({value:e,label:t,attributes:n})=>(0,j.jsx)("li",{role:"tab",tabIndex:o===e?0:-1,"aria-selected":o===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:i,...n,className:(0,s.A)("tabs__item",g.tabItem,n?.className,{"tabs__item--active":o===e}),children:t??e},e))})}function D({lazy:e,children:t,selectedValue:o}){const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===o);return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==o}))})}function b(e){const t=y(e);return(0,j.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,j.jsx)(f,{...t,...e}),(0,j.jsx)(D,{...t,...e})]})}function C(e){const t=(0,x.A)();return(0,j.jsx)(b,{...e,children:p(e.children)},String(t))}},17886:(e,t,o)=>{o.d(t,{A:()=>r});o(96540);var n=o(64058),s=o(74848);function r({name:e,...t}){const o=n[e];return o?(0,s.jsx)(o,{...t}):null}},19365:(e,t,o)=>{o.d(t,{A:()=>c});o(96540);var n=o(18215);const s={tabItem:"tabItem_Ymn6"};var r=o(74848);function c({children:e,hidden:t,className:o}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:t,children:e})}},20892:(e,t,o)=>{o.r(t),o.d(t,{CH:()=>u,assets:()=>h,chCodeConfig:()=>m,contentTitle:()=>p,default:()=>g,frontMatter:()=>d,metadata:()=>n,toc:()=>y});const n=JSON.parse('{"id":"Concepts/data-types","title":"Langflow data types","description":"Langflow components are designed to accept and produce specific types of inputs and outputs.","source":"@site/docs/Concepts/data-types.mdx","sourceDirName":"Concepts","slug":"/data-types","permalink":"/data-types","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Langflow data types","slug":"/data-types"},"sidebar":"docs","previous":{"title":"Telemetry","permalink":"/contributing-telemetry"},"next":{"title":"Use voice mode","permalink":"/concepts-voice-mode"}}');var s=o(74848),r=o(28453),c=o(24754),a=o(11470),l=o(19365),i=o(17886);const d={title:"Langflow data types",slug:"/data-types"},p=void 0,h={},u={annotations:c.hk,Code:c.Cy},m={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},y=[{value:"Data",id:"data",level:2},{value:"Schema and attributes",id:"schema-and-attributes",level:3},{value:"Data structure",id:"data-structure",level:3},{value:"DataFrame",id:"dataframe",level:2},{value:"Schema and attributes",id:"schema-and-attributes-1",level:3},{value:"DataFrame structure",id:"dataframe-structure",level:3},{value:"Embeddings",id:"embeddings",level:2},{value:"LanguageModel",id:"languagemodel",level:2},{value:"Memory",id:"memory",level:2},{value:"Message",id:"message",level:2},{value:"Schema, structure, and attributes",id:"schema-structure-and-attributes",level:3},{value:"Message data in Input and Output components",id:"message-data-in-input-and-output-components",level:3},{value:"Tool",id:"tool",level:2},{value:"Unknown or multiple types",id:"unknown-or-multiple-types",level:2},{value:"View data types in flows",id:"view-data-types-in-flows",level:2},{value:"See also",id:"see-also",level:2}];function x(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:o}=t;return u||j("CH",!1),u.Code||j("CH.Code",!0),o||j("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(t.p,{children:"Langflow components are designed to accept and produce specific types of inputs and outputs.\nInput and output data types define the structure and flow of information between components.\nUnderstanding these structures helps you build applications that provide valid input and correctly anticipate the output format."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"/concepts-components#component-ports",children:"Component ports"})," represent the data types that each component can send and receive.\nSome data types are self-evident from the fields they are attached to; for example, a ",(0,s.jsx)(t.strong,{children:"System Message"})," field accepts ",(0,s.jsx)(t.a,{href:"#message",children:"message data"}),".\n",(0,s.jsx)(t.a,{href:"/concepts-components#port-colors",children:"Port colors"})," also indicate the port's data type.\nFor example ",(0,s.jsx)(t.strong,{children:"Data"})," ports, represented by ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Red data port",style:{color:"#dc2626",fill:"#dc2626"}}),", either accept or emit ",(0,s.jsx)(t.a,{href:"#data",children:"structured data objects"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"When building flows, connect output ports to input ports of the same type (color) to transfer that type of data between two components."}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In the ",(0,s.jsx)(t.a,{href:"/concepts-overview#workspace",children:"workspace"}),", hover over a port to see connection details for that port."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Click a port to filter the ",(0,s.jsx)(t.strong,{children:"Components"})," menu by compatible components."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["If two components have incompatible data types, you can use a processing component like the ",(0,s.jsxs)(t.a,{href:"/components-processing#type-convert",children:[(0,s.jsx)(t.strong,{children:"Type Convert"})," component"]})," to convert the data between components."]}),"\n"]}),"\n"]})}),"\n",(0,s.jsx)(t.h2,{id:"data",children:"Data"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Data"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Red data port",style:{color:"#dc2626",fill:"#dc2626"}})," accept or produce the ",(0,s.jsx)(t.code,{children:"Data"})," type, which is a structured data object, like a JSON payload that you might send to an API.\nThis data type is used to pass key-value pairs between components, such as user profiles, settings, or other structured information."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Data"})," objects include a primary text field, indicated by a ",(0,s.jsx)(t.code,{children:"text_key"}),", and additional metadata."]}),"\n",(0,s.jsx)(t.h3,{id:"schema-and-attributes",children:"Schema and attributes"}),"\n",(0,s.jsxs)(t.p,{children:["The schema is defined in ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/data.py",children:(0,s.jsx)(t.code,{children:"data.py"})}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following attributes are available:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data"}),": A dictionary that stores key-value pairs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"text_key"}),": The key in ",(0,s.jsx)(t.code,{children:"data"})," that is considered the primary text value."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"default_value"}),": Fallback if ",(0,s.jsx)(t.code,{children:"text_key"})," is missing. The default ",(0,s.jsx)(t.code,{children:"text_key"})," is ",(0,s.jsx)(t.code,{children:'"text"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"data-structure",children:"Data structure"}),"\n",(0,s.jsxs)(t.p,{children:["A ",(0,s.jsx)(t.code,{children:"Data"})," object stores key-value pairs within the ",(0,s.jsx)(t.code,{children:".data"})," attribute, where each key is a field name and its value can be any supported data type. ",(0,s.jsx)(t.code,{children:"text_key"})," tells Langflow which key in the data dictionary is the primary text value for that object."]}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"data_obj ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" Data(",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" text_key",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"# Field 1",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" data",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"{ ",props:{style:{color:"#C9D1D9"}}},{content:"# Field 2 (the actual dict)",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Hello world"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" default_value",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:'"" ',props:{style:{color:"#A5D6FF"}}},{content:"# Field 3",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Data"})," objects can be serialized to JSON, created from JSON, or created from other dictionary data.\nHowever, the resulting ",(0,s.jsx)(t.code,{children:"Data"})," object is a structured object with validation and methods, not a plain dictionary."]}),"\n",(0,s.jsx)(t.p,{children:"For example, when serialized into JSON, the previous example becomes the following JSON object:"}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text_key"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "data"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User Profile"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "default_value"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,s.jsx)(t.h2,{id:"dataframe",children:"DataFrame"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"DataFrame"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Pink dataframe port",style:{color:"#ec4899",fill:"#ec4899"}})," accept or produce ",(0,s.jsx)(t.a,{href:"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html",children:"pandas DataFrames"}),", which are similar to the tabular CSV data."]}),"\n",(0,s.jsxs)(t.p,{children:["Use the ",(0,s.jsx)(t.code,{children:"DataFrame"})," type to work with data containing multiple rows or records."]}),"\n",(0,s.jsx)(t.h3,{id:"schema-and-attributes-1",children:"Schema and attributes"}),"\n",(0,s.jsxs)(t.p,{children:["The schema is defined in ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/dataframe.py",children:(0,s.jsx)(t.code,{children:"dataframe.py"})}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following attributes are available:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Full pandas compatibility"}),": All pandas DataFrame methods and functionality are supported"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Langflow integration"}),": Accepts lists of ",(0,s.jsxs)(t.a,{href:"#data",children:[(0,s.jsx)(t.code,{children:"Data"})," objects"]}),", dictionaries, or existing DataFrames."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Convenience methods"}),":"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_data_list()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"add_row()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"add_rows()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_lc_documents()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_data()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_message()"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Text key support"}),": Maintains ",(0,s.jsx)(t.code,{children:"text_key"})," and ",(0,s.jsx)(t.code,{children:"default_value"})," attributes for ",(0,s.jsxs)(t.a,{href:"#data",children:[(0,s.jsx)(t.code,{children:"Data"})," object"]})," compatibility."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"dataframe-structure",children:"DataFrame structure"}),"\n",(0,s.jsx)(t.p,{children:"A DataFrame has a tabular data structure with rows and columns.\nKeys are columns, and each object in the array is a row."}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Alexandra Example"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"34",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"alexandra@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"]",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,s.jsx)(t.p,{children:"When represented as tabular data, the preceding DataFrame object is structured as follows:"}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"| name | age | email |",props:{}}]},{tokens:[{content:"|------|-----|-------|",props:{}}]},{tokens:[{content:"| Charlie Lastname | 28 | charlie.lastname@example.com |",props:{}}]},{tokens:[{content:"| Alexandra Example | 34 | alexandra@example.com |",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsx)(t.h2,{id:"embeddings",children:"Embeddings"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Embeddings"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Emerald embeddings port",style:{color:"#10b981",fill:"#10b981"}})," emit or ingest vector embeddings to support functions like similarity search."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Embeddings"})," data type is used specifically by components that either produce or consume vector embeddings, such as the ",(0,s.jsxs)(t.a,{href:"/components-embedding-models",children:[(0,s.jsx)(t.strong,{children:"Embedding Model"})," components"]})," and ",(0,s.jsxs)(t.a,{href:"/components-vector-stores",children:[(0,s.jsx)(t.strong,{children:"Vector Store"})," components"]}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["For example, ",(0,s.jsx)(t.strong,{children:"Embedding Model"})," components output ",(0,s.jsx)(t.code,{children:"Embeddings"})," data that you can connect to an ",(0,s.jsx)(t.strong,{children:"Embedding"})," input port on a ",(0,s.jsx)(t.strong,{children:"Vector Store"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["For information about the underlying Python classes that produce ",(0,s.jsx)(t.code,{children:"Embeddings"}),", see the ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/text_embedding/",children:"LangChain Embedding models documentation"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"languagemodel",children:"LanguageModel"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"LanguageModel"})," type is a specific data type that can be produced by ",(0,s.jsx)(t.strong,{children:"Language Model"})," components and accepted by components that use an LLM."]}),"\n",(0,s.jsxs)(t.p,{children:["When you change a ",(0,s.jsx)(t.strong,{children:"Language Model"})," component's output type from ",(0,s.jsx)(t.strong,{children:"Model Response"})," to ",(0,s.jsx)(t.strong,{children:"Language Model"}),", the component's output port changes from a ",(0,s.jsx)(t.strong,{children:"Message"})," port to a ",(0,s.jsx)(t.strong,{children:"Language Model"})," port ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Fuchsia language model port",style:{color:"#c026d3",fill:"#c026d3"}}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Then, you connect the outgoing ",(0,s.jsx)(t.strong,{children:"Language Model"})," port to a ",(0,s.jsx)(t.strong,{children:"Language Model"})," input port on a compatible component, such as a ",(0,s.jsx)(t.strong,{children:"Smart Function"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information about using these components in flows and toggling ",(0,s.jsx)(t.code,{children:"LanguageModel"})," output, see ",(0,s.jsxs)(t.a,{href:"/components-models#language-model-output-types",children:[(0,s.jsx)(t.strong,{children:"Language Model"})," components"]}),"."]}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:"LanguageModel is an instance of LangChain ChatModel"}),(0,s.jsxs)(t.p,{children:["Because Langflow is built on LangChain, ",(0,s.jsx)(t.code,{children:"LanguageModel"})," is actually an instance of a ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/concepts/chat_models/",children:"LangChain chat model"})," that uses the configuration parameters set in the originating component."]}),(0,s.jsxs)(t.p,{children:["Often, components produce an instance of an ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/chat/",children:"integrated chat model"})," that is designed to support the specific model provider, such as ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/chat/openai/",children:(0,s.jsx)(t.code,{children:"ChatOpenAI"})})," or ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/chat/anthropic/",children:(0,s.jsx)(t.code,{children:"ChatAnthropic"})}),"."]}),(0,s.jsxs)(t.p,{children:["You can inspect the ",(0,s.jsx)(t.a,{href:"/concepts-components#component-code",children:"component code"})," to see the specific ",(0,s.jsx)(t.code,{children:"Chat"})," instance it produces."]})]}),"\n",(0,s.jsx)(t.h2,{id:"memory",children:"Memory"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Memory"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Orange memory port",style:{color:"#f97316",fill:"#f97316"}})," are used to integrate a ",(0,s.jsx)(t.strong,{children:"Message History"})," component with external chat memory storage."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information, see the ",(0,s.jsxs)(t.a,{href:"/components-helpers#message-history",children:[(0,s.jsx)(t.strong,{children:"Message History"})," component"]}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"message",children:"Message"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Message"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Indigo message port",style:{color:"#4f46e5",fill:"#4f46e5"}})," accept or produce ",(0,s.jsx)(t.code,{children:"Message"})," data, which extends the ",(0,s.jsxs)(t.a,{href:"#data",children:[(0,s.jsx)(t.code,{children:"Data"})," type"]})," with additional fields and methods for text input typically used in chat flows."]}),"\n",(0,s.jsx)(t.p,{children:"This data type is used by many components."}),"\n",(0,s.jsxs)(t.admonition,{type:"tip",children:[(0,s.jsxs)(t.p,{children:["Components that accept or produce ",(0,s.jsx)(t.code,{children:"Message"})," data may not include all attributes in the incoming or outgoing ",(0,s.jsx)(t.code,{children:"Message"})," data.\nAs long as the data is compatible with the ",(0,s.jsx)(t.code,{children:"Message"})," schema, it can be valid."]}),(0,s.jsx)(t.p,{children:"When building flows, focus on the fields shown on each component in the workspace, rather than the data types passed between components.\nThe details of a particular data type are often only relevant when you are debugging a flow or component that isn't producing the expected output."}),(0,s.jsxs)(t.p,{children:["For example, a ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component only requires the content of the ",(0,s.jsx)(t.strong,{children:"Input Text"})," (",(0,s.jsx)(t.code,{children:"input_value"}),") field.\nThe component then constructs a complete ",(0,s.jsx)(t.code,{children:"Message"})," object before passing the data to other components in the flow."]})]}),"\n",(0,s.jsx)(t.h3,{id:"schema-structure-and-attributes",children:"Schema, structure, and attributes"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Message"})," schema is defined in ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/message.py",children:(0,s.jsx)(t.code,{children:"message.py"})}),".\nSome ",(0,s.jsx)(t.code,{children:"Message"})," attributes have their own schema definitions, such as ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/content_block.py",children:(0,s.jsx)(t.code,{children:"content_block.py"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Message"})," data is structured as a JSON object.\nFor example:"]}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Name: Charlie Lastname, Age: 28, Email: charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender_name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "session_id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"some-session-id"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "timestamp"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"2024-06-01T12:00:00Z"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "files"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "content_blocks"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "category"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"message"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:["The attributes included in a specific ",(0,s.jsx)(t.code,{children:"Message"})," object depend on the context, including the component type, flow activity, and whether the message is a query or response.\nSome common attributes include the following:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"text"}),": The main message content."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"sender"}),": Identifies the originator of a chat message as either ",(0,s.jsx)(t.code,{children:"User"})," or ",(0,s.jsx)(t.code,{children:"Language Model"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"sender_name"}),": The display name for the sender. Defaults to ",(0,s.jsx)(t.code,{children:"User"})," or ",(0,s.jsx)(t.code,{children:"Language Model"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"session_id"}),": The chat ",(0,s.jsx)(t.a,{href:"/session-id",children:"session identifier"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"flow_id"}),": The ID of the flow that the message is associated with. ",(0,s.jsx)(t.code,{children:"flow_id"})," and ",(0,s.jsx)(t.code,{children:"session_id"})," are the same if the flow doesn't use custom session IDs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"timestamp"}),": The UTC timestamp that the message was sent."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"files"}),": A list of file paths or images included with the message"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"content_blocks"}),": Container for rich content input, such as text, media, or code. Also contains error message information if the LLM can't process the input."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"category"}),": ",(0,s.jsx)(t.code,{children:'"message"'}),", ",(0,s.jsx)(t.code,{children:'"error"'}),", ",(0,s.jsx)(t.code,{children:'"warning"'}),", or ",(0,s.jsx)(t.code,{children:'"info"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Not all attributes are required, and some components accept message-compatible input, such as raw text input.\nThe strictness depends on the component."}),"\n",(0,s.jsx)(t.h3,{id:"message-data-in-input-and-output-components",children:"Message data in Input and Output components"}),"\n",(0,s.jsxs)(t.p,{children:["In flows with ",(0,s.jsxs)(t.a,{href:"/components-io#chat-io",children:[(0,s.jsx)(t.strong,{children:"Chat Input and Output"})," components"]}),", ",(0,s.jsx)(t.code,{children:"Message"})," data provides a consistent structure for chat interactions, and it is ideal for chatbots, conversational analysis, and other use cases based on a dialogue with an LLM or agent.\nIn these flows, the ",(0,s.jsx)(t.strong,{children:"Playground"})," chat interface prints only the ",(0,s.jsx)(t.code,{children:"Message"})," attributes that are relevant to the conversation, such as ",(0,s.jsx)(t.code,{children:"text"}),", ",(0,s.jsx)(t.code,{children:"files"}),", and error messages from ",(0,s.jsx)(t.code,{children:"content_blocks"}),".\nTo see all ",(0,s.jsx)(t.code,{children:"Message"})," attributes, inspect the message logs in the ",(0,s.jsx)(t.strong,{children:"Playground"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["In flows with ",(0,s.jsxs)(t.a,{href:"/components-io#text-io",children:[(0,s.jsx)(t.strong,{children:"Text Input and Output"})," components"]}),", ",(0,s.jsx)(t.code,{children:"Message"})," data is used to pass simple text strings without the chat-related metadata.\nThese components handle ",(0,s.jsx)(t.code,{children:"Message"})," data as independent text strings, not as part of an ongoing conversation.\nFor this reason, a flow with only ",(0,s.jsx)(t.strong,{children:"Text Input and Output"})," components isn't compatible with the ",(0,s.jsx)(t.strong,{children:"Playground"}),".\nFor more information, see ",(0,s.jsxs)(t.a,{href:"/components-io",children:[(0,s.jsx)(t.strong,{children:"Input and Output"})," components"]}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["When using the Langflow API, the response includes the ",(0,s.jsx)(t.code,{children:"Message"})," object along with other response data from the flow run.\nLangflow API responses can be extremely verbose, so your applications must include code to extract relevant data from the response to return to the user.\nFor an example, see the ",(0,s.jsx)(t.a,{href:"/get-started-quickstart",children:"Langflow quickstart"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, input sent to the input port of input/output components does ",(0,s.jsx)(t.em,{children:"not"})," need to be a complete ",(0,s.jsx)(t.code,{children:"Message"})," object because the component constructs the ",(0,s.jsx)(t.code,{children:"Message"})," object that is then passed to other components in the flow or returned as flow output.\nIn fact, some components shouldn't receive a complete ",(0,s.jsx)(t.code,{children:"Message"})," object because some attributes, like ",(0,s.jsx)(t.code,{children:"timestamp"})," should be added by the component for accuracy."]}),"\n",(0,s.jsx)(t.h2,{id:"tool",children:"Tool"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Tool"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Cyan tool port",style:{color:"#06b6d4",fill:"#06b6d4"}})," connect tools to an ",(0,s.jsx)(t.strong,{children:"Agent"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["Tools can be other components where you enabled ",(0,s.jsx)(t.strong,{children:"Tool Mode"}),", they can be the dedicated ",(0,s.jsx)(t.strong,{children:"MCP Tools"})," component, or they can be other components that only support ",(0,s.jsx)(t.strong,{children:"Tool Mode"}),".\nMultiple tools can be connected to the same ",(0,s.jsx)(t.strong,{children:"Agent"})," component at the same port."]}),"\n",(0,s.jsxs)(t.p,{children:["Functionally, ",(0,s.jsx)(t.code,{children:"Tool"})," data is a LangChain ",(0,s.jsx)(t.code,{children:"StructuredTool"})," object that can be used in agent flows."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information, see ",(0,s.jsx)(t.a,{href:"/agents-tools",children:"Configure tools for agents"})," and ",(0,s.jsx)(t.a,{href:"/mcp-client",children:"Use Langflow as an MCP client"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"unknown-or-multiple-types",children:"Unknown or multiple types"}),"\n",(0,s.jsxs)(t.p,{children:["If a port can accept or produce multiple data types, it is represented by the gray port icon ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Gray unknown port",style:{color:"#9CA3AF",fill:"#9CA3AF"}}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Hover over the port to see the accepted or produced data types."}),"\n",(0,s.jsx)(t.h2,{id:"view-data-types-in-flows",children:"View data types in flows"}),"\n",(0,s.jsxs)(t.p,{children:["In Langflow, you can use ",(0,s.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,s.jsx)(t.strong,{children:"Inspect output"})," to view the output of individual components.\nThis can help you learn about the different data type and debug problems with invalid or malformed inputs and output."]}),"\n",(0,s.jsxs)(t.p,{children:["The following example shows how to inspect the output of a ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component, which can convert ",(0,s.jsx)(t.code,{children:"Message"}),", ",(0,s.jsx)(t.code,{children:"Data"}),", or ",(0,s.jsx)(t.code,{children:"DataFrame"})," input into ",(0,s.jsx)(t.code,{children:"Message"}),", ",(0,s.jsx)(t.code,{children:"Data"}),", or ",(0,s.jsx)(t.code,{children:"DataFrame"})," output:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Create a flow, and then connect a ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component to a ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In the ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component, enter some text for the type converter to process."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["On the ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component, click ",(0,s.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(t.strong,{children:"Run component"}),", and then click ",(0,s.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,s.jsx)(t.strong,{children:"Inspect output"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The default output is ",(0,s.jsx)(t.code,{children:"Message"})," data, which is the same as the input coming from the ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component.\nTo see the ",(0,s.jsx)(t.code,{children:"Message"})," data converted to ",(0,s.jsx)(t.code,{children:"Data"})," or ",(0,s.jsx)(t.code,{children:"DataFrame"}),", change the ",(0,s.jsx)(t.strong,{children:"Output Type"})," on the ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component, and then rerun the component."]}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(l.A,{value:"Message",label:"Message",default:!0,children:(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Input text",props:{}}]}],lang:"text"},annotations:[]}]})}),(0,s.jsx)(l.A,{value:"Data",label:"Data",children:(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "timestamp"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"2025-07-15 20:56:20 UTC"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender_name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "session_id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"a0c7e888-4fd6-4242-b8c8-e761ad690aeb"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "files"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "error"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "edit"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "properties"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text_color"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "background_color"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "edited"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "source"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "display_name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "source"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "icon"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "allow_markdown"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "positive_feedback"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "state"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"complete"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "targets"',props:{style:{color:"#7EE787"}}},{content:": []",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "category"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"message"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "content_blocks"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"9da72da2-efbb-4ccd-90ad-b32429b0418e"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "flow_id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"a0c7e888-4fd6-4242-b8c8-e761ad690aeb"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "duration"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]})}),(0,s.jsx)(l.A,{value:"DataFrame",label:"DataFrame",children:(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"| Field | Value |",props:{}}]},{tokens:[{content:"|-------|-------|",props:{}}]},{tokens:[{content:"| timestamp | 2025-07-15 20:56:11 UTC |",props:{}}]},{tokens:[{content:"| sender | User |",props:{}}]},{tokens:[{content:"| sender_name | User |",props:{}}]},{tokens:[{content:"| session_id | a0c7e888-4fd6-4242-b8c8-e761ad690aeb |",props:{}}]},{tokens:[{content:"| text | (empty) |",props:{}}]},{tokens:[{content:"| files | [] |",props:{}}]},{tokens:[{content:"| error | False |",props:{}}]},{tokens:[{content:"| edit | False |",props:{}}]},{tokens:[{content:"| properties | text_color: '', background_color: '', edited: False, source: {id: None, display_name: None, source: None}, icon: '', allow_markdown: False, positive_feedback: None, state: 'complete', targets: [] |",props:{}}]},{tokens:[{content:"| category | message |",props:{}}]},{tokens:[{content:"| content_blocks | [] |",props:{}}]},{tokens:[{content:"| id | 341686eb-7a39-4b80-a90a-d8bf267815ef |",props:{}}]},{tokens:[{content:"| flow_id | a0c7e888-4fd6-4242-b8c8-e761ad690aeb |",props:{}}]},{tokens:[{content:"| duration | (empty) |",props:{}}]}],lang:"text"},annotations:[]}]})})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/components-custom-components",children:"Custom components"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.pydantic.dev/latest/api/base_model/",children:"Pydantic Models"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html",children:"pandas.DataFrame"})}),"\n"]})]})}function g(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}function j(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/46d346a5.cf5052ec.js b/assets/js/46d346a5.cf5052ec.js new file mode 100644 index 0000000000..8ee1ee4436 --- /dev/null +++ b/assets/js/46d346a5.cf5052ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[3094],{11470:(e,t,o)=>{o.d(t,{A:()=>C});var n=o(96540),s=o(18215),r=o(23104),c=o(56347),a=o(205),l=o(57485),i=o(31682),d=o(70679);function p(e){return n.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:t,children:o}=e;return(0,n.useMemo)(()=>{const e=t??function(e){return p(e).map(({props:{value:e,label:t,attributes:o,default:n}})=>({value:e,label:t,attributes:o,default:n}))}(o);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,o])}function u({value:e,tabValues:t}){return t.some(t=>t.value===e)}function m({queryString:e=!1,groupId:t}){const o=(0,c.W6)(),s=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(s),(0,n.useCallback)(e=>{if(!s)return;const t=new URLSearchParams(o.location.search);t.set(s,e),o.replace({...o.location,search:t.toString()})},[s,o])]}function y(e){const{defaultValue:t,queryString:o=!1,groupId:s}=e,r=h(e),[c,l]=(0,n.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!u({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const o=t.find(e=>e.default)??t[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:t,tabValues:r})),[i,p]=m({queryString:o,groupId:s}),[y,x]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[o,s]=(0,d.Dv)(t);return[o,(0,n.useCallback)(e=>{t&&s.set(e)},[t,s])]}({groupId:s}),g=(()=>{const e=i??y;return u({value:e,tabValues:r})?e:null})();(0,a.A)(()=>{g&&l(g)},[g]);return{selectedValue:c,selectValue:(0,n.useCallback)(e=>{if(!u({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),p(e),x(e)},[p,x,r]),tabValues:r}}var x=o(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var j=o(74848);function f({className:e,block:t,selectedValue:o,selectValue:n,tabValues:c}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,r.a_)(),i=e=>{const t=e.currentTarget,s=a.indexOf(t),r=c[s].value;r!==o&&(l(t),n(r))},d=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const o=a.indexOf(e.currentTarget)+1;t=a[o]??a[0];break}case"ArrowLeft":{const o=a.indexOf(e.currentTarget)-1;t=a[o]??a[a.length-1];break}}t?.focus()};return(0,j.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},e),children:c.map(({value:e,label:t,attributes:n})=>(0,j.jsx)("li",{role:"tab",tabIndex:o===e?0:-1,"aria-selected":o===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:i,...n,className:(0,s.A)("tabs__item",g.tabItem,n?.className,{"tabs__item--active":o===e}),children:t??e},e))})}function D({lazy:e,children:t,selectedValue:o}){const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===o);return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,j.jsx)("div",{className:"margin-top--md",children:r.map((e,t)=>(0,n.cloneElement)(e,{key:t,hidden:e.props.value!==o}))})}function b(e){const t=y(e);return(0,j.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,j.jsx)(f,{...t,...e}),(0,j.jsx)(D,{...t,...e})]})}function C(e){const t=(0,x.A)();return(0,j.jsx)(b,{...e,children:p(e.children)},String(t))}},17886:(e,t,o)=>{o.d(t,{A:()=>r});o(96540);var n=o(64058),s=o(74848);function r({name:e,...t}){const o=n[e];return o?(0,s.jsx)(o,{...t}):null}},19365:(e,t,o)=>{o.d(t,{A:()=>c});o(96540);var n=o(18215);const s={tabItem:"tabItem_Ymn6"};var r=o(74848);function c({children:e,hidden:t,className:o}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,o),hidden:t,children:e})}},20892:(e,t,o)=>{o.r(t),o.d(t,{CH:()=>u,assets:()=>h,chCodeConfig:()=>m,contentTitle:()=>p,default:()=>g,frontMatter:()=>d,metadata:()=>n,toc:()=>y});const n=JSON.parse('{"id":"Concepts/data-types","title":"Langflow data types","description":"Langflow components are designed to accept and produce specific types of inputs and outputs.","source":"@site/docs/Concepts/data-types.mdx","sourceDirName":"Concepts","slug":"/data-types","permalink":"/data-types","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Langflow data types","slug":"/data-types"},"sidebar":"docs","previous":{"title":"Telemetry","permalink":"/contributing-telemetry"},"next":{"title":"Use voice mode","permalink":"/concepts-voice-mode"}}');var s=o(74848),r=o(28453),c=o(24754),a=o(11470),l=o(19365),i=o(17886);const d={title:"Langflow data types",slug:"/data-types"},p=void 0,h={},u={annotations:c.hk,Code:c.Cy},m={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},y=[{value:"Data",id:"data",level:2},{value:"Schema and attributes",id:"schema-and-attributes",level:3},{value:"DataFrame",id:"dataframe",level:2},{value:"Schema and attributes",id:"schema-and-attributes-1",level:3},{value:"DataFrame structure",id:"dataframe-structure",level:3},{value:"Embeddings",id:"embeddings",level:2},{value:"LanguageModel",id:"languagemodel",level:2},{value:"Memory",id:"memory",level:2},{value:"Message",id:"message",level:2},{value:"Schema, structure, and attributes",id:"schema-structure-and-attributes",level:3},{value:"Message data in Input and Output components",id:"message-data-in-input-and-output-components",level:3},{value:"Tool",id:"tool",level:2},{value:"Unknown or multiple types",id:"unknown-or-multiple-types",level:2},{value:"View data types in flows",id:"view-data-types-in-flows",level:2},{value:"See also",id:"see-also",level:2}];function x(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:o}=t;return u||j("CH",!1),u.Code||j("CH.Code",!0),o||j("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(t.p,{children:"Langflow components are designed to accept and produce specific types of inputs and outputs.\nInput and output data types define the structure and flow of information between components.\nUnderstanding these structures helps you build applications that provide valid input and correctly anticipate the output format."}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.a,{href:"/concepts-components#component-ports",children:"Component ports"})," represent the data types that each component can send and receive.\nSome data types are self-evident from the fields they are attached to; for example, a ",(0,s.jsx)(t.strong,{children:"System Message"})," field accepts ",(0,s.jsx)(t.a,{href:"#message",children:"message data"}),".\n",(0,s.jsx)(t.a,{href:"/concepts-components#port-colors",children:"Port colors"})," also indicate the port's data type.\nFor example ",(0,s.jsx)(t.strong,{children:"Data"})," ports, represented by ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Red data port",style:{color:"#dc2626",fill:"#dc2626"}}),", either accept or emit ",(0,s.jsx)(t.a,{href:"#data",children:"structured data objects"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"When building flows, connect output ports to input ports of the same type (color) to transfer that type of data between two components."}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In the ",(0,s.jsx)(t.a,{href:"/concepts-overview#workspace",children:"workspace"}),", hover over a port to see connection details for that port."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Click a port to filter the ",(0,s.jsx)(t.strong,{children:"Components"})," menu by compatible components."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["If two components have incompatible data types, you can use a processing component like the ",(0,s.jsxs)(t.a,{href:"/components-processing#type-convert",children:[(0,s.jsx)(t.strong,{children:"Type Convert"})," component"]})," to convert the data between components."]}),"\n"]}),"\n"]})}),"\n",(0,s.jsx)(t.h2,{id:"data",children:"Data"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Data"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Red data port",style:{color:"#dc2626",fill:"#dc2626"}})," accept or produce the ",(0,s.jsx)(t.code,{children:"Data"})," type, which is a structured data object, like a JSON payload that you might send to an API.\nThis data type is used to pass key-value pairs between components, such as user profiles, settings, or other structured information."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Data"})," objects include a primary text field, indicated by a ",(0,s.jsx)(t.code,{children:"text_key"}),", and additional metadata."]}),"\n",(0,s.jsx)(t.h3,{id:"schema-and-attributes",children:"Schema and attributes"}),"\n",(0,s.jsxs)(t.p,{children:["The schema is defined in ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/data.py",children:(0,s.jsx)(t.code,{children:"data.py"})}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following attributes are available:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"data"}),": A ",(0,s.jsx)(t.code,{children:"Data"})," object stores key-value pairs within the ",(0,s.jsx)(t.code,{children:".data"})," attribute. This is the ",(0,s.jsx)(t.code,{children:"Data"})," object's core dictionary. Each key is a field name, and the values can be any supported data type."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"text_key"}),": The key in ",(0,s.jsx)(t.code,{children:"data"})," that is considered the primary text value."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"default_value"}),": Fallback if ",(0,s.jsx)(t.code,{children:"text_key"})," is missing. The default ",(0,s.jsx)(t.code,{children:"text_key"})," is ",(0,s.jsx)(t.code,{children:'"text"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"data_obj ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" Data(",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" text_key",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" data",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Hello world"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" default_value",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:'""',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Data"})," objects can be serialized to JSON, created from JSON, or created from other dictionary data.\nHowever, the resulting ",(0,s.jsx)(t.code,{children:"Data"})," object is a structured object with validation and methods, not a plain dictionary.\nFor example, when serialized into JSON, the previous Python example becomes the following JSON object:"]}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text_key"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "data"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Hello world"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "default_value"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,s.jsx)(t.h2,{id:"dataframe",children:"DataFrame"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"DataFrame"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Pink dataframe port",style:{color:"#ec4899",fill:"#ec4899"}})," accept or produce ",(0,s.jsx)(t.a,{href:"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html",children:"pandas DataFrames"}),", which are similar to the tabular CSV data."]}),"\n",(0,s.jsxs)(t.p,{children:["Use the ",(0,s.jsx)(t.code,{children:"DataFrame"})," type to work with data containing multiple rows or records."]}),"\n",(0,s.jsx)(t.h3,{id:"schema-and-attributes-1",children:"Schema and attributes"}),"\n",(0,s.jsxs)(t.p,{children:["The schema is defined in ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/dataframe.py",children:(0,s.jsx)(t.code,{children:"dataframe.py"})}),"."]}),"\n",(0,s.jsx)(t.p,{children:"The following attributes are available:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Full pandas compatibility"}),": All pandas DataFrame methods and functionality are supported"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Langflow integration"}),": Accepts lists of ",(0,s.jsxs)(t.a,{href:"#data",children:[(0,s.jsx)(t.code,{children:"Data"})," objects"]}),", dictionaries, or existing DataFrames."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Convenience methods"}),":"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_data_list()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"add_row()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"add_rows()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_lc_documents()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_data()"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.code,{children:"to_message()"})}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Text key support"}),": Maintains ",(0,s.jsx)(t.code,{children:"text_key"})," and ",(0,s.jsx)(t.code,{children:"default_value"})," attributes for ",(0,s.jsxs)(t.a,{href:"#data",children:[(0,s.jsx)(t.code,{children:"Data"})," object"]})," compatibility."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h3,{id:"dataframe-structure",children:"DataFrame structure"}),"\n",(0,s.jsx)(t.p,{children:"A DataFrame has a tabular data structure with rows and columns.\nKeys are columns, and each object in the array is a row."}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Alexandra Example"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"34",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"alexandra@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"]",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,s.jsx)(t.p,{children:"When represented as tabular data, the preceding DataFrame object is structured as follows:"}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"| name | age | email |",props:{}}]},{tokens:[{content:"|------|-----|-------|",props:{}}]},{tokens:[{content:"| Charlie Lastname | 28 | charlie.lastname@example.com |",props:{}}]},{tokens:[{content:"| Alexandra Example | 34 | alexandra@example.com |",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsx)(t.h2,{id:"embeddings",children:"Embeddings"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Embeddings"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Emerald embeddings port",style:{color:"#10b981",fill:"#10b981"}})," emit or ingest vector embeddings to support functions like similarity search."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Embeddings"})," data type is used specifically by components that either produce or consume vector embeddings, such as the ",(0,s.jsxs)(t.a,{href:"/components-embedding-models",children:[(0,s.jsx)(t.strong,{children:"Embedding Model"})," components"]})," and ",(0,s.jsxs)(t.a,{href:"/components-vector-stores",children:[(0,s.jsx)(t.strong,{children:"Vector Store"})," components"]}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["For example, ",(0,s.jsx)(t.strong,{children:"Embedding Model"})," components output ",(0,s.jsx)(t.code,{children:"Embeddings"})," data that you can connect to an ",(0,s.jsx)(t.strong,{children:"Embedding"})," input port on a ",(0,s.jsx)(t.strong,{children:"Vector Store"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["For information about the underlying Python classes that produce ",(0,s.jsx)(t.code,{children:"Embeddings"}),", see the ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/text_embedding/",children:"LangChain Embedding models documentation"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"languagemodel",children:"LanguageModel"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"LanguageModel"})," type is a specific data type that can be produced by ",(0,s.jsx)(t.strong,{children:"Language Model"})," components and accepted by components that use an LLM."]}),"\n",(0,s.jsxs)(t.p,{children:["When you change a ",(0,s.jsx)(t.strong,{children:"Language Model"})," component's output type from ",(0,s.jsx)(t.strong,{children:"Model Response"})," to ",(0,s.jsx)(t.strong,{children:"Language Model"}),", the component's output port changes from a ",(0,s.jsx)(t.strong,{children:"Message"})," port to a ",(0,s.jsx)(t.strong,{children:"Language Model"})," port ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Fuchsia language model port",style:{color:"#c026d3",fill:"#c026d3"}}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Then, you connect the outgoing ",(0,s.jsx)(t.strong,{children:"Language Model"})," port to a ",(0,s.jsx)(t.strong,{children:"Language Model"})," input port on a compatible component, such as a ",(0,s.jsx)(t.strong,{children:"Smart Function"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information about using these components in flows and toggling ",(0,s.jsx)(t.code,{children:"LanguageModel"})," output, see ",(0,s.jsxs)(t.a,{href:"/components-models#language-model-output-types",children:[(0,s.jsx)(t.strong,{children:"Language Model"})," components"]}),"."]}),"\n",(0,s.jsxs)(o,{children:[(0,s.jsx)("summary",{children:"LanguageModel is an instance of LangChain ChatModel"}),(0,s.jsxs)(t.p,{children:["Because Langflow is built on LangChain, ",(0,s.jsx)(t.code,{children:"LanguageModel"})," is actually an instance of a ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/concepts/chat_models/",children:"LangChain chat model"})," that uses the configuration parameters set in the originating component."]}),(0,s.jsxs)(t.p,{children:["Often, components produce an instance of an ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/chat/",children:"integrated chat model"})," that is designed to support the specific model provider, such as ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/chat/openai/",children:(0,s.jsx)(t.code,{children:"ChatOpenAI"})})," or ",(0,s.jsx)(t.a,{href:"https://python.langchain.com/docs/integrations/chat/anthropic/",children:(0,s.jsx)(t.code,{children:"ChatAnthropic"})}),"."]}),(0,s.jsxs)(t.p,{children:["You can inspect the ",(0,s.jsx)(t.a,{href:"/concepts-components#component-code",children:"component code"})," to see the specific ",(0,s.jsx)(t.code,{children:"Chat"})," instance it produces."]})]}),"\n",(0,s.jsx)(t.h2,{id:"memory",children:"Memory"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Memory"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Orange memory port",style:{color:"#f97316",fill:"#f97316"}})," are used to integrate a ",(0,s.jsx)(t.strong,{children:"Message History"})," component with external chat memory storage."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information, see the ",(0,s.jsxs)(t.a,{href:"/components-helpers#message-history",children:[(0,s.jsx)(t.strong,{children:"Message History"})," component"]}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"message",children:"Message"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Message"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Indigo message port",style:{color:"#4f46e5",fill:"#4f46e5"}})," accept or produce ",(0,s.jsx)(t.code,{children:"Message"})," data, which extends the ",(0,s.jsxs)(t.a,{href:"#data",children:[(0,s.jsx)(t.code,{children:"Data"})," type"]})," with additional fields and methods for text input typically used in chat flows."]}),"\n",(0,s.jsx)(t.p,{children:"This data type is used by many components."}),"\n",(0,s.jsxs)(t.admonition,{type:"tip",children:[(0,s.jsxs)(t.p,{children:["Components that accept or produce ",(0,s.jsx)(t.code,{children:"Message"})," data may not include all attributes in the incoming or outgoing ",(0,s.jsx)(t.code,{children:"Message"})," data.\nAs long as the data is compatible with the ",(0,s.jsx)(t.code,{children:"Message"})," schema, it can be valid."]}),(0,s.jsx)(t.p,{children:"When building flows, focus on the fields shown on each component in the workspace, rather than the data types passed between components.\nThe details of a particular data type are often only relevant when you are debugging a flow or component that isn't producing the expected output."}),(0,s.jsxs)(t.p,{children:["For example, a ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component only requires the content of the ",(0,s.jsx)(t.strong,{children:"Input Text"})," (",(0,s.jsx)(t.code,{children:"input_value"}),") field.\nThe component then constructs a complete ",(0,s.jsx)(t.code,{children:"Message"})," object before passing the data to other components in the flow."]})]}),"\n",(0,s.jsx)(t.h3,{id:"schema-structure-and-attributes",children:"Schema, structure, and attributes"}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.code,{children:"Message"})," schema is defined in ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/message.py",children:(0,s.jsx)(t.code,{children:"message.py"})}),".\nSome ",(0,s.jsx)(t.code,{children:"Message"})," attributes have their own schema definitions, such as ",(0,s.jsx)(t.a,{href:"https://github.com/langflow-ai/langflow/blob/main/src/backend/base/langflow/schema/content_block.py",children:(0,s.jsx)(t.code,{children:"content_block.py"})}),"."]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.code,{children:"Message"})," data is structured as a JSON object.\nFor example:"]}),"\n",(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Name: Charlie Lastname, Age: 28, Email: charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender_name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "session_id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"some-session-id"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "timestamp"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"2024-06-01T12:00:00Z"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "files"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "content_blocks"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "category"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"message"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:["The attributes included in a specific ",(0,s.jsx)(t.code,{children:"Message"})," object depend on the context, including the component type, flow activity, and whether the message is a query or response.\nSome common attributes include the following:"]}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"text"}),": The main message content."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"sender"}),": Identifies the originator of a chat message as either ",(0,s.jsx)(t.code,{children:"User"})," or ",(0,s.jsx)(t.code,{children:"Language Model"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"sender_name"}),": The display name for the sender. Defaults to ",(0,s.jsx)(t.code,{children:"User"})," or ",(0,s.jsx)(t.code,{children:"Language Model"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"session_id"}),": The chat ",(0,s.jsx)(t.a,{href:"/session-id",children:"session identifier"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"flow_id"}),": The ID of the flow that the message is associated with. ",(0,s.jsx)(t.code,{children:"flow_id"})," and ",(0,s.jsx)(t.code,{children:"session_id"})," are the same if the flow doesn't use custom session IDs."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"timestamp"}),": The UTC timestamp that the message was sent."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"files"}),": A list of file paths or images included with the message"]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"content_blocks"}),": Container for rich content input, such as text, media, or code. Also contains error message information if the LLM can't process the input."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"category"}),": ",(0,s.jsx)(t.code,{children:'"message"'}),", ",(0,s.jsx)(t.code,{children:'"error"'}),", ",(0,s.jsx)(t.code,{children:'"warning"'}),", or ",(0,s.jsx)(t.code,{children:'"info"'}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"Not all attributes are required, and some components accept message-compatible input, such as raw text input.\nThe strictness depends on the component."}),"\n",(0,s.jsx)(t.h3,{id:"message-data-in-input-and-output-components",children:"Message data in Input and Output components"}),"\n",(0,s.jsxs)(t.p,{children:["In flows with ",(0,s.jsxs)(t.a,{href:"/components-io#chat-io",children:[(0,s.jsx)(t.strong,{children:"Chat Input and Output"})," components"]}),", ",(0,s.jsx)(t.code,{children:"Message"})," data provides a consistent structure for chat interactions, and it is ideal for chatbots, conversational analysis, and other use cases based on a dialogue with an LLM or agent.\nIn these flows, the ",(0,s.jsx)(t.strong,{children:"Playground"})," chat interface prints only the ",(0,s.jsx)(t.code,{children:"Message"})," attributes that are relevant to the conversation, such as ",(0,s.jsx)(t.code,{children:"text"}),", ",(0,s.jsx)(t.code,{children:"files"}),", and error messages from ",(0,s.jsx)(t.code,{children:"content_blocks"}),".\nTo see all ",(0,s.jsx)(t.code,{children:"Message"})," attributes, inspect the message logs in the ",(0,s.jsx)(t.strong,{children:"Playground"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["In flows with ",(0,s.jsxs)(t.a,{href:"/components-io#text-io",children:[(0,s.jsx)(t.strong,{children:"Text Input and Output"})," components"]}),", ",(0,s.jsx)(t.code,{children:"Message"})," data is used to pass simple text strings without the chat-related metadata.\nThese components handle ",(0,s.jsx)(t.code,{children:"Message"})," data as independent text strings, not as part of an ongoing conversation.\nFor this reason, a flow with only ",(0,s.jsx)(t.strong,{children:"Text Input and Output"})," components isn't compatible with the ",(0,s.jsx)(t.strong,{children:"Playground"}),".\nFor more information, see ",(0,s.jsxs)(t.a,{href:"/components-io",children:[(0,s.jsx)(t.strong,{children:"Input and Output"})," components"]}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["When using the Langflow API, the response includes the ",(0,s.jsx)(t.code,{children:"Message"})," object along with other response data from the flow run.\nLangflow API responses can be extremely verbose, so your applications must include code to extract relevant data from the response to return to the user.\nFor an example, see the ",(0,s.jsx)(t.a,{href:"/get-started-quickstart",children:"Langflow quickstart"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["Additionally, input sent to the input port of input/output components does ",(0,s.jsx)(t.em,{children:"not"})," need to be a complete ",(0,s.jsx)(t.code,{children:"Message"})," object because the component constructs the ",(0,s.jsx)(t.code,{children:"Message"})," object that is then passed to other components in the flow or returned as flow output.\nIn fact, some components shouldn't receive a complete ",(0,s.jsx)(t.code,{children:"Message"})," object because some attributes, like ",(0,s.jsx)(t.code,{children:"timestamp"})," should be added by the component for accuracy."]}),"\n",(0,s.jsx)(t.h2,{id:"tool",children:"Tool"}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.strong,{children:"Tool"})," ports ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Cyan tool port",style:{color:"#06b6d4",fill:"#06b6d4"}})," connect tools to an ",(0,s.jsx)(t.strong,{children:"Agent"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["Tools can be other components where you enabled ",(0,s.jsx)(t.strong,{children:"Tool Mode"}),", they can be the dedicated ",(0,s.jsx)(t.strong,{children:"MCP Tools"})," component, or they can be other components that only support ",(0,s.jsx)(t.strong,{children:"Tool Mode"}),".\nMultiple tools can be connected to the same ",(0,s.jsx)(t.strong,{children:"Agent"})," component at the same port."]}),"\n",(0,s.jsxs)(t.p,{children:["Functionally, ",(0,s.jsx)(t.code,{children:"Tool"})," data is a LangChain ",(0,s.jsx)(t.code,{children:"StructuredTool"})," object that can be used in agent flows."]}),"\n",(0,s.jsxs)(t.p,{children:["For more information, see ",(0,s.jsx)(t.a,{href:"/agents-tools",children:"Configure tools for agents"})," and ",(0,s.jsx)(t.a,{href:"/mcp-client",children:"Use Langflow as an MCP client"}),"."]}),"\n",(0,s.jsx)(t.h2,{id:"unknown-or-multiple-types",children:"Unknown or multiple types"}),"\n",(0,s.jsxs)(t.p,{children:["If a port can accept or produce multiple data types, it is represented by the gray port icon ",(0,s.jsx)(i.A,{name:"Circle",size:"16","aria-label":"Gray unknown port",style:{color:"#9CA3AF",fill:"#9CA3AF"}}),"."]}),"\n",(0,s.jsx)(t.p,{children:"Hover over the port to see the accepted or produced data types."}),"\n",(0,s.jsx)(t.h2,{id:"view-data-types-in-flows",children:"View data types in flows"}),"\n",(0,s.jsxs)(t.p,{children:["In Langflow, you can use ",(0,s.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,s.jsx)(t.strong,{children:"Inspect output"})," to view the output of individual components.\nThis can help you learn about the different data type and debug problems with invalid or malformed inputs and output."]}),"\n",(0,s.jsxs)(t.p,{children:["The following example shows how to inspect the output of a ",(0,s.jsxs)(t.a,{href:"/components-processing#type-convert",children:[(0,s.jsx)(t.strong,{children:"Type Convert"})," component"]}),", which can convert data from one type to another:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Create a flow, and then connect a ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component to a ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In the ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component, enter some text for the type converter to process."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["On the ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component, click ",(0,s.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(t.strong,{children:"Run component"}),", and then click ",(0,s.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,s.jsx)(t.strong,{children:"Inspect output"}),"."]}),"\n",(0,s.jsxs)(t.p,{children:["The default output is ",(0,s.jsx)(t.code,{children:"Message"})," data, which is the same as the input coming from the ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component.\nTo see the ",(0,s.jsx)(t.code,{children:"Message"})," data converted to ",(0,s.jsx)(t.code,{children:"Data"})," or ",(0,s.jsx)(t.code,{children:"DataFrame"}),", change the ",(0,s.jsx)(t.strong,{children:"Output Type"})," on the ",(0,s.jsx)(t.strong,{children:"Type Convert"})," component, and then rerun the component."]}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(l.A,{value:"Message",label:"Message",default:!0,children:(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Input text",props:{}}]}],lang:"text"},annotations:[]}]})}),(0,s.jsx)(l.A,{value:"Data",label:"Data",children:(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "timestamp"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"2025-07-15 20:56:20 UTC"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "sender_name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "session_id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"a0c7e888-4fd6-4242-b8c8-e761ad690aeb"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "files"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "error"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "edit"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "properties"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text_color"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "background_color"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "edited"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "source"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "display_name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "source"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "icon"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "allow_markdown"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"false",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "positive_feedback"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "state"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"complete"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "targets"',props:{style:{color:"#7EE787"}}},{content:": []",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "category"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"message"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "content_blocks"',props:{style:{color:"#7EE787"}}},{content:": [],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"9da72da2-efbb-4ccd-90ad-b32429b0418e"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "flow_id"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"a0c7e888-4fd6-4242-b8c8-e761ad690aeb"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "duration"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"null",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]})}),(0,s.jsx)(l.A,{value:"DataFrame",label:"DataFrame",children:(0,s.jsx)(u.Code,{codeConfig:m,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"| Field | Value |",props:{}}]},{tokens:[{content:"|-------|-------|",props:{}}]},{tokens:[{content:"| timestamp | 2025-07-15 20:56:11 UTC |",props:{}}]},{tokens:[{content:"| sender | User |",props:{}}]},{tokens:[{content:"| sender_name | User |",props:{}}]},{tokens:[{content:"| session_id | a0c7e888-4fd6-4242-b8c8-e761ad690aeb |",props:{}}]},{tokens:[{content:"| text | (empty) |",props:{}}]},{tokens:[{content:"| files | [] |",props:{}}]},{tokens:[{content:"| error | False |",props:{}}]},{tokens:[{content:"| edit | False |",props:{}}]},{tokens:[{content:"| properties | text_color: '', background_color: '', edited: False, source: {id: None, display_name: None, source: None}, icon: '', allow_markdown: False, positive_feedback: None, state: 'complete', targets: [] |",props:{}}]},{tokens:[{content:"| category | message |",props:{}}]},{tokens:[{content:"| content_blocks | [] |",props:{}}]},{tokens:[{content:"| id | 341686eb-7a39-4b80-a90a-d8bf267815ef |",props:{}}]},{tokens:[{content:"| flow_id | a0c7e888-4fd6-4242-b8c8-e761ad690aeb |",props:{}}]},{tokens:[{content:"| duration | (empty) |",props:{}}]}],lang:"text"},annotations:[]}]})})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsxs)(t.a,{href:"/components-processing",children:[(0,s.jsx)(t.strong,{children:"Processing"})," components"]})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/components-custom-components",children:"Custom components"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://docs.pydantic.dev/latest/api/base_model/",children:"Pydantic Models"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html",children:"pandas.DataFrame"})}),"\n"]})]})}function g(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(x,{...e})}):x(e)}function j(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/7819cc1c.3fe39d05.js b/assets/js/7819cc1c.3fe39d05.js deleted file mode 100644 index 3a85aee752..0000000000 --- a/assets/js/7819cc1c.3fe39d05.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[6006],{9898:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-llm-router-1b417082a0208a70065bc177a78fab67.png"},13533:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-dataframe-operations-031488ccf4e3d3378f8842f0ea10682c.png"},17886:(e,t,n)=>{n.d(t,{A:()=>o});n(96540);var s=n(64058),r=n(74848);function o({name:e,...t}){const n=s[e];return n?(0,r.jsx)(n,{...t}):null}},35073:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-save-to-file-67ebbb733732670897bedd9fd1b87583.png"},40966:(e,t,n)=>{n.r(t),n.d(t,{CH:()=>h,assets:()=>a,chCodeConfig:()=>p,contentTitle:()=>d,default:()=>m,frontMatter:()=>l,metadata:()=>s,toc:()=>x});const s=JSON.parse('{"id":"Components/components-processing","title":"Processing components","description":"Langflow\'s Processing components process and transform data within a flow.","source":"@site/docs/Components/components-processing.mdx","sourceDirName":"Components","slug":"/components-processing","permalink":"/components-processing","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Processing components","slug":"/components-processing"},"sidebar":"docs","previous":{"title":"Vector Stores","permalink":"/components-vector-stores"},"next":{"title":"Prompt Template","permalink":"/components-prompts"}}');var r=n(74848),o=n(28453),c=n(24754),i=n(17886);const l={title:"Processing components",slug:"/components-processing"},d=void 0,a={},h={annotations:c.hk,Code:c.Cy},p={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},x=[{value:"Prompt Template",id:"prompt-template",level:2},{value:"Batch Run",id:"batch-run",level:2},{value:"Use the Batch Run component in a flow",id:"use-the-batch-run-component-in-a-flow",level:3},{value:"Batch Run parameters",id:"batch-run-parameters",level:3},{value:"Data Operations",id:"data-operations",level:2},{value:"Data Operations parameters",id:"data-operations-parameters",level:3},{value:"Data Operations operations",id:"data-operations-operations",level:3},{value:"DataFrame Operations",id:"dataframe-operations",level:2},{value:"Operations",id:"operations",level:3},{value:"LLM router",id:"llm-router",level:2},{value:"Parser",id:"parser",level:2},{value:"Python Interpreter",id:"python-interpreter",level:2},{value:"Use the Python Interpreter in a flow",id:"use-the-python-interpreter-in-a-flow",level:3},{value:"Python Interpreter parameters",id:"python-interpreter-parameters",level:3},{value:"Save to File",id:"save-to-file",level:2},{value:"File input format options",id:"file-input-format-options",level:3},{value:"Smart Function",id:"smart-function",level:2},{value:"Split Text",id:"split-text",level:2},{value:"Other text splitters",id:"other-text-splitters",level:3},{value:"Structured output",id:"structured-output",level:2},{value:"Type convert",id:"type-convert",level:2},{value:"Legacy Processing components",id:"legacy-processing-components",level:2}];function j(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components},{Details:s}=t;return h||u("CH",!1),h.Code||u("CH.Code",!0),s||u("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,r.jsxs)(t.p,{children:["Langflow's ",(0,r.jsx)(t.strong,{children:"Processing"})," components process and transform data within a flow.\nThey have many uses, including:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Feed instructions and context to your LLMs and agents with the ",(0,r.jsxs)(t.a,{href:"#prompt-template",children:[(0,r.jsx)(t.strong,{children:"Prompt Template"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Extract content from larger chunks of data with a ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Filter data with natural language with the ",(0,r.jsxs)(t.a,{href:"#smart-function",children:[(0,r.jsx)(t.strong,{children:"Smart Function"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Save data to your local machine with the ",(0,r.jsxs)(t.a,{href:"#save-to-file",children:[(0,r.jsx)(t.strong,{children:"Save To File"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Transform data into a different data type with the ",(0,r.jsxs)(t.a,{href:"#type-convert",children:[(0,r.jsx)(t.strong,{children:"Type Convert"})," component"]})," to pass it between incompatible components."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"prompt-template",children:"Prompt Template"}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/components-prompts",children:"Prompt Template"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"batch-run",children:"Batch Run"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component runs a language model over ",(0,r.jsx)(t.em,{children:"each row of one text column"})," in a ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:(0,r.jsx)(t.code,{children:"DataFrame"})}),", and then returns a new ",(0,r.jsx)(t.code,{children:"DataFrame"})," with the original text and an LLM response."]}),"\n",(0,r.jsx)(t.p,{children:"The response contains the following columns:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"text_input"}),": The original text from the input ",(0,r.jsx)(t.code,{children:"DataFrame"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"model_response"}),": The model's response for each input"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"batch_index"}),": The 0-indexed processing order for all rows in the ",(0,r.jsx)(t.code,{children:"DataFrame"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"metadata"})," (optional): Additional information about the processing"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"use-the-batch-run-component-in-a-flow",children:"Use the Batch Run component in a flow"}),"\n",(0,r.jsxs)(t.p,{children:["If you pass this output to a ",(0,r.jsxs)(t.a,{href:"/components-processing#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),", you can use variables in the parsing template to reference these keys, such as ",(0,r.jsx)(t.code,{children:"{text_input}"})," and ",(0,r.jsx)(t.code,{children:"{model_response}"}),".\nThis is demonstrated in the following example."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A batch run component connected to OpenAI and a Parser",src:n(88103).A+"",width:"4000",height:"2728"})}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component to a ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"Language model"})," port."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect ",(0,r.jsx)(t.code,{children:"DataFrame"})," output from another component to the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input.\nFor example, you could connect a ",(0,r.jsx)(t.strong,{children:"File"})," component with a CSV file."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"Column Name"})," field, enter the name of the column in the incoming ",(0,r.jsx)(t.code,{children:"DataFrame"})," that contains the text to process.\nFor example, if you want to extract text from a ",(0,r.jsx)(t.code,{children:"name"})," column in a CSV file, enter ",(0,r.jsx)(t.code,{children:"name"})," in the ",(0,r.jsx)(t.strong,{children:"Column Name"})," field."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"Batch Results"})," output to a ",(0,r.jsx)(t.strong,{children:"Parser"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Optional: In the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"}),", enable the ",(0,r.jsx)(t.strong,{children:"System Message"})," parameter, click ",(0,r.jsx)(t.strong,{children:"Close"}),", and then enter an instruction for how you want the LLM to process each cell extracted from the file.\nFor example, ",(0,r.jsx)(t.code,{children:"Create a business card for each name."})]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Parser"})," component's ",(0,r.jsx)(t.strong,{children:"Template"})," field, enter a template for processing the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's new ",(0,r.jsx)(t.code,{children:"DataFrame"})," columns (",(0,r.jsx)(t.code,{children:"text_input"}),", ",(0,r.jsx)(t.code,{children:"model_response"}),", and ",(0,r.jsx)(t.code,{children:"batch_index"}),"):"]}),"\n",(0,r.jsxs)(t.p,{children:["For example, this template uses three columns from the resulting, post-batch ",(0,r.jsx)(t.code,{children:"DataFrame"}),":"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"record_number: {batch_index}, name: {text_input}, summary: {model_response}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To test the processing, click the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, and then click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Run component"}),", and then click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," to view the final ",(0,r.jsx)(t.code,{children:"DataFrame"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["You can also connect a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component to the ",(0,r.jsx)(t.strong,{children:"Parser"})," component if you want to see the output in the ",(0,r.jsx)(t.strong,{children:"Playground"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"batch-run-parameters",children:"Batch Run parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"model"}),(0,r.jsx)(t.td,{children:"HandleInput"}),(0,r.jsxs)(t.td,{children:["Input parameter. Connect the 'Language Model' output from a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component. Required."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"system_message"}),(0,r.jsx)(t.td,{children:"MultilineInput"}),(0,r.jsx)(t.td,{children:"Input parameter. A multi-line system instruction for all rows in the DataFrame."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"df"}),(0,r.jsx)(t.td,{children:"DataFrameInput"}),(0,r.jsx)(t.td,{children:"Input parameter. The DataFrame whose column is treated as text messages, as specified by 'column_name'. Required."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"column_name"}),(0,r.jsx)(t.td,{children:"MessageTextInput"}),(0,r.jsx)(t.td,{children:"Input parameter. The name of the DataFrame column to treat as text messages. If empty, all columns are formatted in TOML."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output_column_name"}),(0,r.jsx)(t.td,{children:"MessageTextInput"}),(0,r.jsxs)(t.td,{children:["Input parameter. Name of the column where the model's response is stored. Default=",(0,r.jsx)(t.code,{children:"model_response"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"enable_metadata"}),(0,r.jsx)(t.td,{children:"BoolInput"}),(0,r.jsx)(t.td,{children:"Input parameter. If True, add metadata to the output DataFrame."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"batch_results"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"Output parameter. A DataFrame with all original columns plus the model's response column."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"data-operations",children:"Data Operations"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component performs operations on ",(0,r.jsx)(t.a,{href:"/data-types#data",children:(0,r.jsx)(t.code,{children:"Data"})})," objects, including selecting keys, evaluating literals, combining data, filtering values, appending/updating data, removing keys, and renaming keys."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To use the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component in a flow, you must connect its ",(0,r.jsx)(t.strong,{children:"Data"})," input port to the output port of a component that outputs ",(0,r.jsx)(t.code,{children:"Data"}),".\nAll operations in the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component require at least one ",(0,r.jsx)(t.code,{children:"Data"})," input."]}),"\n",(0,r.jsxs)(t.p,{children:["For this example, add a ",(0,r.jsx)(t.strong,{children:"Webhook"})," component to the flow, and then connect it to a ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component. Assume you'll send requests to the webhook with a consistent payload that has ",(0,r.jsx)(t.code,{children:"name"}),", ",(0,r.jsx)(t.code,{children:"username"}),", and ",(0,r.jsx)(t.code,{children:"email"})," keys."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Operations"})," field, select the operation you want to perform on the incoming ",(0,r.jsx)(t.code,{children:"Data"}),".\nFor this example, select the ",(0,r.jsx)(t.strong,{children:"Select Keys"})," operation to extract specific user information."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Add keys for ",(0,r.jsx)(t.code,{children:"name"}),", ",(0,r.jsx)(t.code,{children:"username"}),", and ",(0,r.jsx)(t.code,{children:"email"})," to select those values from the incoming request payload."]}),"\n",(0,r.jsxs)(t.p,{children:["To add additional keys, click ",(0,r.jsx)(i.A,{name:"Plus","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Add more"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A flow with Webhook, Data Operations, and Chat Output components",src:n(46445).A+"",width:"4000",height:"1920"})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To test the flow, send the following request to your flow's webhook endpoint, and then open the ",(0,r.jsx)(t.strong,{children:"Playground"})," to see the resulting output from processing the payload."]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:'POST "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_URL",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/webhook/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"-H ",props:{style:{color:"#C9D1D9"}}},{content:'"Content-Type: application/json" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"-H ",props:{style:{color:"#C9D1D9"}}},{content:'"x-api-key: ',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_API_KEY",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"-d ",props:{style:{color:"#C9D1D9"}}},{content:"'{",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "id": 1,',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "name": "Leanne Graham",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "username": "Bret",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "email": "Sincere@april.biz",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "address": {',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "street": "Main Street",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "suite": "Apt. 556",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "city": "Springfield",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "zipcode": "92998-3874",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "geo": {',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "lat": "-37.3159",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "lng": "81.1496"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "phone": "1-770-736-8031 x56442",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "website": "hildegard.org",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "company": {',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "name": "Acme-Corp",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "catchPhrase": "Multi-layered client-server neural-net",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "bs": "harness real-time e-markets"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"data-operations-parameters",children:"Data Operations parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsxs)(t.td,{children:["Input parameter. The ",(0,r.jsx)(t.code,{children:"Data"})," object to operate on."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operations"}),(0,r.jsx)(t.td,{children:"Operations"}),(0,r.jsxs)(t.td,{children:["Input parameter. The operation to perform on the data. See ",(0,r.jsx)(t.a,{href:"#data-operations-operations",children:"Data Operations operations"})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"select_keys_input"}),(0,r.jsx)(t.td,{children:"Select Keys"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of keys to select from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_key"}),(0,r.jsx)(t.td,{children:"Filter Key"}),(0,r.jsx)(t.td,{children:"Input parameter. The key to filter by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"Comparison Operator"}),(0,r.jsx)(t.td,{children:"Input parameter. The operator to apply for comparing values."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_values"}),(0,r.jsx)(t.td,{children:"Filter Values"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of values to filter by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"append_update_data"}),(0,r.jsx)(t.td,{children:"Append or Update"}),(0,r.jsx)(t.td,{children:"Input parameter. The data to append or update the existing data with."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"remove_keys_input"}),(0,r.jsx)(t.td,{children:"Remove Keys"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of keys to remove from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"rename_keys_input"}),(0,r.jsx)(t.td,{children:"Rename Keys"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of keys to rename in the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_output"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. The resulting Data object after the operation."})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"data-operations-operations",children:"Data Operations operations"}),"\n",(0,r.jsxs)(t.p,{children:["Options for the ",(0,r.jsx)(t.code,{children:"operations"})," input parameter are as follows.\nAll operations act on an incoming ",(0,r.jsx)(t.code,{children:"Data"})," object."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Required Inputs"}),(0,r.jsx)(t.th,{children:"Process"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Select Keys"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"select_keys_input"})}),(0,r.jsx)(t.td,{children:"Selects specific keys from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Literal Eval"}),(0,r.jsx)(t.td,{children:"None"}),(0,r.jsx)(t.td,{children:"Evaluates string values as Python literals."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Combine"}),(0,r.jsx)(t.td,{children:"None"}),(0,r.jsx)(t.td,{children:"Combines multiple data objects into one."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filter Values"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"filter_key"}),", ",(0,r.jsx)(t.code,{children:"filter_values"}),", ",(0,r.jsx)(t.code,{children:"operator"})]}),(0,r.jsx)(t.td,{children:"Filters data based on key-value pair."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Append or Update"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"append_update_data"})}),(0,r.jsx)(t.td,{children:"Adds or updates key-value pairs."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Remove Keys"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"remove_keys_input"})}),(0,r.jsx)(t.td,{children:"Removes specified keys from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Rename Keys"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"rename_keys_input"})}),(0,r.jsx)(t.td,{children:"Renames keys in the data."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"dataframe-operations",children:"DataFrame Operations"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component performs operations on ",(0,r.jsx)(t.a,{href:"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html",children:(0,r.jsx)(t.code,{children:"DataFrame"})})," rows and columns."]}),"\n",(0,r.jsxs)(t.p,{children:["To use the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component in a flow, you must connect its ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input port to the output port of a component that outputs ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nAll operations in the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component require at least one ",(0,r.jsx)(t.code,{children:"DataFrame"})," input."]}),"\n",(0,r.jsxs)(t.p,{children:["The following example fetches JSON data from an API. The ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component extracts and flattens the results into a tabular ",(0,r.jsx)(t.code,{children:"DataFrame"})," that is then processed through the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A flow that ingests an API response, extracts it to a DataFrame with a Smart Filter component, and the processes it through a DataFrame Operations component",src:n(13533).A+"",width:"4000",height:"2120"})}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["The ",(0,r.jsx)(t.strong,{children:"API Request"})," component retrieves data with only ",(0,r.jsx)(t.code,{children:"source"})," and ",(0,r.jsx)(t.code,{children:"result"})," fields.\nFor this example, the desired data is nested within the ",(0,r.jsx)(t.code,{children:"result"})," field."]}),"\n",(0,r.jsxs)(t.li,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component to a ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component, and then connect the ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component to the ",(0,r.jsx)(t.strong,{children:"API Request"})," component. This example connects a ",(0,r.jsx)(t.strong,{children:"Groq"})," language model component."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Groq"})," component, add your Groq API key."]}),"\n",(0,r.jsxs)(t.li,{children:["To filter the data, in the ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component, in the ",(0,r.jsx)(t.strong,{children:"Instructions"})," field, use natural language to describe how the data should be filtered.\nFor this example, enter:"]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"I want to explode the result column out into a Data object",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["Avoid punctuation in the ",(0,r.jsx)(t.strong,{children:"Instructions"})," field, as it can cause errors."]})}),"\n",(0,r.jsxs)(t.ol,{start:"5",children:["\n",(0,r.jsxs)(t.li,{children:["To run the flow, in the ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Run component"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["To inspect the filtered data, in the ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component, click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"}),".\nThe result is a structured DataFrame."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"id | name | company | username | email | address | zip",props:{}}]},{tokens:[{content:"---|------------------|----------------------|-----------------|------------------------------------|-------------------|-------",props:{}}]},{tokens:[{content:"1 | Emily Johnson | ABC Corporation | emily_johnson | emily.johnson@abccorporation.com | 123 Main St | 12345",props:{}}]},{tokens:[{content:"2 | Michael Williams | XYZ Corp | michael_williams| michael.williams@xyzcorp.com | 456 Elm Ave | 67890",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ol,{start:"7",children:["\n",(0,r.jsxs)(t.li,{children:["Add ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," and ",(0,r.jsx)(t.strong,{children:"Chat Output"})," components to the flow."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component, in the ",(0,r.jsx)(t.strong,{children:"Operation"})," field, select ",(0,r.jsx)(t.strong,{children:"Filter"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["To apply a filter, in the ",(0,r.jsx)(t.strong,{children:"Column Name"})," field, enter a column to filter on. This example filters by ",(0,r.jsx)(t.code,{children:"name"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Click ",(0,r.jsx)(t.strong,{children:"Playground"}),", and then click ",(0,r.jsx)(t.strong,{children:"Run Flow"}),".\nThe flow extracts the values from the ",(0,r.jsx)(t.code,{children:"name"})," column."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"name",props:{}}]},{tokens:[{content:"Emily Johnson",props:{}}]},{tokens:[{content:"Michael Williams",props:{}}]},{tokens:[{content:"John Smith",props:{}}]},{tokens:[{content:"...",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsx)(t.h3,{id:"operations",children:"Operations"}),"\n",(0,r.jsxs)(t.p,{children:["This component can perform the following operations on Pandas ",(0,r.jsx)(t.a,{href:"https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html",children:"DataFrame"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Operation"}),(0,r.jsx)(t.th,{children:"Required Inputs"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Add Column"}),(0,r.jsx)(t.td,{children:"new_column_name, new_column_value"}),(0,r.jsx)(t.td,{children:"Adds a new column with a constant value."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Drop Column"}),(0,r.jsx)(t.td,{children:"column_name"}),(0,r.jsx)(t.td,{children:"Removes a specified column."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filter"}),(0,r.jsx)(t.td,{children:"column_name, filter_value"}),(0,r.jsx)(t.td,{children:"Filters rows based on column value."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Head"}),(0,r.jsx)(t.td,{children:"num_rows"}),(0,r.jsxs)(t.td,{children:["Returns first ",(0,r.jsx)(t.code,{children:"n"})," rows."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Rename Column"}),(0,r.jsx)(t.td,{children:"column_name, new_column_name"}),(0,r.jsx)(t.td,{children:"Renames an existing column."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Replace Value"}),(0,r.jsx)(t.td,{children:"column_name, replace_value, replacement_value"}),(0,r.jsx)(t.td,{children:"Replaces values in a column."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Select Columns"}),(0,r.jsx)(t.td,{children:"columns_to_select"}),(0,r.jsx)(t.td,{children:"Selects specific columns."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Sort"}),(0,r.jsx)(t.td,{children:"column_name, ascending"}),(0,r.jsx)(t.td,{children:"Sorts DataFrame by column."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Tail"}),(0,r.jsx)(t.td,{children:"num_rows"}),(0,r.jsxs)(t.td,{children:["Returns last ",(0,r.jsx)(t.code,{children:"n"})," rows."]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"df"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"The input DataFrame to operate on."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operation"}),(0,r.jsx)(t.td,{children:"Operation"}),(0,r.jsx)(t.td,{children:"The DataFrame operation to perform. Options include Add Column, Drop Column, Filter, Head, Rename Column, Replace Value, Select Columns, Sort, and Tail."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"column_name"}),(0,r.jsx)(t.td,{children:"Column Name"}),(0,r.jsx)(t.td,{children:"The column name to use for the operation."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_value"}),(0,r.jsx)(t.td,{children:"Filter Value"}),(0,r.jsx)(t.td,{children:"The value to filter rows by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"ascending"}),(0,r.jsx)(t.td,{children:"Sort Ascending"}),(0,r.jsx)(t.td,{children:"Whether to sort in ascending order."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"new_column_name"}),(0,r.jsx)(t.td,{children:"New Column Name"}),(0,r.jsx)(t.td,{children:"The new column name when renaming or adding a column."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"new_column_value"}),(0,r.jsx)(t.td,{children:"New Column Value"}),(0,r.jsx)(t.td,{children:"The value to populate the new column with."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"columns_to_select"}),(0,r.jsx)(t.td,{children:"Columns to Select"}),(0,r.jsx)(t.td,{children:"A list of column names to select."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"num_rows"}),(0,r.jsx)(t.td,{children:"Number of Rows"}),(0,r.jsx)(t.td,{children:"The number of rows to return for head/tail operations. The default is 5."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"replace_value"}),(0,r.jsx)(t.td,{children:"Value to Replace"}),(0,r.jsx)(t.td,{children:"The value to replace in the column."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"replacement_value"}),(0,r.jsx)(t.td,{children:"Replacement Value"}),(0,r.jsx)(t.td,{children:"The value to replace with."})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"The resulting DataFrame after the operation."})]})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"llm-router",children:"LLM router"}),"\n",(0,r.jsxs)(t.p,{children:["This component routes requests to the most appropriate LLM based on ",(0,r.jsx)(t.a,{href:"https://openrouter.ai/docs/quickstart",children:"OpenRouter"})," model specifications."]}),"\n",(0,r.jsx)(t.p,{children:"The judge LLM analyzed your input message to understand the evaluation context, and then selects the most appropriate model from your LLM pool."}),"\n",(0,r.jsx)(t.p,{children:"The selected model processes your input and returns the response."}),"\n",(0,r.jsxs)(t.p,{children:["To use the ",(0,r.jsx)(t.strong,{children:"LLM Router"})," component in a flow, do the following:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect multiple ",(0,r.jsx)(t.strong,{children:"Language Model"})," components to the ",(0,r.jsx)(t.strong,{children:"LLM Router"}),"'s ",(0,r.jsx)(t.strong,{children:"Language Models"})," input."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Judge LLM"})," component to the ",(0,r.jsx)(t.strong,{children:"Judge LLM"})," input."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect ",(0,r.jsx)(t.strong,{children:"Chat Input"})," and ",(0,r.jsx)(t.strong,{children:"Chat Output"})," components to the ",(0,r.jsx)(t.strong,{children:"LLM Router"}),".\nThe flow looks like this:"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"LLM Router component",src:n(9898).A+"",width:"3316",height:"2492"})}),"\n",(0,r.jsxs)(t.ol,{start:"4",children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"LLM Router"})," component, set your ",(0,r.jsx)(t.strong,{children:"Optimization"})," preference:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Quality"}),": Prioritizes the highest quality response."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Speed"}),": Prioritizes the fastest response time."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Cost"}),": Prioritizes the most cost-effective option."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Balanced"}),": Strikes a balance between quality, speed, and cost."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Run the flow.\nYour input is the task that the LLM router evaluates the models against, such as ",(0,r.jsx)(t.code,{children:"Write a story about horses"})," or ",(0,r.jsx)(t.code,{children:"How do I parse data objects out of JSON?"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"LLM Router"})," component, select the ",(0,r.jsx)(t.strong,{children:"Model Selection Decision"})," output to view the router's reasoning."]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Model Selection Decision:",props:{}}]},{tokens:[{content:"- Selected Model Index: 0",props:{}}]},{tokens:[{content:"- Selected Langflow Model Name: gpt-4o-mini",props:{}}]},{tokens:[{content:"- Selected API Model ID (if resolved): openai/gpt-4o-mini",props:{}}]},{tokens:[{content:"- Optimization Preference: cost",props:{}}]},{tokens:[{content:"- Input Query Length: 27 characters (~5 tokens)",props:{}}]},{tokens:[{content:"- Number of Models Considered: 2",props:{}}]},{tokens:[{content:"- Specifications Source: OpenRouter API",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"models"}),(0,r.jsx)(t.td,{children:"Language Models"}),(0,r.jsx)(t.td,{children:"A list of LLMs to route between."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_value"}),(0,r.jsx)(t.td,{children:"Input"}),(0,r.jsx)(t.td,{children:"The input message to be routed."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"judge_llm"}),(0,r.jsx)(t.td,{children:"Judge LLM"}),(0,r.jsx)(t.td,{children:"The LLM that evaluates and selects the most appropriate model."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"optimization"}),(0,r.jsx)(t.td,{children:"Optimization"}),(0,r.jsx)(t.td,{children:"The optimization preference between quality, speed, cost, or balanced."})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output"}),(0,r.jsx)(t.td,{children:"Output"}),(0,r.jsx)(t.td,{children:"The response from the selected model."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"selected_model"}),(0,r.jsx)(t.td,{children:"Selected Model"}),(0,r.jsx)(t.td,{children:"The name of the chosen model."})]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"parser",children:"Parser"}),"\n",(0,r.jsxs)(t.p,{children:["This component formats ",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Data"})," objects into text using templates, with an option to convert inputs directly to strings using ",(0,r.jsx)(t.code,{children:"stringify"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["To use this component, create variables for values in the ",(0,r.jsx)(t.code,{children:"template"})," the same way you would in a ",(0,r.jsxs)(t.a,{href:"/components-prompts",children:[(0,r.jsx)(t.strong,{children:"Prompt Template"})," component"]}),". For ",(0,r.jsx)(t.code,{children:"DataFrames"}),", use column names, for example ",(0,r.jsx)(t.code,{children:"Name: {Name}"}),". For ",(0,r.jsx)(t.code,{children:"Data"})," objects, use ",(0,r.jsx)(t.code,{children:"{text}"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["To use the ",(0,r.jsx)(t.strong,{children:"Parser"})," component with a ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component, do the following:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," output to the ",(0,r.jsx)(t.strong,{children:"Parser"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input."]}),"\n",(0,r.jsxs)(t.li,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"File"})," component to the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component's ",(0,r.jsx)(t.strong,{children:"Message"})," input."]}),"\n",(0,r.jsxs)(t.li,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"OpenAI"})," component's ",(0,r.jsx)(t.strong,{children:"Language Model"})," output to the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component's ",(0,r.jsx)(t.strong,{children:"Language Model"})," input."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"The flow looks like this:"}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A Parser component connected to OpenAI and Structured Output components",src:n(96218).A+"",width:"4000",height:"2202"})}),"\n",(0,r.jsxs)(t.ol,{start:"4",children:["\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component, click ",(0,r.jsx)(t.strong,{children:"Open Table"}),".\nThis opens a pane for structuring your table.\nThe table contains the rows ",(0,r.jsx)(t.strong,{children:"Name"}),", ",(0,r.jsx)(t.strong,{children:"Description"}),", ",(0,r.jsx)(t.strong,{children:"Type"}),", and ",(0,r.jsx)(t.strong,{children:"Multiple"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Create a table that maps to the data you're loading from the ",(0,r.jsx)(t.strong,{children:"File"})," loader.\nFor example, to create a table for employees, you might have the rows ",(0,r.jsx)(t.code,{children:"id"}),", ",(0,r.jsx)(t.code,{children:"name"}),", and ",(0,r.jsx)(t.code,{children:"email"}),", all of type ",(0,r.jsx)(t.code,{children:"string"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Template"})," field of the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, enter a template for parsing the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component's DataFrame output into structured text.\nCreate variables for values in the ",(0,r.jsx)(t.code,{children:"template"})," using curly braces.\nFor example, to present a table of employees in Markdown:"]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"# Employee Profile",props:{}}]},{tokens:[{content:"## Personal Information",props:{}}]},{tokens:[{content:"- **Name:** {name}",props:{}}]},{tokens:[{content:"- **ID:** {id}",props:{}}]},{tokens:[{content:"- **Email:** {email}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ol,{start:"7",children:["\n",(0,r.jsxs)(t.li,{children:["To run the flow, in the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Run component"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["To view your parsed text, in the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Optionally, connect a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component, and open the ",(0,r.jsx)(t.strong,{children:"Playground"})," to see the output."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For an additional example of using the ",(0,r.jsx)(t.strong,{children:"Parser"})," component to format a DataFrame from a ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component, see the ",(0,r.jsx)(t.strong,{children:"Market Research"})," template flow."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"mode"}),(0,r.jsx)(t.td,{children:"Mode"}),(0,r.jsx)(t.td,{children:'The tab selection between "Parser" and "Stringify" modes. "Stringify" converts input to a string instead of using a template.'})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"pattern"}),(0,r.jsx)(t.td,{children:"Template"}),(0,r.jsxs)(t.td,{children:["The template for formatting using variables in curly brackets. For DataFrames, use column names, such as ",(0,r.jsx)(t.code,{children:"Name: {Name}"}),". For Data objects, use ",(0,r.jsx)(t.code,{children:"{text}"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Data or DataFrame"}),(0,r.jsx)(t.td,{children:"The input to parse. Accepts either a DataFrame or Data object."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sep"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsx)(t.td,{children:"The string used to separate rows or items. The default is a newline."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"clean_data"}),(0,r.jsx)(t.td,{children:"Clean Data"}),(0,r.jsx)(t.td,{children:"When stringify is enabled, this option cleans data by removing empty rows and lines."})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"parsed_text"}),(0,r.jsx)(t.td,{children:"Parsed Text"}),(0,r.jsxs)(t.td,{children:["The resulting formatted text as a ",(0,r.jsx)(t.a,{href:"/data-types#message",children:"Message"})," object."]})]})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"python-interpreter",children:"Python Interpreter"}),"\n",(0,r.jsx)(t.p,{children:"This component allows you to execute Python code with imported packages."}),"\n",(0,r.jsx)(t.h3,{id:"use-the-python-interpreter-in-a-flow",children:"Use the Python Interpreter in a flow"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["To use this component in a flow,in the ",(0,r.jsx)(t.strong,{children:"Global Imports"})," field, add the packages you want to import as a comma-separated list, such as ",(0,r.jsx)(t.code,{children:"math,pandas"}),".\nAt least one import is required."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Python Code"})," field, enter the Python code you want to execute. Use ",(0,r.jsx)(t.code,{children:"print()"})," to see the output."]}),"\n",(0,r.jsxs)(t.li,{children:["Optional: Enable ",(0,r.jsx)(t.strong,{children:"Tool Mode"}),", and then connect the ",(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component to an ",(0,r.jsx)(t.strong,{children:"Agent"})," component as a tool.\nFor example, connect a ",(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component and a ",(0,r.jsxs)(t.a,{href:"/components-helpers#calculator",children:[(0,r.jsx)(t.strong,{children:"Calculator"})," component"]})," as tools for an ",(0,r.jsx)(t.strong,{children:"Agent"})," component, and then test how it chooses different tools to solve math problems.\n",(0,r.jsx)(t.img,{alt:"Python Interpreter and Calculator components connected to an Agent component",src:n(99e3).A+"",width:"3988",height:"2928"})]}),"\n",(0,r.jsxs)(t.li,{children:["Ask the agent an easier math question.\nThe ",(0,r.jsx)(t.strong,{children:"Calculator"})," tool can add, subtract, multiple, divide, or perform exponentiation.\nThe agent executes the ",(0,r.jsx)(t.code,{children:"evaluate_expression"})," tool to correctly answer the question."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"Result:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Executed evaluate_expression",props:{}}]},{tokens:[{content:"Input:",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:' "expression": "2+5"',props:{}}]},{tokens:[{content:"}",props:{}}]},{tokens:[{content:"Output:",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:' "result": "7"',props:{}}]},{tokens:[{content:"}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ol,{start:"5",children:["\n",(0,r.jsxs)(t.li,{children:["Give the agent complete Python code.\nThis example creates a Pandas DataFrame table with the imported ",(0,r.jsx)(t.code,{children:"pandas"})," packages, and returns the square root of the mean squares."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" pandas ",props:{style:{color:"#C9D1D9"}}},{content:"as",props:{style:{color:"#FF7B72"}}},{content:" pd",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" math",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Create a simple DataFrame",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"df ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" pd.DataFrame({",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'numbers'",props:{style:{color:"#A5D6FF"}}},{content:": [",props:{style:{color:"#C9D1D9"}}},{content:"1",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"2",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"3",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"4",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"5",props:{style:{color:"#79C0FF"}}},{content:"],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'squares'",props:{style:{color:"#A5D6FF"}}},{content:": [x",props:{style:{color:"#C9D1D9"}}},{content:"**",props:{style:{color:"#FF7B72"}}},{content:"2 ",props:{style:{color:"#79C0FF"}}},{content:"for",props:{style:{color:"#FF7B72"}}},{content:" x ",props:{style:{color:"#C9D1D9"}}},{content:"in ",props:{style:{color:"#FF7B72"}}},{content:"range",props:{style:{color:"#79C0FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"1",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"6",props:{style:{color:"#79C0FF"}}},{content:")]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"})",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Calculate the square root of the mean",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"result ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" math.sqrt(df[",props:{style:{color:"#C9D1D9"}}},{content:"'squares'",props:{style:{color:"#A5D6FF"}}},{content:"].mean())",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"f",props:{style:{color:"#FF7B72"}}},{content:'"Square root of mean squares: ',props:{style:{color:"#A5D6FF"}}},{content:"{",props:{style:{color:"#79C0FF"}}},{content:"result",props:{style:{color:"#C9D1D9"}}},{content:"}",props:{style:{color:"#79C0FF"}}},{content:'"',props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["The agent correctly chooses the ",(0,r.jsx)(t.code,{children:"run_python_repl"})," tool to solve the problem."]}),"\n",(0,r.jsx)(t.p,{children:"Result:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Executed run_python_repl",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"Input:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:" \"python_code\": \"import pandas as pd\\nimport math\\n\\n# Create a simple DataFrame\\ndf = pd.DataFrame({\\n 'numbers': [1, 2, 3, 4, 5],\\n 'squares': [x**2 for x in range(1, 6)]\\n})\\n\\n# Calculate the square root of the mean\\nresult = math.sqrt(df['squares'].mean())\\nprint(f\\\"Square root of mean squares: {result}\\\")\"",props:{}}]},{tokens:[{content:"}",props:{}}]},{tokens:[{content:"Output:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:' "result": "Square root of mean squares: 3.3166247903554"',props:{}}]},{tokens:[{content:"}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["If you don't include the package imports in the chat, the agent can still create the table using ",(0,r.jsx)(t.code,{children:"pd.DataFrame"}),", because the ",(0,r.jsx)(t.code,{children:"pandas"})," package is imported globally by the ",(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component in the ",(0,r.jsx)(t.strong,{children:"Global Imports"})," field."]}),"\n",(0,r.jsx)(t.h3,{id:"python-interpreter-parameters",children:"Python Interpreter parameters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"global_imports"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsxs)(t.td,{children:["Input parameter. A comma-separated list of modules to import globally, such as ",(0,r.jsx)(t.code,{children:"math,pandas,numpy"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"python_code"}),(0,r.jsx)(t.td,{children:"Code"}),(0,r.jsx)(t.td,{children:"Input parameter. The Python code to execute. Only modules specified in Global Imports can be used."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"results"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. The output of the executed Python code, including any printed results or errors."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"save-to-file",children:"Save to File"}),"\n",(0,r.jsxs)(t.p,{children:["This component saves ",(0,r.jsx)(t.code,{children:"DataFrame"}),", ",(0,r.jsx)(t.code,{children:"Data"}),", or ",(0,r.jsx)(t.code,{children:"Message"})," ",(0,r.jsx)(t.a,{href:"/data-types",children:"data types"})," to various file formats."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["To use this component in a flow, connect a component that outputs ",(0,r.jsx)(t.a,{href:"/data-types#data",children:"DataFrames, Data, or Messages"})," to the ",(0,r.jsx)(t.strong,{children:"Save to File"})," component's input.\nThe following example connects a ",(0,r.jsx)(t.strong,{children:"Webhook"})," component to two ",(0,r.jsx)(t.strong,{children:"Save to File"})," components to demonstrate the different outputs."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Two Save-to File components connected to a Webhook component",src:n(35073).A+"",width:"1458",height:"1732"})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Save to File"})," component's ",(0,r.jsx)(t.strong,{children:"Input Type"})," field, select the expected input type.\nThis example expects ",(0,r.jsx)(t.strong,{children:"Data"})," from the ",(0,r.jsx)(t.strong,{children:"Webhook"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"File Format"})," field, select the file type for your saved file.\nThis example uses ",(0,r.jsx)(t.code,{children:".md"})," in one ",(0,r.jsx)(t.strong,{children:"Save to File"})," component, and ",(0,r.jsx)(t.code,{children:".xlsx"})," in another."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"File Path"})," field, enter the path for your saved file.\nThis example uses ",(0,r.jsx)(t.code,{children:"./output/employees.xlsx"})," and ",(0,r.jsx)(t.code,{children:"./output/employees.md"})," to save the files in a directory relative to where Langflow is running.\nThe component accepts both relative and absolute paths, and creates any necessary directories if they don't exist."]}),"\n"]}),"\n",(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["If the ",(0,r.jsx)(t.code,{children:"file_format"})," and ",(0,r.jsx)(t.code,{children:"file_path"})," extension don't align, the component appends the specified format to the file.\nFor example, if the ",(0,r.jsx)(t.code,{children:"file_format"})," is ",(0,r.jsx)(t.code,{children:"csv"}),", and the ",(0,r.jsx)(t.code,{children:"file_path"})," is ",(0,r.jsx)(t.code,{children:"./output/test.txt"}),", then the file is saved as ",(0,r.jsx)(t.code,{children:"./output/test.txt.csv"})," so the file isn't corrupted."]})}),"\n",(0,r.jsxs)(t.ol,{start:"5",children:["\n",(0,r.jsxs)(t.li,{children:["Send a POST request to the ",(0,r.jsx)(t.strong,{children:"Webhook"})," containing your JSON data.\nReplace ",(0,r.jsx)(t.code,{children:"YOUR_FLOW_ID"})," with your flow ID.\nThis example uses the default Langflow server address."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:'curl -X POST "http://127.0.0.1:7860/api/v1/webhook/YOUR_FLOW_ID" \\',props:{}}]},{tokens:[{content:"-H 'Content-Type: application/json' \\",props:{}}]},{tokens:[{content:"-H 'x-api-key: LANGFLOW_API_KEY' \\",props:{}}]},{tokens:[{content:"-d '{",props:{}}]},{tokens:[{content:' "Name": ["Alex Cruz", "Kalani Smith", "Noam Johnson"],',props:{}}]},{tokens:[{content:' "Role": ["Developer", "Designer", "Manager"],',props:{}}]},{tokens:[{content:' "Department": ["Engineering", "Design", "Management"]',props:{}}]},{tokens:[{content:"}'",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ol,{start:"6",children:["\n",(0,r.jsxs)(t.li,{children:["In your local filesystem, open the ",(0,r.jsx)(t.code,{children:"outputs"})," directory.\nYou should see two files created from the data you've sent: one in ",(0,r.jsx)(t.code,{children:".xlsx"})," for structured spreadsheets, and one in Markdown."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"| Name | Role | Department |",props:{}}]},{tokens:[{content:"|:-------------|:----------|:-------------|",props:{}}]},{tokens:[{content:"| Alex Cruz | Developer | Engineering |",props:{}}]},{tokens:[{content:"| Kalani Smith | Designer | Design |",props:{}}]},{tokens:[{content:"| Noam Johnson | Manager | Management |",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsx)(t.h3,{id:"file-input-format-options",children:"File input format options"}),"\n",(0,r.jsxs)(t.p,{children:["For ",(0,r.jsx)(t.code,{children:"DataFrame"})," and ",(0,r.jsx)(t.code,{children:"Data"})," inputs, the component can create:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"csv"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"excel"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"json"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"markdown"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"pdf"})}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For ",(0,r.jsx)(t.code,{children:"Message"})," inputs, the component can create:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"txt"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"json"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"markdown"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.code,{children:"pdf"})}),"\n"]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_text"}),(0,r.jsx)(t.td,{children:"Input Text"}),(0,r.jsx)(t.td,{children:"The text to analyze and extract patterns from."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"pattern"}),(0,r.jsx)(t.td,{children:"Regex Pattern"}),(0,r.jsx)(t.td,{children:"The regular expression pattern to match in the text."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_type"}),(0,r.jsx)(t.td,{children:"Input Type"}),(0,r.jsx)(t.td,{children:"The type of input to save."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"df"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"The DataFrame to save."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"The Data object to save."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"message"}),(0,r.jsx)(t.td,{children:"Message"}),(0,r.jsx)(t.td,{children:"The Message to save."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"file_format"}),(0,r.jsx)(t.td,{children:"File Format"}),(0,r.jsx)(t.td,{children:"The file format to save the input in."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"file_path"}),(0,r.jsx)(t.td,{children:"File Path"}),(0,r.jsx)(t.td,{children:"The full file path including filename and extension."})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"A list of extracted matches as Data objects."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text"}),(0,r.jsx)(t.td,{children:"Message"}),(0,r.jsx)(t.td,{children:"The extracted matches formatted as a Message object."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"confirmation"}),(0,r.jsx)(t.td,{children:"Confirmation"}),(0,r.jsx)(t.td,{children:"The confirmation message after saving the file."})]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"smart-function",children:"Smart Function"}),"\n",(0,r.jsxs)(t.p,{children:["In Langflow version 1.5, this component was renamed from ",(0,r.jsx)(t.strong,{children:"Lambda Filter"})," to ",(0,r.jsx)(t.strong,{children:"Smart Function"}),"."]}),"\n",(0,r.jsx)(t.p,{children:"This component uses an LLM to generate a function for filtering or transforming structured data."}),"\n",(0,r.jsxs)(t.p,{children:["To use the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component, you must connect it to a ",(0,r.jsxs)(t.a,{href:"/components-models",children:[(0,r.jsx)(t.strong,{children:"Language Model"})," component"]}),", which the ",(0,r.jsx)(t.strong,{children:"Smart Filter"})," component uses to generate a function based on the natural language instructions in the ",(0,r.jsx)(t.strong,{children:"Instructions"})," field."]}),"\n",(0,r.jsxs)(t.p,{children:["This example gets JSON data from the ",(0,r.jsx)(t.code,{children:"https://jsonplaceholder.typicode.com/users"})," API endpoint.\nThe ",(0,r.jsx)(t.strong,{children:"Instructions"})," field in the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component specifies the task ",(0,r.jsx)(t.code,{children:"extract emails"}),".\nThe connected LLM creates a filter based on the instructions, and successfully extracts a list of email addresses from the JSON data."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Smart function connected to an LLM",src:n(66539).A+"",width:"4000",height:"1796"})}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"The structured data to filter or transform using a Lambda function."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"llm"}),(0,r.jsx)(t.td,{children:"Language Model"}),(0,r.jsxs)(t.td,{children:["The connection port for a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_instruction"}),(0,r.jsx)(t.td,{children:"Instructions"}),(0,r.jsxs)(t.td,{children:["The natural language instructions for how to filter or transform the data using a Lambda function, such as ",(0,r.jsx)(t.code,{children:"Filter the data to only include items where the 'status' is 'active'"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sample_size"}),(0,r.jsx)(t.td,{children:"Sample Size"}),(0,r.jsx)(t.td,{children:"For large datasets, the number of characters to sample from the dataset head and tail."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"max_size"}),(0,r.jsx)(t.td,{children:"Max Size"}),(0,r.jsxs)(t.td,{children:['The number of characters for the data to be considered "large", which triggers sampling by the ',(0,r.jsx)(t.code,{children:"sample_size"})," value."]})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filtered_data"}),(0,r.jsx)(t.td,{children:"Filtered Data"}),(0,r.jsxs)(t.td,{children:["The filtered or transformed ",(0,r.jsx)(t.code,{children:"Data"})," object."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"dataframe"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsxs)(t.td,{children:["The filtered data as a ",(0,r.jsx)(t.code,{children:"DataFrame"}),"."]})]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"split-text",children:"Split Text"}),"\n",(0,r.jsx)(t.p,{children:"This component splits text into chunks based on specified criteria. It's ideal for chunking data to be tokenized and embedded into vector databases."}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Split Text"})," component outputs ",(0,r.jsx)(t.strong,{children:"Chunks"})," or ",(0,r.jsx)(t.strong,{children:"DataFrame"}),".\nThe ",(0,r.jsx)(t.strong,{children:"Chunks"})," output returns a list of individual text chunks.\nThe ",(0,r.jsx)(t.strong,{children:"DataFrame"})," output returns a structured data format, with additional ",(0,r.jsx)(t.code,{children:"text"})," and ",(0,r.jsx)(t.code,{children:"metadata"})," columns applied."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["To use this component in a flow, connect a component that outputs ",(0,r.jsx)(t.a,{href:"/data-types#data",children:"Data or DataFrame"})," to the ",(0,r.jsx)(t.strong,{children:"Split Text"})," component's ",(0,r.jsx)(t.strong,{children:"Data"})," port.\nThis example uses the ",(0,r.jsx)(t.strong,{children:"URL"})," component, which is fetching JSON placeholder data."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Split Text and Chroma DB components",src:n(49823).A+"",width:"4000",height:"2766"})}),"\n",(0,r.jsxs)(t.ol,{start:"2",children:["\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Split Text"})," component, define your data splitting parameters."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["This example splits incoming JSON data at the separator ",(0,r.jsx)(t.code,{children:"},"}),", so each chunk contains one JSON object."]}),"\n",(0,r.jsxs)(t.p,{children:["The order of precedence is ",(0,r.jsx)(t.strong,{children:"Separator"}),", then ",(0,r.jsx)(t.strong,{children:"Chunk Size"}),", and then ",(0,r.jsx)(t.strong,{children:"Chunk Overlap"}),".\nIf any segment after separator splitting is longer than ",(0,r.jsx)(t.code,{children:"chunk_size"}),", it is split again to fit within ",(0,r.jsx)(t.code,{children:"chunk_size"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["After ",(0,r.jsx)(t.code,{children:"chunk_size"}),", ",(0,r.jsx)(t.strong,{children:"Chunk Overlap"})," is applied between chunks to maintain context."]}),"\n",(0,r.jsxs)(t.ol,{start:"3",children:["\n",(0,r.jsxs)(t.li,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component to the ",(0,r.jsx)(t.strong,{children:"Split Text"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," output to view its output."]}),"\n",(0,r.jsxs)(t.li,{children:["Click ",(0,r.jsx)(t.strong,{children:"Playground"}),", and then click ",(0,r.jsx)(t.strong,{children:"Run Flow"}),".\nThe output contains a table of JSON objects split at ",(0,r.jsx)(t.code,{children:"},"}),"."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{}}]},{tokens:[{content:'"userId": 1,',props:{}}]},{tokens:[{content:'"id": 1,',props:{}}]},{tokens:[{content:'"title": "Introduction to Artificial Intelligence",',props:{}}]},{tokens:[{content:'"body": "Learn the basics of Artificial Intelligence and its applications in various industries.",',props:{}}]},{tokens:[{content:'"link": "https://example.com/article1",',props:{}}]},{tokens:[{content:'"comment_count": 8',props:{}}]},{tokens:[{content:"},",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:'"userId": 2,',props:{}}]},{tokens:[{content:'"id": 2,',props:{}}]},{tokens:[{content:'"title": "Web Development with React",',props:{}}]},{tokens:[{content:'"body": "Build modern web applications using React.js and explore its powerful features.",',props:{}}]},{tokens:[{content:'"link": "https://example.com/article2",',props:{}}]},{tokens:[{content:'"comment_count": 12',props:{}}]},{tokens:[{content:"},",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ol,{start:"5",children:["\n",(0,r.jsxs)(t.li,{children:["Clear the ",(0,r.jsx)(t.strong,{children:"Separator"})," field, and then run the flow again.\nInstead of JSON objects, the output contains 50-character lines of text with 10 characters of overlap."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:'First chunk: "title": "Introduction to Artificial Intelligence""',props:{}}]},{tokens:[{content:'Second chunk: "elligence", "body": "Learn the basics of Artif"',props:{}}]},{tokens:[{content:'Third chunk: "s of Artificial Intelligence and its applications"',props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_inputs"}),(0,r.jsx)(t.td,{children:"Input Documents"}),(0,r.jsxs)(t.td,{children:["The data to split. The component accepts ",(0,r.jsx)(t.a,{href:"/data-types#data",children:"Data"})," or ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:"DataFrame"})," objects."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"chunk_overlap"}),(0,r.jsx)(t.td,{children:"Chunk Overlap"}),(0,r.jsxs)(t.td,{children:["The number of characters to overlap between chunks. Default: ",(0,r.jsx)(t.code,{children:"200"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"chunk_size"}),(0,r.jsx)(t.td,{children:"Chunk Size"}),(0,r.jsxs)(t.td,{children:["The maximum number of characters in each chunk. Default: ",(0,r.jsx)(t.code,{children:"1000"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"separator"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsxs)(t.td,{children:["The character to split on. Default: ",(0,r.jsx)(t.code,{children:"newline"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key"}),(0,r.jsx)(t.td,{children:"Text Key"}),(0,r.jsxs)(t.td,{children:["The key to use for the text column. Default: ",(0,r.jsx)(t.code,{children:"text"}),"."]})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"chunks"}),(0,r.jsx)(t.td,{children:"Chunks"}),(0,r.jsxs)(t.td,{children:["A list of split text chunks as ",(0,r.jsx)(t.a,{href:"/data-types#data",children:"Data"})," objects."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"dataframe"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsxs)(t.td,{children:["A list of split text chunks as ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:"DataFrame"})," objects."]})]})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"other-text-splitters",children:"Other text splitters"}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/bundles-langchain#text-splitters",children:"LangChain text splitter components"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"structured-output",children:"Structured output"}),"\n",(0,r.jsx)(t.p,{children:"This component transforms LLM responses into structured data formats."}),"\n",(0,r.jsxs)(t.p,{children:["In this example from the ",(0,r.jsx)(t.strong,{children:"Financial Support Parser"})," template, the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component transforms unstructured financial reports into structured data."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Structured output example",src:n(82798).A+"",width:"4000",height:"1724"})}),"\n",(0,r.jsxs)(t.p,{children:["The connected LLM model is prompted by the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component's ",(0,r.jsx)(t.code,{children:"Format Instructions"})," parameter to extract structured output from the unstructured text. ",(0,r.jsx)(t.code,{children:"Format Instructions"})," is utilized as the system prompt for the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component."]}),"\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component, click the ",(0,r.jsx)(t.strong,{children:"Open table"})," button to view the ",(0,r.jsx)(t.code,{children:"Output Schema"})," table.\nThe ",(0,r.jsx)(t.code,{children:"Output Schema"})," parameter defines the structure and data types for the model's output using a table with the following fields:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Name"}),": The name of the output field."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Description"}),": The purpose of the output field."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Type"}),": The data type of the output field. The available types are ",(0,r.jsx)(t.code,{children:"str"}),", ",(0,r.jsx)(t.code,{children:"int"}),", ",(0,r.jsx)(t.code,{children:"float"}),", ",(0,r.jsx)(t.code,{children:"bool"}),", ",(0,r.jsx)(t.code,{children:"list"}),", or ",(0,r.jsx)(t.code,{children:"dict"}),". The default is ",(0,r.jsx)(t.code,{children:"text"}),"."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Multiple (deprecated)"}),": Always true to allow multiple output values for a single field."]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Parse DataFrame"})," component parses the structured output into a template for orderly presentation in chat output. The template receives the values from the ",(0,r.jsx)(t.code,{children:"output_schema"})," table with curly braces."]}),"\n",(0,r.jsxs)(t.p,{children:["For example, the template ",(0,r.jsx)(t.code,{children:"EBITDA: {EBITDA} , Net Income: {NET_INCOME} , GROSS_PROFIT: {GROSS_PROFIT}"})," presents the extracted values in the ",(0,r.jsx)(t.strong,{children:"Playground"})," as ",(0,r.jsx)(t.code,{children:"EBITDA: 900 million , Net Income: 500 million , GROSS_PROFIT: 1.2 billion"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"llm"}),(0,r.jsx)(t.td,{children:"LanguageModel"}),(0,r.jsx)(t.td,{children:"The language model to use to generate the structured output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_value"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"The input message to the language model."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"system_prompt"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"The instructions to the language model for formatting the output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"schema_name"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"The name for the output data schema."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output_schema"}),(0,r.jsx)(t.td,{children:"Table"}),(0,r.jsx)(t.td,{children:"The structure and data types for the model's output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"multiple"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"[Deprecated] Always true."})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"structured_output"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"The structured output is a Data object based on the defined schema."})]})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"type-convert",children:"Type convert"}),"\n",(0,r.jsxs)(t.p,{children:["This component converts data types between different formats. It can transform data between ",(0,r.jsx)(t.a,{href:"/data-types#data",children:(0,r.jsx)(t.code,{children:"Data"})}),", ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:(0,r.jsx)(t.code,{children:"DataFrame"})}),", and ",(0,r.jsx)(t.a,{href:"/data-types#message",children:(0,r.jsx)(t.code,{children:"Message"})})," objects."]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Data"}),": A structured object that contains both text and metadata."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User Profile"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "data"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"John Smith"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"30",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"john@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"DataFrame"}),": A tabular data structure with rows and columns.\nKeys are columns, and each dictionary (a collection of key-value pairs) in the list is a row."]}),"\n"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"John Smith"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"30",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"john@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Jane Doe"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"25",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"jane@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"]",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Message"}),": A string, such as",(0,r.jsx)(t.code,{children:'"Name: John Smith, Age: 30, Email: john@example.com"'}),"."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"To use this component in a flow, do the following:"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Add the ",(0,r.jsx)(t.strong,{children:"Web Search"})," component to the ",(0,r.jsx)(t.strong,{children:"Basic Prompting"})," template. In the ",(0,r.jsx)(t.strong,{children:"Search Query"})," field, enter a query, such as ",(0,r.jsx)(t.code,{children:"environmental news"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"Web Search"})," component's output to a component that accepts the ",(0,r.jsx)(t.code,{children:"DataFrame"})," input.\nThis example uses a ",(0,r.jsx)(t.strong,{children:"Prompt Template"})," component to give the chatbot context, so you must convert the ",(0,r.jsx)(t.strong,{children:"Web Search"})," component's ",(0,r.jsx)(t.code,{children:"DataFrame"})," output to a ",(0,r.jsx)(t.code,{children:"Message"})," type."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component to convert the ",(0,r.jsx)(t.code,{children:"DataFrame"})," to a ",(0,r.jsx)(t.code,{children:"Message"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component, in the ",(0,r.jsx)(t.strong,{children:"Output Type"})," field, select ",(0,r.jsx)(t.strong,{children:"Message"}),"."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Type convert web search output to chat",src:n(42547).A+"",width:"4000",height:"1826"})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Language Model"})," component, in the ",(0,r.jsx)(t.strong,{children:"OpenAI API Key"})," field, add your OpenAI API key."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Click ",(0,r.jsx)(t.strong,{children:"Playground"}),", and then ask about ",(0,r.jsx)(t.code,{children:"latest news"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["The search results are returned to the ",(0,r.jsx)(t.strong,{children:"Playground"})," as a message."]}),"\n",(0,r.jsx)(t.p,{children:"Result:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Latest news",props:{}}]},{tokens:[{content:"AI",props:{}}]},{tokens:[{content:"gpt-4o-mini",props:{}}]},{tokens:[{content:"Here are some of the latest news articles related to the environment:",props:{}}]},{tokens:[{content:"Ozone Pollution and Global Warming: A recent study highlights that ozone pollution is a significant global environmental concern, threatening human health and crop production while exacerbating global warming. Read more",props:{}}]},{tokens:[{content:"...",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parameters"}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Inputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Input Data"}),(0,r.jsx)(t.td,{children:"The data to convert. Accepts Data, DataFrame, or Message objects."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output_type"}),(0,r.jsx)(t.td,{children:"Output Type"}),(0,r.jsx)(t.td,{children:"The desired output type. Options: Data, DataFrame, or Message."})]})]})]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.strong,{children:"Outputs"})}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsx)(t.tbody,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output"}),(0,r.jsx)(t.td,{children:"Output"}),(0,r.jsx)(t.td,{children:"The converted data in the specified format."})]})})]})]}),"\n",(0,r.jsx)(t.h2,{id:"legacy-processing-components",children:"Legacy Processing components"}),"\n",(0,r.jsxs)(t.p,{children:["The following ",(0,r.jsx)(t.strong,{children:"Processing"})," components are legacy components.\nYou can still use them in your flows, but they are no longer supported and can be removed in a future release."]}),"\n",(0,r.jsx)(t.p,{children:"Replace these components with suggested alternatives as soon as possible."}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Alter Metadata"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component modifies metadata of input objects. It can add new metadata, update existing metadata, and remove specified metadata fields. The component works with both ",(0,r.jsx)(t.code,{children:"Message"})," and ",(0,r.jsx)(t.code,{children:"Data"})," objects, and can also create a new ",(0,r.jsx)(t.code,{children:"Data"})," object from user-provided text."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_value"}),(0,r.jsx)(t.td,{children:"Input"}),(0,r.jsx)(t.td,{children:"Input parameter. Objects to which Metadata should be added."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_in"}),(0,r.jsx)(t.td,{children:"User Text"}),(0,r.jsxs)(t.td,{children:["Input parameter. Text input; the value is contained in the 'text' attribute of the ",(0,r.jsx)(t.code,{children:"Data"})," object. Empty text entries are ignored."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metadata"}),(0,r.jsx)(t.td,{children:"Metadata"}),(0,r.jsx)(t.td,{children:"Input parameter. Metadata to add to each object."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"remove_fields"}),(0,r.jsx)(t.td,{children:"Fields to Remove"}),(0,r.jsx)(t.td,{children:"Input parameter. Metadata fields to remove."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. List of Input objects, each with added metadata."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Combine Data/Merge Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]})," or the ",(0,r.jsxs)(t.a,{href:"/components-logic#loop",children:[(0,r.jsx)(t.strong,{children:"Loop"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component combines multiple data sources into a single unified ",(0,r.jsx)(t.code,{children:"Data"})," object."]}),(0,r.jsxs)(t.p,{children:["The component iterates through a list of ",(0,r.jsx)(t.code,{children:"Data"})," objects, merging them into a single ",(0,r.jsx)(t.code,{children:"Data"})," object (",(0,r.jsx)(t.code,{children:"merged_data"}),").\nIf the input list is empty, it returns an empty data object.\nIf there's only one input data object, it returns that object unchanged."]}),(0,r.jsx)(t.p,{children:"The merging process uses the addition operator to combine data objects."})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Combine Text"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component concatenates two text inputs into a single text chunk using a specified delimiter, outputting a ",(0,r.jsx)(t.code,{children:"Message"})," object with the combined text."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Create Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component dynamically creates a ",(0,r.jsx)(t.code,{children:"Data"})," object with a specified number of fields and a text key."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"number_of_fields"}),(0,r.jsx)(t.td,{children:"Number of Fields"}),(0,r.jsx)(t.td,{children:"Input parameter. The number of fields to be added to the record."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key"}),(0,r.jsx)(t.td,{children:"Text Key"}),(0,r.jsx)(t.td,{children:"Input parameter. Key that identifies the field to be used as the text content."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key_validator"}),(0,r.jsx)(t.td,{children:"Text Key Validator"}),(0,r.jsxs)(t.td,{children:["Input parameter. If enabled, checks if the given ",(0,r.jsx)(t.code,{children:"Text Key"})," is present in the given ",(0,r.jsx)(t.code,{children:"Data"}),"."]})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Extract Key"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component extracts a specific key from a ",(0,r.jsx)(t.code,{children:"Data"})," object and returns the value associated with that key."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Data to DataFrame/Data to Message"}),(0,r.jsxs)(t.p,{children:["Replace these legacy components with newer ",(0,r.jsx)(t.strong,{children:"Processing"})," components, such as the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]})," and ",(0,r.jsxs)(t.a,{href:"#type-convert",children:[(0,r.jsx)(t.strong,{children:"Type Convert"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["These components converted one or more ",(0,r.jsx)(t.code,{children:"Data"})," objects into a ",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Message"})," object."]}),(0,r.jsxs)(t.p,{children:["For the ",(0,r.jsx)(t.strong,{children:"Data to DataFrame"})," component, each ",(0,r.jsx)(t.code,{children:"Data"})," object corresponds to one row in the resulting ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nFields from the ",(0,r.jsx)(t.code,{children:".data"})," attribute become columns, and the ",(0,r.jsx)(t.code,{children:".text"})," field (if present) is placed in a ",(0,r.jsx)(t.code,{children:"text"})," column."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Filter Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component filters a ",(0,r.jsx)(t.code,{children:"Data"})," object based on a list of keys (",(0,r.jsx)(t.code,{children:"filter_criteria"}),"), returning a new ",(0,r.jsx)(t.code,{children:"Data"})," object (",(0,r.jsx)(t.code,{children:"filtered_data"}),") that contains only the key-value pairs that match the filter criteria."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Filter Values"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"The Filter values component filters a list of data items based on a specified key, filter value, and comparison operator."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Input data"}),(0,r.jsx)(t.td,{children:"Input parameter. The list of data items to filter."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_key"}),(0,r.jsx)(t.td,{children:"Filter Key"}),(0,r.jsx)(t.td,{children:"Input parameter. The key to filter on."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_value"}),(0,r.jsx)(t.td,{children:"Filter Value"}),(0,r.jsx)(t.td,{children:"Input parameter. The value to filter by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"Comparison Operator"}),(0,r.jsx)(t.td,{children:"Input parameter. The operator to apply for comparing the values."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filtered_data"}),(0,r.jsx)(t.td,{children:"Filtered data"}),(0,r.jsx)(t.td,{children:"Output parameter. The resulting list of filtered data items."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"JSON Cleaner"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"This component cleans JSON strings to ensure they are fully compliant with the JSON specification."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"json_str"}),(0,r.jsx)(t.td,{children:"JSON String"}),(0,r.jsx)(t.td,{children:"Input parameter. The JSON string to be cleaned. This can be a raw, potentially malformed JSON string produced by language models or other sources that may not fully comply with JSON specifications."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"remove_control_chars"}),(0,r.jsx)(t.td,{children:"Remove Control Characters"}),(0,r.jsx)(t.td,{children:"Input parameter. If set to True, this option removes control characters (ASCII characters 0-31 and 127) from the JSON string. This can help eliminate invisible characters that might cause parsing issues or make the JSON invalid."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"normalize_unicode"}),(0,r.jsx)(t.td,{children:"Normalize Unicode"}),(0,r.jsx)(t.td,{children:"Input parameter. When enabled, this option normalizes Unicode characters in the JSON string to their canonical composition form (NFC). This ensures consistent representation of Unicode characters across different systems and prevents potential issues with character encoding."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"validate_json"}),(0,r.jsx)(t.td,{children:"Validate JSON"}),(0,r.jsx)(t.td,{children:"Input parameter. If set to True, this option attempts to parse the JSON string to ensure it is well-formed before applying the final repair operation. It raises a ValueError if the JSON is invalid, allowing for early detection of major structural issues in the JSON."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output"}),(0,r.jsx)(t.td,{children:"Cleaned JSON String"}),(0,r.jsx)(t.td,{children:"Output parameter. The resulting cleaned, repaired, and validated JSON string that fully complies with the JSON specification."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Message to Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#type-convert",children:[(0,r.jsx)(t.strong,{children:"Type Convert"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component converts ",(0,r.jsx)(t.code,{children:"Message"})," objects to ",(0,r.jsx)(t.code,{children:"Data"})," objects."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parse DataFrame"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#dataframe-operations",children:[(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component"]})," or ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component converts ",(0,r.jsx)(t.code,{children:"DataFrame"})," objects into plain text using templates."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"df"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"Input parameter. The DataFrame to convert to text rows."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"template"}),(0,r.jsx)(t.td,{children:"Template"}),(0,r.jsxs)(t.td,{children:["Input parameter. Template for formatting (use ",(0,r.jsx)(t.code,{children:"{column_name}"})," placeholders)."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sep"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsx)(t.td,{children:"Input parameter. String to join rows in output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text"}),(0,r.jsx)(t.td,{children:"Text"}),(0,r.jsx)(t.td,{children:"Output parameter. All rows combined into single text."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parse JSON"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component converts and extracts JSON fields in ",(0,r.jsx)(t.code,{children:"Message"})," and ",(0,r.jsx)(t.code,{children:"Data"})," objects using JQ queries, then returns ",(0,r.jsx)(t.code,{children:"filtered_data"}),", which is a list of ",(0,r.jsx)(t.code,{children:"Data"})," objects."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Python REPL"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#python-interpreter",children:[(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component"]})," or another processing or logic component."]}),(0,r.jsx)(t.p,{children:"This component creates a Python REPL (Read-Eval-Print Loop) tool for executing Python code."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"name"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsxs)(t.td,{children:["Input parameter. The name of the tool. Default: ",(0,r.jsx)(t.code,{children:"python_repl"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"description"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. A description of the tool's functionality."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"global_imports"}),(0,r.jsx)(t.td,{children:"List[String]"}),(0,r.jsxs)(t.td,{children:["Input parameter. A list of modules to import globally. Default: ",(0,r.jsx)(t.code,{children:"math"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool"}),(0,r.jsx)(t.td,{children:"Tool"}),(0,r.jsx)(t.td,{children:"Output parameter. A Python REPL tool for use in LangChain."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Python Code Structured"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#python-interpreter",children:[(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component"]})," or another processing or logic component."]}),(0,r.jsx)(t.p,{children:"This component creates a structured tool from Python code using a dataclass."}),(0,r.jsx)(t.p,{children:"The component dynamically updates its configuration based on the provided Python code, allowing for custom function arguments and descriptions."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_code"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The Python code for the tool's dataclass."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_name"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The name of the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_description"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The description of the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"return_direct"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"Input parameter. Whether to return the function output directly."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_function"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The selected function for the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"global_variables"}),(0,r.jsx)(t.td,{children:"Dict"}),(0,r.jsx)(t.td,{children:"Input parameter. Global variables or data for the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"result_tool"}),(0,r.jsx)(t.td,{children:"Tool"}),(0,r.jsx)(t.td,{children:"Output parameter. A structured tool created from the Python code."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Regex Extractor"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"This component extracts patterns in text using regular expressions. It can be used to find and extract specific patterns or information in text."})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Select Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component selects a single ",(0,r.jsx)(t.code,{children:"Data"})," object from a list."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_list"}),(0,r.jsx)(t.td,{children:"Data List"}),(0,r.jsx)(t.td,{children:"Input parameter. List of data to select from"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_index"}),(0,r.jsx)(t.td,{children:"Data Index"}),(0,r.jsx)(t.td,{children:"Input parameter. Index of the data to select"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"selected_data"}),(0,r.jsx)(t.td,{children:"Selected Data"}),(0,r.jsxs)(t.td,{children:["Output parameter. The selected ",(0,r.jsx)(t.code,{children:"Data"})," object."]})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Update Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"This component dynamically updates or appends data with specified fields."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"old_data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Input parameter. The records to update."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"number_of_fields"}),(0,r.jsx)(t.td,{children:"Number of Fields"}),(0,r.jsx)(t.td,{children:"Input parameter. The number of fields to add. The maximum is 15."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key"}),(0,r.jsx)(t.td,{children:"Text Key"}),(0,r.jsx)(t.td,{children:"Input parameter. The key for text content."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key_validator"}),(0,r.jsx)(t.td,{children:"Text Key Validator"}),(0,r.jsx)(t.td,{children:"Input parameter. Validates the text key presence."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. The updated Data objects."})]})]})]})]})]})}function m(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}function u(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},42547:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-type-convert-and-web-search-1eef7b9a7c1a243f4a08d9717728d0e1.png"},46445:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-data-operations-select-key-80bade862d29f2851b01ee26413d495f.png"},49823:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-split-text-fec2b1abb28e0852c8a172bbeb164b2c.png"},66539:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-lambda-filter-76cd345c52fa41a59dcfac0205dc3068.png"},82798:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-structured-output-23458b0d29eed6d092b557c7aaf6ab2c.png"},88103:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-batch-run-19c94fbb0646b2731b37013b84dff1f6.png"},96218:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-parser-1d1d72593f02991e5b14b6b1c112a744.png"},99e3:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-python-interpreter-1ef9e7dec643a216fd5e83c2139d09c9.png"}}]); \ No newline at end of file diff --git a/assets/js/7819cc1c.ff17ecfc.js b/assets/js/7819cc1c.ff17ecfc.js new file mode 100644 index 0000000000..d7f10d020b --- /dev/null +++ b/assets/js/7819cc1c.ff17ecfc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[6006],{9898:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-llm-router-1b417082a0208a70065bc177a78fab67.png"},11470:(e,t,n)=>{n.d(t,{A:()=>v});var s=n(96540),r=n(18215),o=n(23104),a=n(56347),i=n(205),c=n(57485),l=n(31682),d=n(70679);function h(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,s.useMemo)(()=>{const e=t??function(e){return h(e).map(({props:{value:e,label:t,attributes:n,default:s}})=>({value:e,label:t,attributes:n,default:s}))}(n);return function(e){const t=(0,l.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,n])}function x({value:e,tabValues:t}){return t.some(t=>t.value===e)}function u({queryString:e=!1,groupId:t}){const n=(0,a.W6)(),r=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,c.aZ)(r),(0,s.useCallback)(e=>{if(!r)return;const t=new URLSearchParams(n.location.search);t.set(r,e),n.replace({...n.location,search:t.toString()})},[r,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:r}=e,o=p(e),[a,c]=(0,s.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o})),[l,h]=u({queryString:n,groupId:r}),[m,j]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,r]=(0,d.Dv)(t);return[n,(0,s.useCallback)(e=>{t&&r.set(e)},[t,r])]}({groupId:r}),g=(()=>{const e=l??m;return x({value:e,tabValues:o})?e:null})();(0,i.A)(()=>{g&&c(g)},[g]);return{selectedValue:a,selectValue:(0,s.useCallback)(e=>{if(!x({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);c(e),h(e),j(e)},[h,j,o]),tabValues:o}}var j=n(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=n(74848);function y({className:e,block:t,selectedValue:n,selectValue:s,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,o.a_)(),l=e=>{const t=e.currentTarget,r=i.indexOf(t),o=a[r].value;o!==n&&(c(t),s(o))},d=e=>{let t=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const n=i.indexOf(e.currentTarget)+1;t=i[n]??i[0];break}case"ArrowLeft":{const n=i.indexOf(e.currentTarget)-1;t=i[n]??i[i.length-1];break}}t?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},e),children:a.map(({value:e,label:t,attributes:s})=>(0,f.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:l,...s,className:(0,r.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function b({lazy:e,children:t,selectedValue:n}){const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===n);return e?(0,s.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:o.map((e,t)=>(0,s.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function D(e){const t=m(e);return(0,f.jsxs)("div",{className:(0,r.A)("tabs-container",g.tabList),children:[(0,f.jsx)(y,{...t,...e}),(0,f.jsx)(b,{...t,...e})]})}function v(e){const t=(0,j.A)();return(0,f.jsx)(D,{...e,children:h(e.children)},String(t))}},13533:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-dataframe-operations-031488ccf4e3d3378f8842f0ea10682c.png"},17886:(e,t,n)=>{n.d(t,{A:()=>o});n(96540);var s=n(64058),r=n(74848);function o({name:e,...t}){const n=s[e];return n?(0,r.jsx)(n,{...t}):null}},19365:(e,t,n)=>{n.d(t,{A:()=>a});n(96540);var s=n(18215);const r={tabItem:"tabItem_Ymn6"};var o=n(74848);function a({children:e,hidden:t,className:n}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,s.A)(r.tabItem,n),hidden:t,children:e})}},40966:(e,t,n)=>{n.r(t),n.d(t,{CH:()=>x,assets:()=>p,chCodeConfig:()=>u,contentTitle:()=>h,default:()=>g,frontMatter:()=>d,metadata:()=>s,toc:()=>m});const s=JSON.parse('{"id":"Components/components-processing","title":"Processing components","description":"Langflow\'s Processing components process and transform data within a flow.","source":"@site/docs/Components/components-processing.mdx","sourceDirName":"Components","slug":"/components-processing","permalink":"/components-processing","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Processing components","slug":"/components-processing"},"sidebar":"docs","previous":{"title":"Vector Stores","permalink":"/components-vector-stores"},"next":{"title":"Prompt Template","permalink":"/components-prompts"}}');var r=n(74848),o=n(28453),a=n(24754),i=n(17886),c=n(11470),l=n(19365);const d={title:"Processing components",slug:"/components-processing"},h=void 0,p={},x={annotations:a.hk,Code:a.Cy},u={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},m=[{value:"Prompt Template",id:"prompt-template",level:2},{value:"Batch Run",id:"batch-run",level:2},{value:"Use the Batch Run component in a flow",id:"use-the-batch-run-component-in-a-flow",level:3},{value:"Batch Run parameters",id:"batch-run-parameters",level:3},{value:"Data Operations",id:"data-operations",level:2},{value:"Use the Data Operations component in a flow",id:"use-the-data-operations-component-in-a-flow",level:3},{value:"Data Operations parameters",id:"data-operations-parameters",level:3},{value:"Available data operations",id:"available-data-operations",level:4},{value:"DataFrame Operations",id:"dataframe-operations",level:2},{value:"Use the DataFrame Operations component in a flow",id:"use-the-dataframe-operations-component-in-a-flow",level:3},{value:"DataFrame Operations parameters",id:"dataframe-operations-parameters",level:3},{value:"LLM Router",id:"llm-router",level:2},{value:"LLM Router parameters",id:"llm-router-parameters",level:3},{value:"LLM Router outputs",id:"llm-router-outputs",level:3},{value:"Parser",id:"parser",level:2},{value:"Parsing modes",id:"parsing-modes",level:3},{value:"Test and troubleshoot parsed text",id:"test-and-troubleshoot-parsed-text",level:3},{value:"Python Interpreter",id:"python-interpreter",level:2},{value:"Use the Python Interpreter in a flow",id:"use-the-python-interpreter-in-a-flow",level:3},{value:"Python Interpreter parameters",id:"python-interpreter-parameters",level:3},{value:"Save File",id:"save-file",level:2},{value:"Smart Function",id:"smart-function",level:2},{value:"Smart Function parameters",id:"smart-function-parameters",level:3},{value:"Split Text",id:"split-text",level:2},{value:"Split Text parameters",id:"split-text-parameters",level:3},{value:"Other text splitters",id:"other-text-splitters",level:3},{value:"Structured Output",id:"structured-output",level:2},{value:"Use the Structured Output component in a flow",id:"use-the-structured-output-component-in-a-flow",level:3},{value:"Structured Output parameters",id:"structured-output-parameters",level:3},{value:"Output Schema options",id:"output-schema-options",level:4},{value:"Type Convert",id:"type-convert",level:2},{value:"Use the Type Convert component in a flow",id:"use-the-type-convert-component-in-a-flow",level:3},{value:"Type Convert parameters",id:"type-convert-parameters",level:3},{value:"Legacy Processing components",id:"legacy-processing-components",level:2}];function j(e){const t={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",h4:"h4",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components},{Details:s}=t;return x||f("CH",!1),x.Code||f("CH.Code",!0),s||f("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,r.jsxs)(t.p,{children:["Langflow's ",(0,r.jsx)(t.strong,{children:"Processing"})," components process and transform data within a flow.\nThey have many uses, including:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Feed instructions and context to your LLMs and agents with the ",(0,r.jsxs)(t.a,{href:"#prompt-template",children:[(0,r.jsx)(t.strong,{children:"Prompt Template"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Extract content from larger chunks of data with a ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Filter data with natural language with the ",(0,r.jsxs)(t.a,{href:"#smart-function",children:[(0,r.jsx)(t.strong,{children:"Smart Function"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Save data to your local machine with the ",(0,r.jsxs)(t.a,{href:"#save-file",children:[(0,r.jsx)(t.strong,{children:"Save File"})," component"]}),"."]}),"\n",(0,r.jsxs)(t.li,{children:["Transform data into a different data type with the ",(0,r.jsxs)(t.a,{href:"#type-convert",children:[(0,r.jsx)(t.strong,{children:"Type Convert"})," component"]})," to pass it between incompatible components."]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"prompt-template",children:"Prompt Template"}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/components-prompts",children:"Prompt Template"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"batch-run",children:"Batch Run"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component runs a language model over ",(0,r.jsx)(t.em,{children:"each row of one text column"})," in a ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:(0,r.jsx)(t.code,{children:"DataFrame"})}),", and then returns a new ",(0,r.jsx)(t.code,{children:"DataFrame"})," with the original text and an LLM response.\nThe output contains the following columns:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"text_input"}),": The original text from the input ",(0,r.jsx)(t.code,{children:"DataFrame"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"model_response"}),": The model's response for each input"]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"batch_index"}),": The 0-indexed processing order for all rows in the ",(0,r.jsx)(t.code,{children:"DataFrame"})]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.code,{children:"metadata"})," (optional): Additional information about the processing"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"use-the-batch-run-component-in-a-flow",children:"Use the Batch Run component in a flow"}),"\n",(0,r.jsxs)(t.p,{children:["If you pass the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," output to a ",(0,r.jsxs)(t.a,{href:"/components-processing#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),", you can use variables in the parsing template to reference these keys, such as ",(0,r.jsx)(t.code,{children:"{text_input}"})," and ",(0,r.jsx)(t.code,{children:"{model_response}"}),".\nThis is demonstrated in the following example."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A batch run component connected to OpenAI and a Parser",src:n(88103).A+"",width:"4000",height:"2728"})}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component to a ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"Language model"})," port."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect ",(0,r.jsx)(t.code,{children:"DataFrame"})," output from another component to the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input.\nFor example, you could connect a ",(0,r.jsx)(t.strong,{children:"File"})," component with a CSV file."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"Column Name"})," field, enter the name of the column in the incoming ",(0,r.jsx)(t.code,{children:"DataFrame"})," that contains the text to process.\nFor example, if you want to extract text from a ",(0,r.jsx)(t.code,{children:"name"})," column in a CSV file, enter ",(0,r.jsx)(t.code,{children:"name"})," in the ",(0,r.jsx)(t.strong,{children:"Column Name"})," field."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's ",(0,r.jsx)(t.strong,{children:"Batch Results"})," output to a ",(0,r.jsx)(t.strong,{children:"Parser"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Optional: In the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"}),", enable the ",(0,r.jsx)(t.strong,{children:"System Message"})," parameter, click ",(0,r.jsx)(t.strong,{children:"Close"}),", and then enter an instruction for how you want the LLM to process each cell extracted from the file.\nFor example, ",(0,r.jsx)(t.code,{children:"Create a business card for each name."})]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Parser"})," component's ",(0,r.jsx)(t.strong,{children:"Template"})," field, enter a template for processing the ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component's new ",(0,r.jsx)(t.code,{children:"DataFrame"})," columns (",(0,r.jsx)(t.code,{children:"text_input"}),", ",(0,r.jsx)(t.code,{children:"model_response"}),", and ",(0,r.jsx)(t.code,{children:"batch_index"}),"):"]}),"\n",(0,r.jsxs)(t.p,{children:["For example, this template uses three columns from the resulting, post-batch ",(0,r.jsx)(t.code,{children:"DataFrame"}),":"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"record_number: {batch_index}, name: {text_input}, summary: {model_response}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To test the processing, click the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Run component"}),", and then click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," to view the final ",(0,r.jsx)(t.code,{children:"DataFrame"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["You can also connect a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component to the ",(0,r.jsx)(t.strong,{children:"Parser"})," component if you want to see the output in the ",(0,r.jsx)(t.strong,{children:"Playground"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"batch-run-parameters",children:"Batch Run parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"Batch Run"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"model"}),(0,r.jsx)(t.td,{children:"HandleInput"}),(0,r.jsxs)(t.td,{children:["Input parameter. Connect the 'Language Model' output from a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component. Required."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"system_message"}),(0,r.jsx)(t.td,{children:"MultilineInput"}),(0,r.jsx)(t.td,{children:"Input parameter. A multi-line system instruction for all rows in the DataFrame."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"df"}),(0,r.jsx)(t.td,{children:"DataFrameInput"}),(0,r.jsx)(t.td,{children:"Input parameter. The DataFrame whose column is treated as text messages, as specified by 'column_name'. Required."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"column_name"}),(0,r.jsx)(t.td,{children:"MessageTextInput"}),(0,r.jsx)(t.td,{children:"Input parameter. The name of the DataFrame column to treat as text messages. If empty, all columns are formatted in TOML."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output_column_name"}),(0,r.jsx)(t.td,{children:"MessageTextInput"}),(0,r.jsxs)(t.td,{children:["Input parameter. Name of the column where the model's response is stored. Default=",(0,r.jsx)(t.code,{children:"model_response"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"enable_metadata"}),(0,r.jsx)(t.td,{children:"BoolInput"}),(0,r.jsx)(t.td,{children:"Input parameter. If True, add metadata to the output DataFrame."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"batch_results"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"Output parameter. A DataFrame with all original columns plus the model's response column."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"data-operations",children:"Data Operations"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component performs operations on ",(0,r.jsx)(t.a,{href:"/data-types#data",children:(0,r.jsx)(t.code,{children:"Data"})})," objects, including extracting, filtering, and editing keys and values in the ",(0,r.jsx)(t.code,{children:"Data"}),".\nFor all options, see ",(0,r.jsx)(t.a,{href:"#available-data-operations",children:"Available data operations"}),".\nThe output is a new ",(0,r.jsx)(t.code,{children:"Data"})," object containing the modified data after running the selected operation."]}),"\n",(0,r.jsx)(t.h3,{id:"use-the-data-operations-component-in-a-flow",children:"Use the Data Operations component in a flow"}),"\n",(0,r.jsxs)(t.p,{children:["The following example demonstrates how to use a ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component in a flow using data from a webhook payload:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Create a flow with a ",(0,r.jsx)(t.strong,{children:"Webhook"})," component and a ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component, and then connect the ",(0,r.jsx)(t.strong,{children:"Webhook"})," component's output to the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component's ",(0,r.jsx)(t.strong,{children:"Data"})," input."]}),"\n",(0,r.jsxs)(t.p,{children:["All operations in the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component require at least one ",(0,r.jsx)(t.code,{children:"Data"})," input from another component.\nIf the preceding component doesn't produce ",(0,r.jsx)(t.code,{children:"Data"})," output, you can use another component, such as the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component, to reformat the data before passing it to the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component.\nAlternatively, you could consider using a component that is designed to process the original data type, such as the ",(0,r.jsx)(t.strong,{children:"Parser"})," or ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," components."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Operations"})," field, select the operation you want to perform on the incoming ",(0,r.jsx)(t.code,{children:"Data"}),".\nFor this example, select the ",(0,r.jsx)(t.strong,{children:"Select Keys"})," operation."]}),"\n",(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["You can select only one operation.\nIf you need to perform multiple operations on the data, you can chain multiple ",(0,r.jsx)(t.strong,{children:"Data Operations"})," components together to execute each operation in sequence.\nFor more complex multi-step operations, consider using a component like the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component."]})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Under ",(0,r.jsx)(t.strong,{children:"Select Keys"}),", add keys for ",(0,r.jsx)(t.code,{children:"name"}),", ",(0,r.jsx)(t.code,{children:"username"}),", and ",(0,r.jsx)(t.code,{children:"email"}),".\nClick ",(0,r.jsx)(i.A,{name:"Plus","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Add more"})," to add a field for each key."]}),"\n",(0,r.jsxs)(t.p,{children:["For this example, assume that the webhook will receive consistent payloads that always contain ",(0,r.jsx)(t.code,{children:"name"}),", ",(0,r.jsx)(t.code,{children:"username"}),", and ",(0,r.jsx)(t.code,{children:"email"})," keys.\nThe ",(0,r.jsx)(t.strong,{children:"Select Keys"})," operation extracts the value of these keys from each incoming payload."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Optional: If you want to view the output in the ",(0,r.jsx)(t.strong,{children:"Playground"}),", connect the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component's output to a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A flow with Webhook, Data Operations, and Chat Output components",src:n(46445).A+"",width:"4000",height:"1920"})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To test the flow, send the following request to your flow's webhook endpoint.\nFor more information about the webhook endpoint, see ",(0,r.jsx)(t.a,{href:"/webhook",children:"Trigger flows with webhooks"}),"."]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:'POST "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_URL",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/webhook/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"-H ",props:{style:{color:"#C9D1D9"}}},{content:'"Content-Type: application/json" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"-H ",props:{style:{color:"#C9D1D9"}}},{content:'"x-api-key: ',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_API_KEY",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"-d ",props:{style:{color:"#C9D1D9"}}},{content:"'{",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "id": 1,',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "name": "Leanne Graham",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "username": "Bret",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "email": "Sincere@april.biz",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "address": {',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "street": "Main Street",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "suite": "Apt. 556",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "city": "Springfield",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "zipcode": "92998-3874",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "geo": {',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "lat": "-37.3159",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "lng": "81.1496"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "phone": "1-770-736-8031 x56442",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "website": "hildegard.org",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "company": {',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "name": "Acme-Corp",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "catchPhrase": "Multi-layered client-server neural-net",',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:' "bs": "harness real-time e-markets"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To view the ",(0,r.jsx)(t.code,{children:"Data"})," resulting from the ",(0,r.jsx)(t.strong,{children:"Select Keys"})," operation, do one of the following:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["If you attached a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component, open the ",(0,r.jsx)(t.strong,{children:"Playground"})," to see the result as a chat message."]}),"\n",(0,r.jsxs)(t.li,{children:["Click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," on the ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"data-operations-parameters",children:"Data Operations parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Many ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component input parameters are conditional based on the selected ",(0,r.jsx)(t.strong,{children:"Operation"})," (",(0,r.jsx)(t.code,{children:"operation"}),")."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsxs)(t.td,{children:["Input parameter. The ",(0,r.jsx)(t.code,{children:"Data"})," object to operate on."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operation"}),(0,r.jsx)(t.td,{children:"Operation"}),(0,r.jsxs)(t.td,{children:["Input parameter. The operation to perform on the data. See ",(0,r.jsx)(t.a,{href:"#available-data-operations",children:"Available data operations"})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"select_keys_input"}),(0,r.jsx)(t.td,{children:"Select Keys"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of keys to select from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_key"}),(0,r.jsx)(t.td,{children:"Filter Key"}),(0,r.jsx)(t.td,{children:"Input parameter. The key to filter by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"Comparison Operator"}),(0,r.jsx)(t.td,{children:"Input parameter. The operator to apply for comparing values."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_values"}),(0,r.jsx)(t.td,{children:"Filter Values"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of values to filter by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"append_update_data"}),(0,r.jsx)(t.td,{children:"Append or Update"}),(0,r.jsx)(t.td,{children:"Input parameter. The data to append or update the existing data with."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"remove_keys_input"}),(0,r.jsx)(t.td,{children:"Remove Keys"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of keys to remove from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"rename_keys_input"}),(0,r.jsx)(t.td,{children:"Rename Keys"}),(0,r.jsx)(t.td,{children:"Input parameter. A list of keys to rename in the data."})]})]})]}),"\n",(0,r.jsx)(t.h4,{id:"available-data-operations",children:"Available data operations"}),"\n",(0,r.jsxs)(t.p,{children:["Options for the ",(0,r.jsx)(t.code,{children:"operations"})," input parameter are as follows.\nAll operations act on an incoming ",(0,r.jsx)(t.code,{children:"Data"})," object."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Required Inputs"}),(0,r.jsx)(t.th,{children:"Process"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Select Keys"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"select_keys_input"})}),(0,r.jsx)(t.td,{children:"Selects specific keys from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Literal Eval"}),(0,r.jsx)(t.td,{children:"None"}),(0,r.jsx)(t.td,{children:"Evaluates string values as Python literals."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Combine"}),(0,r.jsx)(t.td,{children:"None"}),(0,r.jsx)(t.td,{children:"Combines multiple data objects into one."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Filter Values"}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"filter_key"}),", ",(0,r.jsx)(t.code,{children:"filter_values"}),", ",(0,r.jsx)(t.code,{children:"operator"})]}),(0,r.jsx)(t.td,{children:"Filters data based on key-value pair."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Append or Update"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"append_update_data"})}),(0,r.jsx)(t.td,{children:"Adds or updates key-value pairs."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Remove Keys"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"remove_keys_input"})}),(0,r.jsx)(t.td,{children:"Removes specified keys from the data."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"Rename Keys"}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"rename_keys_input"})}),(0,r.jsx)(t.td,{children:"Renames keys in the data."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"dataframe-operations",children:"DataFrame Operations"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component performs operations on ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:(0,r.jsx)(t.code,{children:"DataFrame"})})," (table) rows and columns, including schema changes, record changes, sorting, and filtering.\nFor all options, see ",(0,r.jsx)(t.a,{href:"#dataframe-operations-parameters",children:"DataFrame Operations parameters"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["The output is a new ",(0,r.jsx)(t.code,{children:"DataFrame"})," containing the modified data after running the selected operation."]}),"\n",(0,r.jsx)(t.h3,{id:"use-the-dataframe-operations-component-in-a-flow",children:"Use the DataFrame Operations component in a flow"}),"\n",(0,r.jsxs)(t.p,{children:["The following steps explain how to configure a ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component in a flow.\nYou can follow along with an example or use your own flow.\nThe only requirement is that the preceding component must create ",(0,r.jsx)(t.code,{children:"DataFrame"})," output that you can pass to the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component."]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Create a new flow or use an existing flow."}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"API response extraction flow example"}),(0,r.jsxs)(t.p,{children:["The following example flow uses five components to extract ",(0,r.jsx)(t.code,{children:"Data"})," from an API response, transform it to a ",(0,r.jsx)(t.code,{children:"DataFrame"}),", and then perform further processing on the tabular data using a ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component.\nThe sixth component, ",(0,r.jsx)(t.strong,{children:"Chat Output"}),", is optional in this example.\nIt only serves as a convenient way for you to view the final output in the ",(0,r.jsx)(t.strong,{children:"Playground"}),", rather than inspecting the component logs."]}),(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A flow that ingests an API response, extracts it to a DataFrame with a Smart Function component, and the processes it through a DataFrame Operations component",src:n(13533).A+"",width:"4000",height:"2120"})}),(0,r.jsxs)(t.p,{children:["If you want to use this example to test the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component, do the following:"]}),(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Create a flow with the following components:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"API Request"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"Language Model"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"Smart Function"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.strong,{children:"Type Convert"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Configure the ",(0,r.jsxs)(t.a,{href:"#smart-function",children:[(0,r.jsx)(t.strong,{children:"Smart Function"})," component"]})," and its dependencies:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"API Request"}),": Configure the ",(0,r.jsxs)(t.a,{href:"/components-data#api-request",children:[(0,r.jsx)(t.strong,{children:"API Request"})," component"]})," to get JSON data from an endpoint of your choice, and then connect the ",(0,r.jsx)(t.strong,{children:"API Response"})," output to the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component's ",(0,r.jsx)(t.strong,{children:"Data"})," input."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Language Model"}),": Select your preferred provider and model, and then enter a valid API key.\nChange the output to ",(0,r.jsx)(t.strong,{children:"Language Model"}),", and then connect the ",(0,r.jsx)(t.code,{children:"LanguageModel"})," output to the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component's ",(0,r.jsx)(t.strong,{children:"Language Model"})," input."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Smart Function"}),": In the ",(0,r.jsx)(t.strong,{children:"Instructions"})," field, enter natural language instructions to extract data from the API response.\nYour instructions depend on the response content and desired outcome.\nFor example, if the response contains a large ",(0,r.jsx)(t.code,{children:"result"})," field, you might provide instructions like ",(0,r.jsx)(t.code,{children:"explode the result field out into a Data object"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Convert the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component's ",(0,r.jsx)(t.code,{children:"Data"})," output to ",(0,r.jsx)(t.code,{children:"DataFrame"}),":"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"Filtered Data"})," output to the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component's ",(0,r.jsx)(t.strong,{children:"Data"})," input."]}),"\n",(0,r.jsxs)(t.li,{children:["Set the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component's ",(0,r.jsx)(t.strong,{children:"Output Type"})," to ",(0,r.jsx)(t.strong,{children:"DataFrame"}),"."]}),"\n"]}),"\n"]}),"\n"]}),(0,r.jsxs)(t.p,{children:["Now the flow is ready for you to add the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component."]})]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Add a ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component to the flow, and then connect ",(0,r.jsx)(t.code,{children:"DataFrame"})," output from another component to the ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input."]}),"\n",(0,r.jsxs)(t.p,{children:["All operations in the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component require at least one ",(0,r.jsx)(t.code,{children:"DataFrame"})," input from another component.\nIf a component doesn't produce ",(0,r.jsx)(t.code,{children:"DataFrame"})," output, you can use another component, such as the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component, to reformat the data before passing it to the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component.\nAlternatively, you could consider using a component that is designed to process the original data type, such as the ",(0,r.jsx)(t.strong,{children:"Parser"})," or ",(0,r.jsx)(t.strong,{children:"Data Operations"})," components."]}),"\n",(0,r.jsxs)(t.p,{children:["If you are following along with the example flow, connect the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component's ",(0,r.jsx)(t.strong,{children:"DataFrame Output"})," port to the ",(0,r.jsx)(t.strong,{children:"DataFrame"})," input."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Operations"})," field, select the operation you want to perform on the incoming ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nFor example, the ",(0,r.jsx)(t.strong,{children:"Filter"})," operation filters the rows based on a specified column and value."]}),"\n",(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["You can select only one operation.\nIf you need to perform multiple operations on the data, you can chain multiple ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," components together to execute each operation in sequence.\nFor more complex multi-step operations, like dramatic schema changes or pivots, consider using an LLM-powered component, like the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," or ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component, as a replacement or preparation for the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component."]})}),"\n",(0,r.jsxs)(t.p,{children:["If you're following along with the example flow, select any operation that you want to apply to the data that was extracted by the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component.\nTo view the contents of the incoming ",(0,r.jsx)(t.code,{children:"DataFrame"}),", click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Run component"})," on the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component, and then ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"}),".\nIf the ",(0,r.jsx)(t.code,{children:"DataFrame"})," seems malformed, click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," on each upstream component to determine where the error occurs, and then modify your flow's configuration as needed.\nFor example, if the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component didn't extract the expected fields, modify your instructions or verify that the given fields are present in the ",(0,r.jsx)(t.strong,{children:"API Response"})," output."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Configure the operation's parameters.\nThe specific parameters depend on the selected operation.\nFor example, if you select the ",(0,r.jsx)(t.strong,{children:"Filter"})," operation, you must define a filter condition using the ",(0,r.jsx)(t.strong,{children:"Column Name"}),", ",(0,r.jsx)(t.strong,{children:"Filter Value"}),", and ",(0,r.jsx)(t.strong,{children:"Filter Operator"})," parameters.\nFor more information, see ",(0,r.jsx)(t.a,{href:"#dataframe-operations-parameters",children:"DataFrame Operations parameters"})]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To test the flow, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Run component"})," on the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component, and then click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," to view the new ",(0,r.jsx)(t.code,{children:"DataFrame"})," created from the ",(0,r.jsx)(t.strong,{children:"Filter"})," operation."]}),"\n",(0,r.jsxs)(t.p,{children:["If you want to view the output in the ",(0,r.jsx)(t.strong,{children:"Playground"}),", connect the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component's output to a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component, rerun the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component, and then click ",(0,r.jsx)(t.strong,{children:"Playground"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For another example, see ",(0,r.jsx)(t.a,{href:"/components-logic#conditional-looping",children:"Conditional looping"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"dataframe-operations-parameters",children:"DataFrame Operations parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Most ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," parameters are conditional because they only apply to specific operations."]}),"\n",(0,r.jsxs)(t.p,{children:["The only permanent parameters are ",(0,r.jsx)(t.strong,{children:"DataFrame"})," (",(0,r.jsx)(t.code,{children:"df"}),"), which is the ",(0,r.jsx)(t.code,{children:"DataFrame"})," input, and ",(0,r.jsx)(t.strong,{children:"Operation"})," (",(0,r.jsx)(t.code,{children:"operation"}),"), which is the operation to perform on the ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nOnce you select an operation, the conditional parameters for that operation appear on the ",(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component."]}),"\n",(0,r.jsxs)(c.A,{children:[(0,r.jsxs)(l.A,{value:"addcolumn",label:"Add Column",default:!0,children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Add Column"})," operation allows you to add a new column to the ",(0,r.jsx)(t.code,{children:"DataFrame"})," with a constant value."]}),(0,r.jsxs)(t.p,{children:["The parameters are ",(0,r.jsx)(t.strong,{children:"New Column Name"})," (",(0,r.jsx)(t.code,{children:"new_column_name"}),") and ",(0,r.jsx)(t.strong,{children:"New Column Value"})," (",(0,r.jsx)(t.code,{children:"new_column_value"}),")."]})]}),(0,r.jsx)(l.A,{value:"dropcolumn",label:"Drop Column",children:(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Drop Column"})," operation allows you to remove a column from the ",(0,r.jsx)(t.code,{children:"DataFrame"}),", specified by ",(0,r.jsx)(t.strong,{children:"Column Name"})," (",(0,r.jsx)(t.code,{children:"column_name"}),")."]})}),(0,r.jsxs)(l.A,{value:"filter",label:"Filter",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Filter"})," operation allows you to filter the ",(0,r.jsx)(t.code,{children:"DataFrame"})," based on a specified condition.\nThe output is a ",(0,r.jsx)(t.code,{children:"DataFrame"})," containing only the rows that matched the filter condition."]}),(0,r.jsx)(t.p,{children:"Provide the following parameters:"}),(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Column Name"})," (",(0,r.jsx)(t.code,{children:"column_name"}),"): The name of the column to filter on."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Filter Value"})," (",(0,r.jsx)(t.code,{children:"filter_value"}),"): The value to filter on."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Filter Operator"})," (",(0,r.jsx)(t.code,{children:"filter_operator"}),"): The operator to use for filtering, one of ",(0,r.jsx)(t.code,{children:"equals"})," (default), ",(0,r.jsx)(t.code,{children:"not equals"}),", ",(0,r.jsx)(t.code,{children:"contains"}),", ",(0,r.jsx)(t.code,{children:"starts with"}),", ",(0,r.jsx)(t.code,{children:"ends with"}),", ",(0,r.jsx)(t.code,{children:"greater than"}),", or ",(0,r.jsx)(t.code,{children:"less than"}),"."]}),"\n"]})]}),(0,r.jsxs)(l.A,{value:"head",label:"Head",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Head"})," operation allows you to retrieve the first ",(0,r.jsx)(t.code,{children:"n"})," rows of the ",(0,r.jsx)(t.code,{children:"DataFrame"}),", where ",(0,r.jsx)(t.code,{children:"n"})," is set in ",(0,r.jsx)(t.strong,{children:"Number of Rows"})," (",(0,r.jsx)(t.code,{children:"num_rows"}),").\nThe default is ",(0,r.jsx)(t.code,{children:"5"}),"."]}),(0,r.jsxs)(t.p,{children:["The output is a ",(0,r.jsx)(t.code,{children:"DataFrame"})," containing only the selected rows."]})]}),(0,r.jsxs)(l.A,{value:"renamecolumn",label:"Rename Column",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Rename Column"})," operation allows you to rename an existing column in the ",(0,r.jsx)(t.code,{children:"DataFrame"}),"."]}),(0,r.jsxs)(t.p,{children:["The parameters are ",(0,r.jsx)(t.strong,{children:"Column Name"})," (",(0,r.jsx)(t.code,{children:"column_name"}),"), which is the current name, and ",(0,r.jsx)(t.strong,{children:"New Column Name"})," (",(0,r.jsx)(t.code,{children:"new_column_name"}),")."]})]}),(0,r.jsxs)(l.A,{value:"replacevalue",label:"Replace Value",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Replace Value"})," operation allows you to replace values in a specific column of the ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nThis operation replaces a target value with a new value.\nAll cells matching the target value are replaced with the new value in the new ",(0,r.jsx)(t.code,{children:"DataFrame"})," output."]}),(0,r.jsx)(t.p,{children:"Provide the following parameters:"}),(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Column Name"})," (",(0,r.jsx)(t.code,{children:"column_name"}),"): The name of the column to modify."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Value to Replace"})," (",(0,r.jsx)(t.code,{children:"replace_value"}),"): The value that you want to replace."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Replacement Value"})," (",(0,r.jsx)(t.code,{children:"replacement_value"}),"): The new value to use."]}),"\n"]})]}),(0,r.jsxs)(l.A,{value:"selectcolumns",label:"Select Columns",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Select Columns"})," operation allows you to select one or more specific columns from the ",(0,r.jsx)(t.code,{children:"DataFrame"}),"."]}),(0,r.jsxs)(t.p,{children:["Provide a list of column names in ",(0,r.jsx)(t.strong,{children:"Columns to Select"})," (",(0,r.jsx)(t.code,{children:"columns_to_select"}),").\nIn the visual editor, click ",(0,r.jsx)(i.A,{name:"Plus","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Add More"})," to add multiple fields, and then enter one column name in each field."]}),(0,r.jsxs)(t.p,{children:["The output is a ",(0,r.jsx)(t.code,{children:"DataFrame"})," containing only the specified columns."]})]}),(0,r.jsxs)(l.A,{value:"sort",label:"Sort",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Sort"})," operation allows you to sort the ",(0,r.jsx)(t.code,{children:"DataFrame"})," on a specific column in ascending or descending order."]}),(0,r.jsx)(t.p,{children:"Provide the following parameters:"}),(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Column Name"})," (",(0,r.jsx)(t.code,{children:"column_name"}),"): The name of the column to sort on."]}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Sort Ascending"})," (",(0,r.jsx)(t.code,{children:"ascending"}),"): Whether to sort in ascending or descending order. If enabled (true), sorts in ascending order; if disabled (false), sorts in descending order. Default: Enabled (true)"]}),"\n"]})]}),(0,r.jsxs)(l.A,{value:"tail",label:"Tail",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Tail"})," operation allows you to retrieve the last ",(0,r.jsx)(t.code,{children:"n"})," rows of the ",(0,r.jsx)(t.code,{children:"DataFrame"}),", where ",(0,r.jsx)(t.code,{children:"n"})," is set in ",(0,r.jsx)(t.strong,{children:"Number of Rows"})," (",(0,r.jsx)(t.code,{children:"num_rows"}),").\nThe default is ",(0,r.jsx)(t.code,{children:"5"}),"."]}),(0,r.jsxs)(t.p,{children:["The output is a ",(0,r.jsx)(t.code,{children:"DataFrame"})," containing only the selected rows."]})]}),(0,r.jsxs)(l.A,{value:"dropduplicates",label:"Drop Duplicates",children:[(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Drop Duplicates"})," operation removes rows from the ",(0,r.jsx)(t.code,{children:"DataFrame"})," by identifying all duplicate values within a single column."]}),(0,r.jsxs)(t.p,{children:["The only parameter is the ",(0,r.jsx)(t.strong,{children:"Column Name"})," (",(0,r.jsx)(t.code,{children:"column_name"}),")."]}),(0,r.jsxs)(t.p,{children:["When the flow runs, all rows with duplicate values in the given column are removed.\nThe output is a ",(0,r.jsx)(t.code,{children:"DataFrame"})," containing all columns from the original ",(0,r.jsx)(t.code,{children:"DataFrame"}),", but only rows with non-duplicate values."]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"llm-router",children:"LLM Router"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"LLM Router"})," component routes requests to the most appropriate LLM based on ",(0,r.jsx)(t.a,{href:"https://openrouter.ai/docs/quickstart",children:"OpenRouter"})," model specifications."]}),"\n",(0,r.jsxs)(t.p,{children:["To use the component in a flow, you connect multiple ",(0,r.jsx)(t.strong,{children:"Language Model"})," components to the ",(0,r.jsx)(t.strong,{children:"LLM Router"})," components.\nOne model is the judge LLM that analyzes input messages to understand the evaluation context, selects the most appropriate model from the other attached LLMs, and then routes the input to the selected model.\nThe selected model processes the input, and then returns the generated response."]}),"\n",(0,r.jsxs)(t.p,{children:["The following example flow has three ",(0,r.jsx)(t.strong,{children:"Language Model"})," components.\nOne is the judge LLM, and the other two are in the LLM pool for request routing.\nThe ",(0,r.jsx)(t.strong,{children:"Chat Input"})," and ",(0,r.jsx)(t.strong,{children:"Chat Output"})," components create a seamless chat interaction where you send a message and receive a response without any user awareness of the underlying routing."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"LLM Router component",src:n(9898).A+"",width:"3316",height:"2492"})}),"\n",(0,r.jsx)(t.h3,{id:"llm-router-parameters",children:"LLM Router parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"LLM Router"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"models"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Language Models"})}),(0,r.jsxs)(t.td,{children:["Input parameter. Connect ",(0,r.jsx)(t.a,{href:"/data-types#languagemodel",children:(0,r.jsx)(t.code,{children:"LanguageModel"})})," output from multiple ",(0,r.jsxs)(t.a,{href:"/components-models",children:[(0,r.jsx)(t.strong,{children:"Language Model"})," components"]})," to create a pool of models. The ",(0,r.jsx)(t.code,{children:"judge_llm"})," selects models from this pool when routing requests. The first model you connect is the default model if there is a problem with model selection or routing."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"input_value"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Input"})}),(0,r.jsx)(t.td,{children:"Input parameter. The incoming query to be routed to the model selected by the judge LLM."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"judge_llm"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Judge LLM"})}),(0,r.jsxs)(t.td,{children:["Input parameter. Connect ",(0,r.jsx)(t.code,{children:"LanguageModel"})," output from ",(0,r.jsx)(t.em,{children:"one"})," ",(0,r.jsx)(t.strong,{children:"Language Model"})," component to serve as the judge LLM for request routing."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"optimization"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Optimization"})}),(0,r.jsxs)(t.td,{children:["Input parameter. Set a preferred characteristic for model selection by the judge LLM. The options are ",(0,r.jsx)(t.code,{children:"quality"})," (highest response quality), ",(0,r.jsx)(t.code,{children:"speed"})," (fastest response time), ",(0,r.jsx)(t.code,{children:"cost"})," (most cost-effective model), or ",(0,r.jsx)(t.code,{children:"balanced"})," (equal weight for quality, speed, and cost). Default: ",(0,r.jsx)(t.code,{children:"balanced"})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"use_openrouter_specs"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Use OpenRouter Specs"})}),(0,r.jsx)(t.td,{children:"Input parameter. Whether to fetch model specifications from the OpenRouter API."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"If false, only the model name is provided to the judge LLM. Default: Enabled (true)"}),(0,r.jsx)(t.td,{}),(0,r.jsx)(t.td,{})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"timeout"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"API Timeout"})}),(0,r.jsxs)(t.td,{children:["Input parameter. Set a timeout duration in seconds for API requests made by the router. Default: ",(0,r.jsx)(t.code,{children:"10"})]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"fallback_to_first"})}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.strong,{children:"Fallback to First Model"})}),(0,r.jsxs)(t.td,{children:["Input parameter. Whether to use the first LLM in ",(0,r.jsx)(t.code,{children:"models"})," as a backup if routing fails to reach the selected model. Default: Enabled (true)"]})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"llm-router-outputs",children:"LLM Router outputs"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"LLM Router"})," component provides three output options.\nYou can set the desired output type near the component's output port."]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Output"}),": A ",(0,r.jsx)(t.code,{children:"Message"})," containing the response to the original query as generated by the selected LLM.\nUse this output for regular chat interactions."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Selected Model Info"}),": A ",(0,r.jsx)(t.code,{children:"Data"})," object containing information about the selected model, such as its name and version."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Routing Decision"}),": A ",(0,r.jsx)(t.code,{children:"Message"})," containing the judge model's reasoning for selecting a particular model, including input query length and number of models considered.\nFor example:"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Model Selection Decision:",props:{}}]},{tokens:[{content:"- Selected Model Index: 0",props:{}}]},{tokens:[{content:"- Selected Langflow Model Name: gpt-4o-mini",props:{}}]},{tokens:[{content:"- Selected API Model ID (if resolved): openai/gpt-4o-mini",props:{}}]},{tokens:[{content:"- Optimization Preference: cost",props:{}}]},{tokens:[{content:"- Input Query Length: 27 characters (~5 tokens)",props:{}}]},{tokens:[{content:"- Number of Models Considered: 2",props:{}}]},{tokens:[{content:"- Specifications Source: OpenRouter API",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsx)(t.p,{children:"This is useful for debugging if you feel the judge model isn't selecting the best model."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"parser",children:"Parser"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Parser"})," component extracts text from structured data (",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Data"}),") using a template or direct stringification.\nThe output is a ",(0,r.jsx)(t.code,{children:"Message"})," containing the parsed text."]}),"\n",(0,r.jsxs)(t.p,{children:["This is a versatile component for data extraction and manipulation in your flows.\nFor examples of ",(0,r.jsx)(t.strong,{children:"Parser"})," components in flows, see the following:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:(0,r.jsxs)(t.a,{href:"#batch-run",children:[(0,r.jsx)(t.strong,{children:"Batch Run"})," component"]})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsxs)(t.a,{href:"#structured-output",children:[(0,r.jsx)(t.strong,{children:"Structured Output"})," component"]})}),"\n",(0,r.jsxs)(t.li,{children:[(0,r.jsx)(t.strong,{children:"Financial Report Parser"})," template"]}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsxs)(t.a,{href:"/components-vector-stores",children:[(0,r.jsx)(t.strong,{children:"Vector Store"})," components"]})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"/webhook",children:"Trigger flows with webhooks"})}),"\n",(0,r.jsx)(t.li,{children:(0,r.jsx)(t.a,{href:"/chat-with-rag",children:"Create a vector RAG chatbot"})}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A flow that uses a Parser component to extract text from a Structured Output component.",src:n(96218).A+"",width:"4000",height:"2202"})}),"\n",(0,r.jsx)(t.h3,{id:"parsing-modes",children:"Parsing modes"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Parser"})," component has two modes: ",(0,r.jsx)(t.strong,{children:"Parser"})," and ",(0,r.jsx)(t.strong,{children:"Stringify"}),"."]}),"\n",(0,r.jsxs)(c.A,{children:[(0,r.jsxs)(l.A,{value:"template",label:"Parser (template) mode",default:!0,children:[(0,r.jsxs)(t.p,{children:["In ",(0,r.jsx)(t.strong,{children:"Parser"})," mode, you create a template for text output that can include literal strings and variables for extracted keys."]}),(0,r.jsxs)(t.p,{children:["Use curly braces to define variables anywhere in the template.\nVariables must match keys in the ",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Data"})," input, such as column names.\nFor example, ",(0,r.jsx)(t.code,{children:"{name}"})," extracts the value of a ",(0,r.jsx)(t.code,{children:"name"})," key.\nFor more information about the content and structure of ",(0,r.jsx)(t.code,{children:"DataFrame"})," and ",(0,r.jsx)(t.code,{children:"Data"})," objects, see ",(0,r.jsx)(t.a,{href:"/data-types",children:"Langflow data types"}),"."]}),(0,r.jsxs)(t.p,{children:["When the flow runs, the ",(0,r.jsx)(t.strong,{children:"Parser"})," component iterates over the input, producing a ",(0,r.jsx)(t.code,{children:"Message"})," for each parsed item.\nFor example, parsing a ",(0,r.jsx)(t.code,{children:"DataFrame"})," creates a ",(0,r.jsx)(t.code,{children:"Message"})," for each row, populated with the unique values from that row."]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Employee summary template"}),(0,r.jsx)(t.p,{children:"This example template extracts employee data into a natural language summary about an employee's hire date and current role:"}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{employee_first_name} {employee_last_name} was hired on {start_date}.",props:{}}]},{tokens:[{content:"Their current position is {job_title} ({grade}).",props:{}}]}],lang:"text"},annotations:[]}]}),(0,r.jsxs)(t.p,{children:["The resulting ",(0,r.jsx)(t.code,{children:"Message"})," output replaces the variables with the corresponding extracted values.\nFor example:"]}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Renlo Kai was hired on 11-July-2017.",props:{}}]},{tokens:[{content:"Their current position is Software Engineer (Principal).",props:{}}]}],lang:"text"},annotations:[]}]})]}),(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Employee profile template"}),(0,r.jsx)(t.p,{children:"This example template uses Markdown syntax and extracted employee data to create an employee profile:"}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"# Employee Profile",props:{}}]},{tokens:[{content:"## Personal Information",props:{}}]},{tokens:[{content:"- **Name:** {name}",props:{}}]},{tokens:[{content:"- **ID:** {id}",props:{}}]},{tokens:[{content:"- **Email:** {email}",props:{}}]}],lang:"text"},annotations:[]}]}),(0,r.jsxs)(t.p,{children:["When the flow runs, the ",(0,r.jsx)(t.strong,{children:"Parser"})," component iterates over each row of the ",(0,r.jsx)(t.code,{children:"DataFrame"}),", populating the template's variables with the appropriate extracted values.\nThe resulting text for each row is output as a ",(0,r.jsx)(t.a,{href:"/data-types#message",children:(0,r.jsx)(t.code,{children:"Message"})}),"."]})]}),(0,r.jsxs)(t.p,{children:["The following parameters are available in ",(0,r.jsx)(t.strong,{children:"Parser"})," mode.\nTo view and edit all available parameters, click ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Data or DataFrame"}),(0,r.jsxs)(t.td,{children:["Input parameter. The ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," input to parse."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"pattern"}),(0,r.jsx)(t.td,{children:"Template"}),(0,r.jsxs)(t.td,{children:["Input parameter. The formatting template using plaintext and variables for keys (",(0,r.jsx)(t.code,{children:"{KEY_NAME}"}),"). See the preceding examples for more information."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sep"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsxs)(t.td,{children:["Input parameter. A string defining the separator for rows or lines. Default: ",(0,r.jsx)(t.code,{children:"\\n"})," (new line)."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"clean_data"}),(0,r.jsx)(t.td,{children:"Clean Data"}),(0,r.jsxs)(t.td,{children:["Whether to remove empty rows and lines in each cell or key of the ",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Data"})," input. Default: Enabled (true)"]})]})]})]})]}),(0,r.jsxs)(l.A,{value:"stringify",label:"Stringify mode",children:[(0,r.jsxs)(t.p,{children:["Use ",(0,r.jsx)(t.strong,{children:"Stringify"})," mode to convert the entire input directly to text.\nThis mode doesn't support templates or key selection."]}),(0,r.jsxs)(t.p,{children:["The following parameters are available in ",(0,r.jsx)(t.strong,{children:"Stringify"})," mode.\nTo view and edit all available parameters, click ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Data or DataFrame"}),(0,r.jsxs)(t.td,{children:["Input parameter. The ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," input to parse."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sep"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsxs)(t.td,{children:["Input parameter. A string defining the separator for rows or lines. Default: ",(0,r.jsx)(t.code,{children:"\\n"})," (new line)."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"clean_data"}),(0,r.jsx)(t.td,{children:"Clean Data"}),(0,r.jsxs)(t.td,{children:["Whether to remove empty rows and lines in each cell or key of the ",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Data"})," input. Default: Enabled (true)"]})]})]})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"test-and-troubleshoot-parsed-text",children:"Test and troubleshoot parsed text"}),"\n",(0,r.jsxs)(t.p,{children:["To test the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Run component"}),", and then click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," to see the ",(0,r.jsx)(t.code,{children:"Message"})," output with the parsed text.\nYou can also connect a ",(0,r.jsx)(t.strong,{children:"Chat Output"})," component if you want to view the output in the ",(0,r.jsx)(t.strong,{children:"Playground"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["If the ",(0,r.jsx)(t.code,{children:"Message"})," output from the ",(0,r.jsx)(t.strong,{children:"Parser"})," component has empty or unexpected values, there might be a mapping error between the input and the parsing mode, the input has empty values, or the input isn't suitable for plaintext extraction."]}),"\n",(0,r.jsxs)(t.p,{children:["For example, assume you use the following template to parse a ",(0,r.jsx)(t.code,{children:"DataFrame"}),":"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{employee_first_name} {employee_last_name} is a {job_title} ({grade}).",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["The following ",(0,r.jsx)(t.code,{children:"Message"})," could result from parsing a row where ",(0,r.jsx)(t.code,{children:"employee_first_name"})," was empty and ",(0,r.jsx)(t.code,{children:"grade"})," was ",(0,r.jsx)(t.code,{children:"null"}),":"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:" Smith is a Software Engineer (null).",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsx)(t.p,{children:"To troubleshoot missing or unexpected values, you can do the following:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Make sure the variables in your template map to keys in the incoming ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nTo see the data being passed directly to the ",(0,r.jsx)(t.strong,{children:"Parser"})," component, click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," on the component that is sending data to the ",(0,r.jsx)(t.strong,{children:"Parser"})," component."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Check the source data for missing or incorrect values.\nThere are several ways you can address these inconsistencies:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsx)(t.li,{children:"Rectify the source data directly."}),"\n",(0,r.jsxs)(t.li,{children:["Use other components to amend or filter anomalies before passing the data to the ",(0,r.jsx)(t.strong,{children:"Parser"})," component.\nThere are many components you can use for this depending on your goal, such as the ",(0,r.jsx)(t.strong,{children:"Data Operations"}),", ",(0,r.jsx)(t.strong,{children:"Structured Output"}),", and ",(0,r.jsx)(t.strong,{children:"Smart Function"})," components."]}),"\n",(0,r.jsxs)(t.li,{children:["Enable the ",(0,r.jsx)(t.strong,{children:"Parser"})," component's ",(0,r.jsx)(t.strong,{children:"Clean Data"})," parameter to skip empty rows or lines."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"python-interpreter",children:"Python Interpreter"}),"\n",(0,r.jsx)(t.p,{children:"This component allows you to execute Python code with imported packages."}),"\n",(0,r.jsx)(t.h3,{id:"use-the-python-interpreter-in-a-flow",children:"Use the Python Interpreter in a flow"}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["To use this component in a flow,in the ",(0,r.jsx)(t.strong,{children:"Global Imports"})," field, add the packages you want to import as a comma-separated list, such as ",(0,r.jsx)(t.code,{children:"math,pandas"}),".\nAt least one import is required."]}),"\n",(0,r.jsxs)(t.li,{children:["In the ",(0,r.jsx)(t.strong,{children:"Python Code"})," field, enter the Python code you want to execute. Use ",(0,r.jsx)(t.code,{children:"print()"})," to see the output."]}),"\n",(0,r.jsxs)(t.li,{children:["Optional: Enable ",(0,r.jsx)(t.strong,{children:"Tool Mode"}),", and then connect the ",(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component to an ",(0,r.jsx)(t.strong,{children:"Agent"})," component as a tool.\nFor example, connect a ",(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component and a ",(0,r.jsxs)(t.a,{href:"/components-helpers#calculator",children:[(0,r.jsx)(t.strong,{children:"Calculator"})," component"]})," as tools for an ",(0,r.jsx)(t.strong,{children:"Agent"})," component, and then test how it chooses different tools to solve math problems.\n",(0,r.jsx)(t.img,{alt:"Python Interpreter and Calculator components connected to an Agent component",src:n(99e3).A+"",width:"3988",height:"2928"})]}),"\n",(0,r.jsxs)(t.li,{children:["Ask the agent an easier math question.\nThe ",(0,r.jsx)(t.strong,{children:"Calculator"})," tool can add, subtract, multiple, divide, or perform exponentiation.\nThe agent executes the ",(0,r.jsx)(t.code,{children:"evaluate_expression"})," tool to correctly answer the question."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:"Result:"}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Executed evaluate_expression",props:{}}]},{tokens:[{content:"Input:",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:' "expression": "2+5"',props:{}}]},{tokens:[{content:"}",props:{}}]},{tokens:[{content:"Output:",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:' "result": "7"',props:{}}]},{tokens:[{content:"}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.ol,{start:"5",children:["\n",(0,r.jsxs)(t.li,{children:["Give the agent complete Python code.\nThis example creates a Pandas DataFrame table with the imported ",(0,r.jsx)(t.code,{children:"pandas"})," packages, and returns the square root of the mean squares."]}),"\n"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" pandas ",props:{style:{color:"#C9D1D9"}}},{content:"as",props:{style:{color:"#FF7B72"}}},{content:" pd",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" math",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Create a simple DataFrame",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"df ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" pd.DataFrame({",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'numbers'",props:{style:{color:"#A5D6FF"}}},{content:": [",props:{style:{color:"#C9D1D9"}}},{content:"1",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"2",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"3",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"4",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"5",props:{style:{color:"#79C0FF"}}},{content:"],",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'squares'",props:{style:{color:"#A5D6FF"}}},{content:": [x",props:{style:{color:"#C9D1D9"}}},{content:"**",props:{style:{color:"#FF7B72"}}},{content:"2 ",props:{style:{color:"#79C0FF"}}},{content:"for",props:{style:{color:"#FF7B72"}}},{content:" x ",props:{style:{color:"#C9D1D9"}}},{content:"in ",props:{style:{color:"#FF7B72"}}},{content:"range",props:{style:{color:"#79C0FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"1",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"6",props:{style:{color:"#79C0FF"}}},{content:")]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"})",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Calculate the square root of the mean",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"result ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" math.sqrt(df[",props:{style:{color:"#C9D1D9"}}},{content:"'squares'",props:{style:{color:"#A5D6FF"}}},{content:"].mean())",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"f",props:{style:{color:"#FF7B72"}}},{content:'"Square root of mean squares: ',props:{style:{color:"#A5D6FF"}}},{content:"{",props:{style:{color:"#79C0FF"}}},{content:"result",props:{style:{color:"#C9D1D9"}}},{content:"}",props:{style:{color:"#79C0FF"}}},{content:'"',props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["The agent correctly chooses the ",(0,r.jsx)(t.code,{children:"run_python_repl"})," tool to solve the problem."]}),"\n",(0,r.jsx)(t.p,{children:"Result:"}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Executed run_python_repl",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"Input:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:" \"python_code\": \"import pandas as pd\\nimport math\\n\\n# Create a simple DataFrame\\ndf = pd.DataFrame({\\n 'numbers': [1, 2, 3, 4, 5],\\n 'squares': [x**2 for x in range(1, 6)]\\n})\\n\\n# Calculate the square root of the mean\\nresult = math.sqrt(df['squares'].mean())\\nprint(f\\\"Square root of mean squares: {result}\\\")\"",props:{}}]},{tokens:[{content:"}",props:{}}]},{tokens:[{content:"Output:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"{",props:{}}]},{tokens:[{content:' "result": "Square root of mean squares: 3.3166247903554"',props:{}}]},{tokens:[{content:"}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["If you don't include the package imports in the chat, the agent can still create the table using ",(0,r.jsx)(t.code,{children:"pd.DataFrame"}),", because the ",(0,r.jsx)(t.code,{children:"pandas"})," package is imported globally by the ",(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component in the ",(0,r.jsx)(t.strong,{children:"Global Imports"})," field."]}),"\n",(0,r.jsx)(t.h3,{id:"python-interpreter-parameters",children:"Python Interpreter parameters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"global_imports"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsxs)(t.td,{children:["Input parameter. A comma-separated list of modules to import globally, such as ",(0,r.jsx)(t.code,{children:"math,pandas,numpy"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"python_code"}),(0,r.jsx)(t.td,{children:"Code"}),(0,r.jsx)(t.td,{children:"Input parameter. The Python code to execute. Only modules specified in Global Imports can be used."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"results"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. The output of the executed Python code, including any printed results or errors."})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"save-file",children:"Save File"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Save File"})," component creates a file containing data produced by another component.\nSeveral file formats are supported, and you can store files in ",(0,r.jsx)(t.a,{href:"/memory",children:"Langflow storage"})," or the local file system."]}),"\n",(0,r.jsxs)(t.p,{children:["To configure the ",(0,r.jsx)(t.strong,{children:"Save File"})," component and use it in a flow, do the following:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Connect ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:(0,r.jsx)(t.code,{children:"DataFrame"})}),", ",(0,r.jsx)(t.a,{href:"/data-types#data",children:(0,r.jsx)(t.code,{children:"Data"})}),", or ",(0,r.jsx)(t.a,{href:"/data-types#message",children:(0,r.jsx)(t.code,{children:"Message"})})," output from another component to the ",(0,r.jsx)(t.strong,{children:"Save File"})," component's ",(0,r.jsx)(t.strong,{children:"Input"})," port."]}),"\n",(0,r.jsxs)(t.p,{children:["You can connect the same output to multiple ",(0,r.jsx)(t.strong,{children:"Save File"})," components if you want to create multiple files, save the data in different file formats, or save files to multiple locations."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In ",(0,r.jsx)(t.strong,{children:"File Name"}),", enter a file name and an optional path."]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"File Name"})," parameter controls where the file is saved.\nIt can contain a file name or an entire file path:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Default location"}),": If you only provide a file name, then the file is stored in ",(0,r.jsx)(t.code,{children:".langflow/data"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Subdirectory"}),": To store files in subdirectories, add the path to the ",(0,r.jsx)(t.strong,{children:"File Name"})," parameter.\nFor example, ",(0,r.jsx)(t.code,{children:"subdirectory/my_file"})," creates ",(0,r.jsx)(t.code,{children:"my_file"})," in ",(0,r.jsx)(t.code,{children:".langflow/data/subdirectory"}),".\nIf a given subdirectory doesn't already exist, Langflow automatically creates it."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Absolute or relative path"}),": To store files elsewhere in your ",(0,r.jsx)(t.code,{children:".langflow"})," installation or the local file system, provide the absolute or relative path to the desired location.\nFor example, ",(0,r.jsx)(t.code,{children:"~/Desktop/my_file"})," saves ",(0,r.jsx)(t.code,{children:"my_file"})," to the desktop."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["Don't include an extension in the file name.\nIf you do, the extension is treated as part of the file name; it has no impact on the ",(0,r.jsx)(t.strong,{children:"File Format"})," parameter."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"}),", select the desired file format, and then click ",(0,r.jsx)(t.strong,{children:"Close"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["The available ",(0,r.jsx)(t.strong,{children:"File Format"})," options depend on the input data type:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"DataFrame"})," can be saved to CSV (default), Excel (requires ",(0,r.jsx)(t.code,{children:"openpyxl"})," ",(0,r.jsx)(t.a,{href:"/install-custom-dependencies",children:"custom dependency"}),"), JSON (fallback default), or Markdown."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"Data"})," can be saved to CSV, Excel (requires ",(0,r.jsx)(t.code,{children:"openpyxl"})," ",(0,r.jsx)(t.a,{href:"/install-custom-dependencies",children:"custom dependency"}),"), JSON (default), or Markdown."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.code,{children:"Message"})," can be saved to TXT, JSON (default), or Markdown."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.admonition,{title:"Overwrites allowed",type:"important",children:(0,r.jsxs)(t.p,{children:["If you have multiple ",(0,r.jsx)(t.strong,{children:"Save File"})," components, in one or more flows, with the same file name, path, and extension, the file contains the data from the most recent run only.\nLangflow doesn't block overwrites if a matching file already exists.\nTo avoid unintended overwrites, use unique file names and paths."]})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["To test the ",(0,r.jsx)(t.strong,{children:"Save File"})," component, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Run component"}),", and then click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," to get the filepath where the file was saved."]}),"\n",(0,r.jsxs)(t.p,{children:["The component's literal output is a ",(0,r.jsx)(t.code,{children:"Message"})," containing the original data type, the file name and extension, and the absolute filepath to the file based on the ",(0,r.jsx)(t.strong,{children:"File Name"})," parameter.\nFor example:"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"DataFrame saved successfully as 'my_file.csv' at /Users/user.name/.langflow/data/my_file.csv",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["If the ",(0,r.jsx)(t.strong,{children:"File Name"})," contains a subdirectory or other non-default path, this is reflected in the ",(0,r.jsx)(t.code,{children:"Message"})," output.\nFor example, a CSV file with the file name ",(0,r.jsx)(t.code,{children:"~/Desktop/my_file"})," could produce the following output:"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"DataFrame saved successfully as '/Users/user.name/Desktop/my_file.csv' at /Users/user.name/Desktop/my_file.csv",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Optional: If you want to use the saved file in a flow, you must use an API call or another component to retrieve the file from the given filepath."}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h2,{id:"smart-function",children:"Smart Function"}),"\n",(0,r.jsxs)(t.p,{children:["In Langflow version 1.5, this component was renamed from ",(0,r.jsx)(t.strong,{children:"Lambda Filter"})," to ",(0,r.jsx)(t.strong,{children:"Smart Function"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component uses an LLM to generate a Lambda function to filter or transform structured data based on natural language instructions.\nYou must connect this component to a ",(0,r.jsxs)(t.a,{href:"/components-models",children:[(0,r.jsx)(t.strong,{children:"Language Model"})," component"]}),", which is used to generate a function based on the natural language instructions you provide in the ",(0,r.jsx)(t.strong,{children:"Instructions"})," parameter.\nThe LLM runs the function against the data input, and then outputs the results as ",(0,r.jsx)(t.a,{href:"/data-types#data",children:(0,r.jsx)(t.code,{children:"Data"})}),"."]}),"\n",(0,r.jsxs)(t.admonition,{type:"tip",children:[(0,r.jsxs)(t.p,{children:["Provide brief, clear instructions, focusing on the desired outcome or specific actions, such as ",(0,r.jsx)(t.code,{children:"Filter the data to only include items where the 'status' is 'active'"}),".\nOne sentence or less is preferred because end punctuation, like periods, can cause errors or unexpected behavior."]}),(0,r.jsxs)(t.p,{children:["If you need to provide more details instructions that aren't directly relevant to the Lambda function, you can input them in the ",(0,r.jsx)(t.strong,{children:"Language Model"})," component's ",(0,r.jsx)(t.strong,{children:"Input"})," field or through a ",(0,r.jsx)(t.strong,{children:"Prompt Template"})," component."]})]}),"\n",(0,r.jsxs)(t.p,{children:["The following example uses the ",(0,r.jsx)(t.strong,{children:"API Request"})," endpoint to pass JSON data from the ",(0,r.jsx)(t.code,{children:"https://jsonplaceholder.typicode.com/users"})," endpoint to the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component.\nThen, the ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component passes the data and the instruction ",(0,r.jsx)(t.code,{children:"extract emails"})," to the attached ",(0,r.jsx)(t.strong,{children:"Language Model"})," component.\nFrom there, the LLM generates a filter function that extracts email addresses from the JSON data, returning the filtered data as chat output."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A small flow using a Smart Function component to extract data from an API response.",src:n(66539).A+"",width:"4000",height:"1796"})}),"\n",(0,r.jsx)(t.h3,{id:"smart-function-parameters",children:"Smart Function parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"Smart Function"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Input parameter. The structured data to filter or transform using a Lambda function."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"llm"}),(0,r.jsx)(t.td,{children:"Language Model"}),(0,r.jsxs)(t.td,{children:["Input parameter. Connect ",(0,r.jsx)(t.a,{href:"/data-types#languagemodel",children:(0,r.jsx)(t.code,{children:"LanguageModel"})})," output from a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_instruction"}),(0,r.jsx)(t.td,{children:"Instructions"}),(0,r.jsx)(t.td,{children:"Input parameter. The natural language instructions for how to filter or transform the data. The LLM uses these instructions to create a Lambda function."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sample_size"}),(0,r.jsx)(t.td,{children:"Sample Size"}),(0,r.jsxs)(t.td,{children:["Input parameter. For large datasets, the number of characters to sample from the dataset head and tail. Only applied if the dataset meets or exceeds ",(0,r.jsx)(t.code,{children:"max_size"}),". Default: ",(0,r.jsx)(t.code,{children:"1000"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"max_size"}),(0,r.jsx)(t.td,{children:"Max Size"}),(0,r.jsxs)(t.td,{children:["Input parameter. The number of characters for the dataset to be considered large, which triggers sampling by the ",(0,r.jsx)(t.code,{children:"sample_size"})," value. Default: ",(0,r.jsx)(t.code,{children:"30000"}),"."]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"split-text",children:"Split Text"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Split Text"})," component splits data into chunks based on parameters like chunk size and separator.\nIt is often used to chunk data to be tokenized and embedded into vector databases.\nFor examples, see ",(0,r.jsx)(t.a,{href:"/components-vector-stores#use-vector-store-components-in-a-flow",children:"Use Vector Store components in a flow"}),", ",(0,r.jsx)(t.a,{href:"/components-embedding-models#use-embedding-model-components-in-a-flow",children:"Use Embedding Model components in a flow"}),", and ",(0,r.jsx)(t.a,{href:"/chat-with-rag",children:"Create a Vector RAG chatbot"}),"."]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"An embedding generation flow that uses a Split Text component to chunk data.",src:n(49823).A+"",width:"4000",height:"2766"})}),"\n",(0,r.jsxs)(t.p,{children:["The component accepts ",(0,r.jsx)(t.code,{children:"Message"}),", ",(0,r.jsx)(t.code,{children:"Data"}),", or ",(0,r.jsx)(t.code,{children:"DataFrame"}),", and then outputs either ",(0,r.jsx)(t.strong,{children:"Chunks"})," or ",(0,r.jsx)(t.strong,{children:"DataFrame"}),".\nThe ",(0,r.jsx)(t.strong,{children:"Chunks"})," output returns a list of ",(0,r.jsx)(t.a,{href:"/data-types#data",children:(0,r.jsx)(t.code,{children:"Data"})})," objects containing individual text chunks.\nThe ",(0,r.jsx)(t.strong,{children:"DataFrame"})," output returns the list of chunks as a structured ",(0,r.jsx)(t.a,{href:"/data-types#dataframe",children:(0,r.jsx)(t.code,{children:"DataFrame"})})," with additional ",(0,r.jsx)(t.code,{children:"text"})," and ",(0,r.jsx)(t.code,{children:"metadata"})," columns."]}),"\n",(0,r.jsx)(t.h3,{id:"split-text-parameters",children:"Split Text parameters"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Split Text"})," component's parameters control how the text is split into chunks, specifically the ",(0,r.jsx)(t.code,{children:"chunk_size"}),", ",(0,r.jsx)(t.code,{children:"chunk_overlap"}),", and ",(0,r.jsx)(t.code,{children:"separator"})," parameters."]}),"\n",(0,r.jsxs)(t.p,{children:["To test the chunking behavior, add a ",(0,r.jsx)(t.strong,{children:"Text Input"})," or ",(0,r.jsx)(t.strong,{children:"File"})," component with some sample data to chunk, click ",(0,r.jsx)(i.A,{name:"Play","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Run component"})," on the ",(0,r.jsx)(t.strong,{children:"Split Text"})," component, and then click ",(0,r.jsx)(i.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,r.jsx)(t.strong,{children:"Inspect output"})," to view the list of chunks and their metadata. The ",(0,r.jsx)(t.strong,{children:"text"})," column contains the actual text chunks created from your chunking settings.\nIf the chunks aren't split as you expect, adjust the parameters, rerun the component, and then inspect the new output."]}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"Split Text"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_inputs"}),(0,r.jsx)(t.td,{children:"Input"}),(0,r.jsxs)(t.td,{children:["Input parameter. The data to split. Input must be in ",(0,r.jsx)(t.code,{children:"Message"}),", ",(0,r.jsx)(t.code,{children:"Data"}),", or ",(0,r.jsx)(t.code,{children:"DataFrame"})," format."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"chunk_overlap"}),(0,r.jsx)(t.td,{children:"Chunk Overlap"}),(0,r.jsxs)(t.td,{children:["Input parameter. The number of characters to overlap between chunks. This helps maintain context across chunks. When a separator is encountered, the overlap is applied at the point of the separator so that the subsequent chunk contains the last ",(0,r.jsx)(t.em,{children:"n"})," characters of the preceding chunk. Default: ",(0,r.jsx)(t.code,{children:"200"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"chunk_size"}),(0,r.jsx)(t.td,{children:"Chunk Size"}),(0,r.jsxs)(t.td,{children:["Input parameter. The target length for each chunk after splitting. The data is first split by separator, and then chunks smaller than the ",(0,r.jsx)(t.code,{children:"chunk_size"})," are merged up to this limit. However, if the initial separator split produces any chunks larger than the ",(0,r.jsx)(t.code,{children:"chunk_size"}),", those chunks are neither further subdivided nor combined with any smaller chunks; these chunks will be output as-is even though they exceed the the ",(0,r.jsx)(t.code,{children:"chunk_size"}),". Default: ",(0,r.jsx)(t.code,{children:"1000"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"separator"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsxs)(t.td,{children:["Input parameter. A string defining a character to split on, such as ",(0,r.jsx)(t.code,{children:"\\n"})," to split on new line characters, ",(0,r.jsx)(t.code,{children:"\\n\\n"})," to split at paragraph breaks, or ",(0,r.jsx)(t.code,{children:"},"})," to split at the end of JSON objects. You can directly provide the separator string, or pass a separator string from another component as ",(0,r.jsx)(t.code,{children:"Message"})," input."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key"}),(0,r.jsx)(t.td,{children:"Text Key"}),(0,r.jsxs)(t.td,{children:["Input parameter. The key to use for the text column that is extracted from the input and then split. Default: ",(0,r.jsx)(t.code,{children:"text"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"keep_separator"}),(0,r.jsx)(t.td,{children:"Keep Separator"}),(0,r.jsxs)(t.td,{children:["Input parameter. Select how to handle separators in output chunks. If False, separators are omitted from output chunks. Options include ",(0,r.jsx)(t.code,{children:"False"})," (remove separators), ",(0,r.jsx)(t.code,{children:"True"})," (keep separators in chunks without preference for placement), ",(0,r.jsx)(t.code,{children:"Start"})," (place separators at the beginning of chunks), or ",(0,r.jsx)(t.code,{children:"End"})," (place separators at the end of chunks). Default: ",(0,r.jsx)(t.code,{children:"False"}),"."]})]})]})]}),"\n",(0,r.jsx)(t.h3,{id:"other-text-splitters",children:"Other text splitters"}),"\n",(0,r.jsxs)(t.p,{children:["See ",(0,r.jsx)(t.a,{href:"/bundles-langchain#text-splitters",children:"LangChain text splitter components"}),"."]}),"\n",(0,r.jsx)(t.h2,{id:"structured-output",children:"Structured Output"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component uses an LLM to transform any input into structured data (",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"}),") using natural language formatting instructions and an output schema definition.\nFor example, you can extract specific details from documents, like email messages or scientific papers."]}),"\n",(0,r.jsx)(t.h3,{id:"use-the-structured-output-component-in-a-flow",children:"Use the Structured Output component in a flow"}),"\n",(0,r.jsxs)(t.p,{children:["To use the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component in a flow, do the following:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Provide an ",(0,r.jsx)(t.strong,{children:"Input Message"}),", which is the source material from which you want to extract structured data.\nThis can come from practically any component, but it is typically a ",(0,r.jsx)(t.strong,{children:"Chat Input"}),", ",(0,r.jsx)(t.strong,{children:"File"}),", or other component that provides some unstructured or semi-structured input."]}),"\n",(0,r.jsx)(t.admonition,{type:"tip",children:(0,r.jsxs)(t.p,{children:["Not all source material has to become structured output.\nThe power of the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component is that you can specify the information you want to extract, even if that data isn't explicitly labeled or an exact keyword match.\nThen, the LLM can use your instructions to analyze the source material, extract the relevant data, and format it according to your specifications.\nAny irrelevant source material isn't included in the structured output."]})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Define ",(0,r.jsx)(t.strong,{children:"Format Instructions"})," and an ",(0,r.jsx)(t.strong,{children:"Output Schema"})," to specify the data to extract from the source material and how to structure it in the final ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," output."]}),"\n",(0,r.jsx)(t.p,{children:"The instructions are a prompt that tell the LLM what data to extract, how to format it, how to handle exceptions, and any other instructions relevant to preparing the structured data."}),"\n",(0,r.jsxs)(t.p,{children:["The schema is a table that defines the fields (keys) and data types to organize the data extracted by the LLM into a structured ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," object.\nFor more information, see ",(0,r.jsx)(t.a,{href:"#output-schema-options",children:"Output Schema options"})]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Attach a ",(0,r.jsxs)(t.a,{href:"/components-models",children:[(0,r.jsx)(t.strong,{children:"Language Model"})," component"]})," that is set to emit ",(0,r.jsx)(t.a,{href:"/data-types#languagemodel",children:(0,r.jsx)(t.code,{children:"LanguageModel"})})," output."]}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Language Model"})," component uses the ",(0,r.jsx)(t.strong,{children:"Input Message"})," and ",(0,r.jsx)(t.strong,{children:"Format Instructions"})," from the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component to extract specific pieces of data from the input text.\nThe output schema is applied to the model's response to produce the final ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," structured object."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Optional: Typically, the structured output is passed to downstream components that use the extracted data for other processes, such as other ",(0,r.jsx)(t.strong,{children:"Processing"})," components like the ",(0,r.jsx)(t.strong,{children:"Parser"})," or ",(0,r.jsx)(t.strong,{children:"Data Operations"})," components."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"A basic flow with Structured Output, Language Model, Type Convert, and Chat Input and Output components.",src:n(82798).A+"",width:"4000",height:"1724"})}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Structured Output example: Financial Report Parser template"}),(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Financial Report Parser"})," template provides an example of how the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component can be used to extract structured data from unstructured text."]}),(0,r.jsxs)(t.p,{children:["The template's ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component has the following configuration:"]}),(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Input Message"})," comes from a ",(0,r.jsx)(t.strong,{children:"Chat Input"})," component that is preloaded with quotes from sample financial reports"]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Format Instructions"})," are as follows:"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"You are an AI that extracts structured JSON objects from unstructured text.",props:{}}]},{tokens:[{content:"Use a predefined schema with expected types (str, int, float, bool, dict).",props:{}}]},{tokens:[{content:"Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all.",props:{}}]},{tokens:[{content:"Fill missing or ambiguous values with defaults: null for missing values.",props:{}}]},{tokens:[{content:"Remove exact duplicates but keep variations that have different field values.",props:{}}]},{tokens:[{content:"Always return valid JSON in the expected format, never throw errors.",props:{}}]},{tokens:[{content:"If multiple objects can be extracted, return them all in the structured format.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Output Schema"})," includes keys for ",(0,r.jsx)(t.code,{children:"EBITDA"}),", ",(0,r.jsx)(t.code,{children:"NET_INCOME"}),", and ",(0,r.jsx)(t.code,{children:"GROSS_PROFIT"}),"."]}),"\n"]}),"\n"]}),(0,r.jsxs)(t.p,{children:["The structured ",(0,r.jsx)(t.code,{children:"Data"})," object is passed to a ",(0,r.jsx)(t.strong,{children:"Parser"})," component that produces a text string by mapping the schema keys to variables in the parsing template:"]}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"EBITDA: {EBITDA} , Net Income: {NET_INCOME} , GROSS_PROFIT: {GROSS_PROFIT}",props:{}}]}],lang:"text"},annotations:[]}]}),(0,r.jsxs)(t.p,{children:["When printed to the ",(0,r.jsx)(t.strong,{children:"Playground"}),", the resulting ",(0,r.jsx)(t.code,{children:"Message"})," replaces the variables with the actual values extracted by the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component. For example:"]}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"EBITDA: 900 million , Net Income: 500 million , GROSS_PROFIT: 1.2 billion",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n",(0,r.jsx)(t.h3,{id:"structured-output-parameters",children:"Structured Output parameters"}),"\n",(0,r.jsxs)(t.p,{children:["Some ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Controls"})," in the ",(0,r.jsx)(t.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["Language Model (",(0,r.jsx)(t.code,{children:"llm"}),")"]}),(0,r.jsx)(t.td,{children:(0,r.jsx)(t.code,{children:"LanguageModel"})}),(0,r.jsxs)(t.td,{children:["Input parameter. The ",(0,r.jsx)(t.a,{href:"/data-types#languagemodel",children:(0,r.jsx)(t.code,{children:"LanguageModel"})})," output from a ",(0,r.jsx)(t.strong,{children:"Language Model"})," component that defines the LLM to use to analyze, extract, and prepare the structured output."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["Input Message (",(0,r.jsx)(t.code,{children:"input_value"}),")"]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The input message containing source material for extraction."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["Format Instructions (",(0,r.jsx)(t.code,{children:"system_prompt"}),")"]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The instructions to the language model for extracting and formatting the output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["Schema Name (",(0,r.jsx)(t.code,{children:"schema_name"}),")"]}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsxs)(t.td,{children:["Input parameter. An optional title for the ",(0,r.jsx)(t.strong,{children:"Output Schema"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["Output Schema (",(0,r.jsx)(t.code,{children:"output_schema"}),")"]}),(0,r.jsx)(t.td,{children:"Table"}),(0,r.jsxs)(t.td,{children:["Input parameter. A table describing the schema of the desired structured output, ultimately determining the content of the ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," output. See ",(0,r.jsx)(t.a,{href:"#output-schema-options",children:"Output Schema options"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsxs)(t.td,{children:["Structured Output (",(0,r.jsx)(t.code,{children:"structured_output"}),")"]}),(0,r.jsxs)(t.td,{children:[(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})]}),(0,r.jsxs)(t.td,{children:["Output parameter. The final structured output produced by the component. Near the component's output port, you can select the output data type as either ",(0,r.jsx)(t.strong,{children:"Structured Output Data"})," or ",(0,r.jsx)(t.strong,{children:"Structured Output DataFrame"}),". The specific content and structure of the output depends on the input parameters."]})]})]})]}),"\n",(0,r.jsx)(t.h4,{id:"output-schema-options",children:"Output Schema options"}),"\n",(0,r.jsxs)(t.p,{children:["After the LLM extracts the relevant data from the ",(0,r.jsx)(t.strong,{children:"Input Message"})," and ",(0,r.jsx)(t.strong,{children:"Format Instructions"}),", the data is organized according to the ",(0,r.jsx)(t.strong,{children:"Output Schema"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["The schema is a table that defines the fields (keys) and data types for the final ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"})," output from the ",(0,r.jsx)(t.strong,{children:"Structured Output"})," component."]}),"\n",(0,r.jsxs)(t.p,{children:["The default schema is a single ",(0,r.jsx)(t.code,{children:"field"})," string."]}),"\n",(0,r.jsxs)(t.p,{children:["To add a key to the schema, click ",(0,r.jsx)(i.A,{name:"Plus","aria-hidden":"true"})," ",(0,r.jsx)(t.strong,{children:"Add a new row"}),", and then edit each column to define the schema:"]}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Name"}),": The name of the output field. Typically a specific key for which you want to extract a value."]}),"\n",(0,r.jsxs)(t.p,{children:["You can reference these keys as variables in downstream components, such as a ",(0,r.jsx)(t.strong,{children:"Parser"})," component's template.\nFor example, the schema key ",(0,r.jsx)(t.code,{children:"NET_INCOME"})," could be referenced by the variable ",(0,r.jsx)(t.code,{children:"{NET_INCOME}"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Description"}),": An optional metadata description of the field's contents and purpose."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"Type"}),": The data type of the value stored in the field.\nSupported types are ",(0,r.jsx)(t.code,{children:"str"})," (default), ",(0,r.jsx)(t.code,{children:"int"}),", ",(0,r.jsx)(t.code,{children:"float"}),", ",(0,r.jsx)(t.code,{children:"bool"}),", and ",(0,r.jsx)(t.code,{children:"dict"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:[(0,r.jsx)(t.strong,{children:"As List"}),": Enable this setting if you want the field to contain a list of values rather than a single value."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(t.p,{children:["For simple schemas, you might only extract a few ",(0,r.jsx)(t.code,{children:"string"})," or ",(0,r.jsx)(t.code,{children:"int"})," fields.\nFor more complex schemas with lists and dictionaries, it might help to refer to the ",(0,r.jsx)(t.code,{children:"Data"})," and ",(0,r.jsx)(t.code,{children:"DataFrame"})," structures and attributes, as described in ",(0,r.jsx)(t.a,{href:"/data-types",children:"Langflow data types"}),".\nYou can also emit a rough ",(0,r.jsx)(t.code,{children:"Data"})," or ",(0,r.jsx)(t.code,{children:"DataFrame"}),", and then use downstream components for further refinement, such as a ",(0,r.jsx)(t.strong,{children:"Data Operations"})," component."]}),"\n",(0,r.jsx)(t.h2,{id:"type-convert",children:"Type Convert"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component converts data from one type to another.\nIt supports ",(0,r.jsx)(t.code,{children:"Data"}),", ",(0,r.jsx)(t.code,{children:"DataFrame"}),", and ",(0,r.jsx)(t.code,{children:"Message"})," data types."]}),"\n",(0,r.jsxs)(c.A,{children:[(0,r.jsxs)(l.A,{value:"data",label:"Data",default:!0,children:[(0,r.jsxs)(t.p,{children:["A ",(0,r.jsx)(t.code,{children:"Data"})," object is a structured object that contains a primary ",(0,r.jsx)(t.code,{children:"text"})," key and other key-value pairs:"]}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:'"data"',props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User Profile"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"},",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]}),(0,r.jsxs)(t.p,{children:["The larger context associated with a component's ",(0,r.jsx)(t.code,{children:"data"})," dictionary also identifies which key is the primary ",(0,r.jsx)(t.code,{children:"text_key"}),", and it can provide an optional default value if the primary key isn't specified.\nFor example:"]}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"{",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text_key"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "data"',props:{style:{color:"#7EE787"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "text"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"User Profile"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "default_value"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'""',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]})]}),(0,r.jsxs)(l.A,{value:"dataframe",label:"DataFrame",children:[(0,r.jsxs)(t.p,{children:["A ",(0,r.jsx)(t.code,{children:"DataFrame"})," is an array that represents a tabular data structure with rows and columns."]}),(0,r.jsxs)(t.p,{children:["It consists of a list (array) of dictionary objects, where each dictionary represents a row.\nEach key in the dictionaries corresponds to a column name.\nFor example, the following ",(0,r.jsx)(t.code,{children:"DataFrame"})," contains two rows with columns for ",(0,r.jsx)(t.code,{children:"name"}),", ",(0,r.jsx)(t.code,{children:"age"}),", and ",(0,r.jsx)(t.code,{children:"email"}),":"]}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"[",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Charlie Lastname"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"28",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"charlie.lastname@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "name"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"Bobby Othername"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "age"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"25",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "email"',props:{style:{color:"#7EE787"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"bobby.othername@example.com"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"]",props:{style:{color:"#C9D1D9"}}}]}],lang:"json"},annotations:[]}]})]}),(0,r.jsx)(l.A,{value:"message",label:"Message",children:(0,r.jsxs)(t.p,{children:["A ",(0,r.jsx)(t.code,{children:"Message"})," is primarily for passing a ",(0,r.jsx)(t.code,{children:"text"})," string, such as",(0,r.jsx)(t.code,{children:'"Name: Charlie Lastname, Age: 28, Email: charlie.lastname@example.com"'}),".\nHowever, the entire ",(0,r.jsx)(t.code,{children:"Message"})," object can include metadata about the message, particularly when used as chat input or output."]})})]}),"\n",(0,r.jsxs)(t.p,{children:["For more information, see ",(0,r.jsx)(t.a,{href:"/data-types",children:"Langflow data types"}),"."]}),"\n",(0,r.jsx)(t.h3,{id:"use-the-type-convert-component-in-a-flow",children:"Use the Type Convert component in a flow"}),"\n",(0,r.jsxs)(t.p,{children:["The ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component is typically used to transform data into a format required by a downstream component.\nFor example, if a component outputs a ",(0,r.jsx)(t.code,{children:"Message"}),", but the following component requires ",(0,r.jsx)(t.code,{children:"Data"}),", then you can use the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component to reformat the ",(0,r.jsx)(t.code,{children:"Message"})," as ",(0,r.jsx)(t.code,{children:"Data"})," before passing it to the downstream component."]}),"\n",(0,r.jsxs)(t.p,{children:["The following example uses the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component to convert the ",(0,r.jsx)(t.code,{children:"DataFrame"})," output from a ",(0,r.jsx)(t.strong,{children:"Web Search"})," component into ",(0,r.jsx)(t.code,{children:"Message"})," data that is passed as text input for an LLM:"]}),"\n",(0,r.jsxs)(t.ol,{children:["\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Create a flow based on the ",(0,r.jsx)(t.strong,{children:"Basic prompting"})," template."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Add a ",(0,r.jsx)(t.strong,{children:"Web Search"})," component to the flow, and then enter a search query, such as ",(0,r.jsx)(t.code,{children:"environmental news"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Prompt Template"})," component, replace the contents of the ",(0,r.jsx)(t.strong,{children:"Template"})," field with the following text:"]}),"\n",(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Answer the user's question using the {context}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,r.jsxs)(t.p,{children:["The curly braces define a ",(0,r.jsx)(t.a,{href:"/components-prompts#define-variables-in-prompts",children:"prompt variable"})," that becomes an input field on the ",(0,r.jsx)(t.strong,{children:"Prompt Template"})," component.\nIn this example, you will use the ",(0,r.jsx)(t.strong,{children:"context"})," field to pass the search results into the template, as explained in the next steps."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Add a ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component to the flow, and then set the ",(0,r.jsx)(t.strong,{children:"Output Type"})," to ",(0,r.jsx)(t.strong,{children:"Message"}),"."]}),"\n",(0,r.jsxs)(t.p,{children:["Because the ",(0,r.jsx)(t.strong,{children:"Web Search"})," component's ",(0,r.jsx)(t.code,{children:"DataFrame"})," output is incompatible with the ",(0,r.jsx)(t.strong,{children:"context"})," variable's ",(0,r.jsx)(t.code,{children:"Message"})," input, you must use the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component to change the ",(0,r.jsx)(t.code,{children:"DataFrame"})," to a ",(0,r.jsx)(t.code,{children:"Message"})," in order to pass the search results to the ",(0,r.jsx)(t.strong,{children:"Prompt Template"})," component."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsx)(t.p,{children:"Connect the additional components to the rest of the flow:"}),"\n",(0,r.jsxs)(t.ul,{children:["\n",(0,r.jsxs)(t.li,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"Web Search"})," component's output to the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component's input."]}),"\n",(0,r.jsxs)(t.li,{children:["Connect the ",(0,r.jsx)(t.strong,{children:"Type Convert"})," component's output to the ",(0,r.jsx)(t.strong,{children:"Prompt Template"})," component's ",(0,r.jsx)(t.strong,{children:"context"})," input."]}),"\n"]}),"\n",(0,r.jsx)(t.p,{children:(0,r.jsx)(t.img,{alt:"Convert web search output to text input",src:n(42547).A+"",width:"4000",height:"1826"})}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["In the ",(0,r.jsx)(t.strong,{children:"Language Model"})," component, add your OpenAI API key."]}),"\n",(0,r.jsxs)(t.p,{children:["If you want to use a different provider or model, edit the ",(0,r.jsx)(t.strong,{children:"Model Provider"}),", ",(0,r.jsx)(t.strong,{children:"Model Name"}),", and ",(0,r.jsx)(t.strong,{children:"API Key"})," fields accordingly."]}),"\n"]}),"\n",(0,r.jsxs)(t.li,{children:["\n",(0,r.jsxs)(t.p,{children:["Click ",(0,r.jsx)(t.strong,{children:"Playground"}),", and then ask something relevant to your search query, such as ",(0,r.jsx)(t.code,{children:"latest news"})," or ",(0,r.jsx)(t.code,{children:"what's the latest research on the environment?"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Result"}),(0,r.jsx)(t.p,{children:"The LLM uses the search results context, your chat message, and it's built-in training data to respond to your question.\nFor example:"}),(0,r.jsx)(x.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Here are some of the latest news articles related to the environment:",props:{}}]},{tokens:[{content:"Ozone Pollution and Global Warming: A recent study highlights that ozone pollution is a significant global environmental concern, threatening human health and crop production while exacerbating global warming. Read more",props:{}}]},{tokens:[{content:"...",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(t.h3,{id:"type-convert-parameters",children:"Type Convert parameters"}),"\n",(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Input Data"}),(0,r.jsxs)(t.td,{children:["Input parameter. The data to convert. Accepts ",(0,r.jsx)(t.code,{children:"Data"}),", ",(0,r.jsx)(t.code,{children:"DataFrame"}),", or ",(0,r.jsx)(t.code,{children:"Message"})," input."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output_type"}),(0,r.jsx)(t.td,{children:"Output Type"}),(0,r.jsxs)(t.td,{children:["Input parameter. The desired output type, as one of ",(0,r.jsx)(t.strong,{children:"Data"}),", ",(0,r.jsx)(t.strong,{children:"DataFrame"})," or ",(0,r.jsx)(t.strong,{children:"Message"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output"}),(0,r.jsx)(t.td,{children:"Output"}),(0,r.jsxs)(t.td,{children:["Output parameter. The converted data in the specified format. The output port changes depending on the selected ",(0,r.jsx)(t.strong,{children:"Output Type"}),"."]})]})]})]}),"\n",(0,r.jsx)(t.h2,{id:"legacy-processing-components",children:"Legacy Processing components"}),"\n",(0,r.jsxs)(t.p,{children:["The following ",(0,r.jsx)(t.strong,{children:"Processing"})," components are legacy components.\nYou can still use them in your flows, but they are no longer supported and can be removed in a future release."]}),"\n",(0,r.jsx)(t.p,{children:"Replace these components with suggested alternatives as soon as possible."}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Alter Metadata"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component modifies metadata of input objects. It can add new metadata, update existing metadata, and remove specified metadata fields. The component works with both ",(0,r.jsx)(t.code,{children:"Message"})," and ",(0,r.jsx)(t.code,{children:"Data"})," objects, and can also create a new ",(0,r.jsx)(t.code,{children:"Data"})," object from user-provided text."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_value"}),(0,r.jsx)(t.td,{children:"Input"}),(0,r.jsx)(t.td,{children:"Input parameter. Objects to which Metadata should be added."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_in"}),(0,r.jsx)(t.td,{children:"User Text"}),(0,r.jsxs)(t.td,{children:["Input parameter. Text input; the value is contained in the 'text' attribute of the ",(0,r.jsx)(t.code,{children:"Data"})," object. Empty text entries are ignored."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"metadata"}),(0,r.jsx)(t.td,{children:"Metadata"}),(0,r.jsx)(t.td,{children:"Input parameter. Metadata to add to each object."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"remove_fields"}),(0,r.jsx)(t.td,{children:"Fields to Remove"}),(0,r.jsx)(t.td,{children:"Input parameter. Metadata fields to remove."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. List of Input objects, each with added metadata."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Combine Data/Merge Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]})," or the ",(0,r.jsxs)(t.a,{href:"/components-logic#loop",children:[(0,r.jsx)(t.strong,{children:"Loop"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component combines multiple data sources into a single unified ",(0,r.jsx)(t.code,{children:"Data"})," object."]}),(0,r.jsxs)(t.p,{children:["The component iterates through a list of ",(0,r.jsx)(t.code,{children:"Data"})," objects, merging them into a single ",(0,r.jsx)(t.code,{children:"Data"})," object (",(0,r.jsx)(t.code,{children:"merged_data"}),").\nIf the input list is empty, it returns an empty data object.\nIf there's only one input data object, it returns that object unchanged."]}),(0,r.jsx)(t.p,{children:"The merging process uses the addition operator to combine data objects."})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Combine Text"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component concatenates two text inputs into a single text chunk using a specified delimiter, outputting a ",(0,r.jsx)(t.code,{children:"Message"})," object with the combined text."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Create Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component dynamically creates a ",(0,r.jsx)(t.code,{children:"Data"})," object with a specified number of fields and a text key."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"number_of_fields"}),(0,r.jsx)(t.td,{children:"Number of Fields"}),(0,r.jsx)(t.td,{children:"Input parameter. The number of fields to be added to the record."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key"}),(0,r.jsx)(t.td,{children:"Text Key"}),(0,r.jsx)(t.td,{children:"Input parameter. Key that identifies the field to be used as the text content."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key_validator"}),(0,r.jsx)(t.td,{children:"Text Key Validator"}),(0,r.jsxs)(t.td,{children:["Input parameter. If enabled, checks if the given ",(0,r.jsx)(t.code,{children:"Text Key"})," is present in the given ",(0,r.jsx)(t.code,{children:"Data"}),"."]})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Extract Key"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component extracts a specific key from a ",(0,r.jsx)(t.code,{children:"Data"})," object and returns the value associated with that key."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Data to DataFrame/Data to Message"}),(0,r.jsxs)(t.p,{children:["Replace these legacy components with newer ",(0,r.jsx)(t.strong,{children:"Processing"})," components, such as the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]})," and ",(0,r.jsxs)(t.a,{href:"#type-convert",children:[(0,r.jsx)(t.strong,{children:"Type Convert"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["These components converted one or more ",(0,r.jsx)(t.code,{children:"Data"})," objects into a ",(0,r.jsx)(t.code,{children:"DataFrame"})," or ",(0,r.jsx)(t.code,{children:"Message"})," object."]}),(0,r.jsxs)(t.p,{children:["For the ",(0,r.jsx)(t.strong,{children:"Data to DataFrame"})," component, each ",(0,r.jsx)(t.code,{children:"Data"})," object corresponds to one row in the resulting ",(0,r.jsx)(t.code,{children:"DataFrame"}),".\nFields from the ",(0,r.jsx)(t.code,{children:".data"})," attribute become columns, and the ",(0,r.jsx)(t.code,{children:".text"})," field (if present) is placed in a ",(0,r.jsx)(t.code,{children:"text"})," column."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Filter Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component filters a ",(0,r.jsx)(t.code,{children:"Data"})," object based on a list of keys (",(0,r.jsx)(t.code,{children:"filter_criteria"}),"), returning a new ",(0,r.jsx)(t.code,{children:"Data"})," object (",(0,r.jsx)(t.code,{children:"filtered_data"}),") that contains only the key-value pairs that match the filter criteria."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Filter Values"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"The Filter values component filters a list of data items based on a specified key, filter value, and comparison operator."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"input_data"}),(0,r.jsx)(t.td,{children:"Input data"}),(0,r.jsx)(t.td,{children:"Input parameter. The list of data items to filter."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_key"}),(0,r.jsx)(t.td,{children:"Filter Key"}),(0,r.jsx)(t.td,{children:"Input parameter. The key to filter on."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filter_value"}),(0,r.jsx)(t.td,{children:"Filter Value"}),(0,r.jsx)(t.td,{children:"Input parameter. The value to filter by."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"operator"}),(0,r.jsx)(t.td,{children:"Comparison Operator"}),(0,r.jsx)(t.td,{children:"Input parameter. The operator to apply for comparing the values."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"filtered_data"}),(0,r.jsx)(t.td,{children:"Filtered data"}),(0,r.jsx)(t.td,{children:"Output parameter. The resulting list of filtered data items."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"JSON Cleaner"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"This component cleans JSON strings to ensure they are fully compliant with the JSON specification."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"json_str"}),(0,r.jsx)(t.td,{children:"JSON String"}),(0,r.jsx)(t.td,{children:"Input parameter. The JSON string to be cleaned. This can be a raw, potentially malformed JSON string produced by language models or other sources that may not fully comply with JSON specifications."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"remove_control_chars"}),(0,r.jsx)(t.td,{children:"Remove Control Characters"}),(0,r.jsx)(t.td,{children:"Input parameter. If set to True, this option removes control characters (ASCII characters 0-31 and 127) from the JSON string. This can help eliminate invisible characters that might cause parsing issues or make the JSON invalid."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"normalize_unicode"}),(0,r.jsx)(t.td,{children:"Normalize Unicode"}),(0,r.jsx)(t.td,{children:"Input parameter. When enabled, this option normalizes Unicode characters in the JSON string to their canonical composition form (NFC). This ensures consistent representation of Unicode characters across different systems and prevents potential issues with character encoding."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"validate_json"}),(0,r.jsx)(t.td,{children:"Validate JSON"}),(0,r.jsx)(t.td,{children:"Input parameter. If set to True, this option attempts to parse the JSON string to ensure it is well-formed before applying the final repair operation. It raises a ValueError if the JSON is invalid, allowing for early detection of major structural issues in the JSON."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"output"}),(0,r.jsx)(t.td,{children:"Cleaned JSON String"}),(0,r.jsx)(t.td,{children:"Output parameter. The resulting cleaned, repaired, and validated JSON string that fully complies with the JSON specification."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Message to Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#type-convert",children:[(0,r.jsx)(t.strong,{children:"Type Convert"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component converts ",(0,r.jsx)(t.code,{children:"Message"})," objects to ",(0,r.jsx)(t.code,{children:"Data"})," objects."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parse DataFrame"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#dataframe-operations",children:[(0,r.jsx)(t.strong,{children:"DataFrame Operations"})," component"]})," or ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component converts ",(0,r.jsx)(t.code,{children:"DataFrame"})," objects into plain text using templates."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"df"}),(0,r.jsx)(t.td,{children:"DataFrame"}),(0,r.jsx)(t.td,{children:"Input parameter. The DataFrame to convert to text rows."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"template"}),(0,r.jsx)(t.td,{children:"Template"}),(0,r.jsxs)(t.td,{children:["Input parameter. Template for formatting (use ",(0,r.jsx)(t.code,{children:"{column_name}"})," placeholders)."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"sep"}),(0,r.jsx)(t.td,{children:"Separator"}),(0,r.jsx)(t.td,{children:"Input parameter. String to join rows in output."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text"}),(0,r.jsx)(t.td,{children:"Text"}),(0,r.jsx)(t.td,{children:"Output parameter. All rows combined into single text."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Parse JSON"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component converts and extracts JSON fields in ",(0,r.jsx)(t.code,{children:"Message"})," and ",(0,r.jsx)(t.code,{children:"Data"})," objects using JQ queries, then returns ",(0,r.jsx)(t.code,{children:"filtered_data"}),", which is a list of ",(0,r.jsx)(t.code,{children:"Data"})," objects."]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Python REPL"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#python-interpreter",children:[(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component"]})," or another processing or logic component."]}),(0,r.jsx)(t.p,{children:"This component creates a Python REPL (Read-Eval-Print Loop) tool for executing Python code."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"name"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsxs)(t.td,{children:["Input parameter. The name of the tool. Default: ",(0,r.jsx)(t.code,{children:"python_repl"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"description"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. A description of the tool's functionality."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"global_imports"}),(0,r.jsx)(t.td,{children:"List[String]"}),(0,r.jsxs)(t.td,{children:["Input parameter. A list of modules to import globally. Default: ",(0,r.jsx)(t.code,{children:"math"}),"."]})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool"}),(0,r.jsx)(t.td,{children:"Tool"}),(0,r.jsx)(t.td,{children:"Output parameter. A Python REPL tool for use in LangChain."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Python Code Structured"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#python-interpreter",children:[(0,r.jsx)(t.strong,{children:"Python Interpreter"})," component"]})," or another processing or logic component."]}),(0,r.jsx)(t.p,{children:"This component creates a structured tool from Python code using a dataclass."}),(0,r.jsx)(t.p,{children:"The component dynamically updates its configuration based on the provided Python code, allowing for custom function arguments and descriptions."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Type"}),(0,r.jsx)(t.th,{children:"Description"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_code"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The Python code for the tool's dataclass."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_name"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The name of the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_description"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The description of the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"return_direct"}),(0,r.jsx)(t.td,{children:"Boolean"}),(0,r.jsx)(t.td,{children:"Input parameter. Whether to return the function output directly."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"tool_function"}),(0,r.jsx)(t.td,{children:"String"}),(0,r.jsx)(t.td,{children:"Input parameter. The selected function for the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"global_variables"}),(0,r.jsx)(t.td,{children:"Dict"}),(0,r.jsx)(t.td,{children:"Input parameter. Global variables or data for the tool."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"result_tool"}),(0,r.jsx)(t.td,{children:"Tool"}),(0,r.jsx)(t.td,{children:"Output parameter. A structured tool created from the Python code."})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Regex Extractor"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#parser",children:[(0,r.jsx)(t.strong,{children:"Parser"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"This component extracts patterns in text using regular expressions. It can be used to find and extract specific patterns or information in text."})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Select Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsxs)(t.p,{children:["This component selects a single ",(0,r.jsx)(t.code,{children:"Data"})," object from a list."]}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_list"}),(0,r.jsx)(t.td,{children:"Data List"}),(0,r.jsx)(t.td,{children:"Input parameter. List of data to select from"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data_index"}),(0,r.jsx)(t.td,{children:"Data Index"}),(0,r.jsx)(t.td,{children:"Input parameter. Index of the data to select"})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"selected_data"}),(0,r.jsx)(t.td,{children:"Selected Data"}),(0,r.jsxs)(t.td,{children:["Output parameter. The selected ",(0,r.jsx)(t.code,{children:"Data"})," object."]})]})]})]})]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Update Data"}),(0,r.jsxs)(t.p,{children:["Replace this legacy component with the ",(0,r.jsxs)(t.a,{href:"#data-operations",children:[(0,r.jsx)(t.strong,{children:"Data Operations"})," component"]}),"."]}),(0,r.jsx)(t.p,{children:"This component dynamically updates or appends data with specified fields."}),(0,r.jsx)(t.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(t.table,{children:[(0,r.jsx)(t.thead,{children:(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.th,{children:"Name"}),(0,r.jsx)(t.th,{children:"Display Name"}),(0,r.jsx)(t.th,{children:"Info"})]})}),(0,r.jsxs)(t.tbody,{children:[(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"old_data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Input parameter. The records to update."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"number_of_fields"}),(0,r.jsx)(t.td,{children:"Number of Fields"}),(0,r.jsx)(t.td,{children:"Input parameter. The number of fields to add. The maximum is 15."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key"}),(0,r.jsx)(t.td,{children:"Text Key"}),(0,r.jsx)(t.td,{children:"Input parameter. The key for text content."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"text_key_validator"}),(0,r.jsx)(t.td,{children:"Text Key Validator"}),(0,r.jsx)(t.td,{children:"Input parameter. Validates the text key presence."})]}),(0,r.jsxs)(t.tr,{children:[(0,r.jsx)(t.td,{children:"data"}),(0,r.jsx)(t.td,{children:"Data"}),(0,r.jsx)(t.td,{children:"Output parameter. The updated Data objects."})]})]})]})]})]})}function g(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(j,{...e})}):j(e)}function f(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},42547:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-type-convert-and-web-search-1eef7b9a7c1a243f4a08d9717728d0e1.png"},46445:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-data-operations-select-key-80bade862d29f2851b01ee26413d495f.png"},49823:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-split-text-fec2b1abb28e0852c8a172bbeb164b2c.png"},66539:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-lambda-filter-76cd345c52fa41a59dcfac0205dc3068.png"},82798:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-structured-output-23458b0d29eed6d092b557c7aaf6ab2c.png"},88103:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-batch-run-19c94fbb0646b2731b37013b84dff1f6.png"},96218:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-parser-1d1d72593f02991e5b14b6b1c112a744.png"},99e3:(e,t,n)=>{n.d(t,{A:()=>s});const s=n.p+"assets/images/component-python-interpreter-1ef9e7dec643a216fd5e83c2139d09c9.png"}}]); \ No newline at end of file diff --git a/assets/js/7f193c41.0ec74f4e.js b/assets/js/7f193c41.0846ef5d.js similarity index 78% rename from assets/js/7f193c41.0ec74f4e.js rename to assets/js/7f193c41.0846ef5d.js index f7dba82150..95d541593d 100644 --- a/assets/js/7f193c41.0ec74f4e.js +++ b/assets/js/7f193c41.0846ef5d.js @@ -1 +1 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[5761],{14876:(e,n,t)=>{t.r(n),t.d(n,{CH:()=>h,assets:()=>l,chCodeConfig:()=>p,contentTitle:()=>c,default:()=>j,frontMatter:()=>d,metadata:()=>s,toc:()=>x});const s=JSON.parse('{"id":"Components/components-data","title":"Data","description":"You can use Langflow\'s Data components to bring data into your flows from various sources like files, API endpoints, and URLs.","source":"@site/docs/Components/components-data.mdx","sourceDirName":"Components","slug":"/components-data","permalink":"/components-data","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Data","slug":"/components-data"},"sidebar":"docs","previous":{"title":"Embedding Model","permalink":"/components-embedding-models"},"next":{"title":"Vector Stores","permalink":"/components-vector-stores"}}');var r=t(74848),o=t(28453),a=t(24754),i=t(17886);const d={title:"Data",slug:"/components-data"},c=void 0,l={},h={annotations:a.hk,Code:a.Cy},p={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},x=[{value:"Use Data components in flows",id:"use-data-components-in-flows",level:2},{value:"API Request",id:"api-request",level:2},{value:"API Request parameters",id:"api-request-parameters",level:3},{value:"Directory",id:"directory",level:2},{value:"Directory parameters",id:"directory-parameters",level:3},{value:"File",id:"file",level:2},{value:"File type and size limits",id:"file-type-and-size-limits",level:3},{value:"File parameters",id:"file-parameters",level:3},{value:"File output",id:"file-output",level:3},{value:"News Search",id:"news-search",level:2},{value:"News Search parameters",id:"news-search-parameters",level:3},{value:"RSS Reader",id:"rss-reader",level:2},{value:"RSS Reader parameters",id:"rss-reader-parameters",level:3},{value:"SQL Database",id:"sql-database",level:2},{value:"Query an SQL database with natural language prompts",id:"query-an-sql-database-with-natural-language-prompts",level:3},{value:"SQL Database parameters",id:"sql-database-parameters",level:3},{value:"URL",id:"url",level:2},{value:"URL parameters",id:"url-parameters",level:3},{value:"URL output",id:"url-output",level:3},{value:"Web Search",id:"web-search",level:2},{value:"Use the Web Search component in a flow",id:"use-the-web-search-component-in-a-flow",level:3},{value:"Web Search parameters",id:"web-search-parameters",level:3},{value:"Web Search output",id:"web-search-output",level:3},{value:"Webhook",id:"webhook",level:2},{value:"Trigger the webhook",id:"trigger-the-webhook",level:3},{value:"Webhook parameters",id:"webhook-parameters",level:3},{value:"Additional Data components",id:"additional-data-components",level:2},{value:"Legacy Data components",id:"legacy-data-components",level:2},{value:"See also",id:"see-also",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components},{Details:s}=n;return h||m("CH",!1),h.Code||m("CH.Code",!0),s||m("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,r.jsxs)(n.p,{children:["You can use Langflow's ",(0,r.jsx)(n.strong,{children:"Data"})," components to bring data into your flows from various sources like files, API endpoints, and URLs.\nFor example:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Load files"}),": Import data from a file or directory with the ",(0,r.jsxs)(n.a,{href:"#file",children:[(0,r.jsx)(n.strong,{children:"File"})," component"]})," and ",(0,r.jsxs)(n.a,{href:"#directory",children:[(0,r.jsx)(n.strong,{children:"Directory"})," component"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Search the web"}),": Fetch data from the web with components like the ",(0,r.jsxs)(n.a,{href:"#news-search",children:[(0,r.jsx)(n.strong,{children:"News Search"})," component"]}),", ",(0,r.jsxs)(n.a,{href:"#rss-reader",children:[(0,r.jsx)(n.strong,{children:"RSS Reader"})," component"]}),", ",(0,r.jsxs)(n.a,{href:"#web-search",children:[(0,r.jsx)(n.strong,{children:"Web Search"})," component"]}),", and ",(0,r.jsxs)(n.a,{href:"#url",children:[(0,r.jsx)(n.strong,{children:"URL"})," component"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Make API calls"}),": Use APIs to trigger flows or perform actions with the ",(0,r.jsxs)(n.a,{href:"#api-request",children:[(0,r.jsx)(n.strong,{children:"API Request"})," component"]})," and ",(0,r.jsxs)(n.a,{href:"#webhook",children:[(0,r.jsx)(n.strong,{children:"Webhook"})," component"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Run SQL queries"}),": Query an SQL database with the ",(0,r.jsxs)(n.a,{href:"#sql-database",children:[(0,r.jsx)(n.strong,{children:"SQL Database"})," component"]}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Each component runs different commands for retrieval, processing, and type checking.\nSome components are a minimal wrapper for a command that you provide, and others include built-in scripts to fetch and process data based on variable inputs.\nAdditionally, some components return raw data, whereas others can convert, restructure, or validate the data before outputting it.\nThis means that some similar components might produce different results."}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Data"})," components pair well with ",(0,r.jsxs)(n.a,{href:"/components-processing",children:[(0,r.jsx)(n.strong,{children:"Processing"})," components"]})," that can perform additional parsing, transformation, and validation after retrieving the data."]}),(0,r.jsxs)(n.p,{children:["This can include basic operations, like saving a file in a specific format, or more complex tasks, like using a ",(0,r.jsx)(n.strong,{children:"Text Splitter"})," component to break down a large document into smaller chunks before generating embeddings for vector search."]})]}),"\n",(0,r.jsx)(n.h2,{id:"use-data-components-in-flows",children:"Use Data components in flows"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Data"})," components are used often in flows because they offer a versatile way to perform common, basic functions."]}),"\n",(0,r.jsxs)(n.p,{children:["You can use ",(0,r.jsx)(n.strong,{children:"Data"})," components to perform their base functions as isolated steps in your flow, or you can connect them to an ",(0,r.jsx)(n.strong,{children:"Agent"})," component as tools."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"An agent flow with three Data components connected to the agent as tools",src:t(84987).A+"",width:"4000",height:"3028"})}),"\n",(0,r.jsxs)(n.p,{children:["For examples of ",(0,r.jsx)(n.strong,{children:"Data"})," components in flows, see the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/chat-with-files",children:"Create a chatbot that can ingest files"}),": Learn how to use a ",(0,r.jsx)(n.strong,{children:"File"})," component to load a file as context for a chatbot.\nThe file and user input are both passed to the LLM so you can ask questions about the file you uploaded."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/chat-with-rag",children:"Create a vector RAG chatbot"}),": Learn how to ingest files for use in Retrieval-Augmented Generation (RAG), and then set up a chatbot that can use the ingested files as context.\nThe two flows in this tutorial prepare files for RAG, and then let your LLM use vector search to retrieve contextually relevant data during a chat session."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/agents-tools",children:"Configure tools for agents"}),": Learn how to use any component as a tool for an agent.\nWhen used as tools, the agent autonomously decides when to call a component based on the user's query."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/webhook",children:"Trigger flows with webhooks"}),": Learn how to use the ",(0,r.jsx)(n.strong,{children:"Webhook"})," component to trigger a flow run in response to an external event."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"api-request",children:"API Request"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"API Request"})," component constructs and sends an HTTP requests using URLs or curl commands:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"URL mode"}),": Enter one or more comma-separated URLs, and then select the method for the request to each URL."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"curl mode"}),": Enter the curl command to execute."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can enable additional request options and fields in the component's parameters."}),"\n",(0,r.jsxs)(n.p,{children:["Returns a ",(0,r.jsxs)(n.a,{href:"/data-types#data",children:[(0,r.jsx)(n.code,{children:"Data"})," object"]})," containing the response."]}),"\n",(0,r.jsxs)(n.p,{children:["For provider-specific API components, see ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"Bundles"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"api-request-parameters",children:"API Request parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"API Request"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"mode"}),(0,r.jsx)(n.td,{children:"Mode"}),(0,r.jsxs)(n.td,{children:["Input parameter. Set the mode to either ",(0,r.jsx)(n.strong,{children:"URL"})," or ",(0,r.jsx)(n.strong,{children:"curl"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"urls"}),(0,r.jsx)(n.td,{children:"URL"}),(0,r.jsx)(n.td,{children:"Input parameter. Enter one or more comma-separated URLs for the request."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsxs)(n.td,{children:["Input parameter. ",(0,r.jsx)(n.strong,{children:"curl mode"})," only. Enter a complete curl command. Other component parameters are populated from the command arguments."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"method"}),(0,r.jsx)(n.td,{children:"Method"}),(0,r.jsx)(n.td,{children:"Input parameter. The HTTP method to use."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query_params"}),(0,r.jsx)(n.td,{children:"Query Parameters"}),(0,r.jsx)(n.td,{children:"Input parameter. The query parameters to append to the URL."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"body"}),(0,r.jsx)(n.td,{children:"Body"}),(0,r.jsx)(n.td,{children:"Input parameter. The body to send with POST, PATCH, and PUT requests as a dictionary."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"headers"}),(0,r.jsx)(n.td,{children:"Headers"}),(0,r.jsx)(n.td,{children:"Input parameter. The headers to send with the request as a dictionary."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsx)(n.td,{children:"Input parameter. The timeout to use for the request."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"follow_redirects"}),(0,r.jsx)(n.td,{children:"Follow Redirects"}),(0,r.jsx)(n.td,{children:"Input parameter. Whether to follow HTTP redirects. The default is enabled (true). If disabled (false), HTTP redirects aren't followed."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"save_to_file"}),(0,r.jsx)(n.td,{children:"Save to File"}),(0,r.jsx)(n.td,{children:"Input parameter. Whether to save the API response to a temporary file. Default: Disabled/false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"include_httpx_metadata"}),(0,r.jsx)(n.td,{children:"Include HTTPx Metadata"}),(0,r.jsxs)(n.td,{children:["Input parameter. Whether to include properties such as ",(0,r.jsx)(n.code,{children:"headers"}),", ",(0,r.jsx)(n.code,{children:"status_code"}),", ",(0,r.jsx)(n.code,{children:"response_headers"}),", and ",(0,r.jsx)(n.code,{children:"redirection_history"})," in the output. Default: Disabled/false"]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"directory",children:"Directory"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Directory"})," component recursively loads files from a directory, with options for file types, depth, and concurrency."]}),"\n",(0,r.jsxs)(n.p,{children:["Files must be of a ",(0,r.jsx)(n.a,{href:"#file-type-and-size-limits",children:"supported type and size"})," to be loaded."]}),"\n",(0,r.jsxs)(n.p,{children:["Outputs either a ",(0,r.jsx)(n.a,{href:"/data-types#data",children:(0,r.jsx)(n.code,{children:"Data"})})," or ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," object, depending on the directory contents."]}),"\n",(0,r.jsx)(n.h3,{id:"directory-parameters",children:"Directory parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Many ",(0,r.jsx)(n.strong,{children:"Directory"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"path"}),(0,r.jsx)(n.td,{children:"MessageTextInput"}),(0,r.jsxs)(n.td,{children:["Input parameter. The path to the directory to load files from. Default: Current directory (",(0,r.jsx)(n.code,{children:"."}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"types"}),(0,r.jsx)(n.td,{children:"MessageTextInput"}),(0,r.jsx)(n.td,{children:"Input parameter. The file types to load. Select one or more, or leave empty to attempt to load all files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"depth"}),(0,r.jsx)(n.td,{children:"IntInput"}),(0,r.jsx)(n.td,{children:"Input parameter. The depth to search for files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_concurrency"}),(0,r.jsx)(n.td,{children:"IntInput"}),(0,r.jsx)(n.td,{children:"Input parameter. The maximum concurrency for loading multiple files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"load_hidden"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, hidden files are loaded."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"recursive"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, the search is recursive."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"silent_errors"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, errors don't raise an exception."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_multithreading"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, multithreading is used."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"file",children:"File"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"File"})," component loads and parses files, converts the content into a ",(0,r.jsx)(n.code,{children:"Data"}),", ",(0,r.jsx)(n.code,{children:"DataFrame"}),", or ",(0,r.jsx)(n.code,{children:"Message"})," object.\nIt supports multiple file types and provides parameters for parallel processing and error handling."]}),"\n",(0,r.jsxs)(n.p,{children:["You can add files to the ",(0,r.jsx)(n.strong,{children:"File"})," component in the visual editor or at runtime, and you can upload multiple files at once.\nFor more information about uploading files and working with files in flows, see ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"File management"})," and ",(0,r.jsx)(n.a,{href:"/chat-with-files",children:"Create a chatbot that can ingest files"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"file-type-and-size-limits",children:"File type and size limits"}),"\n",(0,r.jsxs)(n.p,{children:["By default, the maximum file size is 100 MB.\nTo modify this value, change the ",(0,r.jsx)(n.code,{children:"--max-file-size-upload"})," ",(0,r.jsx)(n.a,{href:"/environment-variables",children:"environment variable"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Supported file types"}),(0,r.jsxs)(n.p,{children:["The following file types are supported by the ",(0,r.jsx)(n.strong,{children:"File"})," component.\nUse archive and compressed formats to bundle multiple files together, or use the ",(0,r.jsxs)(n.a,{href:"#directory",children:[(0,r.jsx)(n.strong,{children:"Directory"})," component"]})," to load all files in a directory."]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".bz2"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".csv"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".docx"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".gz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".htm"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".html"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".json"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".js"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".md"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".mdx"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".pdf"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".py"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".sh"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".sql"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".tar"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".tgz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".ts"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".tsx"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".txt"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".xml"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".yaml"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".yml"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".zip"})}),"\n"]})]}),"\n",(0,r.jsx)(n.p,{children:"If you need to load an unsupported file type, you must use a different component that supports that file type and, potentially, parses it outside Langflow, or you must convert it to a supported type before uploading it."}),"\n",(0,r.jsxs)(n.p,{children:["For images, see ",(0,r.jsx)(n.a,{href:"/concepts-file-management#upload-images",children:"Upload images"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["For videos, see the ",(0,r.jsx)(n.strong,{children:"Twelve Labs"})," and ",(0,r.jsx)(n.strong,{children:"YouTube"})," ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"bundles"})," in the Langflow ",(0,r.jsx)(n.strong,{children:"Components"})," menu."]}),"\n",(0,r.jsx)(n.h3,{id:"file-parameters",children:"File parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"File"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"path"}),(0,r.jsx)(n.td,{children:"Files"}),(0,r.jsxs)(n.td,{children:["Input parameter. The path to files to load. Can be local or in ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"Langflow file management"}),". Supports individual files and bundled archives."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"file_path"}),(0,r.jsx)(n.td,{children:"Server File Path"}),(0,r.jsxs)(n.td,{children:["Input parameter. A ",(0,r.jsx)(n.code,{children:"Data"})," object with a ",(0,r.jsx)(n.code,{children:"file_path"})," property pointing to a file in ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"Langflow file management"})," or a ",(0,r.jsx)(n.code,{children:"Message"})," object with a path to the file. Supersedes ",(0,r.jsx)(n.strong,{children:"Files"})," (",(0,r.jsx)(n.code,{children:"path"}),") but supports the same file types."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"separator"}),(0,r.jsx)(n.td,{children:"Separator"}),(0,r.jsxs)(n.td,{children:["Input parameter. The separator to use between multiple outputs in ",(0,r.jsx)(n.code,{children:"Message"})," format."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"silent_errors"}),(0,r.jsx)(n.td,{children:"Silent Errors"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, errors in the component don't raise an exception. The default is false/disabled."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"delete_server_file_after_processing"}),(0,r.jsx)(n.td,{children:"Delete Server File After Processing"}),(0,r.jsxs)(n.td,{children:["Input parameter. If true (default), the ",(0,r.jsx)(n.strong,{children:"Server File Path"})," (",(0,r.jsx)(n.code,{children:"file_path"}),") is deleted after processing."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ignore_unsupported_extensions"}),(0,r.jsx)(n.td,{children:"Ignore Unsupported Extensions"}),(0,r.jsxs)(n.td,{children:["Input parameter. If enabled (true), files with unsupported extensions are accepted but not processed. If disabled (false), the ",(0,r.jsx)(n.strong,{children:"File"})," component either can throw an error if an unsupported file type is provided. The default is true."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ignore_unspecified_files"}),(0,r.jsx)(n.td,{children:"Ignore Unspecified Files"}),(0,r.jsxs)(n.td,{children:["Input parameter. If true, ",(0,r.jsx)(n.code,{children:"Data"})," with no ",(0,r.jsx)(n.code,{children:"file_path"})," property is ignored. If false (default), the component errors when a file isn't specified."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"concurrency_multithreading"}),(0,r.jsx)(n.td,{children:"Processing Concurrency"}),(0,r.jsx)(n.td,{children:"Input parameter. The number of files to process concurrently if multiple files are uploaded. Default is 1. Values greater than 1 enable parallel processing for 2 or more files."})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"file-output",children:"File output"}),"\n",(0,r.jsxs)(n.p,{children:["The output of the ",(0,r.jsx)(n.strong,{children:"File"})," component depends on the number and type of files loaded:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No files"}),": Throws an error or, if ",(0,r.jsx)(n.strong,{children:"Silent Errors"})," is enabled, produces no output."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"One file"}),": Produces one of the following depending on the file type. If multiple types are available, you can select the output type by clicking the output field (near the component's output port)."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Structured Content"}),": Available for some tabular and structured data.\nFor ",(0,r.jsx)(n.code,{children:".csv"})," files, produces a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," representing the table data.\nFor ",(0,r.jsx)(n.code,{children:".json"})," files, produces a ",(0,r.jsx)(n.a,{href:"/data-types#data",children:(0,r.jsx)(n.code,{children:"Data"})})," object with the parsed JSON data."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Raw Content"}),": A ",(0,r.jsx)(n.a,{href:"/data-types#message",children:(0,r.jsx)(n.code,{children:"Message"})})," containing the file's raw text content."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"File Path"}),": A ",(0,r.jsx)(n.a,{href:"/data-types#message",children:(0,r.jsx)(n.code,{children:"Message"})})," containing the path to the file in ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"Langflow file management"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Multiple files"}),": Produces a ",(0,r.jsx)(n.strong,{children:"Files"})," ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing the content and metadata of all selected files."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"news-search",children:"News Search"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"News Search"})," component searches Google News through RSS, and then returns clean article data as a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing article titles, links, publication dates, and summaries.\nThe component's ",(0,r.jsx)(n.code,{children:"clean_html"})," method parses the HTML content with the BeautifulSoup library, removes HTML markup, and strips whitespace to output clean data."]}),"\n",(0,r.jsxs)(n.p,{children:["For other RSS feeds, use the ",(0,r.jsxs)(n.a,{href:"#rss-reader",children:[(0,r.jsx)(n.strong,{children:"RSS Reader"})," component"]}),", and for other searches use the ",(0,r.jsxs)(n.a,{href:"#web-search",children:[(0,r.jsx)(n.strong,{children:"Web Search"})," component"]})," or a provider-specific ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"bundle"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"News Search"})," component must be connected to a component that accepts ",(0,r.jsx)(n.code,{children:"DataFrame"})," input.\nYou can connect the ",(0,r.jsx)(n.strong,{children:"News Search"})," component directly to a compatible component, or you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing",children:[(0,r.jsx)(n.strong,{children:"Processing"})," component"]})," to convert or extract data of a different type between components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"News Search"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"News Search"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," output directly."]}),"\n",(0,r.jsx)(n.h3,{id:"news-search-parameters",children:"News Search parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"News Search"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query"}),(0,r.jsx)(n.td,{children:"Search Query"}),(0,r.jsx)(n.td,{children:"Input parameter. Search keywords for news articles."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"hl"}),(0,r.jsx)(n.td,{children:"Language (hl)"}),(0,r.jsxs)(n.td,{children:["Input parameter. Language code, such as en-US, fr, de. Default: ",(0,r.jsx)(n.code,{children:"en-US"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"gl"}),(0,r.jsx)(n.td,{children:"Country (gl)"}),(0,r.jsxs)(n.td,{children:["Input parameter. Country code, such as US, FR, DE. Default: ",(0,r.jsx)(n.code,{children:"US"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ceid"}),(0,r.jsxs)(n.td,{children:["Country",":Language"," (ceid)"]}),(0,r.jsxs)(n.td,{children:["Input parameter. Language, such as US",":en",", FR",":fr",". Default: ",(0,r.jsx)(n.code,{children:"US:en"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"topic"}),(0,r.jsx)(n.td,{children:"Topic"}),(0,r.jsxs)(n.td,{children:["Input parameter. One of: ",(0,r.jsx)(n.code,{children:"WORLD"}),", ",(0,r.jsx)(n.code,{children:"NATION"}),", ",(0,r.jsx)(n.code,{children:"BUSINESS"}),", ",(0,r.jsx)(n.code,{children:"TECHNOLOGY"}),", ",(0,r.jsx)(n.code,{children:"ENTERTAINMENT"}),", ",(0,r.jsx)(n.code,{children:"SCIENCE"}),", ",(0,r.jsx)(n.code,{children:"SPORTS"}),", ",(0,r.jsx)(n.code,{children:"HEALTH"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"location"}),(0,r.jsx)(n.td,{children:"Location (Geo)"}),(0,r.jsx)(n.td,{children:"Input parameter. City, state, or country for location-based news. Leave blank for keyword search."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsx)(n.td,{children:"Input parameter. Timeout for the request in seconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"articles"}),(0,r.jsx)(n.td,{children:"News Articles"}),(0,r.jsxs)(n.td,{children:["Output parameter. A ",(0,r.jsx)(n.code,{children:"DataFrame"})," with the key columns ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"link"}),", ",(0,r.jsx)(n.code,{children:"published"})," and ",(0,r.jsx)(n.code,{children:"summary"}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"rss-reader",children:"RSS Reader"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component fetches and parses RSS feeds from any valid RSS feed URL, and then returns the feed content as a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing article titles, links, publication dates, and summaries."]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component must be connected to a component that accepts ",(0,r.jsx)(n.code,{children:"DataFrame"})," input.\nYou can connect the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component directly to a compatible component, or you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing",children:[(0,r.jsx)(n.strong,{children:"Processing"})," component"]})," to convert or extract data of a different type between components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," output directly."]}),"\n",(0,r.jsx)(n.h3,{id:"rss-reader-parameters",children:"RSS Reader parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"rss_url"}),(0,r.jsx)(n.td,{children:"RSS Feed URL"}),(0,r.jsxs)(n.td,{children:["Input parameter. URL of the RSS feed to parse, such as ",(0,r.jsx)(n.code,{children:"https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsxs)(n.td,{children:["Input parameter. Timeout for the RSS feed request in seconds. Default: ",(0,r.jsx)(n.code,{children:"5"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"articles"}),(0,r.jsx)(n.td,{children:"Articles"}),(0,r.jsxs)(n.td,{children:["Output parameter. A ",(0,r.jsx)(n.code,{children:"DataFrame"})," containing the key columns ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"link"}),", ",(0,r.jsx)(n.code,{children:"published"})," and ",(0,r.jsx)(n.code,{children:"summary"}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"sql-database",children:"SQL Database"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component executes SQL queries on ",(0,r.jsx)(n.a,{href:"https://docs.sqlalchemy.org/en/20/",children:"SQLAlchemy-compatible databases"}),".\nIt supports any SQLAlchemy-compatible database, such as PostgreSQL, MySQL, and SQLite."]}),"\n",(0,r.jsxs)(n.p,{children:["For CQL queries, see the ",(0,r.jsxs)(n.a,{href:"/bundles-datastax",children:[(0,r.jsx)(n.strong,{children:"DataStax"})," bundle"]}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"query-an-sql-database-with-natural-language-prompts",children:"Query an SQL database with natural language prompts"}),"\n",(0,r.jsxs)(n.p,{children:["The following example demonstrates how to use the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component in a flow, and then modify the component to support natural language queries through an ",(0,r.jsx)(n.strong,{children:"Agent"})," component."]}),"\n",(0,r.jsxs)(n.p,{children:["This allows you to use the same ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component for any query, rather than limiting it to a single manually entered query or requiring the user, application, or another component to provide valid SQL syntax as input.\nUsers don't need to master SQL syntax because the ",(0,r.jsx)(n.strong,{children:"Agent"})," component translates the users' natural language prompts into SQL queries, passes the query to the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component, and then returns the results to the user."]}),"\n",(0,r.jsx)(n.p,{children:"Additionally, input from applications and other components doesn't have to be extracted and transformed to exact SQL queries.\nInstead, you only need to provide enough context for the agent to understand that it should create and run a SQL query according to the incoming data."}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Use your own sample database or create a test database."}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Create a test SQL database"}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Create a database called ",(0,r.jsx)(n.code,{children:"test.db"}),":"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sqlite3 ",props:{style:{color:"#FFA657"}}},{content:"test.db",props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Add some values to the database:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sqlite3 ",props:{style:{color:"#FFA657"}}},{content:'test.db "',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"CREATE TABLE users (",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" id INTEGER PRIMARY KEY,",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" name TEXT,",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" email TEXT,",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" age INTEGER",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:");",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"INSERT INTO users (name, email, age) VALUES",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" ('John Doe', 'john@example.com', 30),",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" ('Jane Smith', 'jane@example.com', 25),",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" ('Bob Johnson', 'bob@example.com', 35);",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:'"',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Verify that the database has been created and contains your data:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sqlite3 ",props:{style:{color:"#FFA657"}}},{content:'test.db "SELECT * FROM users;"',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n",(0,r.jsx)(n.p,{children:"The result should list the text data you entered in the previous step:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"1",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"John ",props:{style:{color:"#FFA657"}}},{content:"Doe",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"john@example.com",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"2",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"Jane ",props:{style:{color:"#FFA657"}}},{content:"Smith",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"jane@example.com",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"3",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"John ",props:{style:{color:"#FFA657"}}},{content:"Doe",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"john@example.com",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"4",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"Jane ",props:{style:{color:"#FFA657"}}},{content:"Smith",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"jane@example.com",props:{style:{color:"#FFA657"}}}]}],lang:"shell"},annotations:[]}]}),"\n"]}),"\n"]})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component to your flow."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the ",(0,r.jsx)(n.strong,{children:"Database URL"})," field, add the connection string for your database, such as ",(0,r.jsx)(n.code,{children:"sqlite:///test.db"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["At this point, you can enter an SQL query in the ",(0,r.jsx)(n.strong,{children:"SQL Query"})," field or use the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-ports",children:"port"})," to pass a query from another component, such as a ",(0,r.jsx)(n.strong,{children:"Chat Input"})," component.\nIf you need more space, click ",(0,r.jsx)(i.A,{name:"Expand","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Expand"})," to open a full-screen text field."]}),"\n",(0,r.jsxs)(n.p,{children:["However, to make this component more dynamic in an agentic context, use an ",(0,r.jsx)(n.strong,{children:"Agent"})," component to transform natural language input to SQL queries, as explained in the following steps."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component to expose the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", and then enable ",(0,r.jsx)(n.strong,{children:"Tool Mode"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can now use this component as a tool for an agent.\nIn ",(0,r.jsx)(n.strong,{children:"Tool Mode"}),", no query is set in the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component because the agent will generate and send one if it determines that the tool is required to complete the user's request.\nFor more information, see ",(0,r.jsx)(n.a,{href:"/agents-tools",children:"Configure tools for agents"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.strong,{children:"Agent"})," component to your flow, and then enter your OpenAI API key."]}),"\n",(0,r.jsxs)(n.p,{children:["The default model is an OpenAI model.\nIf you want to use a different model, edit the ",(0,r.jsx)(n.strong,{children:"Model Provider"}),", ",(0,r.jsx)(n.strong,{children:"Model Name"}),", and ",(0,r.jsx)(n.strong,{children:"API Key"})," fields accordingly."]}),"\n",(0,r.jsxs)(n.p,{children:["If you need to execute highly specialized queries, consider selecting a model that is trained for tasks like advanced SQL queries.\nIf your preferred model isn't in the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's built-in model list, select the ",(0,r.jsx)(n.strong,{children:"Custom"})," model provider, and then use a ",(0,r.jsxs)(n.a,{href:"/components-models",children:[(0,r.jsx)(n.strong,{children:"Language Model"})," component"]})," to attach a specific model."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Connect the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component's ",(0,r.jsx)(n.strong,{children:"Toolset"})," output to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," input."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"SQL Database component connected to an Agent component",src:t(52189).A+"",width:"4000",height:"2400"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Playground"}),", and then ask the agent a question about the data in your database, such as ",(0,r.jsx)(n.code,{children:"Which users are in my database?"})]}),"\n",(0,r.jsxs)(n.p,{children:["The agent determines that it needs to query the database to answer the question, uses the LLM to generate an SQL query, and then uses the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component's ",(0,r.jsx)(n.code,{children:"RUN_SQL_QUERY"})," action to run the query on your database.\nFinally, it returns the results in a conversational format, unless you provide instructions to return raw results or a different format."]}),"\n",(0,r.jsx)(n.p,{children:"The following example queried a test database with little data, but with a more robust dataset you could ask more detailed or complex questions."}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Here are the users in your database:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"1. **John Doe** - Email: john@example.com",props:{}}]},{tokens:[{content:"2. **Jane Smith** - Email: jane@example.com",props:{}}]},{tokens:[{content:"3. **John Doe** - Email: john@example.com",props:{}}]},{tokens:[{content:"4. **Jane Smith** - Email: jane@example.com",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"It seems there are duplicate entries for the users.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"sql-database-parameters",children:"SQL Database parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Some ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"database_url"}),(0,r.jsx)(n.td,{children:"Database URL"}),(0,r.jsx)(n.td,{children:"Input parameter. The SQLAlchemy-compatible database connection URL."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query"}),(0,r.jsx)(n.td,{children:"SQL Query"}),(0,r.jsxs)(n.td,{children:["Input parameter. The SQL query to execute, which can be entered directly, passed in from another component, or, in ",(0,r.jsx)(n.strong,{children:"Tool Mode"}),", automatically provided by an ",(0,r.jsx)(n.strong,{children:"Agent"})," component."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"include_columns"}),(0,r.jsx)(n.td,{children:"Include Columns"}),(0,r.jsx)(n.td,{children:"Input parameter. Whether to include column names in the result. The default is enabled (true)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"add_error"}),(0,r.jsx)(n.td,{children:"Add Error"}),(0,r.jsx)(n.td,{children:"Input parameter. If enabled, adds any error messages to the result, if any are returned. The default is disabled (false)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"run_sql_query"}),(0,r.jsx)(n.td,{children:"Result Table"}),(0,r.jsxs)(n.td,{children:["Output parameter. The query results as a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"url",children:"URL"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"URL"})," component fetches content from one or more URLs, processes the content, and returns it in various formats.\nIt follows links recursively to a given depth, and it supports output in plain text or raw HTML."]}),"\n",(0,r.jsx)(n.h3,{id:"url-parameters",children:"URL parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"URL"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Some of the available parameters include the following:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"urls"}),(0,r.jsx)(n.td,{children:"URLs"}),(0,r.jsxs)(n.td,{children:["Input parameter. One or more URLs to crawl recursively. In the visual editor, click ",(0,r.jsx)(i.A,{name:"Plus","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Add URL"})," to add multiple URLs."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_depth"}),(0,r.jsx)(n.td,{children:"Depth"}),(0,r.jsx)(n.td,{children:'Input parameter. Controls link traversal: how many "clicks" away from the initial page the crawler will go. A depth of 1 limits the crawl to the first page at the given URL only. A depth of 2 means the crawler crawls the first page plus each page directly linked from the first page, then stops. This setting exclusively controls link traversal; it doesn\'t limit the number of URL path segments or the domain.'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"prevent_outside"}),(0,r.jsx)(n.td,{children:"Prevent Outside"}),(0,r.jsx)(n.td,{children:"Input parameter. If enabled, only crawls URLs within the same domain as the root URL. This prevents the crawler from accessing sites outside the given URL's domain, even if they are linked from one of the crawled pages."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_async"}),(0,r.jsx)(n.td,{children:"Use Async"}),(0,r.jsx)(n.td,{children:"Input parameter. If enabled, uses asynchronous loading which can be significantly faster but might use more system resources."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"format"}),(0,r.jsx)(n.td,{children:"Output Format"}),(0,r.jsxs)(n.td,{children:["Input parameter. Sets the desired output format as ",(0,r.jsx)(n.strong,{children:"Text"})," or ",(0,r.jsx)(n.strong,{children:"HTML"}),". The default is ",(0,r.jsx)(n.strong,{children:"Text"}),". For more information, see ",(0,r.jsx)(n.a,{href:"#url-output",children:"URL output"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsx)(n.td,{children:"Input parameter. Timeout for the request in seconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"headers"}),(0,r.jsx)(n.td,{children:"Headers"}),(0,r.jsx)(n.td,{children:"Input parameter. The headers to send with the request if needed for authentication or otherwise."})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Additional input parameters are available for error handling and encoding."}),"\n",(0,r.jsx)(n.h3,{id:"url-output",children:"URL output"}),"\n",(0,r.jsxs)(n.p,{children:["There are two settings that control the output of the ",(0,r.jsx)(n.strong,{children:"URL"})," component at different stages:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Output Format"}),": This optional parameter controls the content extracted from the crawled pages:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Text (default)"}),": The component extracts only the text from the HTML of the crawled pages."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"HTML"}),": The component extracts the entire raw HTML content of the crawled pages."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Output data type"}),": In the component's output field (near the output port) you can select the structure of the outgoing data when it is passed to other components:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Extracted Pages"}),": Outputs a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," that breaks the crawled pages into columns for the entire page content (",(0,r.jsx)(n.code,{children:"text"}),") and metadata like ",(0,r.jsx)(n.code,{children:"url"})," and ",(0,r.jsx)(n.code,{children:"title"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Raw Content"}),": Outputs a ",(0,r.jsx)(n.a,{href:"/data-types#message",children:(0,r.jsx)(n.code,{children:"Message"})})," containing the entire text or HTML from the crawled pages, including metadata, in a single block of text."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"URL"})," component must be connected to a component that accepts the selected output data type (",(0,r.jsx)(n.code,{children:"DataFrame"})," or ",(0,r.jsx)(n.code,{children:"Message"}),").\nYou can connect the ",(0,r.jsx)(n.strong,{children:"URL"})," component directly to a compatible component, or you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,r.jsx)(n.strong,{children:"Type Convert"})," component"]})," to convert the output to another type before passing the data to other components if the data types aren't directly compatible."]}),"\n",(0,r.jsxs)(n.p,{children:["Processing components, like the ",(0,r.jsx)(n.strong,{children:"Type Convert"})," component, are useful with the ",(0,r.jsx)(n.strong,{children:"URL"})," component because it can extract a large amount of data from the crawled pages.\nFor example, if you only want to pass specific fields to other components, you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing#parser",children:[(0,r.jsx)(n.strong,{children:"Parser"})," component"]})," to extract only that data from the crawled pages before passing the data to other components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"URL"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"URL"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," or ",(0,r.jsx)(n.code,{children:"Message"})," output directly."]}),"\n",(0,r.jsx)(n.h2,{id:"web-search",children:"Web Search"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Web Search"})," component performs a basic web search using DuckDuckGo's HTML scraping interface.\nFor other search APIs, see ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"Bundles"}),"."]}),"\n",(0,r.jsxs)(n.admonition,{type:"important",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Web Search"})," component uses web scraping that can be subject to rate limits."]}),(0,r.jsxs)(n.p,{children:["For production use, consider using another search component with more robust API support, such as a provider-specific ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"bundle"}),"."]})]}),"\n",(0,r.jsx)(n.h3,{id:"use-the-web-search-component-in-a-flow",children:"Use the Web Search component in a flow"}),"\n",(0,r.jsxs)(n.p,{children:["The following steps demonstrate one way that you can use a ",(0,r.jsx)(n.strong,{children:"Web Search"})," component in a flow:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Create a flow based on the ",(0,r.jsx)(n.strong,{children:"Basic Prompting"})," template."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add a ",(0,r.jsx)(n.strong,{children:"Web Search"})," component, and then enter a search query, such as ",(0,r.jsx)(n.code,{children:"environmental news"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add a ",(0,r.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,r.jsx)(n.strong,{children:"Type Convert"})," component"]}),", set the ",(0,r.jsx)(n.strong,{children:"Output Type"})," to ",(0,r.jsx)(n.strong,{children:"Message"}),", and then connect the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component's output to the ",(0,r.jsx)(n.strong,{children:"Type Convert"})," component's input."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component outputs a ",(0,r.jsx)(n.code,{children:"DataFrame"}),".\nBecause the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component only accepts ",(0,r.jsx)(n.code,{children:"Message"})," data, this conversion is required so that the flow can pass the search results to the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component.\nFor more information, see ",(0,r.jsx)(n.a,{href:"#web-search-output",children:"Web Search output"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component's ",(0,r.jsx)(n.strong,{children:"Template"})," field, add a variable like ",(0,r.jsx)(n.code,{children:"{searchresults}"})," or ",(0,r.jsx)(n.code,{children:"{context}"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["This adds a field to the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component that you can use to pass the converted search results to the prompt."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Connect the ",(0,r.jsx)(n.strong,{children:"Type Convert"})," component's output to the new variable field on the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Type convert web search output to chat",src:t(42547).A+"",width:"4000",height:"1826"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the ",(0,r.jsx)(n.strong,{children:"Language Model"})," component, add your OpenAI API key, or select a different provider and model."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Playground"}),", and then enter ",(0,r.jsx)(n.code,{children:"latest news"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The LLM processes the request, including the context passed through the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component, and then prints the response in the ",(0,r.jsx)(n.strong,{children:"Playground"})," chat interface."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Result"}),(0,r.jsx)(n.p,{children:"The following is an example of a possible response.\nYour response may vary based on the current state of the web, your specific query, the model, and other factors."}),(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Here are some of the latest news articles related to the environment:",props:{}}]},{tokens:[{content:"Ozone Pollution and Global Warming: A recent study highlights that ozone pollution is a significant global environmental concern, threatening human health and crop production while exacerbating global warming. Read more",props:{}}]},{tokens:[{content:"...",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"web-search-parameters",children:"Web Search parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query"}),(0,r.jsx)(n.td,{children:"Search Query"}),(0,r.jsx)(n.td,{children:"Input parameter. Keywords to search for."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsxs)(n.td,{children:["Input parameter. Timeout for the web search request in seconds. Default: ",(0,r.jsx)(n.code,{children:"5"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"results"}),(0,r.jsx)(n.td,{children:"Search Results"}),(0,r.jsxs)(n.td,{children:["Output parameter. Returns a ",(0,r.jsx)(n.code,{children:"DataFrame"})," containing ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"links"}),", and ",(0,r.jsx)(n.code,{children:"snippets"}),". For more information, see ",(0,r.jsx)(n.a,{href:"#web-search-output",children:"Web Search output"}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"web-search-output",children:"Web Search output"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Web Search"})," component outputs a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing the key columns ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"links"}),", and ",(0,r.jsx)(n.code,{children:"snippets"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component must be connected to a component that accepts ",(0,r.jsx)(n.code,{children:"DataFrame"})," input, or you must use a ",(0,r.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,r.jsx)(n.strong,{children:"Type Convert"})," component"]})," to convert the output to ",(0,r.jsx)(n.code,{children:"Data"})," or ",(0,r.jsx)(n.code,{children:"Message"})," type before passing the data to other components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," output directly."]}),"\n",(0,r.jsx)(n.h2,{id:"webhook",children:"Webhook"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Webhook"})," component defines a webhook trigger that runs a flow when it receives an HTTP POST request."]}),"\n",(0,r.jsx)(n.h3,{id:"trigger-the-webhook",children:"Trigger the webhook"}),"\n",(0,r.jsxs)(n.p,{children:["When you add a ",(0,r.jsx)(n.strong,{children:"Webhook"})," component to your flow, a ",(0,r.jsx)(n.strong,{children:"Webhook curl"})," tab is added to the flow's ",(0,r.jsxs)(n.a,{href:"/concepts-publish#api-access",children:[(0,r.jsx)(n.strong,{children:"API Access"})," pane"]}),".\nThis tab automatically generates an HTTP POST request code snippet that you can use to trigger your flow through the ",(0,r.jsx)(n.strong,{children:"Webhook"})," component.\nFor example:"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:"POST ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:' "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_ADDRESS",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/webhook/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:"'Content-Type: application/json' ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:"'x-api-key: $LANGFLOW_API_KEY' ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -d ",props:{style:{color:"#79C0FF"}}},{content:'\'{"any": "data"}\'',props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,r.jsxs)(n.p,{children:["For more information, see ",(0,r.jsx)(n.a,{href:"/webhook",children:"Trigger flows with webhooks"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"webhook-parameters",children:"Webhook parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"data"}),(0,r.jsx)(n.td,{children:"Payload"}),(0,r.jsx)(n.td,{children:"Input parameter. Receives a payload from external systems through HTTP POST requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsx)(n.td,{children:"Input parameter. The curl command template for making requests to this webhook."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"endpoint"}),(0,r.jsx)(n.td,{children:"Endpoint"}),(0,r.jsx)(n.td,{children:"Input parameter. The endpoint URL where this webhook receives requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"output_data"}),(0,r.jsx)(n.td,{children:"Data"}),(0,r.jsxs)(n.td,{children:["Output parameter. The processed data from the webhook input. Returns an empty ",(0,r.jsx)(n.a,{href:"/data-types#data",children:(0,r.jsx)(n.code,{children:"Data"})})," object if no input is provided. If the input isn't valid JSON, the ",(0,r.jsx)(n.strong,{children:"Webhook"})," component wraps it in a ",(0,r.jsx)(n.code,{children:"payload"})," object so that it can be accepted as input to trigger the flow."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"additional-data-components",children:"Additional Data components"}),"\n",(0,r.jsx)(n.p,{children:"Langflow's core components are meant to be generic and support a range of use cases.\nCore components typically aren't limited to a single provider."}),"\n",(0,r.jsxs)(n.p,{children:["If the core ",(0,r.jsx)(n.strong,{children:"Data"})," components don't meet your needs, you can find provider-specific components in the ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:(0,r.jsx)(n.strong,{children:"Bundles"})})," section of the ",(0,r.jsx)(n.strong,{children:"Components"})," menu."]}),"\n",(0,r.jsxs)(n.p,{children:["For example, the ",(0,r.jsxs)(n.a,{href:"/bundles-datastax",children:[(0,r.jsx)(n.strong,{children:"DataStax"})," bundle"]})," includes components for CQL queries, and the ",(0,r.jsxs)(n.a,{href:"/bundles-google",children:[(0,r.jsx)(n.strong,{children:"Google"})," bundle"]})," includes components for Google Search APIs."]}),"\n",(0,r.jsx)(n.h2,{id:"legacy-data-components",children:"Legacy Data components"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Load CSV"})," and ",(0,r.jsx)(n.strong,{children:"Load JSON"})," components are legacy components.\nYou can still use them in your flows, but they are no longer maintained and can be removed in a future release."]}),"\n",(0,r.jsxs)(n.p,{children:["Replace these components with the ",(0,r.jsx)(n.strong,{children:"File"})," component, which supports loading CSV and JSON files, as well as many other file types."]}),"\n",(0,r.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/bundles-google",children:"Google components"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/integrations-composio",children:"Composio components"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"File management"})}),"\n"]})]})}function j(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},17886:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var s=t(64058),r=t(74848);function o({name:e,...n}){const t=s[e];return t?(0,r.jsx)(t,{...n}):null}},42547:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/component-type-convert-and-web-search-1eef7b9a7c1a243f4a08d9717728d0e1.png"},52189:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/component-sql-database-3d2c985aee2dd9970874cb85e1d2b570.png"},84987:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/connect-data-components-to-agent-a8cd8c94d0474ae434aeb5d507a803e8.png"}}]); \ No newline at end of file +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[5761],{14876:(e,n,t)=>{t.r(n),t.d(n,{CH:()=>h,assets:()=>l,chCodeConfig:()=>p,contentTitle:()=>c,default:()=>j,frontMatter:()=>d,metadata:()=>s,toc:()=>x});const s=JSON.parse('{"id":"Components/components-data","title":"Data","description":"You can use Langflow\'s Data components to bring data into your flows from various sources like files, API endpoints, and URLs.","source":"@site/docs/Components/components-data.mdx","sourceDirName":"Components","slug":"/components-data","permalink":"/components-data","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Data","slug":"/components-data"},"sidebar":"docs","previous":{"title":"Embedding Model","permalink":"/components-embedding-models"},"next":{"title":"Vector Stores","permalink":"/components-vector-stores"}}');var r=t(74848),o=t(28453),a=t(24754),i=t(17886);const d={title:"Data",slug:"/components-data"},c=void 0,l={},h={annotations:a.hk,Code:a.Cy},p={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},x=[{value:"Use Data components in flows",id:"use-data-components-in-flows",level:2},{value:"API Request",id:"api-request",level:2},{value:"API Request parameters",id:"api-request-parameters",level:3},{value:"Directory",id:"directory",level:2},{value:"Directory parameters",id:"directory-parameters",level:3},{value:"File",id:"file",level:2},{value:"File type and size limits",id:"file-type-and-size-limits",level:3},{value:"File parameters",id:"file-parameters",level:3},{value:"File output",id:"file-output",level:3},{value:"News Search",id:"news-search",level:2},{value:"News Search parameters",id:"news-search-parameters",level:3},{value:"RSS Reader",id:"rss-reader",level:2},{value:"RSS Reader parameters",id:"rss-reader-parameters",level:3},{value:"SQL Database",id:"sql-database",level:2},{value:"Query an SQL database with natural language prompts",id:"query-an-sql-database-with-natural-language-prompts",level:3},{value:"SQL Database parameters",id:"sql-database-parameters",level:3},{value:"URL",id:"url",level:2},{value:"URL parameters",id:"url-parameters",level:3},{value:"URL output",id:"url-output",level:3},{value:"Web Search",id:"web-search",level:2},{value:"Use the Web Search component in a flow",id:"use-the-web-search-component-in-a-flow",level:3},{value:"Web Search parameters",id:"web-search-parameters",level:3},{value:"Web Search output",id:"web-search-output",level:3},{value:"Webhook",id:"webhook",level:2},{value:"Trigger the webhook",id:"trigger-the-webhook",level:3},{value:"Webhook parameters",id:"webhook-parameters",level:3},{value:"Additional Data components",id:"additional-data-components",level:2},{value:"Legacy Data components",id:"legacy-data-components",level:2},{value:"See also",id:"see-also",level:2}];function u(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components},{Details:s}=n;return h||m("CH",!1),h.Code||m("CH.Code",!0),s||m("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,r.jsxs)(n.p,{children:["You can use Langflow's ",(0,r.jsx)(n.strong,{children:"Data"})," components to bring data into your flows from various sources like files, API endpoints, and URLs.\nFor example:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Load files"}),": Import data from a file or directory with the ",(0,r.jsxs)(n.a,{href:"#file",children:[(0,r.jsx)(n.strong,{children:"File"})," component"]})," and ",(0,r.jsxs)(n.a,{href:"#directory",children:[(0,r.jsx)(n.strong,{children:"Directory"})," component"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Search the web"}),": Fetch data from the web with components like the ",(0,r.jsxs)(n.a,{href:"#news-search",children:[(0,r.jsx)(n.strong,{children:"News Search"})," component"]}),", ",(0,r.jsxs)(n.a,{href:"#rss-reader",children:[(0,r.jsx)(n.strong,{children:"RSS Reader"})," component"]}),", ",(0,r.jsxs)(n.a,{href:"#web-search",children:[(0,r.jsx)(n.strong,{children:"Web Search"})," component"]}),", and ",(0,r.jsxs)(n.a,{href:"#url",children:[(0,r.jsx)(n.strong,{children:"URL"})," component"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Make API calls"}),": Use APIs to trigger flows or perform actions with the ",(0,r.jsxs)(n.a,{href:"#api-request",children:[(0,r.jsx)(n.strong,{children:"API Request"})," component"]})," and ",(0,r.jsxs)(n.a,{href:"#webhook",children:[(0,r.jsx)(n.strong,{children:"Webhook"})," component"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Run SQL queries"}),": Query an SQL database with the ",(0,r.jsxs)(n.a,{href:"#sql-database",children:[(0,r.jsx)(n.strong,{children:"SQL Database"})," component"]}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"Each component runs different commands for retrieval, processing, and type checking.\nSome components are a minimal wrapper for a command that you provide, and others include built-in scripts to fetch and process data based on variable inputs.\nAdditionally, some components return raw data, whereas others can convert, restructure, or validate the data before outputting it.\nThis means that some similar components might produce different results."}),"\n",(0,r.jsxs)(n.admonition,{type:"tip",children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Data"})," components pair well with ",(0,r.jsxs)(n.a,{href:"/components-processing",children:[(0,r.jsx)(n.strong,{children:"Processing"})," components"]})," that can perform additional parsing, transformation, and validation after retrieving the data."]}),(0,r.jsxs)(n.p,{children:["This can include basic operations, like saving a file in a specific format, or more complex tasks, like using a ",(0,r.jsx)(n.strong,{children:"Text Splitter"})," component to break down a large document into smaller chunks before generating embeddings for vector search."]})]}),"\n",(0,r.jsx)(n.h2,{id:"use-data-components-in-flows",children:"Use Data components in flows"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Data"})," components are used often in flows because they offer a versatile way to perform common, basic functions."]}),"\n",(0,r.jsxs)(n.p,{children:["You can use ",(0,r.jsx)(n.strong,{children:"Data"})," components to perform their base functions as isolated steps in your flow, or you can connect them to an ",(0,r.jsx)(n.strong,{children:"Agent"})," component as tools."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"An agent flow with three Data components connected to the agent as tools",src:t(84987).A+"",width:"4000",height:"3028"})}),"\n",(0,r.jsxs)(n.p,{children:["For examples of ",(0,r.jsx)(n.strong,{children:"Data"})," components in flows, see the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/chat-with-files",children:"Create a chatbot that can ingest files"}),": Learn how to use a ",(0,r.jsx)(n.strong,{children:"File"})," component to load a file as context for a chatbot.\nThe file and user input are both passed to the LLM so you can ask questions about the file you uploaded."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/chat-with-rag",children:"Create a vector RAG chatbot"}),": Learn how to ingest files for use in Retrieval-Augmented Generation (RAG), and then set up a chatbot that can use the ingested files as context.\nThe two flows in this tutorial prepare files for RAG, and then let your LLM use vector search to retrieve contextually relevant data during a chat session."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/agents-tools",children:"Configure tools for agents"}),": Learn how to use any component as a tool for an agent.\nWhen used as tools, the agent autonomously decides when to call a component based on the user's query."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/webhook",children:"Trigger flows with webhooks"}),": Learn how to use the ",(0,r.jsx)(n.strong,{children:"Webhook"})," component to trigger a flow run in response to an external event."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"api-request",children:"API Request"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"API Request"})," component constructs and sends an HTTP requests using URLs or curl commands:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"URL mode"}),": Enter one or more comma-separated URLs, and then select the method for the request to each URL."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"curl mode"}),": Enter the curl command to execute."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"You can enable additional request options and fields in the component's parameters."}),"\n",(0,r.jsxs)(n.p,{children:["Returns a ",(0,r.jsxs)(n.a,{href:"/data-types#data",children:[(0,r.jsx)(n.code,{children:"Data"})," object"]})," containing the response."]}),"\n",(0,r.jsxs)(n.p,{children:["For provider-specific API components, see ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"Bundles"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"api-request-parameters",children:"API Request parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"API Request"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"mode"}),(0,r.jsx)(n.td,{children:"Mode"}),(0,r.jsxs)(n.td,{children:["Input parameter. Set the mode to either ",(0,r.jsx)(n.strong,{children:"URL"})," or ",(0,r.jsx)(n.strong,{children:"curl"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"urls"}),(0,r.jsx)(n.td,{children:"URL"}),(0,r.jsx)(n.td,{children:"Input parameter. Enter one or more comma-separated URLs for the request."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsxs)(n.td,{children:["Input parameter. ",(0,r.jsx)(n.strong,{children:"curl mode"})," only. Enter a complete curl command. Other component parameters are populated from the command arguments."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"method"}),(0,r.jsx)(n.td,{children:"Method"}),(0,r.jsx)(n.td,{children:"Input parameter. The HTTP method to use."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query_params"}),(0,r.jsx)(n.td,{children:"Query Parameters"}),(0,r.jsx)(n.td,{children:"Input parameter. The query parameters to append to the URL."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"body"}),(0,r.jsx)(n.td,{children:"Body"}),(0,r.jsx)(n.td,{children:"Input parameter. The body to send with POST, PATCH, and PUT requests as a dictionary."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"headers"}),(0,r.jsx)(n.td,{children:"Headers"}),(0,r.jsx)(n.td,{children:"Input parameter. The headers to send with the request as a dictionary."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsx)(n.td,{children:"Input parameter. The timeout to use for the request."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"follow_redirects"}),(0,r.jsx)(n.td,{children:"Follow Redirects"}),(0,r.jsx)(n.td,{children:"Input parameter. Whether to follow HTTP redirects. The default is enabled (true). If disabled (false), HTTP redirects aren't followed."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"save_to_file"}),(0,r.jsx)(n.td,{children:"Save to File"}),(0,r.jsx)(n.td,{children:"Input parameter. Whether to save the API response to a temporary file. Default: Disabled/false"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"include_httpx_metadata"}),(0,r.jsx)(n.td,{children:"Include HTTPx Metadata"}),(0,r.jsxs)(n.td,{children:["Input parameter. Whether to include properties such as ",(0,r.jsx)(n.code,{children:"headers"}),", ",(0,r.jsx)(n.code,{children:"status_code"}),", ",(0,r.jsx)(n.code,{children:"response_headers"}),", and ",(0,r.jsx)(n.code,{children:"redirection_history"})," in the output. Default: Disabled/false"]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"directory",children:"Directory"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Directory"})," component recursively loads files from a directory, with options for file types, depth, and concurrency."]}),"\n",(0,r.jsxs)(n.p,{children:["Files must be of a ",(0,r.jsx)(n.a,{href:"#file-type-and-size-limits",children:"supported type and size"})," to be loaded."]}),"\n",(0,r.jsxs)(n.p,{children:["Outputs either a ",(0,r.jsx)(n.a,{href:"/data-types#data",children:(0,r.jsx)(n.code,{children:"Data"})})," or ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," object, depending on the directory contents."]}),"\n",(0,r.jsx)(n.h3,{id:"directory-parameters",children:"Directory parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Many ",(0,r.jsx)(n.strong,{children:"Directory"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Type"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"path"}),(0,r.jsx)(n.td,{children:"MessageTextInput"}),(0,r.jsxs)(n.td,{children:["Input parameter. The path to the directory to load files from. Default: Current directory (",(0,r.jsx)(n.code,{children:"."}),")"]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"types"}),(0,r.jsx)(n.td,{children:"MessageTextInput"}),(0,r.jsx)(n.td,{children:"Input parameter. The file types to load. Select one or more, or leave empty to attempt to load all files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"depth"}),(0,r.jsx)(n.td,{children:"IntInput"}),(0,r.jsx)(n.td,{children:"Input parameter. The depth to search for files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_concurrency"}),(0,r.jsx)(n.td,{children:"IntInput"}),(0,r.jsx)(n.td,{children:"Input parameter. The maximum concurrency for loading multiple files."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"load_hidden"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, hidden files are loaded."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"recursive"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, the search is recursive."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"silent_errors"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, errors don't raise an exception."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_multithreading"}),(0,r.jsx)(n.td,{children:"BoolInput"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, multithreading is used."})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"file",children:"File"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"File"})," component loads and parses files, converts the content into a ",(0,r.jsx)(n.code,{children:"Data"}),", ",(0,r.jsx)(n.code,{children:"DataFrame"}),", or ",(0,r.jsx)(n.code,{children:"Message"})," object.\nIt supports multiple file types and provides parameters for parallel processing and error handling."]}),"\n",(0,r.jsxs)(n.p,{children:["You can add files to the ",(0,r.jsx)(n.strong,{children:"File"})," component in the visual editor or at runtime, and you can upload multiple files at once.\nFor more information about uploading files and working with files in flows, see ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"File management"})," and ",(0,r.jsx)(n.a,{href:"/chat-with-files",children:"Create a chatbot that can ingest files"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"file-type-and-size-limits",children:"File type and size limits"}),"\n",(0,r.jsxs)(n.p,{children:["By default, the maximum file size is 100 MB.\nTo modify this value, change the ",(0,r.jsx)(n.code,{children:"--max-file-size-upload"})," ",(0,r.jsx)(n.a,{href:"/environment-variables",children:"environment variable"}),"."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Supported file types"}),(0,r.jsxs)(n.p,{children:["The following file types are supported by the ",(0,r.jsx)(n.strong,{children:"File"})," component.\nUse archive and compressed formats to bundle multiple files together, or use the ",(0,r.jsxs)(n.a,{href:"#directory",children:[(0,r.jsx)(n.strong,{children:"Directory"})," component"]})," to load all files in a directory."]}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".bz2"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".csv"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".docx"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".gz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".htm"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".html"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".json"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".js"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".md"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".mdx"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".pdf"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".py"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".sh"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".sql"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".tar"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".tgz"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".ts"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".tsx"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".txt"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".xml"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".yaml"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".yml"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.code,{children:".zip"})}),"\n"]})]}),"\n",(0,r.jsx)(n.p,{children:"If you need to load an unsupported file type, you must use a different component that supports that file type and, potentially, parses it outside Langflow, or you must convert it to a supported type before uploading it."}),"\n",(0,r.jsxs)(n.p,{children:["For images, see ",(0,r.jsx)(n.a,{href:"/concepts-file-management#upload-images",children:"Upload images"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["For videos, see the ",(0,r.jsx)(n.strong,{children:"Twelve Labs"})," and ",(0,r.jsx)(n.strong,{children:"YouTube"})," ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"bundles"})," in the Langflow ",(0,r.jsx)(n.strong,{children:"Components"})," menu."]}),"\n",(0,r.jsx)(n.h3,{id:"file-parameters",children:"File parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"File"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"path"}),(0,r.jsx)(n.td,{children:"Files"}),(0,r.jsxs)(n.td,{children:["Input parameter. The path to files to load. Can be local or in ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"Langflow file management"}),". Supports individual files and bundled archives."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"file_path"}),(0,r.jsx)(n.td,{children:"Server File Path"}),(0,r.jsxs)(n.td,{children:["Input parameter. A ",(0,r.jsx)(n.code,{children:"Data"})," object with a ",(0,r.jsx)(n.code,{children:"file_path"})," property pointing to a file in ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"Langflow file management"})," or a ",(0,r.jsx)(n.code,{children:"Message"})," object with a path to the file. Supersedes ",(0,r.jsx)(n.strong,{children:"Files"})," (",(0,r.jsx)(n.code,{children:"path"}),") but supports the same file types."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"separator"}),(0,r.jsx)(n.td,{children:"Separator"}),(0,r.jsxs)(n.td,{children:["Input parameter. The separator to use between multiple outputs in ",(0,r.jsx)(n.code,{children:"Message"})," format."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"silent_errors"}),(0,r.jsx)(n.td,{children:"Silent Errors"}),(0,r.jsx)(n.td,{children:"Input parameter. If true, errors in the component don't raise an exception. The default is false/disabled."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"delete_server_file_after_processing"}),(0,r.jsx)(n.td,{children:"Delete Server File After Processing"}),(0,r.jsxs)(n.td,{children:["Input parameter. If true (default), the ",(0,r.jsx)(n.strong,{children:"Server File Path"})," (",(0,r.jsx)(n.code,{children:"file_path"}),") is deleted after processing."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ignore_unsupported_extensions"}),(0,r.jsx)(n.td,{children:"Ignore Unsupported Extensions"}),(0,r.jsxs)(n.td,{children:["Input parameter. If enabled (true), files with unsupported extensions are accepted but not processed. If disabled (false), the ",(0,r.jsx)(n.strong,{children:"File"})," component either can throw an error if an unsupported file type is provided. The default is true."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ignore_unspecified_files"}),(0,r.jsx)(n.td,{children:"Ignore Unspecified Files"}),(0,r.jsxs)(n.td,{children:["Input parameter. If true, ",(0,r.jsx)(n.code,{children:"Data"})," with no ",(0,r.jsx)(n.code,{children:"file_path"})," property is ignored. If false (default), the component errors when a file isn't specified."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"concurrency_multithreading"}),(0,r.jsx)(n.td,{children:"Processing Concurrency"}),(0,r.jsx)(n.td,{children:"Input parameter. The number of files to process concurrently if multiple files are uploaded. Default is 1. Values greater than 1 enable parallel processing for 2 or more files."})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"file-output",children:"File output"}),"\n",(0,r.jsxs)(n.p,{children:["The output of the ",(0,r.jsx)(n.strong,{children:"File"})," component depends on the number and type of files loaded:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No files"}),": Throws an error or, if ",(0,r.jsx)(n.strong,{children:"Silent Errors"})," is enabled, produces no output."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"One file"}),": Produces one of the following depending on the file type. If multiple types are available, you can select the output type by clicking the output field (near the component's output port)."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Structured Content"}),": Available for some tabular and structured data.\nFor ",(0,r.jsx)(n.code,{children:".csv"})," files, produces a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," representing the table data.\nFor ",(0,r.jsx)(n.code,{children:".json"})," files, produces a ",(0,r.jsx)(n.a,{href:"/data-types#data",children:(0,r.jsx)(n.code,{children:"Data"})})," object with the parsed JSON data."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Raw Content"}),": A ",(0,r.jsx)(n.a,{href:"/data-types#message",children:(0,r.jsx)(n.code,{children:"Message"})})," containing the file's raw text content."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"File Path"}),": A ",(0,r.jsx)(n.a,{href:"/data-types#message",children:(0,r.jsx)(n.code,{children:"Message"})})," containing the path to the file in ",(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"Langflow file management"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Multiple files"}),": Produces a ",(0,r.jsx)(n.strong,{children:"Files"})," ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing the content and metadata of all selected files."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"news-search",children:"News Search"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"News Search"})," component searches Google News through RSS, and then returns clean article data as a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing article titles, links, publication dates, and summaries.\nThe component's ",(0,r.jsx)(n.code,{children:"clean_html"})," method parses the HTML content with the BeautifulSoup library, removes HTML markup, and strips whitespace to output clean data."]}),"\n",(0,r.jsxs)(n.p,{children:["For other RSS feeds, use the ",(0,r.jsxs)(n.a,{href:"#rss-reader",children:[(0,r.jsx)(n.strong,{children:"RSS Reader"})," component"]}),", and for other searches use the ",(0,r.jsxs)(n.a,{href:"#web-search",children:[(0,r.jsx)(n.strong,{children:"Web Search"})," component"]})," or a provider-specific ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"bundle"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"News Search"})," component must be connected to a component that accepts ",(0,r.jsx)(n.code,{children:"DataFrame"})," input.\nYou can connect the ",(0,r.jsx)(n.strong,{children:"News Search"})," component directly to a compatible component, or you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing",children:[(0,r.jsx)(n.strong,{children:"Processing"})," component"]})," to convert or extract data of a different type between components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"News Search"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"News Search"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," output directly."]}),"\n",(0,r.jsx)(n.h3,{id:"news-search-parameters",children:"News Search parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"News Search"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query"}),(0,r.jsx)(n.td,{children:"Search Query"}),(0,r.jsx)(n.td,{children:"Input parameter. Search keywords for news articles."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"hl"}),(0,r.jsx)(n.td,{children:"Language (hl)"}),(0,r.jsxs)(n.td,{children:["Input parameter. Language code, such as en-US, fr, de. Default: ",(0,r.jsx)(n.code,{children:"en-US"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"gl"}),(0,r.jsx)(n.td,{children:"Country (gl)"}),(0,r.jsxs)(n.td,{children:["Input parameter. Country code, such as US, FR, DE. Default: ",(0,r.jsx)(n.code,{children:"US"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"ceid"}),(0,r.jsxs)(n.td,{children:["Country",":Language"," (ceid)"]}),(0,r.jsxs)(n.td,{children:["Input parameter. Language, such as US",":en",", FR",":fr",". Default: ",(0,r.jsx)(n.code,{children:"US:en"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"topic"}),(0,r.jsx)(n.td,{children:"Topic"}),(0,r.jsxs)(n.td,{children:["Input parameter. One of: ",(0,r.jsx)(n.code,{children:"WORLD"}),", ",(0,r.jsx)(n.code,{children:"NATION"}),", ",(0,r.jsx)(n.code,{children:"BUSINESS"}),", ",(0,r.jsx)(n.code,{children:"TECHNOLOGY"}),", ",(0,r.jsx)(n.code,{children:"ENTERTAINMENT"}),", ",(0,r.jsx)(n.code,{children:"SCIENCE"}),", ",(0,r.jsx)(n.code,{children:"SPORTS"}),", ",(0,r.jsx)(n.code,{children:"HEALTH"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"location"}),(0,r.jsx)(n.td,{children:"Location (Geo)"}),(0,r.jsx)(n.td,{children:"Input parameter. City, state, or country for location-based news. Leave blank for keyword search."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsx)(n.td,{children:"Input parameter. Timeout for the request in seconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"articles"}),(0,r.jsx)(n.td,{children:"News Articles"}),(0,r.jsxs)(n.td,{children:["Output parameter. A ",(0,r.jsx)(n.code,{children:"DataFrame"})," with the key columns ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"link"}),", ",(0,r.jsx)(n.code,{children:"published"})," and ",(0,r.jsx)(n.code,{children:"summary"}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"rss-reader",children:"RSS Reader"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component fetches and parses RSS feeds from any valid RSS feed URL, and then returns the feed content as a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing article titles, links, publication dates, and summaries."]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component must be connected to a component that accepts ",(0,r.jsx)(n.code,{children:"DataFrame"})," input.\nYou can connect the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component directly to a compatible component, or you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing",children:[(0,r.jsx)(n.strong,{children:"Processing"})," component"]})," to convert or extract data of a different type between components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"RSS Reader"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," output directly."]}),"\n",(0,r.jsx)(n.h3,{id:"rss-reader-parameters",children:"RSS Reader parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"rss_url"}),(0,r.jsx)(n.td,{children:"RSS Feed URL"}),(0,r.jsxs)(n.td,{children:["Input parameter. URL of the RSS feed to parse, such as ",(0,r.jsx)(n.code,{children:"https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsxs)(n.td,{children:["Input parameter. Timeout for the RSS feed request in seconds. Default: ",(0,r.jsx)(n.code,{children:"5"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"articles"}),(0,r.jsx)(n.td,{children:"Articles"}),(0,r.jsxs)(n.td,{children:["Output parameter. A ",(0,r.jsx)(n.code,{children:"DataFrame"})," containing the key columns ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"link"}),", ",(0,r.jsx)(n.code,{children:"published"})," and ",(0,r.jsx)(n.code,{children:"summary"}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"sql-database",children:"SQL Database"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component executes SQL queries on ",(0,r.jsx)(n.a,{href:"https://docs.sqlalchemy.org/en/20/",children:"SQLAlchemy-compatible databases"}),".\nIt supports any SQLAlchemy-compatible database, such as PostgreSQL, MySQL, and SQLite."]}),"\n",(0,r.jsxs)(n.p,{children:["For CQL queries, see the ",(0,r.jsxs)(n.a,{href:"/bundles-datastax",children:[(0,r.jsx)(n.strong,{children:"DataStax"})," bundle"]}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"query-an-sql-database-with-natural-language-prompts",children:"Query an SQL database with natural language prompts"}),"\n",(0,r.jsxs)(n.p,{children:["The following example demonstrates how to use the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component in a flow, and then modify the component to support natural language queries through an ",(0,r.jsx)(n.strong,{children:"Agent"})," component."]}),"\n",(0,r.jsxs)(n.p,{children:["This allows you to use the same ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component for any query, rather than limiting it to a single manually entered query or requiring the user, application, or another component to provide valid SQL syntax as input.\nUsers don't need to master SQL syntax because the ",(0,r.jsx)(n.strong,{children:"Agent"})," component translates the users' natural language prompts into SQL queries, passes the query to the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component, and then returns the results to the user."]}),"\n",(0,r.jsx)(n.p,{children:"Additionally, input from applications and other components doesn't have to be extracted and transformed to exact SQL queries.\nInstead, you only need to provide enough context for the agent to understand that it should create and run a SQL query according to the incoming data."}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Use your own sample database or create a test database."}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Create a test SQL database"}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Create a database called ",(0,r.jsx)(n.code,{children:"test.db"}),":"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sqlite3 ",props:{style:{color:"#FFA657"}}},{content:"test.db",props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Add some values to the database:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sqlite3 ",props:{style:{color:"#FFA657"}}},{content:'test.db "',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"CREATE TABLE users (",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" id INTEGER PRIMARY KEY,",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" name TEXT,",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" email TEXT,",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" age INTEGER",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:");",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"INSERT INTO users (name, email, age) VALUES",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" ('John Doe', 'john@example.com', 30),",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" ('Jane Smith', 'jane@example.com', 25),",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" ('Bob Johnson', 'bob@example.com', 35);",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:'"',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Verify that the database has been created and contains your data:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sqlite3 ",props:{style:{color:"#FFA657"}}},{content:'test.db "SELECT * FROM users;"',props:{style:{color:"#A5D6FF"}}}]}],lang:"shell"},annotations:[]}]}),"\n",(0,r.jsx)(n.p,{children:"The result should list the text data you entered in the previous step:"}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"1",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"John ",props:{style:{color:"#FFA657"}}},{content:"Doe",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"john@example.com",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"2",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"Jane ",props:{style:{color:"#FFA657"}}},{content:"Smith",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"jane@example.com",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"3",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"John ",props:{style:{color:"#FFA657"}}},{content:"Doe",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"john@example.com",props:{style:{color:"#FFA657"}}}]},{tokens:[{content:"4",props:{style:{color:"#FFA657"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"Jane ",props:{style:{color:"#FFA657"}}},{content:"Smith",props:{style:{color:"#A5D6FF"}}},{content:"|",props:{style:{color:"#FF7B72"}}},{content:"jane@example.com",props:{style:{color:"#FFA657"}}}]}],lang:"shell"},annotations:[]}]}),"\n"]}),"\n"]})]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component to your flow."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the ",(0,r.jsx)(n.strong,{children:"Database URL"})," field, add the connection string for your database, such as ",(0,r.jsx)(n.code,{children:"sqlite:///test.db"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["At this point, you can enter an SQL query in the ",(0,r.jsx)(n.strong,{children:"SQL Query"})," field or use the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-ports",children:"port"})," to pass a query from another component, such as a ",(0,r.jsx)(n.strong,{children:"Chat Input"})," component.\nIf you need more space, click ",(0,r.jsx)(i.A,{name:"Expand","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Expand"})," to open a full-screen text field."]}),"\n",(0,r.jsxs)(n.p,{children:["However, to make this component more dynamic in an agentic context, use an ",(0,r.jsx)(n.strong,{children:"Agent"})," component to transform natural language input to SQL queries, as explained in the following steps."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component to expose the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", and then enable ",(0,r.jsx)(n.strong,{children:"Tool Mode"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can now use this component as a tool for an agent.\nIn ",(0,r.jsx)(n.strong,{children:"Tool Mode"}),", no query is set in the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component because the agent will generate and send one if it determines that the tool is required to complete the user's request.\nFor more information, see ",(0,r.jsx)(n.a,{href:"/agents-tools",children:"Configure tools for agents"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add an ",(0,r.jsx)(n.strong,{children:"Agent"})," component to your flow, and then enter your OpenAI API key."]}),"\n",(0,r.jsxs)(n.p,{children:["The default model is an OpenAI model.\nIf you want to use a different model, edit the ",(0,r.jsx)(n.strong,{children:"Model Provider"}),", ",(0,r.jsx)(n.strong,{children:"Model Name"}),", and ",(0,r.jsx)(n.strong,{children:"API Key"})," fields accordingly."]}),"\n",(0,r.jsxs)(n.p,{children:["If you need to execute highly specialized queries, consider selecting a model that is trained for tasks like advanced SQL queries.\nIf your preferred model isn't in the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's built-in model list, select the ",(0,r.jsx)(n.strong,{children:"Custom"})," model provider, and then use a ",(0,r.jsxs)(n.a,{href:"/components-models",children:[(0,r.jsx)(n.strong,{children:"Language Model"})," component"]})," to attach a specific model."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Connect the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component's ",(0,r.jsx)(n.strong,{children:"Toolset"})," output to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," input."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"SQL Database component connected to an Agent component",src:t(52189).A+"",width:"4000",height:"2400"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Playground"}),", and then ask the agent a question about the data in your database, such as ",(0,r.jsx)(n.code,{children:"Which users are in my database?"})]}),"\n",(0,r.jsxs)(n.p,{children:["The agent determines that it needs to query the database to answer the question, uses the LLM to generate an SQL query, and then uses the ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component's ",(0,r.jsx)(n.code,{children:"RUN_SQL_QUERY"})," action to run the query on your database.\nFinally, it returns the results in a conversational format, unless you provide instructions to return raw results or a different format."]}),"\n",(0,r.jsx)(n.p,{children:"The following example queried a test database with little data, but with a more robust dataset you could ask more detailed or complex questions."}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Here are the users in your database:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"1. **John Doe** - Email: john@example.com",props:{}}]},{tokens:[{content:"2. **Jane Smith** - Email: jane@example.com",props:{}}]},{tokens:[{content:"3. **John Doe** - Email: john@example.com",props:{}}]},{tokens:[{content:"4. **Jane Smith** - Email: jane@example.com",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"It seems there are duplicate entries for the users.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"sql-database-parameters",children:"SQL Database parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Some ",(0,r.jsx)(n.strong,{children:"SQL Database"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"database_url"}),(0,r.jsx)(n.td,{children:"Database URL"}),(0,r.jsx)(n.td,{children:"Input parameter. The SQLAlchemy-compatible database connection URL."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query"}),(0,r.jsx)(n.td,{children:"SQL Query"}),(0,r.jsxs)(n.td,{children:["Input parameter. The SQL query to execute, which can be entered directly, passed in from another component, or, in ",(0,r.jsx)(n.strong,{children:"Tool Mode"}),", automatically provided by an ",(0,r.jsx)(n.strong,{children:"Agent"})," component."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"include_columns"}),(0,r.jsx)(n.td,{children:"Include Columns"}),(0,r.jsx)(n.td,{children:"Input parameter. Whether to include column names in the result. The default is enabled (true)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"add_error"}),(0,r.jsx)(n.td,{children:"Add Error"}),(0,r.jsx)(n.td,{children:"Input parameter. If enabled, adds any error messages to the result, if any are returned. The default is disabled (false)."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"run_sql_query"}),(0,r.jsx)(n.td,{children:"Result Table"}),(0,r.jsxs)(n.td,{children:["Output parameter. The query results as a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"url",children:"URL"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"URL"})," component fetches content from one or more URLs, processes the content, and returns it in various formats.\nIt follows links recursively to a given depth, and it supports output in plain text or raw HTML."]}),"\n",(0,r.jsx)(n.h3,{id:"url-parameters",children:"URL parameters"}),"\n",(0,r.jsxs)(n.p,{children:["Most ",(0,r.jsx)(n.strong,{children:"URL"})," component input parameters are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,r.jsx)(i.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Controls"})," in the ",(0,r.jsx)(n.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"Some of the available parameters include the following:"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"urls"}),(0,r.jsx)(n.td,{children:"URLs"}),(0,r.jsxs)(n.td,{children:["Input parameter. One or more URLs to crawl recursively. In the visual editor, click ",(0,r.jsx)(i.A,{name:"Plus","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Add URL"})," to add multiple URLs."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_depth"}),(0,r.jsx)(n.td,{children:"Depth"}),(0,r.jsx)(n.td,{children:'Input parameter. Controls link traversal: how many "clicks" away from the initial page the crawler will go. A depth of 1 limits the crawl to the first page at the given URL only. A depth of 2 means the crawler crawls the first page plus each page directly linked from the first page, then stops. This setting exclusively controls link traversal; it doesn\'t limit the number of URL path segments or the domain.'})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"prevent_outside"}),(0,r.jsx)(n.td,{children:"Prevent Outside"}),(0,r.jsx)(n.td,{children:"Input parameter. If enabled, only crawls URLs within the same domain as the root URL. This prevents the crawler from accessing sites outside the given URL's domain, even if they are linked from one of the crawled pages."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_async"}),(0,r.jsx)(n.td,{children:"Use Async"}),(0,r.jsx)(n.td,{children:"Input parameter. If enabled, uses asynchronous loading which can be significantly faster but might use more system resources."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"format"}),(0,r.jsx)(n.td,{children:"Output Format"}),(0,r.jsxs)(n.td,{children:["Input parameter. Sets the desired output format as ",(0,r.jsx)(n.strong,{children:"Text"})," or ",(0,r.jsx)(n.strong,{children:"HTML"}),". The default is ",(0,r.jsx)(n.strong,{children:"Text"}),". For more information, see ",(0,r.jsx)(n.a,{href:"#url-output",children:"URL output"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsx)(n.td,{children:"Input parameter. Timeout for the request in seconds."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"headers"}),(0,r.jsx)(n.td,{children:"Headers"}),(0,r.jsx)(n.td,{children:"Input parameter. The headers to send with the request if needed for authentication or otherwise."})]})]})]}),"\n",(0,r.jsx)(n.p,{children:"Additional input parameters are available for error handling and encoding."}),"\n",(0,r.jsx)(n.h3,{id:"url-output",children:"URL output"}),"\n",(0,r.jsxs)(n.p,{children:["There are two settings that control the output of the ",(0,r.jsx)(n.strong,{children:"URL"})," component at different stages:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Output Format"}),": This optional parameter controls the content extracted from the crawled pages:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Text (default)"}),": The component extracts only the text from the HTML of the crawled pages."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"HTML"}),": The component extracts the entire raw HTML content of the crawled pages."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Output data type"}),": In the component's output field (near the output port) you can select the structure of the outgoing data when it is passed to other components:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Extracted Pages"}),": Outputs a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," that breaks the crawled pages into columns for the entire page content (",(0,r.jsx)(n.code,{children:"text"}),") and metadata like ",(0,r.jsx)(n.code,{children:"url"})," and ",(0,r.jsx)(n.code,{children:"title"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Raw Content"}),": Outputs a ",(0,r.jsx)(n.a,{href:"/data-types#message",children:(0,r.jsx)(n.code,{children:"Message"})})," containing the entire text or HTML from the crawled pages, including metadata, in a single block of text."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"URL"})," component must be connected to a component that accepts the selected output data type (",(0,r.jsx)(n.code,{children:"DataFrame"})," or ",(0,r.jsx)(n.code,{children:"Message"}),").\nYou can connect the ",(0,r.jsx)(n.strong,{children:"URL"})," component directly to a compatible component, or you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,r.jsx)(n.strong,{children:"Type Convert"})," component"]})," to convert the output to another type before passing the data to other components if the data types aren't directly compatible."]}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Processing"})," components like the ",(0,r.jsx)(n.strong,{children:"Type Convert"})," component are useful with the ",(0,r.jsx)(n.strong,{children:"URL"})," component because it can extract a large amount of data from the crawled pages.\nFor example, if you only want to pass specific fields to other components, you can use a ",(0,r.jsxs)(n.a,{href:"/components-processing#parser",children:[(0,r.jsx)(n.strong,{children:"Parser"})," component"]})," to extract only that data from the crawled pages before passing the data to other components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"URL"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"URL"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," or ",(0,r.jsx)(n.code,{children:"Message"})," output directly."]}),"\n",(0,r.jsx)(n.h2,{id:"web-search",children:"Web Search"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Web Search"})," component performs a basic web search using DuckDuckGo's HTML scraping interface.\nFor other search APIs, see ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"Bundles"}),"."]}),"\n",(0,r.jsxs)(n.admonition,{type:"important",children:[(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Web Search"})," component uses web scraping that can be subject to rate limits."]}),(0,r.jsxs)(n.p,{children:["For production use, consider using another search component with more robust API support, such as a provider-specific ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"bundle"}),"."]})]}),"\n",(0,r.jsx)(n.h3,{id:"use-the-web-search-component-in-a-flow",children:"Use the Web Search component in a flow"}),"\n",(0,r.jsxs)(n.p,{children:["The following steps demonstrate one way that you can use a ",(0,r.jsx)(n.strong,{children:"Web Search"})," component in a flow:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Create a flow based on the ",(0,r.jsx)(n.strong,{children:"Basic Prompting"})," template."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add a ",(0,r.jsx)(n.strong,{children:"Web Search"})," component, and then enter a search query, such as ",(0,r.jsx)(n.code,{children:"environmental news"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Add a ",(0,r.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,r.jsx)(n.strong,{children:"Type Convert"})," component"]}),", set the ",(0,r.jsx)(n.strong,{children:"Output Type"})," to ",(0,r.jsx)(n.strong,{children:"Message"}),", and then connect the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component's output to the ",(0,r.jsx)(n.strong,{children:"Type Convert"})," component's input."]}),"\n",(0,r.jsxs)(n.p,{children:["By default, the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component outputs a ",(0,r.jsx)(n.code,{children:"DataFrame"}),".\nBecause the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component only accepts ",(0,r.jsx)(n.code,{children:"Message"})," data, this conversion is required so that the flow can pass the search results to the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component.\nFor more information, see ",(0,r.jsx)(n.a,{href:"#web-search-output",children:"Web Search output"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component's ",(0,r.jsx)(n.strong,{children:"Template"})," field, add a variable like ",(0,r.jsx)(n.code,{children:"{searchresults}"})," or ",(0,r.jsx)(n.code,{children:"{context}"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["This adds a field to the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component that you can use to pass the converted search results to the prompt."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Connect the ",(0,r.jsx)(n.strong,{children:"Type Convert"})," component's output to the new variable field on the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"Type convert web search output to chat",src:t(42547).A+"",width:"4000",height:"1826"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the ",(0,r.jsx)(n.strong,{children:"Language Model"})," component, add your OpenAI API key, or select a different provider and model."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Playground"}),", and then enter ",(0,r.jsx)(n.code,{children:"latest news"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The LLM processes the request, including the context passed through the ",(0,r.jsx)(n.strong,{children:"Prompt Template"})," component, and then prints the response in the ",(0,r.jsx)(n.strong,{children:"Playground"})," chat interface."]}),"\n",(0,r.jsxs)(s,{children:[(0,r.jsx)("summary",{children:"Result"}),(0,r.jsx)(n.p,{children:"The following is an example of a possible response.\nYour response may vary based on the current state of the web, your specific query, the model, and other factors."}),(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Here are some of the latest news articles related to the environment:",props:{}}]},{tokens:[{content:"Ozone Pollution and Global Warming: A recent study highlights that ozone pollution is a significant global environmental concern, threatening human health and crop production while exacerbating global warming. Read more",props:{}}]},{tokens:[{content:"...",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h3,{id:"web-search-parameters",children:"Web Search parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"query"}),(0,r.jsx)(n.td,{children:"Search Query"}),(0,r.jsx)(n.td,{children:"Input parameter. Keywords to search for."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"timeout"}),(0,r.jsx)(n.td,{children:"Timeout"}),(0,r.jsxs)(n.td,{children:["Input parameter. Timeout for the web search request in seconds. Default: ",(0,r.jsx)(n.code,{children:"5"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"results"}),(0,r.jsx)(n.td,{children:"Search Results"}),(0,r.jsxs)(n.td,{children:["Output parameter. Returns a ",(0,r.jsx)(n.code,{children:"DataFrame"})," containing ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"links"}),", and ",(0,r.jsx)(n.code,{children:"snippets"}),". For more information, see ",(0,r.jsx)(n.a,{href:"#web-search-output",children:"Web Search output"}),"."]})]})]})]}),"\n",(0,r.jsx)(n.h3,{id:"web-search-output",children:"Web Search output"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Web Search"})," component outputs a ",(0,r.jsx)(n.a,{href:"/data-types#dataframe",children:(0,r.jsx)(n.code,{children:"DataFrame"})})," containing the key columns ",(0,r.jsx)(n.code,{children:"title"}),", ",(0,r.jsx)(n.code,{children:"links"}),", and ",(0,r.jsx)(n.code,{children:"snippets"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["When used as a standard component in a flow, the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component must be connected to a component that accepts ",(0,r.jsx)(n.code,{children:"DataFrame"})," input, or you must use a ",(0,r.jsxs)(n.a,{href:"/components-processing#type-convert",children:[(0,r.jsx)(n.strong,{children:"Type Convert"})," component"]})," to convert the output to ",(0,r.jsx)(n.code,{children:"Data"})," or ",(0,r.jsx)(n.code,{children:"Message"})," type before passing the data to other components."]}),"\n",(0,r.jsxs)(n.p,{children:["When used in ",(0,r.jsx)(n.strong,{children:"Tool Mode"})," with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component, the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component can be connected directly to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port without converting the data.\nThe agent decides whether to use the ",(0,r.jsx)(n.strong,{children:"Web Search"})," component based on the user's query, and it can process the ",(0,r.jsx)(n.code,{children:"DataFrame"})," output directly."]}),"\n",(0,r.jsx)(n.h2,{id:"webhook",children:"Webhook"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Webhook"})," component defines a webhook trigger that runs a flow when it receives an HTTP POST request."]}),"\n",(0,r.jsx)(n.h3,{id:"trigger-the-webhook",children:"Trigger the webhook"}),"\n",(0,r.jsxs)(n.p,{children:["When you add a ",(0,r.jsx)(n.strong,{children:"Webhook"})," component to your flow, a ",(0,r.jsx)(n.strong,{children:"Webhook curl"})," tab is added to the flow's ",(0,r.jsxs)(n.a,{href:"/concepts-publish#api-access",children:[(0,r.jsx)(n.strong,{children:"API Access"})," pane"]}),".\nThis tab automatically generates an HTTP POST request code snippet that you can use to trigger your flow through the ",(0,r.jsx)(n.strong,{children:"Webhook"})," component.\nFor example:"]}),"\n",(0,r.jsx)(h.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"curl ",props:{style:{color:"#FFA657"}}},{content:"-X ",props:{style:{color:"#79C0FF"}}},{content:"POST ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:' "http://',props:{style:{color:"#A5D6FF"}}},{content:"$LANGFLOW_SERVER_ADDRESS",props:{style:{color:"#C9D1D9"}}},{content:"/api/v1/webhook/",props:{style:{color:"#A5D6FF"}}},{content:"$FLOW_ID",props:{style:{color:"#C9D1D9"}}},{content:'" ',props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:"'Content-Type: application/json' ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -H ",props:{style:{color:"#79C0FF"}}},{content:"'x-api-key: $LANGFLOW_API_KEY' ",props:{style:{color:"#A5D6FF"}}},{content:"\\",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" -d ",props:{style:{color:"#79C0FF"}}},{content:'\'{"any": "data"}\'',props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,r.jsxs)(n.p,{children:["For more information, see ",(0,r.jsx)(n.a,{href:"/webhook",children:"Trigger flows with webhooks"}),"."]}),"\n",(0,r.jsx)(n.h3,{id:"webhook-parameters",children:"Webhook parameters"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Description"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"data"}),(0,r.jsx)(n.td,{children:"Payload"}),(0,r.jsx)(n.td,{children:"Input parameter. Receives a payload from external systems through HTTP POST requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsx)(n.td,{children:"curl"}),(0,r.jsx)(n.td,{children:"Input parameter. The curl command template for making requests to this webhook."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"endpoint"}),(0,r.jsx)(n.td,{children:"Endpoint"}),(0,r.jsx)(n.td,{children:"Input parameter. The endpoint URL where this webhook receives requests."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"output_data"}),(0,r.jsx)(n.td,{children:"Data"}),(0,r.jsxs)(n.td,{children:["Output parameter. The processed data from the webhook input. Returns an empty ",(0,r.jsx)(n.a,{href:"/data-types#data",children:(0,r.jsx)(n.code,{children:"Data"})})," object if no input is provided. If the input isn't valid JSON, the ",(0,r.jsx)(n.strong,{children:"Webhook"})," component wraps it in a ",(0,r.jsx)(n.code,{children:"payload"})," object so that it can be accepted as input to trigger the flow."]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"additional-data-components",children:"Additional Data components"}),"\n",(0,r.jsx)(n.p,{children:"Langflow's core components are meant to be generic and support a range of use cases.\nCore components typically aren't limited to a single provider."}),"\n",(0,r.jsxs)(n.p,{children:["If the core ",(0,r.jsx)(n.strong,{children:"Data"})," components don't meet your needs, you can find provider-specific components in the ",(0,r.jsx)(n.a,{href:"/components-bundle-components",children:(0,r.jsx)(n.strong,{children:"Bundles"})})," section of the ",(0,r.jsx)(n.strong,{children:"Components"})," menu."]}),"\n",(0,r.jsxs)(n.p,{children:["For example, the ",(0,r.jsxs)(n.a,{href:"/bundles-datastax",children:[(0,r.jsx)(n.strong,{children:"DataStax"})," bundle"]})," includes components for CQL queries, and the ",(0,r.jsxs)(n.a,{href:"/bundles-google",children:[(0,r.jsx)(n.strong,{children:"Google"})," bundle"]})," includes components for Google Search APIs."]}),"\n",(0,r.jsx)(n.h2,{id:"legacy-data-components",children:"Legacy Data components"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Load CSV"})," and ",(0,r.jsx)(n.strong,{children:"Load JSON"})," components are legacy components.\nYou can still use them in your flows, but they are no longer maintained and can be removed in a future release."]}),"\n",(0,r.jsxs)(n.p,{children:["Replace these components with the ",(0,r.jsx)(n.strong,{children:"File"})," component, which supports loading CSV and JSON files, as well as many other file types."]}),"\n",(0,r.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/bundles-google",children:"Google components"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/integrations-composio",children:"Composio components"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/concepts-file-management",children:"File management"})}),"\n"]})]})}function j(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}function m(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},17886:(e,n,t)=>{t.d(n,{A:()=>o});t(96540);var s=t(64058),r=t(74848);function o({name:e,...n}){const t=s[e];return t?(0,r.jsx)(t,{...n}):null}},42547:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/component-type-convert-and-web-search-1eef7b9a7c1a243f4a08d9717728d0e1.png"},52189:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/component-sql-database-3d2c985aee2dd9970874cb85e1d2b570.png"},84987:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/connect-data-components-to-agent-a8cd8c94d0474ae434aeb5d507a803e8.png"}}]); \ No newline at end of file diff --git a/assets/js/8a484c94.1a0cb6a7.js b/assets/js/8a484c94.1a0cb6a7.js deleted file mode 100644 index a35c11dffa..0000000000 --- a/assets/js/8a484c94.1a0cb6a7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[8750],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(96540);const r={},o=s.createContext(r);function i(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:n},e.children)}},81451:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"Components/components-agents","title":"Agents","description":"Langflow\'s Agent and MCP Tools components are critical for building agent flows.","source":"@site/docs/Components/components-agents.mdx","sourceDirName":"Components","slug":"/components-agents","permalink":"/components-agents","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Agents","slug":"/components-agents"},"sidebar":"docs","previous":{"title":"Input / Output","permalink":"/components-io"},"next":{"title":"Language Model","permalink":"/components-models"}}');var r=t(74848),o=t(28453);const i={title:"Agents",slug:"/components-agents"},a=void 0,l={},c=[{value:"Examples of agent flows",id:"examples-of-agent-flows",level:2},{value:"Agent component",id:"agent-component",level:2},{value:"MCP Tools component",id:"mcp-connection",level:2},{value:"Legacy Agent components",id:"legacy-agent-components",level:2},{value:"See also",id:"see-also",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Langflow's ",(0,r.jsx)(n.strong,{children:"Agent"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," components are critical for building agent flows.\nThese components define the behavior and capabilities of AI agents in your flows."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"How do agents work?"}),(0,r.jsxs)(n.p,{children:["Agents extend Large Language Models (LLMs) by integrating ",(0,r.jsx)(n.em,{children:"tools"}),", which are functions that provide additional context and enable autonomous task execution.\nThese integrations make agents more specialized and powerful than standalone LLMs."]}),(0,r.jsx)(n.p,{children:"Whereas an LLM might generate acceptable, inert responses to general queries and tasks, an agent can leverage the integrated context and tools to provide more relevant responses and even take action.\nFor example, you might create an agent that can access your company's knowledge base, repositories, and other resources to help your team with tasks that require knowledge of your specific products, customers, and code."}),(0,r.jsx)(n.p,{children:"Agents use LLMs as a reasoning engine to process input, determine which actions to take to address the query, and then generate a response.\nThe response could be a typical text-based LLM response, or it could involve an action, like editing a file, running a script, or calling an external API."}),(0,r.jsxs)(n.p,{children:["In an agentic context, tools are functions that the agent can run to perform tasks or access external resources.\nA function is wrapped as a ",(0,r.jsx)(n.code,{children:"Tool"})," object with a common interface that the agent understands.\nAgents become aware of tools through tool registration, which is when the agent is provided a list of available tools typically at agent initialization.\nThe ",(0,r.jsx)(n.code,{children:"Tool"})," object's description tells the agent what the tool can do so that it can decide whether the tool is appropriate for a given request."]})]}),"\n",(0,r.jsx)(n.h2,{id:"examples-of-agent-flows",children:"Examples of agent flows"}),"\n",(0,r.jsxs)(n.p,{children:["For examples of flows using the ",(0,r.jsx)(n.strong,{children:"Agent"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," components, see the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/get-started-quickstart",children:"Langflow quickstart"}),": Start with the ",(0,r.jsx)(n.strong,{children:"Simple Agent"})," template, modify its tools, and then learn how to use an agent flow in an application."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Simple Agent"})," template creates a basic agent flow with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component that can use two other Langflow components as tools.\nThe LLM specified in the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's settings can use its own built-in functionality as well as the functionality provided by the connected tools when generating responses."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/agents-tools#use-an-agent-as-a-tool",children:"Use an agent as a tool"}),": Create a multi-agent flow."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/mcp-client",children:"Use Langflow as an MCP client"})," and ",(0,r.jsx)(n.a,{href:"/mcp-server",children:"Use Langflow as an MCP server"}),": Use the ",(0,r.jsx)(n.strong,{children:"Agent"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," components to implement the Model Context Protocol (MCP) in your flows."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"agent-component",children:"Agent component"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Agent"})," component is the primary agent actor in your agent flows.\nThis component uses an LLM integration to respond to input, such as a chat message or file upload."]}),"\n",(0,r.jsxs)(n.p,{children:["The agent can use the tools already available in the base LLM model as well as additional tools that you connect to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port.\nYou can connect any Langflow component as a tool, including other ",(0,r.jsx)(n.strong,{children:"Agent"})," components and MCP servers through the ",(0,r.jsxs)(n.a,{href:"#mcp-connection",children:[(0,r.jsx)(n.strong,{children:"MCP Tools"})," component"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["For more information about using this component, see ",(0,r.jsx)(n.a,{href:"/agents",children:"Use Langflow agents"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"mcp-connection",children:"MCP Tools component"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," component connects to a Model Context Protocol (MCP) server and exposes the MCP server's functions as tools for Langflow agents to use to respond to input."]}),"\n",(0,r.jsxs)(n.p,{children:["In addition to publicly available MCP servers and your own custom-built MCP servers, you can connect Langflow MCP servers, which allow your agent to use your Langflow flows as tools.\nTo do this, use the ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," component's ",(0,r.jsx)(n.a,{href:"/mcp-client#mcp-sse-mode",children:"SSE mode"})," to connect to your Langflow MCP server at the ",(0,r.jsx)(n.code,{children:"/api/v1/mcp/sse"})," endpoint."]}),"\n",(0,r.jsxs)(n.p,{children:["For more information about using this component and serving flows as MCP tools, see ",(0,r.jsx)(n.a,{href:"/mcp-client",children:"Use Langflow as an MCP client"})," and ",(0,r.jsx)(n.a,{href:"/mcp-server",children:"Use Langflow as an MCP server"}),"."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Earlier versions of the MCP Tools component"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In Langflow version 1.5, the ",(0,r.jsx)(n.strong,{children:"MCP Connection"})," component was renamed to the ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," component."]}),"\n",(0,r.jsxs)(n.li,{children:["In Langflow version 1.3, the ",(0,r.jsx)(n.strong,{children:"MCP Tools (stdio)"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools (SSE)"})," components were deprecated and replaced by the unified ",(0,r.jsx)(n.strong,{children:"MCP Connection"})," component, which was later renamed to ",(0,r.jsx)(n.strong,{children:"MCP Tools"}),"."]}),"\n"]})]}),"\n",(0,r.jsx)(n.h2,{id:"legacy-agent-components",children:"Legacy Agent components"}),"\n",(0,r.jsx)(n.p,{children:"The following components are legacy components.\nYou can still use these components in your flows, but they are no longer maintained and they can be removed in future releases."}),"\n",(0,r.jsxs)(n.p,{children:["Replace these components with the ",(0,r.jsx)(n.strong,{children:"Agent"})," component or other Langflow components, depending on your use case."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.strong,{children:"CrewAI Hierarchical Task"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.strong,{children:"CrewAI Sequential Task"})}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Agent"}),(0,r.jsxs)(n.p,{children:["This component represents CrewAI agents, allowing for the creation of specialized AI agents with defined roles goals and capabilities within a crew.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/core-concepts/Agents/",children:"CrewAI agents documentation"}),"."]}),(0,r.jsx)(n.p,{children:"This component accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"role"}),(0,r.jsx)(n.td,{children:"Role"}),(0,r.jsx)(n.td,{children:"Input parameter. The role of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"goal"}),(0,r.jsx)(n.td,{children:"Goal"}),(0,r.jsx)(n.td,{children:"Input parameter. The objective of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"backstory"}),(0,r.jsx)(n.td,{children:"Backstory"}),(0,r.jsx)(n.td,{children:"Input parameter. The backstory of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tools"}),(0,r.jsx)(n.td,{children:"Tools"}),(0,r.jsx)(n.td,{children:"Input parameter. The tools at the agent's disposal."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"llm"}),(0,r.jsx)(n.td,{children:"Language Model"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model that runs the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent should have memory or not."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_delegation"}),(0,r.jsx)(n.td,{children:"Allow Delegation"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to delegate tasks to other agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_code_execution"}),(0,r.jsx)(n.td,{children:"Allow Code Execution"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to execute code."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"kwargs"}),(0,r.jsx)(n.td,{children:"kwargs"}),(0,r.jsx)(n.td,{children:"Input parameter. Additional keyword arguments for the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"output"}),(0,r.jsx)(n.td,{children:"Agent"}),(0,r.jsx)(n.td,{children:"Output parameter. The constructed CrewAI Agent object."})]})]})]})]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Hierarchical Crew"}),(0,r.jsxs)(n.p,{children:["This component represents a group of agents managing how they should collaborate and the tasks they should perform in a hierarchical structure. This component allows for the creation of a crew with a manager overseeing the task execution.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/how-to/Hierarchical/",children:"CrewAI hierarchical crew documentation"}),"."]}),(0,r.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"agents"}),(0,r.jsx)(n.td,{children:"Agents"}),(0,r.jsx)(n.td,{children:"Input parameter. The list of Agent objects representing the crew members."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tasks"}),(0,r.jsx)(n.td,{children:"Tasks"}),(0,r.jsx)(n.td,{children:"Input parameter. The list of HierarchicalTask objects representing the tasks to be executed."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"manager_llm"}),(0,r.jsx)(n.td,{children:"Manager LLM"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model for the manager agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"manager_agent"}),(0,r.jsx)(n.td,{children:"Manager Agent"}),(0,r.jsx)(n.td,{children:"Input parameter. The specific agent to act as the manager."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output for detailed logging."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. The memory configuration for the crew."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_cache"}),(0,r.jsx)(n.td,{children:"Use Cache"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables caching of results."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_rpm"}),(0,r.jsx)(n.td,{children:"Max RPM"}),(0,r.jsx)(n.td,{children:"Input parameter. This sets the maximum requests per minute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"share_crew"}),(0,r.jsx)(n.td,{children:"Share Crew"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines if the crew information is shared among agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"function_calling_llm"}),(0,r.jsx)(n.td,{children:"Function Calling LLM"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model for function calling."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"crew"}),(0,r.jsx)(n.td,{children:"Crew"}),(0,r.jsx)(n.td,{children:"Output parameter. The constructed Crew object with hierarchical task execution."})]})]})]})]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Sequential Crew"}),(0,r.jsxs)(n.p,{children:["This component represents a group of agents with tasks that are executed sequentially. This component allows for the creation of a crew that performs tasks in a specific order.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/how-to/Sequential/",children:"CrewAI sequential crew documentation"}),"."]}),(0,r.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tasks"}),(0,r.jsx)(n.td,{children:"Tasks"}),(0,r.jsx)(n.td,{children:"Input parameter. The list of SequentialTask objects representing the tasks to be executed."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output for detailed logging."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. The memory configuration for the crew."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_cache"}),(0,r.jsx)(n.td,{children:"Use Cache"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables caching of results."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_rpm"}),(0,r.jsx)(n.td,{children:"Max RPM"}),(0,r.jsx)(n.td,{children:"Input parameter. This sets the maximum requests per minute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"share_crew"}),(0,r.jsx)(n.td,{children:"Share Crew"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines if the crew information is shared among agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"function_calling_llm"}),(0,r.jsx)(n.td,{children:"Function Calling LLM"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model for function calling."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"crew"}),(0,r.jsx)(n.td,{children:"Crew"}),(0,r.jsx)(n.td,{children:"Output parameter. The constructed Crew object with sequential task execution."})]})]})]})]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Sequential Task Agent"}),(0,r.jsxs)(n.p,{children:["This component creates a CrewAI Task and its associated agent allowing for the definition of sequential tasks with specific agent roles and capabilities.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/how-to/Sequential/",children:"CrewAI sequential agents documentation"}),"."]}),(0,r.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"role"}),(0,r.jsx)(n.td,{children:"Role"}),(0,r.jsx)(n.td,{children:"Input parameter. The role of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"goal"}),(0,r.jsx)(n.td,{children:"Goal"}),(0,r.jsx)(n.td,{children:"Input parameter. The objective of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"backstory"}),(0,r.jsx)(n.td,{children:"Backstory"}),(0,r.jsx)(n.td,{children:"Input parameter. The backstory of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tools"}),(0,r.jsx)(n.td,{children:"Tools"}),(0,r.jsx)(n.td,{children:"Input parameter. The tools at the agent's disposal."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"llm"}),(0,r.jsx)(n.td,{children:"Language Model"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model that runs the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent should have memory or not."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_delegation"}),(0,r.jsx)(n.td,{children:"Allow Delegation"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to delegate tasks to other agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_code_execution"}),(0,r.jsx)(n.td,{children:"Allow Code Execution"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to execute code."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"agent_kwargs"}),(0,r.jsx)(n.td,{children:"Agent kwargs"}),(0,r.jsx)(n.td,{children:"Input parameter. The additional kwargs for the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"task_description"}),(0,r.jsx)(n.td,{children:"Task Description"}),(0,r.jsx)(n.td,{children:"Input parameter. The descriptive text detailing the task's purpose and execution."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"expected_output"}),(0,r.jsx)(n.td,{children:"Expected Task Output"}),(0,r.jsx)(n.td,{children:"Input parameter. The clear definition of the expected task outcome."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"async_execution"}),(0,r.jsx)(n.td,{children:"Async Execution"}),(0,r.jsx)(n.td,{children:"Input parameter. Boolean flag indicating asynchronous task execution."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"previous_task"}),(0,r.jsx)(n.td,{children:"Previous Task"}),(0,r.jsx)(n.td,{children:"Input parameter. The previous task in the sequence for chaining."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"task_output"}),(0,r.jsx)(n.td,{children:"Sequential Task"}),(0,r.jsx)(n.td,{children:"Output parameter. The list of SequentialTask objects representing the created tasks."})]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsxs)(n.a,{href:"/components-helpers#message-history",children:[(0,r.jsx)(n.strong,{children:"Message History"})," component"]})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/memory#store-chat-memory",children:"Store chat memory"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"Bundles"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/bundles-langchain#legacy-langchain-components",children:"Legacy LangChain components"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/8a484c94.ac2a10e3.js b/assets/js/8a484c94.ac2a10e3.js new file mode 100644 index 0000000000..b50565f5a8 --- /dev/null +++ b/assets/js/8a484c94.ac2a10e3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[8750],{28453:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var s=t(96540);const r={},o=s.createContext(r);function i(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),s.createElement(o.Provider,{value:n},e.children)}},81451:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"Components/components-agents","title":"Agents","description":"Langflow\'s Agent and MCP Tools components are critical for building agent flows.","source":"@site/docs/Components/components-agents.mdx","sourceDirName":"Components","slug":"/components-agents","permalink":"/components-agents","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Agents","slug":"/components-agents"},"sidebar":"docs","previous":{"title":"Input / Output","permalink":"/components-io"},"next":{"title":"Language Model","permalink":"/components-models"}}');var r=t(74848),o=t(28453);const i={title:"Agents",slug:"/components-agents"},a=void 0,l={},c=[{value:"Examples of agent flows",id:"examples-of-agent-flows",level:2},{value:"Agent component",id:"agent-component",level:2},{value:"MCP Tools component",id:"mcp-connection",level:2},{value:"Legacy Agent components",id:"legacy-agent-components",level:2},{value:"See also",id:"see-also",level:2}];function d(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components},{Details:t}=n;return t||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Langflow's ",(0,r.jsx)(n.strong,{children:"Agent"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," components are critical for building agent flows.\nThese components define the behavior and capabilities of AI agents in your flows."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"How do agents work?"}),(0,r.jsxs)(n.p,{children:["Agents extend Large Language Models (LLMs) by integrating ",(0,r.jsx)(n.em,{children:"tools"}),", which are functions that provide additional context and enable autonomous task execution.\nThese integrations make agents more specialized and powerful than standalone LLMs."]}),(0,r.jsx)(n.p,{children:"Whereas an LLM might generate acceptable, inert responses to general queries and tasks, an agent can leverage the integrated context and tools to provide more relevant responses and even take action.\nFor example, you might create an agent that can access your company's knowledge base, repositories, and other resources to help your team with tasks that require knowledge of your specific products, customers, and code."}),(0,r.jsx)(n.p,{children:"Agents use LLMs as a reasoning engine to process input, determine which actions to take to address the query, and then generate a response.\nThe response could be a typical text-based LLM response, or it could involve an action, like editing a file, running a script, or calling an external API."}),(0,r.jsxs)(n.p,{children:["In an agentic context, tools are functions that the agent can run to perform tasks or access external resources.\nA function is wrapped as a ",(0,r.jsx)(n.code,{children:"Tool"})," object with a common interface that the agent understands.\nAgents become aware of tools through tool registration, which is when the agent is provided a list of available tools typically at agent initialization.\nThe ",(0,r.jsx)(n.code,{children:"Tool"})," object's description tells the agent what the tool can do so that it can decide whether the tool is appropriate for a given request."]})]}),"\n",(0,r.jsx)(n.h2,{id:"examples-of-agent-flows",children:"Examples of agent flows"}),"\n",(0,r.jsxs)(n.p,{children:["For examples of flows using the ",(0,r.jsx)(n.strong,{children:"Agent"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," components, see the following:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/get-started-quickstart",children:"Langflow quickstart"}),": Start with the ",(0,r.jsx)(n.strong,{children:"Simple Agent"})," template, modify its tools, and then learn how to use an agent flow in an application."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Simple Agent"})," template creates a basic agent flow with an ",(0,r.jsx)(n.strong,{children:"Agent"})," component that can use two other Langflow components as tools.\nThe LLM specified in the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's settings can use its own built-in functionality as well as the functionality provided by the connected tools when generating responses."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/agents-tools#use-an-agent-as-a-tool",children:"Use an agent as a tool"}),": Create a multi-agent flow."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/mcp-client",children:"Use Langflow as an MCP client"})," and ",(0,r.jsx)(n.a,{href:"/mcp-server",children:"Use Langflow as an MCP server"}),": Use the ",(0,r.jsx)(n.strong,{children:"Agent"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," components to implement the Model Context Protocol (MCP) in your flows."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"agent-component",children:"Agent component"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Agent"})," component is the primary agent actor in your agent flows.\nThis component uses an LLM integration to respond to input, such as a chat message or file upload."]}),"\n",(0,r.jsxs)(n.p,{children:["The agent can use the tools already available in the base LLM as well as additional tools that you connect to the ",(0,r.jsx)(n.strong,{children:"Agent"})," component's ",(0,r.jsx)(n.strong,{children:"Tools"})," port.\nYou can connect any Langflow component as a tool, including other ",(0,r.jsx)(n.strong,{children:"Agent"})," components and MCP servers through the ",(0,r.jsxs)(n.a,{href:"#mcp-connection",children:[(0,r.jsx)(n.strong,{children:"MCP Tools"})," component"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["For more information about using this component, see ",(0,r.jsx)(n.a,{href:"/agents",children:"Use Langflow agents"}),"."]}),"\n",(0,r.jsx)(n.h2,{id:"mcp-connection",children:"MCP Tools component"}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," component connects to a Model Context Protocol (MCP) server and exposes the MCP server's functions as tools for Langflow agents to use to respond to input."]}),"\n",(0,r.jsxs)(n.p,{children:["In addition to publicly available MCP servers and your own custom-built MCP servers, you can connect Langflow MCP servers, which allow your agent to use your Langflow flows as tools.\nTo do this, use the ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," component's ",(0,r.jsx)(n.a,{href:"/mcp-client#mcp-sse-mode",children:"SSE mode"})," to connect to your Langflow MCP server at the ",(0,r.jsx)(n.code,{children:"/api/v1/mcp/sse"})," endpoint."]}),"\n",(0,r.jsxs)(n.p,{children:["For more information about using this component and serving flows as MCP tools, see ",(0,r.jsx)(n.a,{href:"/mcp-client",children:"Use Langflow as an MCP client"})," and ",(0,r.jsx)(n.a,{href:"/mcp-server",children:"Use Langflow as an MCP server"}),"."]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"Earlier versions of the MCP Tools component"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["In Langflow version 1.5, the ",(0,r.jsx)(n.strong,{children:"MCP Connection"})," component was renamed to the ",(0,r.jsx)(n.strong,{children:"MCP Tools"})," component."]}),"\n",(0,r.jsxs)(n.li,{children:["In Langflow version 1.3, the ",(0,r.jsx)(n.strong,{children:"MCP Tools (stdio)"})," and ",(0,r.jsx)(n.strong,{children:"MCP Tools (SSE)"})," components were deprecated and replaced by the unified ",(0,r.jsx)(n.strong,{children:"MCP Connection"})," component, which was later renamed to ",(0,r.jsx)(n.strong,{children:"MCP Tools"}),"."]}),"\n"]})]}),"\n",(0,r.jsx)(n.h2,{id:"legacy-agent-components",children:"Legacy Agent components"}),"\n",(0,r.jsx)(n.p,{children:"The following components are legacy components.\nYou can still use these components in your flows, but they are no longer maintained and they can be removed in future releases."}),"\n",(0,r.jsxs)(n.p,{children:["Replace these components with the ",(0,r.jsx)(n.strong,{children:"Agent"})," component or other Langflow components, depending on your use case."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.strong,{children:"CrewAI Hierarchical Task"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.strong,{children:"CrewAI Sequential Task"})}),"\n"]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Agent"}),(0,r.jsxs)(n.p,{children:["This component represents CrewAI agents, allowing for the creation of specialized AI agents with defined roles goals and capabilities within a crew.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/core-concepts/Agents/",children:"CrewAI agents documentation"}),"."]}),(0,r.jsx)(n.p,{children:"This component accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"role"}),(0,r.jsx)(n.td,{children:"Role"}),(0,r.jsx)(n.td,{children:"Input parameter. The role of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"goal"}),(0,r.jsx)(n.td,{children:"Goal"}),(0,r.jsx)(n.td,{children:"Input parameter. The objective of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"backstory"}),(0,r.jsx)(n.td,{children:"Backstory"}),(0,r.jsx)(n.td,{children:"Input parameter. The backstory of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tools"}),(0,r.jsx)(n.td,{children:"Tools"}),(0,r.jsx)(n.td,{children:"Input parameter. The tools at the agent's disposal."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"llm"}),(0,r.jsx)(n.td,{children:"Language Model"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model that runs the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent should have memory or not."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_delegation"}),(0,r.jsx)(n.td,{children:"Allow Delegation"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to delegate tasks to other agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_code_execution"}),(0,r.jsx)(n.td,{children:"Allow Code Execution"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to execute code."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"kwargs"}),(0,r.jsx)(n.td,{children:"kwargs"}),(0,r.jsx)(n.td,{children:"Input parameter. Additional keyword arguments for the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"output"}),(0,r.jsx)(n.td,{children:"Agent"}),(0,r.jsx)(n.td,{children:"Output parameter. The constructed CrewAI Agent object."})]})]})]})]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Hierarchical Crew"}),(0,r.jsxs)(n.p,{children:["This component represents a group of agents managing how they should collaborate and the tasks they should perform in a hierarchical structure. This component allows for the creation of a crew with a manager overseeing the task execution.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/how-to/Hierarchical/",children:"CrewAI hierarchical crew documentation"}),"."]}),(0,r.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"agents"}),(0,r.jsx)(n.td,{children:"Agents"}),(0,r.jsx)(n.td,{children:"Input parameter. The list of Agent objects representing the crew members."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tasks"}),(0,r.jsx)(n.td,{children:"Tasks"}),(0,r.jsx)(n.td,{children:"Input parameter. The list of HierarchicalTask objects representing the tasks to be executed."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"manager_llm"}),(0,r.jsx)(n.td,{children:"Manager LLM"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model for the manager agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"manager_agent"}),(0,r.jsx)(n.td,{children:"Manager Agent"}),(0,r.jsx)(n.td,{children:"Input parameter. The specific agent to act as the manager."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output for detailed logging."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. The memory configuration for the crew."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_cache"}),(0,r.jsx)(n.td,{children:"Use Cache"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables caching of results."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_rpm"}),(0,r.jsx)(n.td,{children:"Max RPM"}),(0,r.jsx)(n.td,{children:"Input parameter. This sets the maximum requests per minute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"share_crew"}),(0,r.jsx)(n.td,{children:"Share Crew"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines if the crew information is shared among agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"function_calling_llm"}),(0,r.jsx)(n.td,{children:"Function Calling LLM"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model for function calling."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"crew"}),(0,r.jsx)(n.td,{children:"Crew"}),(0,r.jsx)(n.td,{children:"Output parameter. The constructed Crew object with hierarchical task execution."})]})]})]})]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Sequential Crew"}),(0,r.jsxs)(n.p,{children:["This component represents a group of agents with tasks that are executed sequentially. This component allows for the creation of a crew that performs tasks in a specific order.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/how-to/Sequential/",children:"CrewAI sequential crew documentation"}),"."]}),(0,r.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tasks"}),(0,r.jsx)(n.td,{children:"Tasks"}),(0,r.jsx)(n.td,{children:"Input parameter. The list of SequentialTask objects representing the tasks to be executed."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output for detailed logging."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. The memory configuration for the crew."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"use_cache"}),(0,r.jsx)(n.td,{children:"Use Cache"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables caching of results."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"max_rpm"}),(0,r.jsx)(n.td,{children:"Max RPM"}),(0,r.jsx)(n.td,{children:"Input parameter. This sets the maximum requests per minute."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"share_crew"}),(0,r.jsx)(n.td,{children:"Share Crew"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines if the crew information is shared among agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"function_calling_llm"}),(0,r.jsx)(n.td,{children:"Function Calling LLM"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model for function calling."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"crew"}),(0,r.jsx)(n.td,{children:"Crew"}),(0,r.jsx)(n.td,{children:"Output parameter. The constructed Crew object with sequential task execution."})]})]})]})]}),"\n",(0,r.jsxs)(t,{children:[(0,r.jsx)("summary",{children:"CrewAI Sequential Task Agent"}),(0,r.jsxs)(n.p,{children:["This component creates a CrewAI Task and its associated agent allowing for the definition of sequential tasks with specific agent roles and capabilities.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"https://docs.crewai.com/how-to/Sequential/",children:"CrewAI sequential agents documentation"}),"."]}),(0,r.jsx)(n.p,{children:"It accepts the following parameters:"}),(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Name"}),(0,r.jsx)(n.th,{children:"Display Name"}),(0,r.jsx)(n.th,{children:"Info"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"role"}),(0,r.jsx)(n.td,{children:"Role"}),(0,r.jsx)(n.td,{children:"Input parameter. The role of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"goal"}),(0,r.jsx)(n.td,{children:"Goal"}),(0,r.jsx)(n.td,{children:"Input parameter. The objective of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"backstory"}),(0,r.jsx)(n.td,{children:"Backstory"}),(0,r.jsx)(n.td,{children:"Input parameter. The backstory of the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"tools"}),(0,r.jsx)(n.td,{children:"Tools"}),(0,r.jsx)(n.td,{children:"Input parameter. The tools at the agent's disposal."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"llm"}),(0,r.jsx)(n.td,{children:"Language Model"}),(0,r.jsx)(n.td,{children:"Input parameter. The language model that runs the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"memory"}),(0,r.jsx)(n.td,{children:"Memory"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent should have memory or not."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"verbose"}),(0,r.jsx)(n.td,{children:"Verbose"}),(0,r.jsx)(n.td,{children:"Input parameter. This enables verbose output."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_delegation"}),(0,r.jsx)(n.td,{children:"Allow Delegation"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to delegate tasks to other agents."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"allow_code_execution"}),(0,r.jsx)(n.td,{children:"Allow Code Execution"}),(0,r.jsx)(n.td,{children:"Input parameter. This determines whether the agent is allowed to execute code."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"agent_kwargs"}),(0,r.jsx)(n.td,{children:"Agent kwargs"}),(0,r.jsx)(n.td,{children:"Input parameter. The additional kwargs for the agent."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"task_description"}),(0,r.jsx)(n.td,{children:"Task Description"}),(0,r.jsx)(n.td,{children:"Input parameter. The descriptive text detailing the task's purpose and execution."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"expected_output"}),(0,r.jsx)(n.td,{children:"Expected Task Output"}),(0,r.jsx)(n.td,{children:"Input parameter. The clear definition of the expected task outcome."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"async_execution"}),(0,r.jsx)(n.td,{children:"Async Execution"}),(0,r.jsx)(n.td,{children:"Input parameter. Boolean flag indicating asynchronous task execution."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"previous_task"}),(0,r.jsx)(n.td,{children:"Previous Task"}),(0,r.jsx)(n.td,{children:"Input parameter. The previous task in the sequence for chaining."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"task_output"}),(0,r.jsx)(n.td,{children:"Sequential Task"}),(0,r.jsx)(n.td,{children:"Output parameter. The list of SequentialTask objects representing the created tasks."})]})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:(0,r.jsxs)(n.a,{href:"/components-helpers#message-history",children:[(0,r.jsx)(n.strong,{children:"Message History"})," component"]})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/memory#store-chat-memory",children:"Store chat memory"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/components-bundle-components",children:"Bundles"})}),"\n",(0,r.jsx)(n.li,{children:(0,r.jsx)(n.a,{href:"/bundles-langchain#legacy-langchain-components",children:"Legacy LangChain components"})}),"\n"]})]})}function h(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/8bd4a540.1111abcf.js b/assets/js/8bd4a540.1111abcf.js new file mode 100644 index 0000000000..c9c99a5609 --- /dev/null +++ b/assets/js/8bd4a540.1111abcf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[2307],{7685:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/vector-store-document-ingestion-6157311fb4d16e7f944d55254f0cc0e2.png"},11470:(e,r,t)=>{t.d(r,{A:()=>I});var n=t(96540),s=t(18215),i=t(23104),d=t(56347),a=t(205),c=t(57485),o=t(31682),l=t(70679);function h(e){return n.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:r}=e;return!!r&&"object"==typeof r&&"value"in r}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function x(e){const{values:r,children:t}=e;return(0,n.useMemo)(()=>{const e=r??function(e){return h(e).map(({props:{value:e,label:r,attributes:t,default:n}})=>({value:e,label:r,attributes:t,default:n}))}(t);return function(e){const r=(0,o.XI)(e,(e,r)=>e.value===r.value);if(r.length>0)throw new Error(`Docusaurus error: Duplicate values "${r.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[r,t])}function j({value:e,tabValues:r}){return r.some(r=>r.value===e)}function p({queryString:e=!1,groupId:r}){const t=(0,d.W6)(),s=function({queryString:e=!1,groupId:r}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!r)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return r??null}({queryString:e,groupId:r});return[(0,c.aZ)(s),(0,n.useCallback)(e=>{if(!s)return;const r=new URLSearchParams(t.location.search);r.set(s,e),t.replace({...t.location,search:r.toString()})},[s,t])]}function u(e){const{defaultValue:r,queryString:t=!1,groupId:s}=e,i=x(e),[d,c]=(0,n.useState)(()=>function({defaultValue:e,tabValues:r}){if(0===r.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!j({value:e,tabValues:r}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${r.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=r.find(e=>e.default)??r[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:r,tabValues:i})),[o,h]=p({queryString:t,groupId:s}),[u,m]=function({groupId:e}){const r=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,l.Dv)(r);return[t,(0,n.useCallback)(e=>{r&&s.set(e)},[r,s])]}({groupId:s}),g=(()=>{const e=o??u;return j({value:e,tabValues:i})?e:null})();(0,a.A)(()=>{g&&c(g)},[g]);return{selectedValue:d,selectValue:(0,n.useCallback)(e=>{if(!j({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);c(e),h(e),m(e)},[h,m,i]),tabValues:i}}var m=t(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=t(74848);function b({className:e,block:r,selectedValue:t,selectValue:n,tabValues:d}){const a=[],{blockElementScrollPositionUntilNextRender:c}=(0,i.a_)(),o=e=>{const r=e.currentTarget,s=a.indexOf(r),i=d[s].value;i!==t&&(c(r),n(i))},l=e=>{let r=null;switch(e.key){case"Enter":o(e);break;case"ArrowRight":{const t=a.indexOf(e.currentTarget)+1;r=a[t]??a[0];break}case"ArrowLeft":{const t=a.indexOf(e.currentTarget)-1;r=a[t]??a[a.length-1];break}}r?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":r},e),children:d.map(({value:e,label:r,attributes:n})=>(0,f.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{a.push(e)},onKeyDown:l,onClick:o,...n,className:(0,s.A)("tabs__item",g.tabItem,n?.className,{"tabs__item--active":t===e}),children:r??e},e))})}function y({lazy:e,children:r,selectedValue:t}){const i=(Array.isArray(r)?r:[r]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===t);return e?(0,n.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:i.map((e,r)=>(0,n.cloneElement)(e,{key:r,hidden:e.props.value!==t}))})}function v(e){const r=u(e);return(0,f.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,f.jsx)(b,{...r,...e}),(0,f.jsx)(y,{...r,...e})]})}function I(e){const r=(0,m.A)();return(0,f.jsx)(v,{...e,children:h(e.children)},String(r))}},17343:(e,r,t)=>{t.r(r),t.d(r,{CH:()=>j,assets:()=>x,chCodeConfig:()=>p,contentTitle:()=>h,default:()=>g,frontMatter:()=>l,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"Components/components-vector-stores","title":"Vector Stores","description":"Langflow\'s Vector Store components are used to read and write vector data, including embedding storage, vector search, Graph RAG traversals, and specialized provider-specific search, such as OpenSearch, Elasticsearch, and Vectara.","source":"@site/docs/Components/components-vector-stores.mdx","sourceDirName":"Components","slug":"/components-vector-stores","permalink":"/components-vector-stores","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Vector Stores","slug":"/components-vector-stores"},"sidebar":"docs","previous":{"title":"Data","permalink":"/components-data"},"next":{"title":"Processing components","permalink":"/components-processing"}}');var s=t(74848),i=t(28453),d=t(24754),a=t(17886),c=t(11470),o=t(19365);const l={title:"Vector Stores",slug:"/components-vector-stores"},h=void 0,x={},j={annotations:d.hk,Code:d.Cy},p={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},u=[{value:"Use Vector Store components in a flow",id:"use-vector-store-components-in-a-flow",level:2},{value:"Hidden parameters",id:"hidden-parameters",level:3},{value:"Search results output",id:"search-results-output",level:3},{value:"Vector store instances",id:"vector-store-instances",level:3},{value:"Apache Cassandra",id:"apache-cassandra",level:2},{value:"Cassandra",id:"cassandra",level:3},{value:"Cassandra Graph",id:"cassandra-graph",level:3},{value:"Chroma",id:"chroma",level:2},{value:"Chroma DB",id:"chroma-db",level:3},{value:"Local DB",id:"local-db",level:3},{value:"Clickhouse",id:"clickhouse",level:2},{value:"Couchbase",id:"couchbase",level:2},{value:"DataStax",id:"datastax",level:2},{value:"Astra DB",id:"astra-db",level:3},{value:"Astra DB Graph",id:"astra-db-graph",level:3},{value:"Graph RAG",id:"graph-rag",level:3},{value:"Hyper-Converged Database (HCD)",id:"hyper-converged-database-hcd",level:3},{value:"Elasticsearch",id:"elasticsearch",level:2},{value:"FAISS",id:"faiss",level:2},{value:"Milvus",id:"milvus",level:2},{value:"MongoDB Atlas",id:"mongodb-atlas",level:2},{value:"OpenSearch",id:"opensearch",level:2},{value:"PGVector",id:"pgvector",level:2},{value:"Pinecone",id:"pinecone",level:2},{value:"Qdrant",id:"qdrant",level:2},{value:"Redis",id:"redis",level:2},{value:"Supabase",id:"supabase",level:2},{value:"Upstash",id:"upstash",level:2},{value:"Vectara Platform",id:"vectara-platform",level:2},{value:"Vectara",id:"vectara",level:3},{value:"Vectara RAG",id:"vectara-rag",level:3},{value:"Weaviate",id:"weaviate",level:2}];function m(e){const r={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components},{Details:n}=r;return j||f("CH",!1),j.Code||f("CH.Code",!0),n||f("Details",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsxs)(r.p,{children:["Langflow's ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components are used to read and write vector data, including embedding storage, vector search, Graph RAG traversals, and specialized provider-specific search, such as OpenSearch, Elasticsearch, and Vectara."]}),"\n",(0,s.jsx)(r.p,{children:"These components are critical for vector search applications, such as Retrieval Augmented Generation (RAG) chatbots that need to retrieve relevant context from large datasets."}),"\n",(0,s.jsxs)(r.p,{children:["Most of these components connect to a specific vector database provider, but some components support multiple providers or platforms.\nFor example, the ",(0,s.jsx)(r.strong,{children:"Cassandra"})," vector store component can connect to self-managed Apache Cassandra-based clusters as well as Astra DB, which is a managed Cassandra DBaaS."]}),"\n",(0,s.jsxs)(r.p,{children:["Other types of storage, like traditional structured databases and chat memory, are handled through other components like the ",(0,s.jsxs)(r.a,{href:"/components-data#sql-database",children:[(0,s.jsx)(r.strong,{children:"SQL Database"})," component"]})," or the ",(0,s.jsxs)(r.a,{href:"/components-helpers#message-history",children:[(0,s.jsx)(r.strong,{children:"Message History"})," component"]}),"."]}),"\n",(0,s.jsx)(r.h2,{id:"use-vector-store-components-in-a-flow",children:"Use Vector Store components in a flow"}),"\n",(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsxs)(r.p,{children:["For a tutorial using ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components in a flow, see ",(0,s.jsx)(r.a,{href:"/chat-with-rag",children:"Create a vector RAG chatbot"}),"."]})}),"\n",(0,s.jsxs)(r.p,{children:["The following steps introduce the use of ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components in a flow, including configuration details, how the components work when you run a flow, why you might need multiple ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components in one flow, and useful supporting components, such as ",(0,s.jsx)(r.strong,{children:"Embedding Model"})," and ",(0,s.jsx)(r.strong,{children:"Parser"})," components."]}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Create a flow with the ",(0,s.jsx)(r.strong,{children:"Vector Store RAG"})," template."]}),"\n",(0,s.jsxs)(r.p,{children:["This template has two subflows.\nThe ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow loads embeddings and content into a vector database, and the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow runs a vector search to retrieve relevant context based on a user's query."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Configure the database connection for both ",(0,s.jsxs)(r.a,{href:"#astra-db",children:[(0,s.jsx)(r.strong,{children:"Astra DB"})," components"]}),", or replace them with another pair of ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components of your choice.\nMake sure the components connect to the same vector store, and that the component in the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow is able to run a similarity search."]}),"\n",(0,s.jsxs)(r.p,{children:["The parameters you set in each ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component depend on the component's role in your flow.\nIn this example, the ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow ",(0,s.jsx)(r.em,{children:"writes"})," to the vector store, whereas the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow ",(0,s.jsx)(r.em,{children:"reads"})," from the vector store.\nTherefore, search-related parameters are only relevant to the ",(0,s.jsx)(r.strong,{children:"Vector Search"})," component in the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow."]}),"\n",(0,s.jsxs)(r.p,{children:["For information about specific configuration parameters, see the section of this page for your chosen ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component and ",(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsx)(r.p,{children:"To configure the embedding model, do one of the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Use an OpenAI model"}),": In both ",(0,s.jsx)(r.strong,{children:"OpenAI Embeddings"})," components, enter your OpenAI API key.\nYou can use the default model or select a different OpenAI embedding model."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Use another provider"}),": Replace the ",(0,s.jsx)(r.strong,{children:"OpenAI Embeddings"})," components with another pair of ",(0,s.jsxs)(r.a,{href:"/components-embedding-models",children:[(0,s.jsx)(r.strong,{children:"Embedding Model"})," component"]})," of your choice, and then configure the parameters and credentials accordingly."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Use Astra DB vectorize"}),": If you are using an Astra DB vector store that has a vectorize integration, you can remove both ",(0,s.jsx)(r.strong,{children:"OpenAI Embeddings"})," components.\nIf you do this, the vectorize integration automatically generates embeddings from the ",(0,s.jsx)(r.strong,{children:"Ingest Data"})," (in the ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow) and ",(0,s.jsx)(r.strong,{children:"Search Query"})," (in the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow)."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsxs)(r.p,{children:["If your vector store already contains embeddings, make sure your ",(0,s.jsx)(r.strong,{children:"Embedding Model"})," components use the same model as your previous embeddings.\nMixing embedding models in the same vector store can produce inaccurate search results."]})}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Recommended: In the ",(0,s.jsxs)(r.a,{href:"/components-processing#split-text",children:[(0,s.jsx)(r.strong,{children:"Split Text"})," component"]}),", optimize the chunking settings for your embedding model.\nFor example, if your embedding model has a token limit of 512, then the ",(0,s.jsx)(r.strong,{children:"Chunk Size"})," parameter must not exceed that limit."]}),"\n",(0,s.jsxs)(r.p,{children:["Additionally, because the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow passes the chat input directly to the ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component for vector search, make sure that your chat input string doesn't exceed your embedding model's limits.\nFor this example, you can enter a query that is within the limits; however, in a production environment, you might need to implement additional checks or preprocessing steps to ensure compliance.\nFor example, use additional components to prepare the chat input before running the vector search, or enforce chat input limits in your application code."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the ",(0,s.jsx)(r.strong,{children:"Language Model"})," component, enter your OpenAI API key, or select a different provider and model to use for the chat portion of the flow."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Run the ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow to populate your vector store.\nIn the ",(0,s.jsx)(r.strong,{children:"File"})," component, select one or more files, and then click ",(0,s.jsx)(a.A,{name:"Play","aria-hidden":"True"})," ",(0,s.jsx)(r.strong,{children:"Run component"})," on the ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component in the ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow."]}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow loads files from your local machine, chunks them, generates embeddings for the chunks, and then stores the chunks and their embeddings in the vector database."]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"Embedding data into a vector store",src:t(7685).A+"",width:"4000",height:"2512"})}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow is separate from the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow because you probably won't run it every time you use the chat.\nYou can run the ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow as needed to preload or update the data in your vector store.\nThen, your chat interactions only use the components that are necessary for chat."]}),"\n",(0,s.jsxs)(r.p,{children:["If your vector store already contains data that you want to use for vector search, then you don't need to run the ",(0,s.jsx)(r.strong,{children:"Load Data"})," subflow."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Open the ",(0,s.jsx)(r.strong,{children:"Playground"})," and start chatting to run the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow."]}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow generates an embedding from chat input, runs a vector search to retrieve similar content from your vector store, parses the search results into supplemental context for the LLM, and then uses the LLM to generate a natural language response to your query.\nThe LLM uses the vector search results along with its internal training data and tools, such as basic web search and datetime information, to produce the response."]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"Retrieval from a vector store",src:t(67719).A+"",width:"4000",height:"1324"})}),"\n",(0,s.jsxs)(r.p,{children:["To avoid passing the entire block of raw search results to the LLM, the ",(0,s.jsx)(r.strong,{children:"Parser"})," component extracts ",(0,s.jsx)(r.code,{children:"text"})," strings from the search results ",(0,s.jsx)(r.code,{children:"Data"})," object, and then passes them to the ",(0,s.jsx)(r.strong,{children:"Prompt Template"})," component in ",(0,s.jsx)(r.code,{children:"Message"})," format.\nFrom there, the strings and other template content are compiled into natural language instructions for the LLM."]}),"\n",(0,s.jsxs)(r.p,{children:["You can use other components for this transformation, such as the ",(0,s.jsx)(r.strong,{children:"Data Operations"})," component, depending on how you want to use the search results."]}),"\n",(0,s.jsxs)(r.p,{children:["To view the raw search results, click ",(0,s.jsx)(a.A,{name:"TextSearch","aria-hidden":"True"})," ",(0,s.jsx)(r.strong,{children:"Inspect output"})," on the ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component after running the ",(0,s.jsx)(r.strong,{children:"Retriever"})," subflow."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"hidden-parameters",children:"Hidden parameters"}),"\n",(0,s.jsxs)(r.p,{children:["You can inspect a ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component's parameters to learn more about the inputs it accepts, the features it supports, and how to configure it."]}),"\n",(0,s.jsxs)(r.p,{children:["Many input parameters for ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,s.jsx)(a.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Controls"})," in each ",(0,s.jsx)(r.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,s.jsxs)(r.p,{children:["Some parameters are conditional, and they are only available after you set other parameters or select specific options for other parameters.\nConditional parameters may not be visible on the ",(0,s.jsx)(r.strong,{children:"Controls"})," pane until you set the required dependencies.\nHowever, all parameters are always listed in a ",(0,s.jsx)(r.a,{href:"/concepts-components#component-code",children:"component's code"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For information about a specific component's parameters, see the provider's documentation and the component details."}),"\n",(0,s.jsx)(r.h3,{id:"search-results-output",children:"Search results output"}),"\n",(0,s.jsxs)(r.p,{children:["If you use a ",(0,s.jsx)(r.strong,{children:"Vector Store"})," component to query your vector store, it produces search results that you can pass to downstream components in your flow as a list of ",(0,s.jsx)(r.a,{href:"/data-types#data",children:(0,s.jsx)(r.code,{children:"Data"})})," objects or a tabular ",(0,s.jsx)(r.a,{href:"/data-types#dataframe",children:(0,s.jsx)(r.code,{children:"DataFrame"})}),".\nIf both types are supported, you can set the format near the component's output port in the visual editor."]}),"\n",(0,s.jsxs)(r.p,{children:["The exception to this pattern is the ",(0,s.jsx)(r.strong,{children:"Vectara RAG"})," component, which outputs only an ",(0,s.jsx)(r.code,{children:"answer"})," string in ",(0,s.jsx)(r.a,{href:"/data-types#message",children:(0,s.jsx)(r.code,{children:"Message"})})," format."]}),"\n",(0,s.jsx)(r.h3,{id:"vector-store-instances",children:"Vector store instances"}),"\n",(0,s.jsxs)(r.p,{children:["Because Langflow is based on LangChain, ",(0,s.jsx)(r.strong,{children:"Vector Store"})," components use an instance of ",(0,s.jsx)(r.a,{href:"https://python.langchain.com/docs/integrations/vectorstores/",children:"LangChain vector store"})," to drive the underlying vector search functions.\nIn the component code, this is often instantiated as ",(0,s.jsx)(r.code,{children:"vector_store"}),", but some components use a different name, such as the provider name."]}),"\n",(0,s.jsxs)(r.p,{children:["For the ",(0,s.jsx)(r.strong,{children:"Cassandra Graph"})," and ",(0,s.jsx)(r.strong,{children:"Astra DB Graph"})," components, ",(0,s.jsx)(r.code,{children:"vector_store"})," is an instance of ",(0,s.jsx)(r.a,{href:"https://python.langchain.com/api_reference/community/graph_vectorstores.html",children:"LangChain graph vector store"}),"."]}),"\n",(0,s.jsxs)(r.p,{children:["These instances are provider-specific and configured according to the component's parameters.\nFor example, the ",(0,s.jsx)(r.strong,{children:"Redis"})," component creates an instance of ",(0,s.jsx)(r.a,{href:"https://python.langchain.com/docs/integrations/vectorstores/redis/",children:(0,s.jsx)(r.code,{children:"RedisVectorStore"})})," based on the component's parameters, such as the connection string, index name, and schema."]}),"\n",(0,s.jsx)(r.p,{children:"Some LangChain classes don't expose all possible options as component parameters.\nDepending on the provider, these options might use default values or allow modification through environment variables, if they are supported in Langflow.\nFor information about specific options, see the LangChain API reference and provider documentation."}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Vector Store Connection ports"}),(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Astra DB"})," and ",(0,s.jsx)(r.strong,{children:"OpenSearch"})," components have an additional ",(0,s.jsx)(r.strong,{children:"Vector Store Connection"})," output.\nThis output can only connect to a ",(0,s.jsx)(r.code,{children:"VectorStore"})," input port, and it was intended for use with dedicated Graph RAG components."]}),(0,s.jsxs)(r.p,{children:["The only non-legacy component that supports this input is the ",(0,s.jsx)(r.strong,{children:"Graph RAG"})," component, which was meant as a Graph RAG extension to the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component.\nInstead, you can use the ",(0,s.jsx)(r.strong,{children:"Astra DB Graph"})," component that includes both the vector store connection and Graph RAG functionality.\nOpenSearch instances support Graph traversal through built-in RAG functionality and plugins."]})]}),"\n",(0,s.jsx)(r.h2,{id:"apache-cassandra",children:"Apache Cassandra"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Cassandra"})," and ",(0,s.jsx)(r.strong,{children:"Cassandra Graph"})," components can be used with Cassandra clusters that support vector search, including Astra DB."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://cassandra.apache.org/doc/latest/cassandra/vector-search/overview.html",children:"Vector search in Cassandra"})}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"cassandra",children:"Cassandra"}),"\n",(0,s.jsxs)(r.p,{children:["Use the ",(0,s.jsx)(r.strong,{children:"Cassandra"})," component to read or write to a Cassandra vector store using a ",(0,s.jsx)(r.code,{children:"CassandraVectorStore"})," instance."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Cassandra parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"database_ref"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Contact points for the database or an Astra database ID."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"username"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Username for the database. Leave empty for Astra DB."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"token"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. User password for the database or an Astra application token."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"keyspace"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The name of the keyspace containing the vector store specified in ",(0,s.jsx)(r.strong,{children:"Table Name"})," (",(0,s.jsx)(r.code,{children:"table_name"}),")."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"table_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the table or collection that is the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ttl_seconds"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Time-to-live for added texts, if supported by the cluster. Only relevant for writes."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"batch_size"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Amount of records to process in a single batch."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"setup_mode"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Configuration mode for setting up a Cassandra table."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"cluster_kwargs"}),(0,s.jsx)(r.td,{children:"Dict"}),(0,s.jsx)(r.td,{children:"Input parameter. Additional keyword arguments for a Cassandra cluster."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Query string for similarity search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. Data to be loaded into the vector store as raw chunks and embeddings. Only relevant for writes."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. Embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of results to return in search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Type of search to perform. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Float"}),(0,s.jsx)(r.td,{children:"Input parameter. Minimum similarity score for search results. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_filter"}),(0,s.jsx)(r.td,{children:"Dict"}),(0,s.jsx)(r.td,{children:"Input parameter. An optional dictionary of metadata search filters to apply in addition to vector search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"body_search"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Document textual search terms. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"enable_body_search"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Flag to enable body search. Only relevant for reads."})]})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"cassandra-graph",children:"Cassandra Graph"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Cassandra Graph"})," component uses a ",(0,s.jsx)(r.code,{children:"CassandraGraphVectorStore"})," instance for graph traversal and graph-based document retrieval in a compatible Cassandra cluster.\nIt also supports writing to the vector store."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Cassandra Graph parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Display Name"}),(0,s.jsx)(r.th,{children:"Info"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"database_ref"}),(0,s.jsx)(r.td,{children:"Contact Points / Astra Database ID"}),(0,s.jsx)(r.td,{children:"Input parameter. The contact points for the database or an Astra database ID. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"username"}),(0,s.jsx)(r.td,{children:"Username"}),(0,s.jsx)(r.td,{children:"Input parameter. The username for the database. Leave empty for Astra DB."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"token"}),(0,s.jsx)(r.td,{children:"Password / Astra DB Token"}),(0,s.jsx)(r.td,{children:"Input parameter. The user password for the database or an Astra application token. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"keyspace"}),(0,s.jsx)(r.td,{children:"Keyspace"}),(0,s.jsxs)(r.td,{children:["Input parameter. The name of the keyspace containing the vector store specified in ",(0,s.jsx)(r.strong,{children:"Table Name"})," (",(0,s.jsx)(r.code,{children:"table_name"}),"). Required."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"table_name"}),(0,s.jsx)(r.td,{children:"Table Name"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the table or collection that is the vector store. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"setup_mode"}),(0,s.jsx)(r.td,{children:"Setup Mode"}),(0,s.jsxs)(r.td,{children:["Input parameter. The configuration mode for setting up the Cassandra table. The options are ",(0,s.jsx)(r.code,{children:"Sync"})," (default) or ",(0,s.jsx)(r.code,{children:"Off"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"cluster_kwargs"}),(0,s.jsx)(r.td,{children:"Cluster arguments"}),(0,s.jsx)(r.td,{children:"Input parameter. An optional dictionary of additional keyword arguments for the Cassandra cluster."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"Search Query"}),(0,s.jsx)(r.td,{children:"Input parameter. The query string for similarity search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Ingest Data"}),(0,s.jsx)(r.td,{children:"Input parameter. Data to be loaded into the vector store as raw chunks and embeddings. Only relevant for writes."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embedding"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding model to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Number of Results"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in similarity search. Only relevant for reads. Default: 4."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"Search Type"}),(0,s.jsxs)(r.td,{children:["Input parameter. The search type to use. The options are ",(0,s.jsx)(r.code,{children:"Traversal"})," (default), ",(0,s.jsx)(r.code,{children:"MMR Traversal"}),", ",(0,s.jsx)(r.code,{children:"Similarity"}),", ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"}),", or ",(0,s.jsx)(r.code,{children:"MMR (Max Marginal Relevance)"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"depth"}),(0,s.jsx)(r.td,{children:"Depth of traversal"}),(0,s.jsxs)(r.td,{children:["Input parameter. The maximum depth of edges to traverse. Only relevant if ",(0,s.jsx)(r.strong,{children:"Search Type"})," (",(0,s.jsx)(r.code,{children:"search_type"}),") is ",(0,s.jsx)(r.code,{children:"Traversal"})," or ",(0,s.jsx)(r.code,{children:"MMR Traversal"}),". Default: 1."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Search Score Threshold"}),(0,s.jsxs)(r.td,{children:["Input parameter. The minimum similarity score threshold for search results. Only relevant for reads using the ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"})," search type."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_filter"}),(0,s.jsx)(r.td,{children:"Search Metadata Filter"}),(0,s.jsx)(r.td,{children:"Input parameter. An optional dictionary of metadata search filters to apply in addition to graph traversal and similarity search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"chroma",children:"Chroma"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Chroma DB"})," and ",(0,s.jsx)(r.strong,{children:"Local DB"})," components read and write to Chroma vector stores using an instance of ",(0,s.jsx)(r.code,{children:"Chroma"})," vector store.\nIncludes support for remote or in-memory instances with or without persistence."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://docs.trychroma.com/",children:"Chroma documentation"})}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"chroma-db",children:"Chroma DB"}),"\n",(0,s.jsxs)(r.p,{children:["You can use the ",(0,s.jsx)(r.strong,{children:"Chroma DB"})," component to read and write to a Chroma database in local storage or a remote Chroma server with options for persistence and caching.\nWhen writing, the component can create a new database or collection at the specified location."]}),"\n",(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsx)(r.p,{children:"An ephemeral (non-persistent) local Chroma vector store is helpful for testing vector search flows where you don't need to retain the database."})}),"\n",(0,s.jsxs)(r.p,{children:["The following example flow uses one ",(0,s.jsx)(r.strong,{children:"Chroma DB"})," component for both reads and writes:"]}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["When writing, it splits ",(0,s.jsx)(r.code,{children:"Data"})," from a ",(0,s.jsxs)(r.a,{href:"/components-data#url",children:[(0,s.jsx)(r.strong,{children:"URL"})," component"]})," into chunks, computes embeddings with attached ",(0,s.jsx)(r.strong,{children:"Embedding Model"})," component, and then loads the chunks and embeddings into the Chroma vector store.\nTo trigger writes, click ",(0,s.jsx)(a.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Run component"})," on the ",(0,s.jsx)(r.strong,{children:"Chroma DB"})," component."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["When reading, it uses chat input to perform a similarity search on the vector store, and then print the search results to the chat.\nTo trigger reads, open the ",(0,s.jsx)(r.strong,{children:"Playground"})," and enter a chat message."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["After running the flow once, you can click ",(0,s.jsx)(a.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Inspect Output"})," on each component to understand how the data transformed as it passed from component to component."]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"ChromaDB receiving split text",src:t(88690).A+"",width:"4000",height:"2694"})}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Chroma DB parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Collection Name"})," (",(0,s.jsx)(r.code,{children:"collection_name"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The name of your Chroma vector store collection. Default: ",(0,s.jsx)(r.code,{children:"langflow"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Persist Directory"})," (",(0,s.jsx)(r.code,{children:"persist_directory"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. To persist the Chroma database, enter a relative or absolute path to a directory to store the ",(0,s.jsx)(r.code,{children:"chroma.sqlite3"})," file. Leave empty for an ephemeral database. When reading or writing to an existing persistent database, specify the path to the persistent directory."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Ingest Data"})," (",(0,s.jsx)(r.code,{children:"ingest_data"}),")"]}),(0,s.jsx)(r.td,{children:"Data or DataFrame"}),(0,s.jsxs)(r.td,{children:["Input parameter. ",(0,s.jsx)(r.code,{children:"Data"})," or ",(0,s.jsx)(r.code,{children:"DataFrame"})," input containing the records to write to the vector store. Only relevant for writes."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Search Query"})," (",(0,s.jsx)(r.code,{children:"search_query"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query to use for vector search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Cache Vector Store"})," (",(0,s.jsx)(r.code,{children:"cache_vector_store"}),")"]}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. If true, the component caches the vector store in memory for faster reads. Default: Enabled (true)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Embedding"})," (",(0,s.jsx)(r.code,{children:"embedding"}),")"]}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsxs)(r.td,{children:["Input parameter. The embedding function to use for the vector store. By default, Chroma DB uses its built-in embeddings model, or you can attach an ",(0,s.jsx)(r.strong,{children:"Embedding Model"})," component to use a different provider or model."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"CORS Allow Origins"})," (",(0,s.jsx)(r.code,{children:"chroma_server_cors_allow_origins"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The CORS allow origins for the Chroma server."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Chroma Server Host"})," (",(0,s.jsx)(r.code,{children:"chroma_server_host"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The host for the Chroma server."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Chroma Server HTTP Port"})," (",(0,s.jsx)(r.code,{children:"chroma_server_http_port"}),")"]}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The HTTP port for the Chroma server."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Chroma Server gRPC Port"})," (",(0,s.jsx)(r.code,{children:"chroma_server_grpc_port"}),")"]}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The gRPC port for the Chroma server."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Chroma Server SSL Enabled"})," (",(0,s.jsx)(r.code,{children:"chroma_server_ssl_enabled"}),")"]}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Enable SSL for the Chroma server."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Allow Duplicates"})," (",(0,s.jsx)(r.code,{children:"allow_duplicates"}),")"]}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsxs)(r.td,{children:["Input parameter. If true (default), writes don't check for existing duplicates in the collection, allowing you to store multiple copies of the same content. If false, writes won't add documents that match existing documents already present in the collection. If false, it can strictly enforce deduplication by searching the entire collection or only search the number of records, specified in ",(0,s.jsx)(r.code,{children:"limit"}),". Only relevant for writes."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Search Type"})," (",(0,s.jsx)(r.code,{children:"search_type"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The type of search to perform, either ",(0,s.jsx)(r.code,{children:"Similarity"})," or ",(0,s.jsx)(r.code,{children:"MMR"}),". Only relevant for reads."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Number of Results"})," (",(0,s.jsx)(r.code,{children:"number_of_results"}),")"]}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsxs)(r.td,{children:["Input parameter. The number of search results to return. Default: ",(0,s.jsx)(r.code,{children:"10"}),". Only relevant for reads."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Limit"})," (",(0,s.jsx)(r.code,{children:"limit"}),")"]}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsxs)(r.td,{children:["Input parameter. Limit the number of records to compare when ",(0,s.jsx)(r.strong,{children:"Allow Duplicates"})," is false. This can help improve performance when writing to large collections, but it can result in some duplicate records. Only relevant for writes."]})]})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"local-db",children:"Local DB"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Local DB"})," component reads and writes to a persistent, in-memory Chroma DB instance intended for use with Langflow.\nIt has separate modes for reads and writes, automatic collection management, and default persistence in your Langflow cache directory."]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"A basic flow with a Local DB component in Retrieve mode.",src:t(60159).A+"",width:"4000",height:"2188"})}),"\n",(0,s.jsxs)(r.p,{children:["Set the ",(0,s.jsx)(r.strong,{children:"Mode"})," parameter to reflect the operation you want the component to perform, and the configure the other parameters accordingly.\nSome parameters are only available for one mode."]}),"\n",(0,s.jsxs)(c.A,{children:[(0,s.jsxs)(o.A,{value:"ingest",label:"Ingest",children:[(0,s.jsxs)(r.p,{children:["To create or write to your local Chroma vector store, use ",(0,s.jsx)(r.strong,{children:"Ingest"})," mode."]}),(0,s.jsxs)(r.p,{children:["The following parameters are available in ",(0,s.jsx)(r.strong,{children:"Ingest"})," mode:"]}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Name Your Collection"})," (",(0,s.jsx)(r.code,{children:"collection_name"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The name for your Chroma vector store collection. Default: ",(0,s.jsx)(r.code,{children:"langflow"}),". Only available in ",(0,s.jsx)(r.strong,{children:"Ingest"})," mode."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Persist Directory"})," (",(0,s.jsx)(r.code,{children:"persist_directory"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The base directory where you want to create and persist the vector store. If you use the ",(0,s.jsx)(r.strong,{children:"Local DB"})," component in multiple flows or to create multiple collections, collections are stored at ",(0,s.jsx)(r.code,{children:"$PERSISTENT_DIRECTORY/vector_stores/$COLLECTION_NAME"}),". If not specified, the default location is your Langflow cache directory (",(0,s.jsx)(r.code,{children:"LANGFLOW_CONFIG_DIR"}),"). For more information, see ",(0,s.jsx)(r.a,{href:"/memory",children:"Memory management options"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Embedding"})," (",(0,s.jsx)(r.code,{children:"embedding"}),")"]}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use for the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Allow Duplicates"})," (",(0,s.jsx)(r.code,{children:"allow_duplicates"}),")"]}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsxs)(r.td,{children:["Input parameter. If true (default), writes don't check for existing duplicates in the collection, allowing you to store multiple copies of the same content. If false, writes won't add documents that match existing documents already present in the collection. If false, it can strictly enforce deduplication by searching the entire collection or only search the number of records, specified in ",(0,s.jsx)(r.code,{children:"limit"}),". Only available in ",(0,s.jsx)(r.strong,{children:"Ingest"})," mode."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Ingest Data"})," (",(0,s.jsx)(r.code,{children:"ingest_data"}),")"]}),(0,s.jsx)(r.td,{children:"Data or DataFrame"}),(0,s.jsxs)(r.td,{children:["Input parameter. The records to write to the collection. Records are embedded and indexed for semantic search. Only available in ",(0,s.jsx)(r.strong,{children:"Ingest"})," mode."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Limit"})," (",(0,s.jsx)(r.code,{children:"limit"}),")"]}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsxs)(r.td,{children:["Input parameter. Limit the number of records to compare when ",(0,s.jsx)(r.strong,{children:"Allow Duplicates"})," is false. This can help improve performance when writing to large collections, but it can result in some duplicate records. Only available in ",(0,s.jsx)(r.strong,{children:"Ingest"})," mode."]})]})]})]})]}),(0,s.jsxs)(o.A,{value:"retrieve",label:"Retrieve",children:[(0,s.jsxs)(r.p,{children:["To read from your local Chroma vector store, use ",(0,s.jsx)(r.strong,{children:"Retrieve"})," mode."]}),(0,s.jsxs)(r.p,{children:["The following parameters are available in ",(0,s.jsx)(r.strong,{children:"Retrieve"})," mode:"]}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Persist Directory"})," (",(0,s.jsx)(r.code,{children:"persist_directory"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The base directory where you want to create and persist the vector store. If you use the ",(0,s.jsx)(r.strong,{children:"Local DB"})," component in multiple flows or to create multiple collections, collections are stored at ",(0,s.jsx)(r.code,{children:"$PERSISTENT_DIRECTORY/vector_stores/$COLLECTION_NAME"}),". If not specified, the default location is your Langflow cache directory (",(0,s.jsx)(r.code,{children:"LANGFLOW_CONFIG_DIR"}),"). For more information, see ",(0,s.jsx)(r.a,{href:"/memory",children:"Memory management options"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Existing Collections"})," (",(0,s.jsx)(r.code,{children:"existing_collections"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. Select a previously-created collection to search. Only available in ",(0,s.jsx)(r.strong,{children:"Retrieve"})," mode."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Embedding"})," (",(0,s.jsx)(r.code,{children:"embedding"}),")"]}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use for the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Search Type"})," (",(0,s.jsx)(r.code,{children:"search_type"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. The type of search to perform, either ",(0,s.jsx)(r.code,{children:"Similarity"})," or ",(0,s.jsx)(r.code,{children:"MMR"}),". Only available in ",(0,s.jsx)(r.strong,{children:"Retrieve"})," mode."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Search Query"})," (",(0,s.jsx)(r.code,{children:"search_query"}),")"]}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. Enter a query for similarity search. Only available in ",(0,s.jsx)(r.strong,{children:"Retrieve"})," mode."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Number of Results"})," (",(0,s.jsx)(r.code,{children:"number_of_results"}),")"]}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsxs)(r.td,{children:["Input parameter. Number of search results to return. Default: 10. Only available in ",(0,s.jsx)(r.strong,{children:"Retrieve"})," mode."]})]})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"clickhouse",children:"Clickhouse"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Clickhouse"})," component reads and writes to a Clickhouse vector store using an instance of ",(0,s.jsx)(r.code,{children:"Clickhouse"})," vector store."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://clickhouse.com/docs/en/intro",children:"Clickhouse Documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Clickhouse parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Display Name"}),(0,s.jsx)(r.th,{children:"Info"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"host"}),(0,s.jsx)(r.td,{children:"hostname"}),(0,s.jsxs)(r.td,{children:["Input parameter. The Clickhouse server hostname. Required. Default: ",(0,s.jsx)(r.code,{children:"localhost"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"port"}),(0,s.jsx)(r.td,{children:"port"}),(0,s.jsxs)(r.td,{children:["Input parameter. The Clickhouse server port. Required. Default: ",(0,s.jsx)(r.code,{children:"8123"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"database"}),(0,s.jsx)(r.td,{children:"database"}),(0,s.jsx)(r.td,{children:"Input parameter. The Clickhouse database name. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"table"}),(0,s.jsx)(r.td,{children:"Table name"}),(0,s.jsx)(r.td,{children:"Input parameter. The Clickhouse table name. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"username"}),(0,s.jsx)(r.td,{children:"Username"}),(0,s.jsx)(r.td,{children:"Input parameter. Clickhouse username for authentication. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"password"}),(0,s.jsx)(r.td,{children:"Password"}),(0,s.jsx)(r.td,{children:"Input parameter. Clickhouse password for authentication. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_type"}),(0,s.jsx)(r.td,{children:"index_type"}),(0,s.jsxs)(r.td,{children:["Input parameter. Type of the index, either ",(0,s.jsx)(r.code,{children:"annoy"})," (default) or ",(0,s.jsx)(r.code,{children:"vector_similarity"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metric"}),(0,s.jsx)(r.td,{children:"metric"}),(0,s.jsxs)(r.td,{children:["Input parameter. Metric to compute distance for similarity search. The options are ",(0,s.jsx)(r.code,{children:"angular"})," (default), ",(0,s.jsx)(r.code,{children:"euclidean"}),", ",(0,s.jsx)(r.code,{children:"manhattan"}),", ",(0,s.jsx)(r.code,{children:"hamming"}),", ",(0,s.jsx)(r.code,{children:"dot"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"secure"}),(0,s.jsx)(r.td,{children:"Use HTTPS/TLS"}),(0,s.jsx)(r.td,{children:"Input parameter. If true, enables HTTPS/TLS for the Clickhouse server and overrides inferred values for interface or port arguments. Default: false."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_param"}),(0,s.jsx)(r.td,{children:"Param of the index"}),(0,s.jsxs)(r.td,{children:["Input parameter. Index parameters. Default: ",(0,s.jsx)(r.code,{children:"100,'L2Distance'"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_query_params"}),(0,s.jsx)(r.td,{children:"index query params"}),(0,s.jsx)(r.td,{children:"Input parameter. Additional index query parameters."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"Search Query"}),(0,s.jsx)(r.td,{children:"Input parameter. The query string for similarity search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Ingest Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The records to load into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"cache_vector_store"}),(0,s.jsx)(r.td,{children:"Cache Vector Store"}),(0,s.jsx)(r.td,{children:"Input parameter. If true, the component caches the vector store in memory for faster reads. Default: Enabled (true)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embedding"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding model to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Number of Results"}),(0,s.jsxs)(r.td,{children:["Input parameter. The number of search results to return. Default: ",(0,s.jsx)(r.code,{children:"4"}),". Only relevant for reads."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"score_threshold"}),(0,s.jsx)(r.td,{children:"Score threshold"}),(0,s.jsx)(r.td,{children:"Input parameter. The threshold for similarity score comparison. Default: Unset (no threshold). Only relevant for reads."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"couchbase",children:"Couchbase"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Couchbase"})," component reads and writes to a Couchbase vector store using an instance of ",(0,s.jsx)(r.code,{children:"CouchbaseSearchVectorStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://docs.couchbase.com/home/index.html",children:"Couchbase documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Couchbase parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"couchbase_connection_string"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. Couchbase Cluster connection string. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"couchbase_username"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Couchbase username for authentication. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"couchbase_password"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. Couchbase password for authentication. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bucket_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Name of the Couchbase bucket. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"scope_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Name of the Couchbase scope. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Name of the Couchbase collection. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Name of the Couchbase index. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The records to load into the vector store. Only relevant for writes."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query string for vector search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"cache_vector_store"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. If true, the component caches the vector store in memory for faster reads. Default: Enabled (true)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use for the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Maximum number of search results to return. Default: 4. Only relevant for reads."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"datastax",children:"DataStax"}),"\n",(0,s.jsx)(r.p,{children:"The following components support DataStax vector stores."}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/index.html",children:"Astra DB Serverless documentation"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/hyper-converged-database/1.2/get-started/get-started-hcd.html",children:"Hyper-Converged Database (HCD) documentation"})}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"astra-db",children:"Astra DB"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component read and writes to Astra DB Serverless databases, using an instance of ",(0,s.jsx)(r.code,{children:"AstraDBVectorStore"})," to call the Data API and DevOps API."]}),"\n",(0,s.jsxs)(r.admonition,{type:"important",children:[(0,s.jsxs)(r.p,{children:["It is recommend that you create any databases, keyspaces, and collections you need before configuring the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component."]}),(0,s.jsxs)(r.p,{children:["You can create new databases and collections through this component, but this is only possible in the Langflow visual editor, not at runtime, and you must wait while the database or collection initializes before proceeding with flow configuration.\nAdditionally, not all database and collection configuration options are available through the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component, such as hybrid search options, PCU groups, vectorize integration management, and multi-region deployments."]})]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Astra DB parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Display Name"}),(0,s.jsx)(r.th,{children:"Info"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"token"}),(0,s.jsx)(r.td,{children:"Astra DB Application Token"}),(0,s.jsx)(r.td,{children:"Input parameter. An Astra application token with permission to access your vector database. Once the connection is verified, additional fields are populated with your existing databases and collections. If you want to create a database through this component, the application token must have Organization Administrator permissions."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"environment"}),(0,s.jsx)(r.td,{children:"Environment"}),(0,s.jsxs)(r.td,{children:["Input parameter. The environment for the Astra DB API endpoint. Always use ",(0,s.jsx)(r.code,{children:"prod"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"database_name"}),(0,s.jsx)(r.td,{children:"Database"}),(0,s.jsxs)(r.td,{children:["Input parameter. The name of the database that you want this component to connect to. Or, you can select ",(0,s.jsx)(r.strong,{children:"New Database"})," to create a new database, and then wait for the database to initialize."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"keyspace"}),(0,s.jsx)(r.td,{children:"Keyspace"}),(0,s.jsxs)(r.td,{children:["Input parameter. The keyspace in your database that contains the collection specified in ",(0,s.jsx)(r.code,{children:"collection_name"}),". Default: ",(0,s.jsx)(r.code,{children:"default_keyspace"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"Collection"}),(0,s.jsxs)(r.td,{children:["Input parameter. The name of the collection that you want to use with this flow. Or, select ",(0,s.jsx)(r.strong,{children:"New Collection"})," to create a new collection with limited configuration options. To ensure your collection is configured with the correct embedding provider and search capabilities, it is recommended to create the collection in the Astra Portal or with the Data API ",(0,s.jsx)(r.em,{children:"before"})," configuring this component. For more information, see ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/manage-collections.html",children:"Manage collections in Astra DB Serverless"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding_model"}),(0,s.jsx)(r.td,{children:"Embedding Model"}),(0,s.jsxs)(r.td,{children:["Input parameter. Attach an ",(0,s.jsxs)(r.a,{href:"/components-embedding-models",children:[(0,s.jsx)(r.strong,{children:"Embedding Model"})," component"]})," to generate embeddings. Only available if the specified collection doesn't have a ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html",children:"vectorize integration"}),". If a vectorize integration exists, the component automatically uses the collection's integrated model."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Ingest Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The documents to load into the specified collection."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"Search Query"}),(0,s.jsx)(r.td,{children:"Input parameter. The query string for vector search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"cache_vector_store"}),(0,s.jsx)(r.td,{children:"Cache Vector Store"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to cache the vector store in Langflow memory for faster reads. Default: Enabled (true)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_method"}),(0,s.jsx)(r.td,{children:"Search Method"}),(0,s.jsxs)(r.td,{children:["Input parameter. The search methods to use, either ",(0,s.jsx)(r.code,{children:"Hybrid Search"})," or ",(0,s.jsx)(r.code,{children:"Vector Search"}),". Your collection must be configured to support the chosen option, and the default depends on what your collection supports. All collections in Astra DB Serverless (Vector) databases support vector search, but hybrid search requires that you set specific collection settings when creating the collection. These options are only available when creating a collection programmatically. For more information, see ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/about-search.html",children:"Ways to find data in Astra DB Serverless"})," and ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/api-reference/collection-methods/create-collection.html#example-hybrid",children:"Create a collection that supports hybrid search"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"reranker"}),(0,s.jsx)(r.td,{children:"Reranker"}),(0,s.jsxs)(r.td,{children:["Input parameter. The re-ranker model to use for hybrid search, depending on the collection configuration. ",(0,s.jsx)(r.strong,{children:"This parameter shows the default reranker even if the selected collection doesn't support hybrid search."})," To verify if a collection supports hybrid search, ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/api-reference/collection-methods/list-collection-metadata.html",children:"get collection metadata"}),", and then check that ",(0,s.jsx)(r.code,{children:"lexical"})," and ",(0,s.jsx)(r.code,{children:"rerank"})," both have ",(0,s.jsx)(r.code,{children:'"enabled": true'}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"lexical_terms"}),(0,s.jsx)(r.td,{children:"Lexical Terms"}),(0,s.jsxs)(r.td,{children:["Input parameter. A space-separated string of keywords for hybrid search, like ",(0,s.jsx)(r.code,{children:"features, data, attributes, characteristics"}),". This parameter is only available if the collection supports hybrid search. For more information, see the following ",(0,s.jsx)(r.strong,{children:"Hybrid search example"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Number of Search Results"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of search results to return. Default: 4."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"Search Type"}),(0,s.jsxs)(r.td,{children:["Input parameter. The search type to use, either ",(0,s.jsx)(r.code,{children:"Similarity"})," (default), ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"}),", and ",(0,s.jsx)(r.code,{children:"MMR (Max Marginal Relevance)"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Search Score Threshold"}),(0,s.jsxs)(r.td,{children:["Input parameter. The minimum similarity score threshold for vector search results with the ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"})," search type. Default: 0."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"advanced_search_filter"}),(0,s.jsx)(r.td,{children:"Search Metadata Filter"}),(0,s.jsx)(r.td,{children:"Input parameter. An optional dictionary of metadata filters to apply in addition to vector or hybrid search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"autodetect_collection"}),(0,s.jsx)(r.td,{children:"Autodetect Collection"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to automatically fetch a list of available collections after providing an application token and API endpoint."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"content_field"}),(0,s.jsx)(r.td,{children:"Content Field"}),(0,s.jsx)(r.td,{children:"Input parameter. For writes, this parameter specifies the name of the field in the documents that contains text strings for which you want to generate embeddings."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"deletion_field"}),(0,s.jsx)(r.td,{children:"Deletion Based On Field"}),(0,s.jsx)(r.td,{children:"Input parameter. When provided, documents in the target collection with metadata field values matching the input metadata field value are deleted before new records are loaded. Use this setting for writes with upserts (overwrites)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ignore_invalid_documents"}),(0,s.jsx)(r.td,{children:"Ignore Invalid Documents"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to ignore invalid documents during writes. If disabled (false), then an error is raised for invalid documents. Default: Enabled (true)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"astradb_vectorstore_kwargs"}),(0,s.jsx)(r.td,{children:"AstraDBVectorStore Parameters"}),(0,s.jsxs)(r.td,{children:["Input parameter. An optional dictionary of additional parameters for the ",(0,s.jsx)(r.code,{children:"AstraDBVectorStore"})," instance. For more information, see ",(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"}),"."]})]})]})]})]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Hybrid search example"}),(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component supports the Data API's ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/hybrid-search.html",children:"hybrid search"})," feature.\nHybrid search performs a vector similarity search and a lexical search, compares the results of both searches, and then returns the most relevant results overall."]}),(0,s.jsxs)(r.p,{children:["To use hybrid search through the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component, do the following:"]}),(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Use the Data API to ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/api-reference/collection-methods/create-collection.html#example-hybrid",children:"create a collection that supports hybrid search"})," if you haven't already created one."]}),"\n",(0,s.jsxs)(r.p,{children:["Although you can create a collection through the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component, you have more control and insight into the collection settings when using the Data API for this operation."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Create a flow based on the ",(0,s.jsx)(r.strong,{children:"Hybrid Search RAG"})," template, which includes an ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component that is pre-configured for hybrid search."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the ",(0,s.jsx)(r.strong,{children:"Language Model"})," components, add your OpenAI API key."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Delete the ",(0,s.jsx)(r.strong,{children:"Language Model"})," component that is connected to the ",(0,s.jsx)(r.strong,{children:"Structured Output"})," component's ",(0,s.jsx)(r.strong,{children:"Input Message"})," port, and then connect the ",(0,s.jsx)(r.strong,{children:"Chat Input"})," component to that port."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Configure the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," vector store component:"]}),"\n",(0,s.jsxs)(r.ol,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsx)(r.p,{children:"Enter your Astra DB application token."}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the ",(0,s.jsx)(r.strong,{children:"Database"})," field, select your database."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the ",(0,s.jsx)(r.strong,{children:"Collection"})," field, select your collection with hybrid search enabled."]}),"\n",(0,s.jsx)(r.p,{children:"Once you select a collection that supports hybrid search, the other parameters automatically update to allow hybrid search options."}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["In the ",(0,s.jsx)(r.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,s.jsx)(a.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Controls"}),", find the ",(0,s.jsx)(r.strong,{children:"Lexical Terms"})," field, enable the ",(0,s.jsx)(r.strong,{children:"Show"})," toggle, and then click ",(0,s.jsx)(r.strong,{children:"Close"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Connect the first ",(0,s.jsx)(r.strong,{children:"Parser"})," component's ",(0,s.jsx)(r.strong,{children:"Parsed Text"})," output to the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component's ",(0,s.jsx)(r.strong,{children:"Lexical Terms"})," input.\nThis input only appears after connecting a collection that support hybrid search with reranking."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Click the ",(0,s.jsx)(r.strong,{children:"Structured Output"})," component to expose the ",(0,s.jsx)(r.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),", click ",(0,s.jsx)(a.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Controls"}),", find the ",(0,s.jsx)(r.strong,{children:"Format Instructions"})," row, click ",(0,s.jsx)(a.A,{name:"Expand","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Expand"}),", and then replace the prompt with the following text:"]}),"\n",(0,s.jsx)(j.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"You are a database query planner that takes a user's requests, and then converts to a search against the subject matter in question.",props:{}}]},{tokens:[{content:"You should convert the query into:",props:{}}]},{tokens:[{content:"1. A list of keywords to use against a Lucene text analyzer index, no more than 4. Strictly unigrams.",props:{}}]},{tokens:[{content:"2. A question to use as the basis for a QA embedding engine.",props:{}}]},{tokens:[{content:"Avoid common keywords associated with the user's subject matter.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Click ",(0,s.jsx)(r.strong,{children:"Finish Editing"}),", and then click ",(0,s.jsx)(r.strong,{children:"Close"})," to save your changes to the component."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Open the ",(0,s.jsx)(r.strong,{children:"Playground"}),", and then enter a natural language question that you would ask about your database."]}),"\n",(0,s.jsxs)(r.p,{children:["In this example, your input is sent to both the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," and ",(0,s.jsx)(r.strong,{children:"Structured Output"})," components:"]}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["The input sent directly to the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component's ",(0,s.jsx)(r.strong,{children:"Search Query"})," port is used as a string for similarity search.\nAn embedding is generated from the query string using the collection's Astra DB vectorize integration."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["The input sent to the ",(0,s.jsx)(r.strong,{children:"Structured Output"})," component is processed by the ",(0,s.jsx)(r.strong,{children:"Structured Output"}),", ",(0,s.jsx)(r.strong,{children:"Language Model"}),", and ",(0,s.jsx)(r.strong,{children:"Parser"})," components to extract space-separated ",(0,s.jsx)(r.code,{children:"keywords"})," used for the lexical search portion of the hybrid search."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(r.p,{children:["The complete hybrid search query is executed against your database using the Data API's ",(0,s.jsx)(r.code,{children:"find_and_rerank"})," command.\nThe API's response is output as a ",(0,s.jsx)(r.code,{children:"DataFrame"})," that is transformed into a text string ",(0,s.jsx)(r.code,{children:"Message"})," by another ",(0,s.jsx)(r.strong,{children:"Parser"})," component.\nFinally, the ",(0,s.jsx)(r.strong,{children:"Chat Output"})," component prints the ",(0,s.jsx)(r.code,{children:"Message"})," response to the ",(0,s.jsx)(r.strong,{children:"Playground"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:["Optional: Exit the ",(0,s.jsx)(r.strong,{children:"Playground"}),", and then click ",(0,s.jsx)(a.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,s.jsx)(r.strong,{children:"Inspect Output"})," on each individual component to understand how lexical keywords were constructed and view the raw response from the Data API.\nThis is helpful for debugging flows where a certain component isn't receiving input as expected from another component."]}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Structured Output component"}),": The output is the ",(0,s.jsx)(r.code,{children:"Data"})," object produced by applying the output schema to the LLM's response to the input message and format instructions.\nThe following example is based on the aforementioned instructions for keyword extraction:"]}),"\n",(0,s.jsx)(j.Code,{codeConfig:p,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"1. Keywords: features, data, attributes, characteristics",props:{}}]},{tokens:[{content:"2. Question: What characteristics can be identified in my data?",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Parser component"}),": The output is the string of keywords extracted from the structured output ",(0,s.jsx)(r.code,{children:"Data"}),", and then used as lexical terms for the hybrid search."]}),"\n"]}),"\n",(0,s.jsxs)(r.li,{children:["\n",(0,s.jsxs)(r.p,{children:[(0,s.jsx)(r.strong,{children:"Astra DB component"}),": The output is the ",(0,s.jsx)(r.code,{children:"DataFrame"})," containing the results of the hybrid search as returned by the Data API."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]})]}),"\n",(0,s.jsx)(r.h3,{id:"astra-db-graph",children:"Astra DB Graph"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Astra DB Graph"})," component uses a ",(0,s.jsx)(r.code,{children:"AstraDBGraphVectorStore"})," instance for graph traversal and graph-based document retrieval in an Astra DB collection. It also supports writing to the vector store.\nFor more information, see ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/tutorials/graph-rag.html",children:"Build a Graph RAG system with LangChain and GraphRetriever"}),"."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Astra DB Graph parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Display Name"}),(0,s.jsx)(r.th,{children:"Info"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"token"}),(0,s.jsx)(r.td,{children:"Astra DB Application Token"}),(0,s.jsx)(r.td,{children:"Input parameter. An Astra application token with permission to access your vector database. Once the connection is verified, additional fields are populated with your existing databases and collections. If you want to create a database through this component, the application token must have Organization Administrator permissions."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"api_endpoint"}),(0,s.jsx)(r.td,{children:"API Endpoint"}),(0,s.jsx)(r.td,{children:"Input parameter. Your database's API endpoint."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"keyspace"}),(0,s.jsx)(r.td,{children:"Keyspace"}),(0,s.jsxs)(r.td,{children:["Input parameter. The keyspace in your database that contains the collection specified in ",(0,s.jsx)(r.code,{children:"collection_name"}),". Default: ",(0,s.jsx)(r.code,{children:"default_keyspace"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"Collection"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the collection that you want to use with this flow. For write operations, if a matching collection doesn't exist, a new one is created."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_incoming_links_key"}),(0,s.jsx)(r.td,{children:"Metadata Incoming Links Key"}),(0,s.jsx)(r.td,{children:"Input parameter. The metadata key for the incoming links in the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Ingest Data"}),(0,s.jsx)(r.td,{children:"Input parameter. Records to load into the vector store. Only relevant for writes."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_input"}),(0,s.jsx)(r.td,{children:"Search Query"}),(0,s.jsx)(r.td,{children:"Input parameter. Query string for similarity search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"cache_vector_store"}),(0,s.jsx)(r.td,{children:"Cache Vector Store"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to cache the vector store in Langflow memory for faster reads. Default: Enabled (true)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding_model"}),(0,s.jsx)(r.td,{children:"Embedding Model"}),(0,s.jsxs)(r.td,{children:["Input parameter. Attach an ",(0,s.jsxs)(r.a,{href:"/components-embedding-models",children:[(0,s.jsx)(r.strong,{children:"Embedding Model"})," component"]})," to generate embeddings. If the collection has a ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html",children:"vectorize integration"}),", don't attach an ",(0,s.jsx)(r.strong,{children:"Embedding Model"})," component."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metric"}),(0,s.jsx)(r.td,{children:"Metric"}),(0,s.jsxs)(r.td,{children:["Input parameter. The metrics to use for similarity search calculations, either ",(0,s.jsx)(r.code,{children:"cosine"})," (default), ",(0,s.jsx)(r.code,{children:"dot_product"}),", or ",(0,s.jsx)(r.code,{children:"euclidean"}),". This is a collection setting."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"batch_size"}),(0,s.jsx)(r.td,{children:"Batch Size"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional number of records to process in a single batch."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bulk_insert_batch_concurrency"}),(0,s.jsx)(r.td,{children:"Bulk Insert Batch Concurrency"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional concurrency level for bulk write operations."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bulk_insert_overwrite_concurrency"}),(0,s.jsx)(r.td,{children:"Bulk Insert Overwrite Concurrency"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional concurrency level for bulk write operations that allow upserts (overwriting existing records)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bulk_delete_concurrency"}),(0,s.jsx)(r.td,{children:"Bulk Delete Concurrency"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional concurrency level for bulk delete operations."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"setup_mode"}),(0,s.jsx)(r.td,{children:"Setup Mode"}),(0,s.jsxs)(r.td,{children:["Input parameter. Configuration mode for setting up the vector store, either ",(0,s.jsx)(r.code,{children:"Sync"})," (default) or ",(0,s.jsx)(r.code,{children:"Off"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"pre_delete_collection"}),(0,s.jsx)(r.td,{children:"Pre Delete Collection"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to delete the collection before creating a new one. Default: Disabled (false)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_indexing_include"}),(0,s.jsx)(r.td,{children:"Metadata Indexing Include"}),(0,s.jsxs)(r.td,{children:["Input parameter. An list of metadata fields to index if you want to enable ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/api-reference/collection-indexes.html",children:"selective indexing"})," ",(0,s.jsx)(r.em,{children:"only"})," when creating a collection. Doesn't apply to existing collections. Only one ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameter can be set per collection. If all ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameters are unset, then all fields are indexed (default indexing)."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_indexing_exclude"}),(0,s.jsx)(r.td,{children:"Metadata Indexing Exclude"}),(0,s.jsxs)(r.td,{children:["Input parameter. An list of metadata fields to exclude from indexing if you want to enable selective indexing ",(0,s.jsx)(r.em,{children:"only"})," when creating a collection. Doesn't apply to existing collections. Only one ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameter can be set per collection. If all ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameters are unset, then all fields are indexed (default indexing)."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_indexing_policy"}),(0,s.jsx)(r.td,{children:"Collection Indexing Policy"}),(0,s.jsxs)(r.td,{children:["Input parameter. A dictionary to define the indexing policy if you want to enable selective indexing ",(0,s.jsx)(r.em,{children:"only"})," when creating a collection. Doesn't apply to existing collections. Only one ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameter can be set per collection. If all ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameters are unset, then all fields are indexed (default indexing). The ",(0,s.jsx)(r.code,{children:"collection_indexing_policy"})," dictionary is used when you need to set indexing on subfields or a complex indexing definition that isn't compatible as a list."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Number of Results"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of search results to return. Default: 4. Only relevant to reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"Search Type"}),(0,s.jsxs)(r.td,{children:["Input parameter. Search type to use, either ",(0,s.jsx)(r.code,{children:"Similarity"}),", ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"}),", or ",(0,s.jsx)(r.code,{children:"MMR (Max Marginal Relevance)"}),", ",(0,s.jsx)(r.code,{children:"Graph Traversal"}),", or ",(0,s.jsx)(r.code,{children:"MMR (Max Marginal Relevance) Graph Traversal"})," (default). Only relevant to reads."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Search Score Threshold"}),(0,s.jsxs)(r.td,{children:["Input parameter. Minimum similarity score threshold for search results if the ",(0,s.jsx)(r.code,{children:"search_type"})," is ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"}),". Default: 0."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_filter"}),(0,s.jsx)(r.td,{children:"Search Metadata Filter"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional dictionary of metadata filters to apply in addition to vector search."})]})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"graph-rag",children:"Graph RAG"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Graph RAG"})," component uses an instance of ",(0,s.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/reference/langchain_graph_retriever/",children:(0,s.jsx)(r.code,{children:"GraphRetriever"})})," for Graph RAG traversal enabling graph-based document retrieval in an Astra DB vector store.\nFor more information, see the ",(0,s.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/",children:"DataStax Graph RAG documentation"}),"."]}),"\n",(0,s.jsx)(r.admonition,{type:"tip",children:(0,s.jsxs)(r.p,{children:["This component was meant as a Graph RAG extension for the ",(0,s.jsx)(r.strong,{children:"Astra DB"})," vector store component.\nHowever, the ",(0,s.jsx)(r.strong,{children:"Astra DB Graph"})," component includes both the vector store connection and Graph RAG functionality."]})}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Graph RAG parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Display Name"}),(0,s.jsx)(r.th,{children:"Info"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding_model"}),(0,s.jsx)(r.td,{children:"Embedding Model"}),(0,s.jsxs)(r.td,{children:["Input parameter. Specify the embedding model to use. Not required if the connected vector store has an ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html",children:"vectorize integration"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"vector_store"}),(0,s.jsx)(r.td,{children:"Vector Store Connection"}),(0,s.jsxs)(r.td,{children:["Input parameter. A ",(0,s.jsx)(r.a,{href:"#vector-store-instances",children:(0,s.jsx)(r.code,{children:"vector_store"})})," instance inherited from an ",(0,s.jsx)(r.strong,{children:"Astra DB"})," component's ",(0,s.jsx)(r.strong,{children:"Vector Store Connection"})," output."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"edge_definition"}),(0,s.jsx)(r.td,{children:"Edge Definition"}),(0,s.jsxs)(r.td,{children:["Input parameter. ",(0,s.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/reference/graph_retriever/edges/",children:"Edge definition"})," for the graph traversal."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"strategy"}),(0,s.jsx)(r.td,{children:"Traversal Strategies"}),(0,s.jsx)(r.td,{children:"Input parameter. The strategy to use for graph traversal. Strategy options are dynamically loaded from available strategies."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"Search Query"}),(0,s.jsx)(r.td,{children:"Input parameter. The query to search for in the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"graphrag_strategy_kwargs"}),(0,s.jsx)(r.td,{children:"Strategy Parameters"}),(0,s.jsxs)(r.td,{children:["Input parameter. Optional dictionary of additional parameters for the ",(0,s.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/reference/graph_retriever/strategies/",children:"retrieval strategy"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_results"}),(0,s.jsxs)(r.td,{children:[(0,s.jsx)(r.strong,{children:"Search Results"})," or ",(0,s.jsx)(r.strong,{children:"DataFrame"})]}),(0,s.jsxs)(r.td,{children:["Output parameter. The results of the graph-based document retrieval as a list of ",(0,s.jsx)(r.a,{href:"/data-types#data",children:(0,s.jsx)(r.code,{children:"Data"})})," objects or as a tabular ",(0,s.jsx)(r.a,{href:"/data-types#dataframe",children:(0,s.jsx)(r.code,{children:"DataFrame"})}),". You can set the desired output type near the component's output port."]})]})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"hyper-converged-database-hcd",children:"Hyper-Converged Database (HCD)"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Hyper-Converged Database (HCD)"})," component uses your cluster's the Data API server to read and write to an HCD vector store.\nBecause the underlying functions call the Data API, which originated from Astra DB, the component uses an instance of ",(0,s.jsx)(r.code,{children:"AstraDBVectorStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:(0,s.jsx)(r.img,{alt:"A flow using the HCD component to load vector data.",src:t(42638).A+"",width:"2294",height:"1684"})}),"\n",(0,s.jsxs)(r.p,{children:["For more information about using the Data API with an HCD deployment, see ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/hyper-converged-database/1.2/api-reference/dataapiclient.html",children:"Get started with the Data API in HCD 1.2"}),"."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"HCD parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Display Name"}),(0,s.jsx)(r.th,{children:"Info"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"Collection Name"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of a vector store collection in HCD. For write operations, if the collection doesn't exist, then a new one is created. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"username"}),(0,s.jsx)(r.td,{children:"HCD Username"}),(0,s.jsxs)(r.td,{children:["Input parameter. Username for authenticating to your HCD deployment. Default: ",(0,s.jsx)(r.code,{children:"hcd-superuser"}),". Required."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"password"}),(0,s.jsx)(r.td,{children:"HCD Password"}),(0,s.jsx)(r.td,{children:"Input parameter. Password for authenticating to your HCD deployment. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"api_endpoint"}),(0,s.jsx)(r.td,{children:"HCD API Endpoint"}),(0,s.jsxs)(r.td,{children:["Input parameter. Your deployment's HCD Data API endpoint, formatted as ",(0,s.jsx)(r.code,{children:"http[s]://**CLUSTER_HOST**:**GATEWAY_PORT"})," where ",(0,s.jsx)(r.code,{children:"CLUSTER_HOST"})," is the IP address of any node in your cluster and ",(0,s.jsx)(r.code,{children:"GATEWAY_PORT"})," is the port number ofr your API gateway service. For example, ",(0,s.jsx)(r.code,{children:"http://192.0.2.250:8181"}),". Required."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Ingest Data"}),(0,s.jsx)(r.td,{children:"Input parameter. Records to load into the vector store. Only relevant for writes."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_input"}),(0,s.jsx)(r.td,{children:"Search Input"}),(0,s.jsx)(r.td,{children:"Input parameter. Query string for similarity search. Only relevant for reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"namespace"}),(0,s.jsx)(r.td,{children:"Namespace"}),(0,s.jsxs)(r.td,{children:["Input parameter. The namespace in HCD that contains or will contain the collection specified in ",(0,s.jsx)(r.code,{children:"collection_name"}),". Default: ",(0,s.jsx)(r.code,{children:"default_namespace"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ca_certificate"}),(0,s.jsx)(r.td,{children:"CA Certificate"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional CA certificate for TLS connections to HCD."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metric"}),(0,s.jsx)(r.td,{children:"Metric"}),(0,s.jsxs)(r.td,{children:["Input parameter. The metrics to use for similarity search calculations, either ",(0,s.jsx)(r.code,{children:"cosine"}),", ",(0,s.jsx)(r.code,{children:"dot_product"}),", or ",(0,s.jsx)(r.code,{children:"euclidean"}),". This is a collection setting. If calling an existing collection, leave unset to use the collection's metric. If a write operation creates a new collection, specify the desired similarity metric setting."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"batch_size"}),(0,s.jsx)(r.td,{children:"Batch Size"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional number of records to process in a single batch."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bulk_insert_batch_concurrency"}),(0,s.jsx)(r.td,{children:"Bulk Insert Batch Concurrency"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional concurrency level for bulk write operations."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bulk_insert_overwrite_concurrency"}),(0,s.jsx)(r.td,{children:"Bulk Insert Overwrite Concurrency"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional concurrency level for bulk write operations that allow upserts (overwriting existing records)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"bulk_delete_concurrency"}),(0,s.jsx)(r.td,{children:"Bulk Delete Concurrency"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional concurrency level for bulk delete operations."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"setup_mode"}),(0,s.jsx)(r.td,{children:"Setup Mode"}),(0,s.jsxs)(r.td,{children:["Input parameter. Configuration mode for setting up the vector store, either ",(0,s.jsx)(r.code,{children:"Sync"})," (default), ",(0,s.jsx)(r.code,{children:"Async"}),", or ",(0,s.jsx)(r.code,{children:"Off"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"pre_delete_collection"}),(0,s.jsx)(r.td,{children:"Pre Delete Collection"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to delete the collection before creating a new one."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_indexing_include"}),(0,s.jsx)(r.td,{children:"Metadata Indexing Include"}),(0,s.jsxs)(r.td,{children:["Input parameter. An list of metadata fields to index if you want to enable ",(0,s.jsx)(r.a,{href:"https://docs.datastax.com/en/hyper-converged-database/1.2/api-reference/collection-indexes.html",children:"selective indexing"})," ",(0,s.jsx)(r.em,{children:"only"})," when creating a collection. Doesn't apply to existing collections. Only one ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameter can be set per collection. If all ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameters are unset, then all fields are indexed (default indexing)."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_indexing_exclude"}),(0,s.jsx)(r.td,{children:"Metadata Indexing Exclude"}),(0,s.jsxs)(r.td,{children:["Input parameter. An list of metadata fields to exclude from indexing if you want to enable selective indexing ",(0,s.jsx)(r.em,{children:"only"})," when creating a collection. Doesn't apply to existing collections. Only one ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameter can be set per collection. If all ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameters are unset, then all fields are indexed (default indexing)."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_indexing_policy"}),(0,s.jsx)(r.td,{children:"Collection Indexing Policy"}),(0,s.jsxs)(r.td,{children:["Input parameter. A dictionary to define the indexing policy if you want to enable selective indexing ",(0,s.jsx)(r.em,{children:"only"})," when creating a collection. Doesn't apply to existing collections. Only one ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameter can be set per collection. If all ",(0,s.jsx)(r.code,{children:"*_indexing_*"})," parameters are unset, then all fields are indexed (default indexing). The ",(0,s.jsx)(r.code,{children:"collection_indexing_policy"})," dictionary is used when you need to set indexing on subfields or a complex indexing definition that isn't compatible as a list."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embedding or Astra Vectorize"}),(0,s.jsxs)(r.td,{children:["Input parameter. The embedding model to use by attaching an ",(0,s.jsx)(r.strong,{children:"Embedding Model"})," component. This component doesn't support additional vectorize authentication headers, so it isn't possible to use a vectorize integration with this component, even if you have enabled one on an existing HCD collection."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Number of Results"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of search results to return. Default: 4. Only relevant to reads."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"Search Type"}),(0,s.jsxs)(r.td,{children:["Input parameter. Search type to use, either ",(0,s.jsx)(r.code,{children:"Similarity"})," (default), ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"}),", or ",(0,s.jsx)(r.code,{children:"MMR (Max Marginal Relevance)"}),". Only relevant to reads."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Search Score Threshold"}),(0,s.jsxs)(r.td,{children:["Input parameter. Minimum similarity score threshold for search results if the ",(0,s.jsx)(r.code,{children:"search_type"})," is ",(0,s.jsx)(r.code,{children:"Similarity with score threshold"}),". Default: 0."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_filter"}),(0,s.jsx)(r.td,{children:"Search Metadata Filter"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional dictionary of metadata filters to apply in addition to vector search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"elasticsearch",children:"Elasticsearch"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Elasticsearch"})," component reads and writes to an Elasticsearch instance using ",(0,s.jsx)(r.code,{children:"ElasticsearchStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html",children:"Elasticsearch documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Elasticsearch parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"es_url"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Elasticsearch server URL."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"es_user"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Username for Elasticsearch authentication."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"es_password"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. Password for Elasticsearch authentication."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Name of the Elasticsearch index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"strategy"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. Strategy for vector search, either ",(0,s.jsx)(r.code,{children:"approximate_k_nearest_neighbors"})," or ",(0,s.jsx)(r.code,{children:"script_scoring"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"distance_strategy"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. Strategy for distance calculation, either ",(0,s.jsx)(r.code,{children:"COSINE"}),", ",(0,s.jsx)(r.code,{children:"EUCLIDEAN_DISTANCE"}),", or ",(0,s.jsx)(r.code,{children:"DOT_PRODUCT"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Query string for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. Records to load into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding model to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of search results to return. Default: 4."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"faiss",children:"FAISS"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"FAISS"})," component providese access to the Facebook AI Similarity Search (FAISS) library through an instance of ",(0,s.jsx)(r.code,{children:"FAISS"})," vector store."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://faiss.ai/index.html",children:"FAISS documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"FAISS parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:'Input parameter. The name of the FAISS index. Default: "langflow_index".'})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"persist_directory"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Path to save the FAISS index. It is relative to where Langflow is running."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query to search for in the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The list of data to ingest into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"allow_dangerous_deserialization"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Set to True to allow loading pickle files from untrusted sources. Default: True."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use for the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of results to return from the search. Default: 4."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"milvus",children:"Milvus"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Milvus"})," component reads and writes to Milvus vector stores using an instance of ",(0,s.jsx)(r.code,{children:"Milvus"})," vector store."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://milvus.io/docs",children:"Milvus documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Milvus parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Name of the Milvus collection."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_description"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Description of the Milvus collection."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"uri"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Connection URI for Milvus."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"password"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. Password for Milvus."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"username"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. Username for Milvus."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"batch_size"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of data to process in a single batch."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. Data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. Embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of results to return in search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Type of search to perform."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Float"}),(0,s.jsx)(r.td,{children:"Input parameter. Minimum similarity score for search results."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_filter"}),(0,s.jsx)(r.td,{children:"Dict"}),(0,s.jsx)(r.td,{children:"Input parameter. Metadata filters for search query."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"setup_mode"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Configuration mode for setting up the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"vector_dimensions"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of dimensions of the vectors."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"pre_delete_collection"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Whether to delete the collection before creating a new one."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"mongodb-atlas",children:"MongoDB Atlas"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"MongoDB Atlas"})," component reads and writes to MongoDB Atlas vector stores using an instance of ",(0,s.jsx)(r.code,{children:"MongoDBAtlasVectorSearch"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://www.mongodb.com/docs/atlas/atlas-vector-search/tutorials/vector-search-quick-start/",children:"MongoDB Atlas documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"MongoDB Atlas parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"mongodb_atlas_cluster_uri"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The connection URI for your MongoDB Atlas cluster. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"enable_mtls"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Enable mutual TLS authentication. Default: false."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"mongodb_atlas_client_cert"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. Client certificate combined with private key for mTLS authentication. Required if mTLS is enabled."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"db_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the database to use. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the collection to use. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the Atlas Search index, it should be a Vector Search. Required."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"insert_mode"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:'Input parameter. How to insert new documents into the collection. The options are "append" or "overwrite". Default: "append".'})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding model to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Number of results to return in similarity search. Default: 4."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_field"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:'Input parameter. The field to index. Default: "embedding".'})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"filter_field"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The field to filter the index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_dimensions"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. Embedding context length. Default: 1536."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"similarity"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:'Input parameter. The method used to measure similarity between vectors. The options are "cosine", "euclidean", or "dotProduct". Default: "cosine".'})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"quantization"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:'Input parameter. Quantization reduces memory costs by converting 32-bit floats to smaller data types. The options are "scalar" or "binary".'})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"opensearch",children:"OpenSearch"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"OpenSearch"})," component reads and writes to OpenSearch instances using ",(0,s.jsx)(r.code,{children:"OpenSearchVectorSearch"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://opensearch.org/platform/search/vector-database.html",children:"OpenSearch documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"OpenSearch parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"opensearch_url"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsxs)(r.td,{children:["Input parameter. URL for OpenSearch cluster, such as ",(0,s.jsx)(r.code,{children:"https://192.168.1.1:9200"}),"."]})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The index name where the vectors are stored in OpenSearch cluster."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_input"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Enter a search query. Leave empty to retrieve all documents or if hybrid search is being used."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_type"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:'Input parameter. The options are "similarity", "similarity_score_threshold", "mmr".'})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_score_threshold"}),(0,s.jsx)(r.td,{children:"Float"}),(0,s.jsx)(r.td,{children:"Input parameter. The minimum similarity score threshold for search results."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"username"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The username for the opensource cluster."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"password"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The password for the opensource cluster."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"use_ssl"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Use SSL."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"verify_certs"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Verify certificates."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"hybrid_search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Provide a custom hybrid search query in JSON format. This allows you to combine vector similarity and keyword matching."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"pgvector",children:"PGVector"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"PGVector"})," component reads and writes to PostgreSQL vector stores using an instance of ",(0,s.jsx)(r.code,{children:"PGVector"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://github.com/pgvector/pgvector",children:"PGVector documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"PGVector parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"pg_server_url"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The PostgreSQL server connection string."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The table name for the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"pinecone",children:"Pinecone"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Pinecone"})," component reads and writes to Pinecone vector stores using an instance of ",(0,s.jsx)(r.code,{children:"PineconeVectorStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://docs.pinecone.io/home",children:"Pinecone documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Pinecone parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the Pinecone index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"namespace"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The namespace for the index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"distance_strategy"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The strategy for calculating distance between vectors."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"pinecone_api_key"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The API key for Pinecone."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"text_key"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The key in the record to use as text."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"qdrant",children:"Qdrant"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Qdrant"})," component reads and writes to Qdrant vector stores using an instance of ",(0,s.jsx)(r.code,{children:"QdrantVectorStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://qdrant.tech/documentation/",children:"Qdrant documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Qdrant parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"collection_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the Qdrant collection."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"host"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The Qdrant server host."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"port"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The Qdrant server port."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"grpc_port"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The Qdrant gRPC port."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"api_key"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The API key for Qdrant."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"prefix"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The prefix for Qdrant."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"timeout"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The timeout for Qdrant operations."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"path"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The path for Qdrant."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"url"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The URL for Qdrant."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"distance_func"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The distance function for vector similarity."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"content_payload_key"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The content payload key."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_payload_key"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The metadata payload key."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"redis",children:"Redis"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Redis"})," component reads and writes to Redis vector stores using an instance of ",(0,s.jsx)(r.code,{children:"Redis"})," vector store."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/",children:"Redis documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Redis parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"redis_server_url"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The Redis server connection string."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"redis_index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the Redis index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"code"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The custom code for Redis (advanced)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"schema"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The schema for Redis index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"supabase",children:"Supabase"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Supabase"})," component reads and writes to Supabase vector stores using an instance of ",(0,s.jsx)(r.code,{children:"SupabaseVectorStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://supabase.com/docs/guides/ai",children:"Supabase documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Supabase parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"supabase_url"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The URL of the Supabase instance."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"supabase_service_key"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The service key for Supabase authentication."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"table_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the table in Supabase."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"query_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The name of the query to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"upstash",children:"Upstash"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Upstash"})," component reads and writes to Upstash vector stores using an instance of ",(0,s.jsx)(r.code,{children:"UpstashVectorStore"}),"."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://upstash.com/docs/introduction",children:"Upstash documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Upstash parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_url"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The URL of the Upstash index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_token"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The token for the Upstash index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"text_key"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The key in the record to use as text."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"namespace"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The namespace for the index."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"metadata_filter"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. Filter documents by metadata."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"Data"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]})]})]})]}),"\n",(0,s.jsx)(r.h2,{id:"vectara-platform",children:"Vectara Platform"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Vectara"})," and ",(0,s.jsx)(r.strong,{children:"Vectara RAG"})," components support Vectara vector store, search, and RAG functionality using instances of ",(0,s.jsx)(r.code,{children:"Vectara"})," vector store."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://docs.vectara.com/docs/",children:"Vectara documentation"})}),"\n"]}),"\n",(0,s.jsx)(r.h3,{id:"vectara",children:"Vectara"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Vectara"})," component reads and writes to Vectara vector stores, and then produces ",(0,s.jsx)(r.a,{href:"#search-results-output",children:"search results output"}),"."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Vectara parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"vectara_customer_id"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The Vectara customer ID."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"vectara_corpus_id"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The Vectara corpus ID."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"vectara_api_key"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The Vectara API key."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding function to use (optional)."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"ingest_data"}),(0,s.jsx)(r.td,{children:"List[Document/Data]"}),(0,s.jsx)(r.td,{children:"Input parameter. The data to be ingested into the vector store."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_query"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The query for similarity search."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"number_of_results"}),(0,s.jsx)(r.td,{children:"Integer"}),(0,s.jsx)(r.td,{children:"Input parameter. The number of results to return in search."})]})]})]})]}),"\n",(0,s.jsx)(r.h3,{id:"vectara-rag",children:"Vectara RAG"}),"\n",(0,s.jsx)(r.p,{children:"This component enables Vectara's full end-to-end RAG capabilities with reranking options."}),"\n",(0,s.jsxs)(r.p,{children:["This component uses a ",(0,s.jsx)(r.code,{children:"Vectara"})," vector store to execute the vector search and reranking functions, and then outputs an ",(0,s.jsx)(r.strong,{children:"Answer"})," string in ",(0,s.jsx)(r.a,{href:"/data-types#message",children:(0,s.jsx)(r.code,{children:"Message"})})," format."]}),"\n",(0,s.jsx)(r.h2,{id:"weaviate",children:"Weaviate"}),"\n",(0,s.jsxs)(r.p,{children:["The ",(0,s.jsx)(r.strong,{children:"Weaviate"})," component reads and writes to Weaviate vector stores using an instance of ",(0,s.jsx)(r.code,{children:"Weaviate"})," vector store."]}),"\n",(0,s.jsx)(r.p,{children:"For more information, see the following:"}),"\n",(0,s.jsxs)(r.ul,{children:["\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#hidden-parameters",children:"Hidden parameters"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#search-results-output",children:"Search results output"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"#vector-store-instances",children:"Vector store instances"})}),"\n",(0,s.jsx)(r.li,{children:(0,s.jsx)(r.a,{href:"https://weaviate.io/developers/weaviate",children:"Weaviate Documentation"})}),"\n"]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Weaviate parameters"}),(0,s.jsxs)(r.table,{children:[(0,s.jsx)(r.thead,{children:(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.th,{children:"Name"}),(0,s.jsx)(r.th,{children:"Type"}),(0,s.jsx)(r.th,{children:"Description"})]})}),(0,s.jsxs)(r.tbody,{children:[(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"weaviate_url"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The default instance URL."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"search_by_text"}),(0,s.jsx)(r.td,{children:"Boolean"}),(0,s.jsx)(r.td,{children:"Input parameter. Indicates whether to search by text."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"api_key"}),(0,s.jsx)(r.td,{children:"SecretString"}),(0,s.jsx)(r.td,{children:"Input parameter. The optional API key for authentication."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"index_name"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The optional index name."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"text_key"}),(0,s.jsx)(r.td,{children:"String"}),(0,s.jsx)(r.td,{children:"Input parameter. The default text extraction key."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"input"}),(0,s.jsx)(r.td,{children:"Document"}),(0,s.jsx)(r.td,{children:"Input parameter. The document or record."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"embedding"}),(0,s.jsx)(r.td,{children:"Embeddings"}),(0,s.jsx)(r.td,{children:"Input parameter. The embedding model used."})]}),(0,s.jsxs)(r.tr,{children:[(0,s.jsx)(r.td,{children:"attributes"}),(0,s.jsx)(r.td,{children:"List[String]"}),(0,s.jsx)(r.td,{children:"Input parameter. Optional additional attributes."})]})]})]})]})]})}function g(e={}){const{wrapper:r}={...(0,i.R)(),...e.components};return r?(0,s.jsx)(r,{...e,children:(0,s.jsx)(m,{...e})}):m(e)}function f(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},17886:(e,r,t)=>{t.d(r,{A:()=>i});t(96540);var n=t(64058),s=t(74848);function i({name:e,...r}){const t=n[e];return t?(0,s.jsx)(t,{...r}):null}},19365:(e,r,t)=>{t.d(r,{A:()=>d});t(96540);var n=t(18215);const s={tabItem:"tabItem_Ymn6"};var i=t(74848);function d({children:e,hidden:r,className:t}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,t),hidden:r,children:e})}},42638:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/component-hcd-example-flow-b82057600ce5e9e4a0f7ea0a61dcbf7f.png"},60159:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/component-local-db-5ba34611640c3e325d9dd3cdcb591d1f.png"},67719:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/vector-store-retrieval-af7257d77ff0259ab1a0980641d464ce.png"},88690:(e,r,t)=>{t.d(r,{A:()=>n});const n=t.p+"assets/images/component-chroma-db-b69a08e861be3451fe6f2992e203f516.png"}}]); \ No newline at end of file diff --git a/assets/js/8bd4a540.41d943d9.js b/assets/js/8bd4a540.41d943d9.js deleted file mode 100644 index fe56e6eec8..0000000000 --- a/assets/js/8bd4a540.41d943d9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[2307],{7685:(e,r,t)=>{t.d(r,{A:()=>s});const s=t.p+"assets/images/vector-store-document-ingestion-6157311fb4d16e7f944d55254f0cc0e2.png"},17343:(e,r,t)=>{t.r(r),t.d(r,{CH:()=>o,assets:()=>a,chCodeConfig:()=>x,contentTitle:()=>l,default:()=>u,frontMatter:()=>h,metadata:()=>s,toc:()=>j});const s=JSON.parse('{"id":"Components/components-vector-stores","title":"Vector Stores","description":"Langflow\'s Vector Store components connect to your vector databases or create in-memory vector stores for storing and retrieving vector data in flows.","source":"@site/docs/Components/components-vector-stores.mdx","sourceDirName":"Components","slug":"/components-vector-stores","permalink":"/components-vector-stores","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Vector Stores","slug":"/components-vector-stores"},"sidebar":"docs","previous":{"title":"Data","permalink":"/components-data"},"next":{"title":"Processing components","permalink":"/components-processing"}}');var n=t(74848),d=t(28453),i=t(24754),c=t(17886);const h={title:"Vector Stores",slug:"/components-vector-stores"},l=void 0,a={},o={annotations:i.hk,Code:i.Cy},x={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},j=[{value:"Use a Vector Store component in a flow",id:"use-a-vector-store-component-in-a-flow",level:2},{value:"Configure vector store parameters",id:"configure-vector-store-parameters",level:3},{value:"Astra DB",id:"astra-db",level:2},{value:"Generate embeddings",id:"generate-embeddings",level:3},{value:"Hybrid search",id:"hybrid-search",level:3},{value:"Astra DB Graph",id:"astra-db-graph",level:2},{value:"Cassandra",id:"cassandra",level:2},{value:"Cassandra Graph",id:"cassandra-graph",level:2},{value:"Chroma DB",id:"chroma-db",level:2},{value:"Clickhouse",id:"clickhouse",level:2},{value:"Couchbase",id:"couchbase",level:2},{value:"Elasticsearch",id:"elasticsearch",level:2},{value:"FAISS",id:"faiss",level:2},{value:"Graph RAG",id:"graph-rag",level:2},{value:"Hyper-Converged Database (HCD)",id:"hyper-converged-database-hcd",level:2},{value:"Local DB",id:"local-db",level:2},{value:"Milvus",id:"milvus",level:2},{value:"MongoDB Atlas",id:"mongodb-atlas",level:2},{value:"OpenSearch",id:"opensearch",level:2},{value:"PGVector",id:"pgvector",level:2},{value:"Pinecone",id:"pinecone",level:2},{value:"Qdrant",id:"qdrant",level:2},{value:"Redis",id:"redis",level:2},{value:"Supabase",id:"supabase",level:2},{value:"Upstash",id:"upstash",level:2},{value:"Vectara",id:"vectara",level:2},{value:"Vectara RAG",id:"vectara-rag",level:2},{value:"Weaviate",id:"weaviate",level:2}];function m(e){const r={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,d.R)(),...e.components},{Details:s}=r;return o||p("CH",!1),o.Code||p("CH.Code",!0),s||p("Details",!0),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,n.jsxs)(r.p,{children:["Langflow's ",(0,n.jsx)(r.strong,{children:"Vector Store"})," components connect to your vector databases or create in-memory vector stores for storing and retrieving vector data in flows."]}),"\n",(0,n.jsxs)(r.p,{children:["Vector databases and ",(0,n.jsx)(r.strong,{children:"Vector Store"})," components are specifically designed for storing and retrieving vector data, such as embeddings generated by language models. They are used to perform similarity searches, enabling applications like chatbots to retrieve relevant context from large datasets."]}),"\n",(0,n.jsxs)(r.p,{children:["Other types of storage, like traditional structured databases and chat memory, are handled through other components like the ",(0,n.jsxs)(r.a,{href:"/components-data#sql-database",children:[(0,n.jsx)(r.strong,{children:"SQL Database"})," component"]})," or the ",(0,n.jsxs)(r.a,{href:"/components-helpers#message-history",children:[(0,n.jsx)(r.strong,{children:"Message History"})," component"]}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"use-a-vector-store-component-in-a-flow",children:"Use a Vector Store component in a flow"}),"\n",(0,n.jsx)(r.admonition,{type:"tip",children:(0,n.jsxs)(r.p,{children:["For an tutorial using ",(0,n.jsx)(r.strong,{children:"Vector Store"})," components in a flow, see ",(0,n.jsx)(r.a,{href:"/chat-with-rag",children:"Create a vector RAG chatbot"}),"."]})}),"\n",(0,n.jsxs)(r.p,{children:["This example uses the ",(0,n.jsx)(r.strong,{children:"Chroma DB"})," vector store component. Your ",(0,n.jsx)(r.strong,{children:"Vector Store"})," component's parameters and authentication may be different, but the document ingestion workflow is the same. A document is loaded from a local machine and chunked. The ",(0,n.jsx)(r.strong,{children:"Vector Store"})," component generates embeddings with the connected ",(0,n.jsxs)(r.a,{href:"/components-embedding-models",children:[(0,n.jsx)(r.strong,{children:"Embedding Model"})," component"]}),", and stores them in the connected vector database.\nThis vector data can then be retrieved for workloads like Retrieval Augmented Generation (RAG)."]}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"Embedding data into a vector store",src:t(7685).A+"",width:"4000",height:"2512"})}),"\n",(0,n.jsxs)(r.p,{children:["The user's chat input is embedded and compared to the vectors embedded during document ingestion for a similarity search.\nThe results are output from the ",(0,n.jsx)(r.strong,{children:"Vector Store"})," component as a ",(0,n.jsx)(r.a,{href:"/data-types#data",children:(0,n.jsx)(r.code,{children:"Data"})})," object and parsed into text.\nThis text fills the ",(0,n.jsx)(r.code,{children:"{context}"})," variable in the ",(0,n.jsx)(r.strong,{children:"Prompt Template"})," component, which informs the ",(0,n.jsx)(r.strong,{children:"OpenAI"})," language model component's responses."]}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"Retrieval from a vector store",src:t(67719).A+"",width:"4000",height:"1324"})}),"\n",(0,n.jsx)(r.h3,{id:"configure-vector-store-parameters",children:"Configure vector store parameters"}),"\n",(0,n.jsxs)(r.p,{children:["Most ",(0,n.jsx)(r.strong,{children:"Vector Store"})," components have the same utility within a flow, but each provider can offer different parameters and functionality.\nInspect a component's parameters to learn more about the inputs it accepts and how to configure it."]}),"\n",(0,n.jsxs)(r.p,{children:["Many input parameters for ",(0,n.jsx)(r.strong,{children:"Vector Store"})," components are hidden by default in the visual editor.\nYou can toggle parameters through the ",(0,n.jsx)(c.A,{name:"SlidersHorizontal","aria-hidden":"true"})," ",(0,n.jsx)(r.strong,{children:"Controls"})," in each ",(0,n.jsx)(r.a,{href:"/concepts-components#component-menus",children:"component's header menu"}),"."]}),"\n",(0,n.jsx)(r.p,{children:"For details about a specific provider's parameters, see the provider's documentation."}),"\n",(0,n.jsx)(r.h2,{id:"astra-db",children:"Astra DB"}),"\n",(0,n.jsxs)(r.p,{children:["This component implements an ",(0,n.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/create-database.html",children:"Astra DB Serverless vector store"})," with search capabilities."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"token"}),(0,n.jsx)(r.td,{children:"Astra DB Application Token"}),(0,n.jsx)(r.td,{children:"An Astra application token with permission to access your vector database. Once the connection is verified, additional fields are populated with your existing databases and collections."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"environment"}),(0,n.jsx)(r.td,{children:"Environment"}),(0,n.jsxs)(r.td,{children:["The environment for the Astra DB API Endpoint. For example, ",(0,n.jsx)(r.code,{children:"dev"})," or ",(0,n.jsx)(r.code,{children:"prod"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"database_name"}),(0,n.jsx)(r.td,{children:"Database"}),(0,n.jsxs)(r.td,{children:["The name of the database that you want this component to connect to, or select ",(0,n.jsx)(r.strong,{children:"New Database"})," to create a new database. To create a new database, you must provide the database details, and then wait for the database to initialize."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"api_endpoint"}),(0,n.jsx)(r.td,{children:"Astra DB API Endpoint"}),(0,n.jsx)(r.td,{children:"The API endpoint for the Astra DB instance. This supersedes the database selection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"Collection"}),(0,n.jsxs)(r.td,{children:["The name of the collection that you want to use with this flow, or click ",(0,n.jsx)(r.strong,{children:"New Collection"})," to create a new collection."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"keyspace"}),(0,n.jsx)(r.td,{children:"Keyspace"}),(0,n.jsx)(r.td,{children:"An optional keyspace within Astra DB to use for the collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding_choice"}),(0,n.jsx)(r.td,{children:"Embedding Model or Astra Vectorize"}),(0,n.jsxs)(r.td,{children:["Choose an embedding model or use Astra vectorize. If the collection has a vectorize integration, ",(0,n.jsx)(r.strong,{children:"Astra Vectorize"})," can be selected automatically."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding_model"}),(0,n.jsx)(r.td,{children:"Embedding Model"}),(0,n.jsxs)(r.td,{children:["Specify the embedding model. Not required if the embedding choice is ",(0,n.jsx)(r.strong,{children:"Astra Vectorize"})," because the component automatically uses the integrated model."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Number of Search Results"}),(0,n.jsxs)(r.td,{children:["The number of search results to return. Default:",(0,n.jsx)(r.code,{children:"4"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"Search Type"}),(0,n.jsxs)(r.td,{children:["The search type to use. The options are ",(0,n.jsx)(r.code,{children:"Similarity"}),", ",(0,n.jsx)(r.code,{children:"Similarity with score threshold"}),", and ",(0,n.jsx)(r.code,{children:"MMR (Max Marginal Relevance)"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Search Score Threshold"}),(0,n.jsxs)(r.td,{children:["The minimum similarity score threshold for search results when using the ",(0,n.jsx)(r.code,{children:"Similarity with score threshold"})," option."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"advanced_search_filter"}),(0,n.jsx)(r.td,{children:"Search Metadata Filter"}),(0,n.jsx)(r.td,{children:"An optional dictionary of filters to apply to the search query."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"autodetect_collection"}),(0,n.jsx)(r.td,{children:"Autodetect Collection"}),(0,n.jsx)(r.td,{children:"Boolean flag to determine whether to autodetect the collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"content_field"}),(0,n.jsx)(r.td,{children:"Content Field"}),(0,n.jsx)(r.td,{children:"A field to use as the text content field for the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"deletion_field"}),(0,n.jsx)(r.td,{children:"Deletion Based On Field"}),(0,n.jsx)(r.td,{children:"When provided, documents in the target collection with metadata field values matching the input metadata field value are deleted before new data is loaded."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ignore_invalid_documents"}),(0,n.jsx)(r.td,{children:"Ignore Invalid Documents"}),(0,n.jsx)(r.td,{children:"Boolean flag to determine whether to ignore invalid documents at runtime."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"astradb_vectorstore_kwargs"}),(0,n.jsx)(r.td,{children:"AstraDBVectorStore Parameters"}),(0,n.jsx)(r.td,{children:"An optional dictionary of additional parameters for the AstraDBVectorStore."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The Astra DB vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h3,{id:"generate-embeddings",children:"Generate embeddings"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component offers two methods for generating embeddings."]}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["*",(0,n.jsx)(r.strong,{children:"Embedding Model"}),": Use your own embedding model by connecting an ",(0,n.jsxs)(r.a,{href:"/components-embedding-models",children:[(0,n.jsx)(r.strong,{children:"Embedding Model"})," component"]})," in Langflow."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:[(0,n.jsx)(r.strong,{children:"Astra Vectorize"}),": Use Astra DB's built-in embedding generation service. When creating a new collection, choose the embeddings provider and models, including NVIDIA's ",(0,n.jsx)(r.code,{children:"NV-Embed-QA"})," model hosted by DataStax.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html",children:"Astra DB Serverless documentation"}),"."]}),"\n",(0,n.jsx)(r.admonition,{type:"important",children:(0,n.jsx)(r.p,{children:"With vectorize, the embedding model you choose when you create a collection cannot be changed later."})}),"\n"]}),"\n"]}),"\n",(0,n.jsxs)(r.p,{children:["For an example of using the ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component with an embedding model, see the ",(0,n.jsx)(r.strong,{children:"Vector Store RAG"})," template."]}),"\n",(0,n.jsx)(r.h3,{id:"hybrid-search",children:"Hybrid search"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component includes Astra DB's ",(0,n.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/hybrid-search.html",children:"hybrid search"})," feature through the Astra DB Data API."]}),"\n",(0,n.jsx)(r.p,{children:"Hybrid search performs a vector similarity search and a lexical search, compares the results of both searches, and then returns the most relevant results overall."}),"\n",(0,n.jsxs)(r.p,{children:["To use hybrid search through the ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component, you must ",(0,n.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/api-reference/collection-methods/create-collection.html#example-hybrid",children:"create a collection with that supports hybrid search"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["The following ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component parameters are used for hybrid search:"]}),"\n",(0,n.jsxs)(r.ul,{children:["\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.strong,{children:"Search Query"}),": The query to use for vector search."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.strong,{children:"Lexical Terms"}),": A comma-separated string of keywords, like ",(0,n.jsx)(r.code,{children:"features, data, attributes, characteristics"}),"."]}),"\n",(0,n.jsxs)(r.li,{children:[(0,n.jsx)(r.strong,{children:"Reranker"}),": The re-ranker model to use for hybrid search, such as ",(0,n.jsx)(r.code,{children:"nvidia/llama-3.2-nv.reranker"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Hybrid search example"}),(0,n.jsxs)(r.p,{children:["To use hybrid search through the ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component, do the following:"]}),(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["Create a flow based on the ",(0,n.jsx)(r.strong,{children:"Hybrid Search RAG"})," template."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["In the ",(0,n.jsx)(r.strong,{children:"OpenAI"})," component, add your OpenAI API key."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["In the ",(0,n.jsx)(r.strong,{children:"Astra DB"})," vector store component, add your ",(0,n.jsx)(r.strong,{children:"Astra DB Application Token"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["In the ",(0,n.jsx)(r.strong,{children:"Database"})," field, select your database."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["In the ",(0,n.jsx)(r.strong,{children:"Collection"})," field, select or create a collection with hybrid search capabilities enabled."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["In the ",(0,n.jsx)(r.strong,{children:"Playground"}),", enter a question about your data, such as ",(0,n.jsx)(r.code,{children:"What are the features of my data?"})]}),"\n",(0,n.jsxs)(r.p,{children:["Your query is sent to the ",(0,n.jsx)(r.strong,{children:"OpenAI"})," and ",(0,n.jsx)(r.strong,{children:"Astra DB"})," components.\nThe ",(0,n.jsx)(r.strong,{children:"OpenAI"})," component contains a prompt for creating the lexical query from your input:"]}),"\n",(0,n.jsx)(o.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"You are a database query planner that takes a user's requests, and then converts to a search against the subject matter in question.",props:{}}]},{tokens:[{content:"You should convert the query into:",props:{}}]},{tokens:[{content:"1. A list of keywords to use against a Lucene text analyzer index, no more than 4. Strictly unigrams.",props:{}}]},{tokens:[{content:"2. A question to use as the basis for a QA embedding engine.",props:{}}]},{tokens:[{content:"Avoid common keywords associated with the user's subject matter.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["To view the keywords and questions the ",(0,n.jsx)(r.strong,{children:"OpenAI"})," component generates from your collection, in the ",(0,n.jsx)(r.strong,{children:"OpenAI"})," component, click ",(0,n.jsx)(c.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,n.jsx)(r.strong,{children:"Inspect Output"}),"."]}),"\n",(0,n.jsx)(o.Code,{codeConfig:x,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"1. Keywords: features, data, attributes, characteristics",props:{}}]},{tokens:[{content:"2. Question: What characteristics can be identified in my data?",props:{}}]}],lang:"text"},annotations:[]}]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["To view the ",(0,n.jsx)(r.a,{href:"/data-types#dataframe",children:"DataFrame"})," generated from the ",(0,n.jsx)(r.strong,{children:"OpenAI"})," component's response, in the ",(0,n.jsx)(r.strong,{children:"Structured Output"})," component, click ",(0,n.jsx)(c.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,n.jsx)(r.strong,{children:"Inspect output"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["The DataFrame is passed to a ",(0,n.jsx)(r.strong,{children:"Parser"})," component, which parses the contents of the ",(0,n.jsx)(r.strong,{children:"Keywords"})," column into a string."]}),"\n",(0,n.jsxs)(r.p,{children:["This string of comma-separated words is passed to the ",(0,n.jsx)(r.strong,{children:"Lexical Terms"})," port of the ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component.\nNote that the ",(0,n.jsx)(r.strong,{children:"Search Query"})," port of the ",(0,n.jsx)(r.strong,{children:"Astra DB"})," component is connected to the ",(0,n.jsx)(r.strong,{children:"Chat Input"})," component.\nThe search query is vectorized, and both the ",(0,n.jsx)(r.strong,{children:"Search Query"})," and ",(0,n.jsx)(r.strong,{children:"Lexical Terms"})," content are sent to the reranker at the ",(0,n.jsx)(r.code,{children:"find_and_rerank"})," endpoint.\nThe reranker compares the vector search results against the string of terms from the lexical search.\nThe highest-ranked results of your hybrid search are returned to the ",(0,n.jsx)(r.strong,{children:"Playground"}),"."]}),"\n"]}),"\n"]})]}),"\n",(0,n.jsx)(r.h2,{id:"astra-db-graph",children:"Astra DB Graph"}),"\n",(0,n.jsxs)(r.p,{children:["This component implements a vector store using Astra DB with graph capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/tutorials/graph-rag.html",children:"Astra DB Serverless documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"Collection Name"}),(0,n.jsx)(r.td,{children:"The name of the collection within Astra DB where the vectors are stored. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"token"}),(0,n.jsx)(r.td,{children:"Astra DB Application Token"}),(0,n.jsx)(r.td,{children:"Authentication token for accessing Astra DB. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"api_endpoint"}),(0,n.jsx)(r.td,{children:"API Endpoint"}),(0,n.jsx)(r.td,{children:"API endpoint URL for the Astra DB service. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_input"}),(0,n.jsx)(r.td,{children:"Search Input"}),(0,n.jsx)(r.td,{children:"Query string for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Ingest Data"}),(0,n.jsx)(r.td,{children:"Data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"keyspace"}),(0,n.jsx)(r.td,{children:"Keyspace"}),(0,n.jsx)(r.td,{children:"Optional keyspace within Astra DB to use for the collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embedding Model"}),(0,n.jsx)(r.td,{children:"Embedding model to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metric"}),(0,n.jsx)(r.td,{children:"Metric"}),(0,n.jsx)(r.td,{children:'Distance metric for vector comparisons. The options are "cosine", "euclidean", "dot_product".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"setup_mode"}),(0,n.jsx)(r.td,{children:"Setup Mode"}),(0,n.jsx)(r.td,{children:'Configuration mode for setting up the vector store. The options are "Sync", "Async", "Off".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"pre_delete_collection"}),(0,n.jsx)(r.td,{children:"Pre Delete Collection"}),(0,n.jsx)(r.td,{children:"Boolean flag to determine whether to delete the collection before creating a new one."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Number of Results"}),(0,n.jsx)(r.td,{children:"Number of results to return in similarity search. Default: 4."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"Search Type"}),(0,n.jsx)(r.td,{children:'Search type to use. The options are "Similarity", "Graph Traversal", "Hybrid".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"traversal_depth"}),(0,n.jsx)(r.td,{children:"Traversal Depth"}),(0,n.jsx)(r.td,{children:"Maximum depth for graph traversal searches. Default: 1."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Search Score Threshold"}),(0,n.jsx)(r.td,{children:"Minimum similarity score threshold for search results."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_filter"}),(0,n.jsx)(r.td,{children:"Search Metadata Filter"}),(0,n.jsx)(r.td,{children:"Optional dictionary of filters to apply to the search query."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The Graph RAG vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"cassandra",children:"Cassandra"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Cassandra vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://cassandra.apache.org/doc/latest/cassandra/vector-search/overview.html",children:"Cassandra documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"database_ref"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Contact points for the database or Astra DB database ID."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"username"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Username for the database (leave empty for Astra DB)."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"token"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"User password for the database or Astra DB token."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"keyspace"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Table or keyspace."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"table_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the table or Astra DB collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ttl_seconds"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Time-to-live for added texts."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"batch_size"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of data to process in a single batch."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"setup_mode"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Configuration mode for setting up the Cassandra table."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"cluster_kwargs"}),(0,n.jsx)(r.td,{children:"Dict"}),(0,n.jsx)(r.td,{children:"Additional keyword arguments for the Cassandra cluster."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"Data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"Embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of results to return in search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Type of search to perform."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Float"}),(0,n.jsx)(r.td,{children:"Minimum similarity score for search results."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_filter"}),(0,n.jsx)(r.td,{children:"Dict"}),(0,n.jsx)(r.td,{children:"Metadata filters for search query."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"body_search"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Document textual search terms."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"enable_body_search"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Flag to enable body search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Cassandra"}),(0,n.jsx)(r.td,{children:"The Cassandra vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.code,{children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"cassandra-graph",children:"Cassandra Graph"}),"\n",(0,n.jsx)(r.p,{children:"This component implements a Cassandra Graph vector store with search capabilities."}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"database_ref"}),(0,n.jsx)(r.td,{children:"Contact Points / Astra Database ID"}),(0,n.jsx)(r.td,{children:"The contact points for the database or Astra DB database ID. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"username"}),(0,n.jsx)(r.td,{children:"Username"}),(0,n.jsx)(r.td,{children:"The username for the database. Leave this field empty for Astra DB."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"token"}),(0,n.jsx)(r.td,{children:"Password / Astra DB Token"}),(0,n.jsx)(r.td,{children:"The user password for the database or Astra DB token. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"keyspace"}),(0,n.jsx)(r.td,{children:"Keyspace"}),(0,n.jsx)(r.td,{children:"The table or keyspace. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"table_name"}),(0,n.jsx)(r.td,{children:"Table Name"}),(0,n.jsx)(r.td,{children:"The name of the table or Astra DB collection where vectors are stored. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"setup_mode"}),(0,n.jsx)(r.td,{children:"Setup Mode"}),(0,n.jsx)(r.td,{children:'The configuration mode for setting up the Cassandra table. The options are "Sync" or "Off". Default: "Sync".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"cluster_kwargs"}),(0,n.jsx)(r.td,{children:"Cluster arguments"}),(0,n.jsx)(r.td,{children:"An optional dictionary of additional keyword arguments for the Cassandra cluster."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"Search Query"}),(0,n.jsx)(r.td,{children:"The query string for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Ingest Data"}),(0,n.jsx)(r.td,{children:"The list of data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embedding"}),(0,n.jsx)(r.td,{children:"The embedding model to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Number of Results"}),(0,n.jsx)(r.td,{children:"The number of results to return in similarity search. Default: 4."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"Search Type"}),(0,n.jsx)(r.td,{children:'The search type to use. The options are "Traversal", "MMR traversal", "Similarity", "Similarity with score threshold", or "MMR (Max Marginal Relevance)". Default: "Traversal".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"depth"}),(0,n.jsx)(r.td,{children:"Depth of traversal"}),(0,n.jsx)(r.td,{children:'The maximum depth of edges to traverse. Used for "Traversal" or "MMR traversal" search types. Default: 1.'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Search Score Threshold"}),(0,n.jsx)(r.td,{children:'The minimum similarity score threshold for search results. Used for "Similarity with score threshold" search types.'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_filter"}),(0,n.jsx)(r.td,{children:"Search Metadata Filter"}),(0,n.jsx)(r.td,{children:"An optional dictionary of filters to apply to the search query."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The Cassandra Graph vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"chroma-db",children:"Chroma DB"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.strong,{children:"Chroma DB"})," component creates an ephemeral, Chroma vector database with search capabilities that you can use for experimentation and vector storage.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.trychroma.com/",children:"Chroma documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Chroma DB sample flow"}),(0,n.jsxs)(r.ol,{children:["\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["To use this component in a flow, connect it to a component that outputs ",(0,n.jsx)(r.code,{children:"Data"})," or ",(0,n.jsx)(r.code,{children:"DataFrame"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["This example splits text from a ",(0,n.jsxs)(r.a,{href:"/components-data#url",children:[(0,n.jsx)(r.strong,{children:"URL"})," component"]}),", and then computes embeddings with the connected ",(0,n.jsx)(r.strong,{children:"OpenAI Embeddings"})," component. Chroma DB computes embeddings by default, but you can connect your own embeddings model, as seen in this example."]}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"ChromaDB receiving split text",src:t(88690).A+"",width:"4000",height:"2694"})}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["In the ",(0,n.jsx)(r.strong,{children:"Chroma DB"})," component, in the ",(0,n.jsx)(r.strong,{children:"Collection"})," field, enter a name for your embeddings collection."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["Optional: To persist the Chroma database, in the ",(0,n.jsx)(r.strong,{children:"Persist"})," field, enter a directory to store the ",(0,n.jsx)(r.code,{children:"chroma.sqlite3"})," file.\nThis example uses ",(0,n.jsx)(r.code,{children:"./chroma-db"})," to create a directory relative to where Langflow is running."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["To load data and embeddings into your Chroma database, in the ",(0,n.jsx)(r.strong,{children:"Chroma DB"})," component, click ",(0,n.jsx)(c.A,{name:"Play","aria-hidden":"true"})," ",(0,n.jsx)(r.strong,{children:"Run component"}),"."]}),"\n",(0,n.jsx)(r.admonition,{type:"tip",children:(0,n.jsxs)(r.p,{children:["When loading duplicate documents, enable the ",(0,n.jsx)(r.strong,{children:"Allow Duplicates"})," option in Chroma DB if you want to store multiple copies of the same content, or disable it to automatically deduplicate your data."]})}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["To view the split data, in the ",(0,n.jsx)(r.strong,{children:"Split Text"})," component, click ",(0,n.jsx)(c.A,{name:"TextSearch","aria-hidden":"true"})," ",(0,n.jsx)(r.strong,{children:"Inspect Output"}),"."]}),"\n"]}),"\n",(0,n.jsxs)(r.li,{children:["\n",(0,n.jsxs)(r.p,{children:["To query your loaded data, open the ",(0,n.jsx)(r.strong,{children:"Playground"})," and query your database.\nYour input is converted to vector data and compared to the stored vectors in a vector similarity search."]}),"\n"]}),"\n"]})]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The name of the Chroma collection. Default: "langflow".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"persist_directory"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The directory to persist the Chroma database."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query to search for in the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsxs)(r.td,{children:["The data to ingest into the vector store (list of ",(0,n.jsx)(r.code,{children:"Data"})," objects)."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use for the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"chroma_server_cors_allow_origins"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The CORS allow origins for the Chroma server."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"chroma_server_host"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The host for the Chroma server."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"chroma_server_http_port"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The HTTP port for the Chroma server."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"chroma_server_grpc_port"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The gRPC port for the Chroma server."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"chroma_server_ssl_enabled"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Enable SSL for the Chroma server."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"allow_duplicates"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Allow duplicate documents in the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The type of search to perform: "Similarity" or "MMR".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsxs)(r.td,{children:["The number of results to return from the search. Default: ",(0,n.jsx)(r.code,{children:"10"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"limit"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsxs)(r.td,{children:["The limit of the number of records to compare when ",(0,n.jsx)(r.code,{children:"Allow Duplicates"})," is false."]})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Chroma"}),(0,n.jsx)(r.td,{children:"The Chroma vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"clickhouse",children:"Clickhouse"}),"\n",(0,n.jsxs)(r.p,{children:["This component implements a Clickhouse vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://clickhouse.com/docs/en/intro",children:"Clickhouse Documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"host"}),(0,n.jsx)(r.td,{children:"hostname"}),(0,n.jsx)(r.td,{children:'The Clickhouse server hostname. Required. Default: "localhost".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"port"}),(0,n.jsx)(r.td,{children:"port"}),(0,n.jsx)(r.td,{children:"The Clickhouse server port. Required. Default: 8123."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"database"}),(0,n.jsx)(r.td,{children:"database"}),(0,n.jsx)(r.td,{children:"The Clickhouse database name. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"table"}),(0,n.jsx)(r.td,{children:"Table name"}),(0,n.jsx)(r.td,{children:"The Clickhouse table name. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"username"}),(0,n.jsx)(r.td,{children:"The ClickHouse user name."}),(0,n.jsx)(r.td,{children:"Username for authentication. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"password"}),(0,n.jsx)(r.td,{children:"The password for username."}),(0,n.jsx)(r.td,{children:"Password for authentication. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_type"}),(0,n.jsx)(r.td,{children:"index_type"}),(0,n.jsx)(r.td,{children:'Type of the index. The options are "annoy" and "vector_similarity". Default: "annoy".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metric"}),(0,n.jsx)(r.td,{children:"metric"}),(0,n.jsx)(r.td,{children:'Metric to compute distance. The options are "angular", "euclidean", "manhattan", "hamming", "dot". Default: "angular".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"secure"}),(0,n.jsx)(r.td,{children:"Use https/TLS"}),(0,n.jsx)(r.td,{children:"Overrides inferred values from the interface or port arguments. Default: false."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_param"}),(0,n.jsx)(r.td,{children:"Param of the index"}),(0,n.jsx)(r.td,{children:"Index parameters. Default: \"'L2Distance',100\"."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_query_params"}),(0,n.jsx)(r.td,{children:"index query params"}),(0,n.jsx)(r.td,{children:"Additional index query parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"Search Query"}),(0,n.jsx)(r.td,{children:"The query string for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Ingest Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embedding"}),(0,n.jsx)(r.td,{children:"The embedding model to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Number of Results"}),(0,n.jsx)(r.td,{children:"The number of results to return in similarity search. Default: 4."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"score_threshold"}),(0,n.jsx)(r.td,{children:"Score threshold"}),(0,n.jsx)(r.td,{children:"The threshold for similarity scores."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The Clickhouse vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsx)(r.td,{children:"The results of the similarity search as a list of Data objects."})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"couchbase",children:"Couchbase"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Couchbase vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.couchbase.com/home/index.html",children:"Couchbase documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"couchbase_connection_string"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"Couchbase Cluster connection string. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"couchbase_username"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Couchbase username. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"couchbase_password"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"Couchbase password. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"bucket_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the Couchbase bucket. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"scope_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the Couchbase scope. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the Couchbase collection. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the Couchbase index. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query to search for in the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The list of data to ingest into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use for the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of results to return from the search. Default: 4."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsx)(r.tbody,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"CouchbaseVectorStore"}),(0,n.jsx)(r.td,{children:"A Couchbase vector store instance configured with the specified parameters."})]})})]})]}),"\n",(0,n.jsx)(r.h2,{id:"elasticsearch",children:"Elasticsearch"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates an Elasticsearch vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://www.elastic.co/guide/en/elasticsearch/reference/current/dense-vector.html",children:"Elasticsearch documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"es_url"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Elasticsearch server URL."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"es_user"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Username for Elasticsearch authentication."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"es_password"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"Password for Elasticsearch authentication."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the Elasticsearch index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"strategy"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'Strategy for vector search. The options are "approximate_k_nearest_neighbors" or "script_scoring".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"distance_strategy"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'Strategy for distance calculation. The options are "COSINE", "EUCLIDEAN_DISTANCE", or "DOT_PRODUCT".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"Data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"Embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsxs)(r.td,{children:["Number of results to return in search. Default: ",(0,n.jsx)(r.code,{children:"4"}),"."]})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"ElasticsearchStore"}),(0,n.jsx)(r.td,{children:"The Elasticsearch vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"faiss",children:"FAISS"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a FAISS vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://faiss.ai/index.html",children:"FAISS documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The name of the FAISS index. Default: "langflow_index".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"persist_directory"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Path to save the FAISS index. It is relative to where Langflow is running."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query to search for in the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The list of data to ingest into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"allow_dangerous_deserialization"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Set to True to allow loading pickle files from untrusted sources. Default: True."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use for the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of results to return from the search. Default: 4."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The FAISS vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"graph-rag",children:"Graph RAG"}),"\n",(0,n.jsxs)(r.p,{children:["This component performs Graph RAG traversal in a vector store, enabling graph-based document retrieval.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/",children:"Graph RAG documentation"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["For an example flow, see the ",(0,n.jsx)(r.strong,{children:"Graph RAG"})," template in Langflow."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding_model"}),(0,n.jsx)(r.td,{children:"Embedding Model"}),(0,n.jsxs)(r.td,{children:["Specify the embedding model. This isn't required for collections embedded with ",(0,n.jsx)(r.a,{href:"https://docs.datastax.com/en/astra-db-serverless/databases/embedding-generation.html",children:"Astra vectorize"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store Connection"}),(0,n.jsx)(r.td,{children:"Connection to the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"edge_definition"}),(0,n.jsx)(r.td,{children:"Edge Definition"}),(0,n.jsxs)(r.td,{children:["Edge definition for the graph traversal. For more information, see the ",(0,n.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/reference/graph_retriever/edges/",children:"GraphRAG documentation"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"strategy"}),(0,n.jsx)(r.td,{children:"Traversal Strategies"}),(0,n.jsx)(r.td,{children:"The strategy to use for graph traversal. Strategy options are dynamically loaded from available strategies."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"Search Query"}),(0,n.jsx)(r.td,{children:"The query to search for in the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"graphrag_strategy_kwargs"}),(0,n.jsx)(r.td,{children:"Strategy Parameters"}),(0,n.jsxs)(r.td,{children:["Optional dictionary of additional parameters for the retrieval strategy. For more information, see the ",(0,n.jsx)(r.a,{href:"https://datastax.github.io/graph-rag/reference/graph_retriever/strategies/",children:"strategy documentation"}),"."]})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsx)(r.tbody,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["Results of the graph-based document retrieval as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})})]})]}),"\n",(0,n.jsx)(r.h2,{id:"hyper-converged-database-hcd",children:"Hyper-Converged Database (HCD)"}),"\n",(0,n.jsx)(r.p,{children:"This component implements a vector store using HCD."}),"\n",(0,n.jsxs)(r.p,{children:["To use the HCD vector store, add your deployment's collection name, username, password, and HCD Data API endpoint.\nThe endpoint must be formatted like ",(0,n.jsx)(r.code,{children:"http[s]://**DOMAIN_NAME** or **IP_ADDRESS**[:port]"}),", for example, ",(0,n.jsx)(r.code,{children:"http://192.0.2.250:8181"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["Replace ",(0,n.jsx)(r.strong,{children:"DOMAIN_NAME"})," or ",(0,n.jsx)(r.strong,{children:"IP_ADDRESS"})," with the domain name or IP address of your HCD Data API connection."]}),"\n",(0,n.jsx)(r.p,{children:"To use the HCD vector store for embeddings ingestion, connect it to an embeddings model and a file loader."}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"HCD vector store embeddings ingestion",src:t(42638).A+"",width:"2294",height:"1684"})}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"Collection Name"}),(0,n.jsx)(r.td,{children:"The name of the collection within HCD where the vectors will be stored. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"username"}),(0,n.jsx)(r.td,{children:"HCD Username"}),(0,n.jsx)(r.td,{children:'Authentication username for accessing HCD. Default is "hcd-superuser". Required.'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"password"}),(0,n.jsx)(r.td,{children:"HCD Password"}),(0,n.jsx)(r.td,{children:"Authentication password for accessing HCD. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"api_endpoint"}),(0,n.jsx)(r.td,{children:"HCD API Endpoint"}),(0,n.jsx)(r.td,{children:"API endpoint URL for the HCD service. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_input"}),(0,n.jsx)(r.td,{children:"Search Input"}),(0,n.jsx)(r.td,{children:"Query string for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Ingest Data"}),(0,n.jsx)(r.td,{children:"Data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"namespace"}),(0,n.jsx)(r.td,{children:"Namespace"}),(0,n.jsx)(r.td,{children:'Optional namespace within HCD to use for the collection. Default is "default_namespace".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ca_certificate"}),(0,n.jsx)(r.td,{children:"CA Certificate"}),(0,n.jsx)(r.td,{children:"Optional CA certificate for TLS connections to HCD."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metric"}),(0,n.jsx)(r.td,{children:"Metric"}),(0,n.jsx)(r.td,{children:'Optional distance metric for vector comparisons. Options are "cosine", "dot_product", "euclidean".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"batch_size"}),(0,n.jsx)(r.td,{children:"Batch Size"}),(0,n.jsx)(r.td,{children:"Optional number of data to process in a single batch."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"bulk_insert_batch_concurrency"}),(0,n.jsx)(r.td,{children:"Bulk Insert Batch Concurrency"}),(0,n.jsx)(r.td,{children:"Optional concurrency level for bulk insert operations."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"bulk_insert_overwrite_concurrency"}),(0,n.jsx)(r.td,{children:"Bulk Insert Overwrite Concurrency"}),(0,n.jsx)(r.td,{children:"Optional concurrency level for bulk insert operations that overwrite existing data."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"bulk_delete_concurrency"}),(0,n.jsx)(r.td,{children:"Bulk Delete Concurrency"}),(0,n.jsx)(r.td,{children:"Optional concurrency level for bulk delete operations."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"setup_mode"}),(0,n.jsx)(r.td,{children:"Setup Mode"}),(0,n.jsx)(r.td,{children:'Configuration mode for setting up the vector store. Options are "Sync", "Async", "Off". Default is "Sync".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"pre_delete_collection"}),(0,n.jsx)(r.td,{children:"Pre Delete Collection"}),(0,n.jsx)(r.td,{children:"Boolean flag to determine whether to delete the collection before creating a new one."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metadata_indexing_include"}),(0,n.jsx)(r.td,{children:"Metadata Indexing Include"}),(0,n.jsx)(r.td,{children:"Optional list of metadata fields to include in the indexing."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embedding or Astra Vectorize"}),(0,n.jsx)(r.td,{children:"Allows either an embedding model or an Astra Vectorize configuration."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metadata_indexing_exclude"}),(0,n.jsx)(r.td,{children:"Metadata Indexing Exclude"}),(0,n.jsx)(r.td,{children:"Optional list of metadata fields to exclude from the indexing."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_indexing_policy"}),(0,n.jsx)(r.td,{children:"Collection Indexing Policy"}),(0,n.jsx)(r.td,{children:"Optional dictionary defining the indexing policy for the collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Number of Results"}),(0,n.jsx)(r.td,{children:"Number of results to return in similarity search. Default is 4."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"Search Type"}),(0,n.jsx)(r.td,{children:'Search type to use. Options are "Similarity", "Similarity with score threshold", "MMR (Max Marginal Relevance)". Default is "Similarity".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Search Score Threshold"}),(0,n.jsx)(r.td,{children:"Minimum similarity score threshold for search results. Default is 0."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_filter"}),(0,n.jsx)(r.td,{children:"Search Metadata Filter"}),(0,n.jsx)(r.td,{children:"Optional dictionary of filters to apply to the search query."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"HyperConvergedDatabaseVectorStore"}),(0,n.jsx)(r.td,{children:"The HCD vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"local-db",children:"Local DB"}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.strong,{children:"Local DB"})," component is Langflow's enhanced version of Chroma DB."]}),"\n",(0,n.jsx)(r.p,{children:"The component adds a user-friendly interface with two modes (Ingest and Retrieve), automatic collection management, and built-in persistence in Langflow's cache directory."}),"\n",(0,n.jsxs)(r.p,{children:["Local DB includes ",(0,n.jsx)(r.strong,{children:"Ingest"})," and ",(0,n.jsx)(r.strong,{children:"Retrieve"})," modes."]}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.strong,{children:"Ingest"})," mode works similarly to ",(0,n.jsx)(r.a,{href:"#chroma-db",children:"ChromaDB"}),", and persists your database to the Langflow cache directory. The Langflow cache directory location is specified in the ",(0,n.jsx)(r.code,{children:"LANGFLOW_CONFIG_DIR"})," environment variable. For more information, see ",(0,n.jsx)(r.a,{href:"/concepts-flows#flow-storage-and-logs",children:"Flow storage and logs"}),"."]}),"\n",(0,n.jsxs)(r.p,{children:["The ",(0,n.jsx)(r.strong,{children:"Retrieve"})," mode can query your ",(0,n.jsx)(r.strong,{children:"Chroma DB"})," collections."]}),"\n",(0,n.jsx)(r.p,{children:(0,n.jsx)(r.img,{alt:"Local DB retrieving vectors",src:t(60159).A+"",width:"4000",height:"2188"})}),"\n",(0,n.jsxs)(r.p,{children:["For more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.trychroma.com/",children:"Chroma documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The name of the Chroma collection. Default: "langflow".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"persist_directory"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsxs)(r.td,{children:["Custom base directory to save the vector store. Collections are stored under ",(0,n.jsx)(r.code,{children:"$DIRECTORY/vector_stores/$COLLECTION_NAME"}),". If not specified, it uses your system's cache folder."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"existing_collections"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Select a previously created collection to search through its stored data."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use for the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"allow_duplicates"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"If false, the component won't add documents that are already in the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'Type of search to perform: "Similarity" or "MMR".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data/DataFrame"}),(0,n.jsx)(r.td,{children:"Data to store. It is embedded and indexed for semantic search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Enter text to search for similar content in the selected collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of results to return. Default: 10."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"limit"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Limit the number of records to compare when Allow Duplicates is False."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Chroma"}),(0,n.jsx)(r.td,{children:"A local Chroma vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsxs)(r.td,{children:["List",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})]}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"milvus",children:"Milvus"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Milvus vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://milvus.io/docs",children:"Milvus documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Name of the Milvus collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_description"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Description of the Milvus collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"uri"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Connection URI for Milvus."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"password"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"Password for Milvus."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"username"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"Username for Milvus."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"batch_size"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of data to process in a single batch."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"Data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"Embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of results to return in search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Type of search to perform."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Float"}),(0,n.jsx)(r.td,{children:"Minimum similarity score for search results."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_filter"}),(0,n.jsx)(r.td,{children:"Dict"}),(0,n.jsx)(r.td,{children:"Metadata filters for search query."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"setup_mode"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Configuration mode for setting up the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_dimensions"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of dimensions of the vectors."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"pre_delete_collection"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Whether to delete the collection before creating a new one."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsx)(r.tbody,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Milvus"}),(0,n.jsx)(r.td,{children:"A Milvus vector store instance configured with the specified parameters."})]})})]})]}),"\n",(0,n.jsx)(r.h2,{id:"mongodb-atlas",children:"MongoDB Atlas"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a MongoDB Atlas vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://www.mongodb.com/docs/atlas/atlas-vector-search/tutorials/vector-search-quick-start/",children:"MongoDB Atlas documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"mongodb_atlas_cluster_uri"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The connection URI for your MongoDB Atlas cluster. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"enable_mtls"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Enable mutual TLS authentication. Default: false."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"mongodb_atlas_client_cert"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"Client certificate combined with private key for mTLS authentication. Required if mTLS is enabled."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"db_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the database to use. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the collection to use. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the Atlas Search index, it should be a Vector Search. Required."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"insert_mode"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'How to insert new documents into the collection. The options are "append" or "overwrite". Default: "append".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding model to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Number of results to return in similarity search. Default: 4."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_field"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The field to index. Default: "embedding".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"filter_field"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The field to filter the index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_dimensions"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"Embedding context length. Default: 1536."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"similarity"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The method used to measure similarity between vectors. The options are "cosine", "euclidean", or "dotProduct". Default: "cosine".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"quantization"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'Quantization reduces memory costs by converting 32-bit floats to smaller data types. The options are "scalar" or "binary".'})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"MongoDBAtlasVectorSearch"}),(0,n.jsx)(r.td,{children:"The MongoDB Atlas vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"opensearch",children:"OpenSearch"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates an OpenSearch vector store with search capabilities\nFor more information, see ",(0,n.jsx)(r.a,{href:"https://opensearch.org/platform/search/vector-database.html",children:"OpenSearch documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"opensearch_url"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsxs)(r.td,{children:["URL for OpenSearch cluster, such as ",(0,n.jsx)(r.code,{children:"https://192.168.1.1:9200"}),"."]})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The index name where the vectors are stored in OpenSearch cluster."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_input"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Enter a search query. Leave empty to retrieve all documents or if hybrid search is being used."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_type"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:'The options are "similarity", "similarity_score_threshold", "mmr".'})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_score_threshold"}),(0,n.jsx)(r.td,{children:"Float"}),(0,n.jsx)(r.td,{children:"The minimum similarity score threshold for search results."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"username"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The username for the opensource cluster."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"password"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The password for the opensource cluster."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"use_ssl"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Use SSL."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"verify_certs"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Verify certificates."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"hybrid_search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Provide a custom hybrid search query in JSON format. This allows you to combine vector similarity and keyword matching."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"OpenSearchVectorSearch"}),(0,n.jsx)(r.td,{children:"OpenSearch vector store instance"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"pgvector",children:"PGVector"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a PGVector vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://github.com/pgvector/pgvector",children:"PGVector documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"pg_server_url"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The PostgreSQL server connection string."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The table name for the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The PGVector vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"pinecone",children:"Pinecone"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Pinecone vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.pinecone.io/home",children:"Pinecone documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the Pinecone index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"namespace"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The namespace for the index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"distance_strategy"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The strategy for calculating distance between vectors."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"pinecone_api_key"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The API key for Pinecone."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"text_key"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The key in the record to use as text."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Display Name"}),(0,n.jsx)(r.th,{children:"Info"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Vector Store"}),(0,n.jsx)(r.td,{children:"The Pinecone vector store instance configured with the specified parameters."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"Search Results"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"qdrant",children:"Qdrant"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Qdrant vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://qdrant.tech/documentation/",children:"Qdrant documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"collection_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the Qdrant collection."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"host"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The Qdrant server host."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"port"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The Qdrant server port."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"grpc_port"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The Qdrant gRPC port."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"api_key"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The API key for Qdrant."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"prefix"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The prefix for Qdrant."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"timeout"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The timeout for Qdrant operations."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"path"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The path for Qdrant."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"url"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The URL for Qdrant."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"distance_func"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The distance function for vector similarity."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"content_payload_key"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The content payload key."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metadata_payload_key"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The metadata payload key."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Qdrant"}),(0,n.jsx)(r.td,{children:"A Qdrant vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"redis",children:"Redis"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Redis vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://redis.io/docs/latest/develop/interact/search-and-query/advanced-concepts/vectors/",children:"Redis documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"redis_server_url"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The Redis server connection string."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"redis_index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the Redis index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"code"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The custom code for Redis (advanced)."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"schema"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The schema for Redis index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"Redis"}),(0,n.jsx)(r.td,{children:"Redis vector store instance"})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"supabase",children:"Supabase"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a connection to a Supabase vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://supabase.com/docs/guides/ai",children:"Supabase documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"supabase_url"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The URL of the Supabase instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"supabase_service_key"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The service key for Supabase authentication."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"table_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the table in Supabase."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"query_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The name of the query to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"SupabaseVectorStore"}),(0,n.jsx)(r.td,{children:"A Supabase vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"upstash",children:"Upstash"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates an Upstash vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://upstash.com/docs/introduction",children:"Upstash documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_url"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The URL of the Upstash index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_token"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The token for the Upstash index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"text_key"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The key in the record to use as text."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"namespace"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The namespace for the index."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"metadata_filter"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"Filter documents by metadata."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"Data"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"UpstashVectorStore"}),(0,n.jsx)(r.td,{children:"An Upstash vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"vectara",children:"Vectara"}),"\n",(0,n.jsxs)(r.p,{children:["This component creates a Vectara vector store with search capabilities.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.vectara.com/docs/",children:"Vectara documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vectara_customer_id"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The Vectara customer ID."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vectara_corpus_id"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The Vectara corpus ID."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vectara_api_key"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The Vectara API key."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding function to use (optional)."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"ingest_data"}),(0,n.jsx)(r.td,{children:"List[Document/Data]"}),(0,n.jsx)(r.td,{children:"The data to be ingested into the vector store."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_query"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The query for similarity search."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"number_of_results"}),(0,n.jsx)(r.td,{children:"Integer"}),(0,n.jsx)(r.td,{children:"The number of results to return in search."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"VectaraVectorStore"}),(0,n.jsx)(r.td,{children:"Vectara vector store instance."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_results"}),(0,n.jsx)(r.td,{children:"List[Data]"}),(0,n.jsxs)(r.td,{children:["The results of the similarity search as a list of ",(0,n.jsx)(r.a,{href:"/data-types#data",children:"Data"})," objects."]})]})]})]})]}),"\n",(0,n.jsx)(r.h2,{id:"vectara-rag",children:"Vectara RAG"}),"\n",(0,n.jsxs)(r.p,{children:["This component enabled Vectara's full end-to-end RAG capabilities with reranking options.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://docs.vectara.com/docs/",children:"Vectara documentation"}),"."]}),"\n",(0,n.jsx)(r.h2,{id:"weaviate",children:"Weaviate"}),"\n",(0,n.jsxs)(r.p,{children:["This component facilitates a Weaviate vector store setup, optimizing text and document indexing and retrieval.\nFor more information, see the ",(0,n.jsx)(r.a,{href:"https://weaviate.io/developers/weaviate",children:"Weaviate Documentation"}),"."]}),"\n",(0,n.jsxs)(s,{children:[(0,n.jsx)("summary",{children:"Parameters"}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Inputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsxs)(r.tbody,{children:[(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"weaviate_url"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The default instance URL."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"search_by_text"}),(0,n.jsx)(r.td,{children:"Boolean"}),(0,n.jsx)(r.td,{children:"Indicates whether to search by text."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"api_key"}),(0,n.jsx)(r.td,{children:"SecretString"}),(0,n.jsx)(r.td,{children:"The optional API key for authentication."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"index_name"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The optional index name."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"text_key"}),(0,n.jsx)(r.td,{children:"String"}),(0,n.jsx)(r.td,{children:"The default text extraction key."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"input"}),(0,n.jsx)(r.td,{children:"Document"}),(0,n.jsx)(r.td,{children:"The document or record."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"embedding"}),(0,n.jsx)(r.td,{children:"Embeddings"}),(0,n.jsx)(r.td,{children:"The embedding model used."})]}),(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"attributes"}),(0,n.jsx)(r.td,{children:"List[String]"}),(0,n.jsx)(r.td,{children:"Optional additional attributes."})]})]})]}),(0,n.jsx)(r.p,{children:(0,n.jsx)(r.strong,{children:"Outputs"})}),(0,n.jsxs)(r.table,{children:[(0,n.jsx)(r.thead,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.th,{children:"Name"}),(0,n.jsx)(r.th,{children:"Type"}),(0,n.jsx)(r.th,{children:"Description"})]})}),(0,n.jsx)(r.tbody,{children:(0,n.jsxs)(r.tr,{children:[(0,n.jsx)(r.td,{children:"vector_store"}),(0,n.jsx)(r.td,{children:"WeaviateVectorStore"}),(0,n.jsx)(r.td,{children:"The Weaviate vector store instance."})]})})]})]})]})}function u(e={}){const{wrapper:r}={...(0,d.R)(),...e.components};return r?(0,n.jsx)(r,{...e,children:(0,n.jsx)(m,{...e})}):m(e)}function p(e,r){throw new Error("Expected "+(r?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},17886:(e,r,t)=>{t.d(r,{A:()=>d});t(96540);var s=t(64058),n=t(74848);function d({name:e,...r}){const t=s[e];return t?(0,n.jsx)(t,{...r}):null}},42638:(e,r,t)=>{t.d(r,{A:()=>s});const s=t.p+"assets/images/component-hcd-example-flow-b82057600ce5e9e4a0f7ea0a61dcbf7f.png"},60159:(e,r,t)=>{t.d(r,{A:()=>s});const s=t.p+"assets/images/component-local-db-5ba34611640c3e325d9dd3cdcb591d1f.png"},67719:(e,r,t)=>{t.d(r,{A:()=>s});const s=t.p+"assets/images/vector-store-retrieval-af7257d77ff0259ab1a0980641d464ce.png"},88690:(e,r,t)=>{t.d(r,{A:()=>s});const s=t.p+"assets/images/component-chroma-db-b69a08e861be3451fe6f2992e203f516.png"}}]); \ No newline at end of file diff --git a/assets/js/e1a0f423.a52f998f.js b/assets/js/e1a0f423.93ae2054.js similarity index 88% rename from assets/js/e1a0f423.a52f998f.js rename to assets/js/e1a0f423.93ae2054.js index 3636c9ba1a..867940a862 100644 --- a/assets/js/e1a0f423.a52f998f.js +++ b/assets/js/e1a0f423.93ae2054.js @@ -1 +1 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[4341],{11470:(e,n,o)=>{o.d(n,{A:()=>j});var t=o(96540),s=o(18215),l=o(23104),r=o(56347),i=o(205),a=o(57485),c=o(31682),d=o(70679);function u(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:o}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:o,default:t}})=>({value:e,label:n,attributes:o,default:t}))}(o);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,o])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const o=(0,r.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,a.aZ)(s),(0,t.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(o.location.search);n.set(s,e),o.replace({...o.location,search:n.toString()})},[s,o])]}function f(e){const{defaultValue:n,queryString:o=!1,groupId:s}=e,l=h(e),[r,a]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const o=n.find(e=>e.default)??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:l})),[c,u]=g({queryString:o,groupId:s}),[f,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[o,s]=(0,d.Dv)(n);return[o,(0,t.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),w=(()=>{const e=c??f;return p({value:e,tabValues:l})?e:null})();(0,i.A)(()=>{w&&a(w)},[w]);return{selectedValue:r,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),m(e)},[u,m,l]),tabValues:l}}var m=o(92303);const w={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=o(74848);function v({className:e,block:n,selectedValue:o,selectValue:t,tabValues:r}){const i=[],{blockElementScrollPositionUntilNextRender:a}=(0,l.a_)(),c=e=>{const n=e.currentTarget,s=i.indexOf(n),l=r[s].value;l!==o&&(a(n),t(l))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const o=i.indexOf(e.currentTarget)+1;n=i[o]??i[0];break}case"ArrowLeft":{const o=i.indexOf(e.currentTarget)-1;n=i[o]??i[i.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:r.map(({value:e,label:n,attributes:t})=>(0,b.jsx)("li",{role:"tab",tabIndex:o===e?0:-1,"aria-selected":o===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:c,...t,className:(0,s.A)("tabs__item",w.tabItem,t?.className,{"tabs__item--active":o===e}),children:n??e},e))})}function x({lazy:e,children:n,selectedValue:o}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===o);return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==o}))})}function y(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",w.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(x,{...n,...e})]})}function j(e){const n=(0,m.A)();return(0,b.jsx)(y,{...e,children:u(e.children)},String(n))}},19365:(e,n,o)=>{o.d(n,{A:()=>r});o(96540);var t=o(18215);const s={tabItem:"tabItem_Ymn6"};var l=o(74848);function r({children:e,hidden:n,className:o}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,o),hidden:n,children:e})}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>i});var t=o(96540);const s={},l=t.createContext(s);function r(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(l.Provider,{value:n},e.children)}},91724:(e,n,o)=>{o.r(n),o.d(n,{CH:()=>d,assets:()=>c,chCodeConfig:()=>u,contentTitle:()=>a,default:()=>g,frontMatter:()=>i,metadata:()=>t,toc:()=>h});const t=JSON.parse('{"id":"Support/troubleshooting","title":"Troubleshoot Langflow","description":"This page provides troubleshooting advice for issues you might encounter when using Langflow or contributing to Langflow.","source":"@site/docs/Support/troubleshooting.mdx","sourceDirName":"Support","slug":"/troubleshoot","permalink":"/troubleshoot","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Troubleshoot Langflow","slug":"/troubleshoot"},"sidebar":"docs","previous":{"title":"Release notes","permalink":"/release-notes"},"next":{"title":"Get help and request enhancements","permalink":"/contributing-github-issues"}}');var s=o(74848),l=o(28453),r=o(24754);o(11470),o(19365);const i={title:"Troubleshoot Langflow",slug:"/troubleshoot"},a=void 0,c={},d={annotations:r.hk,Code:r.Cy},u={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},h=[{value:"Missing components",id:"missing-components",level:2},{value:"No input in the Playground",id:"no-input-in-the-playground",level:2},{value:"Missing key, no key found, or invalid API key",id:"missing-key-no-key-found-or-invalid-api-key",level:2},{value:"Langflow installation issues",id:"langflow-installation-issues",level:2},{value:"Langflow installation freezes at pip dependency resolution",id:"langflow-installation-freezes-at-pip-dependency-resolution",level:3},{value:"Linux installation fails to build required package",id:"linux-installation-fails-to-build-required-package",level:3},{value:"Installation failure from webrtcvad package",id:"installation-failure-from-webrtcvad-package",level:3},{value:"C++ build tools required for Langflow Desktop on Windows",id:"c-build-tools-required-for-langflow-desktop-on-windows",level:3},{value:"Langflow startup issues",id:"langflow-startup-issues",level:2},{value:"No langflow.__main__ module",id:"no-langflow__main__-module",level:3},{value:"Langflow runTraceback",id:"langflow-runtraceback",level:3},{value:"Environment variables not available from terminal",id:"environment-variables-not-available-from-terminal",level:3},{value:"Package is not installed",id:"package-is-not-installed",level:3},{value:"Langflow upgrade issues",id:"langflow-upgrade-issues",level:2},{value:"Something went wrong running migrations",id:"something-went-wrong-running-migrations",level:3},{value:"Langflow uninstall issues",id:"langflow-uninstall-issues",level:2},{value:"Dot directory isn't deleted when uninstalling Langflow Desktop on macOS",id:"dot-directory-isnt-deleted-when-uninstalling-langflow-desktop-on-macos",level:3},{value:"MCP server issues",id:"mcp-server-issues",level:2},{value:"Custom components and integrations issues",id:"custom-components-and-integrations-issues",level:2},{value:"See also",id:"see-also",level:2}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return d||f("CH",!1),d.Code||f("CH.Code",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(n.p,{children:"This page provides troubleshooting advice for issues you might encounter when using Langflow or contributing to Langflow."}),"\n",(0,s.jsx)(n.h2,{id:"missing-components",children:"Missing components"}),"\n",(0,s.jsx)(n.p,{children:"As Langflow development continues, components are often recategorized or deprecated for better alignment or to prepare for new components."}),"\n",(0,s.jsxs)(n.p,{children:["If a component appears to be missing from the expected location on the ",(0,s.jsx)(n.strong,{children:"Components"})," menu, try the following:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Search for the component or check other component categories, including ",(0,s.jsx)(n.a,{href:"/components-bundle-components",children:"bundles"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/concepts-components#component-menus",children:"Expose legacy components"}),", which are hidden by default."]}),"\n",(0,s.jsxs)(n.li,{children:["Check the ",(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/langflow/releases/latest",children:"Changelog"})," for component changes in recent releases."]}),"\n",(0,s.jsx)(n.li,{children:"Make sure the component isn't already present in your flow if it is a single-use component."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If you still cannot locate the component, see ",(0,s.jsx)(n.a,{href:"/contributing-github-issues",children:"Langflow GitHub Issues and Discussions"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"no-input-in-the-playground",children:"No input in the Playground"}),"\n",(0,s.jsxs)(n.p,{children:["If there is no message input field in the ",(0,s.jsx)(n.strong,{children:"Playground"}),", make sure your flow has a ",(0,s.jsxs)(n.a,{href:"/components-io#chat-io",children:[(0,s.jsx)(n.strong,{children:"Chat Input"})," component"]})," that is connected, directly or indirectly, to the ",(0,s.jsx)(n.strong,{children:"Input"})," port of a ",(0,s.jsx)(n.strong,{children:"Language Model"})," or ",(0,s.jsx)(n.strong,{children:"Agent"})," component."]}),"\n",(0,s.jsxs)(n.p,{children:["Because the ",(0,s.jsx)(n.strong,{children:"Playground"})," is designed for flows that use an LLM in a query-and-response format, such as chatbots and agents, a flow must have ",(0,s.jsx)(n.strong,{children:"Chat Input"}),", ",(0,s.jsx)(n.strong,{children:"Language Model"}),"/",(0,s.jsx)(n.strong,{children:"Agent"}),", and ",(0,s.jsx)(n.strong,{children:"Chat Output"})," components to be fully supported by the ",(0,s.jsx)(n.strong,{children:"Playground"})," chat interface."]}),"\n",(0,s.jsxs)(n.p,{children:["For more information, see ",(0,s.jsx)(n.a,{href:"/concepts-playground",children:"Test flows in the Playground"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"missing-key-no-key-found-or-invalid-api-key",children:"Missing key, no key found, or invalid API key"}),"\n",(0,s.jsx)(n.p,{children:"If you get an API key error when running a flow, try the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For all components that require credentials, make sure those components have a valid credential in the component's settings, such as the ",(0,s.jsx)(n.strong,{children:"API Key"})," field."]}),"\n",(0,s.jsxs)(n.li,{children:["If you store your credentials in ",(0,s.jsx)(n.a,{href:"/configuration-global-variables",children:"Langflow global variables"}),", make sure you selected the correct global variable and that the variable contains a valid credential."]}),"\n",(0,s.jsx)(n.li,{children:"Make sure the provided credentials are active, have the required permissions, and, if applicable, have sufficient funds in the account to execute the required action. For example, model providers require credits to use their LLMs."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-installation-issues",children:"Langflow installation issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when installing Langflow."}),"\n",(0,s.jsx)(n.h3,{id:"langflow-installation-freezes-at-pip-dependency-resolution",children:"Langflow installation freezes at pip dependency resolution"}),"\n",(0,s.jsxs)(n.p,{children:["Installing Langflow OSS with ",(0,s.jsx)(n.code,{children:"pip install langflow"})," slowly fails with this error message:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"pip is looking at multiple versions of <> to determine which version is compatible with other requirements. This could take a while.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["To work around this issue, install Langflow with ",(0,s.jsx)(n.code,{children:"uv"})," instead of ",(0,s.jsx)(n.code,{children:"pip"}),", as explained in ",(0,s.jsx)(n.a,{href:"/get-started-installation#install-and-run-the-langflow-oss-python-package",children:"Install and run the Langflow OSS Python package"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"linux-installation-fails-to-build-required-package",children:"Linux installation fails to build required package"}),"\n",(0,s.jsx)(n.p,{children:"When you try to install Langflow OSS on Linux, installation fails because of outdated or missing packages:"}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Resolved ",props:{style:{color:"#FFA657"}}},{content:"455 ",props:{style:{color:"#79C0FF"}}},{content:"packages in ",props:{style:{color:"#A5D6FF"}}},{content:"18.92s",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" \xd7 ",props:{style:{color:"#FFA657"}}},{content:"Failed to build `",props:{style:{color:"#A5D6FF"}}},{content:"webrtcvad",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#A5D6FF"}}},{content:"2.0.10",props:{style:{color:"#79C0FF"}}},{content:"`",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" \u251c\u2500\u25b6",props:{style:{color:"#FFA657"}}},{content:" The build backend returned an error",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" \u2570\u2500\u25b6",props:{style:{color:"#FFA657"}}},{content:" Call to `setuptools.build_meta:__legacy__.build_wheel` ",props:{style:{color:"#A5D6FF"}}},{content:"failed",props:{style:{color:"#FFA657"}}},{content:" (exit status: ",props:{style:{color:"#A5D6FF"}}},{content:"1",props:{style:{color:"#79C0FF"}}},{content:")",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"To resolve this error, install the required build dependencies, and then retry the Langflow installation:"}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sudo ",props:{style:{color:"#FFA657"}}},{content:"apt-get update",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"sudo ",props:{style:{color:"#FFA657"}}},{content:"apt-get install build-essential python3-dev",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["If upgrading your packages doesn't fix the issue, install ",(0,s.jsx)(n.code,{children:"gcc"})," separately, and then retry the Langflow installation:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sudo ",props:{style:{color:"#FFA657"}}},{content:"apt-get install gcc",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsxs)(n.h3,{id:"installation-failure-from-webrtcvad-package",children:["Installation failure from ",(0,s.jsx)(n.code,{children:"webrtcvad"})," package"]}),"\n",(0,s.jsxs)(n.p,{children:["If you experience an error from the ",(0,s.jsx)(n.code,{children:"webrtcvad"})," package, run ",(0,s.jsx)(n.code,{children:"uv pip install webrtcvad-wheels"})," in your virtual environment, and then retry the Langflow installation."]}),"\n",(0,s.jsx)(n.h3,{id:"c-build-tools-required-for-langflow-desktop-on-windows",children:"C++ build tools required for Langflow Desktop on Windows"}),"\n",(0,s.jsxs)(n.p,{children:["Microsoft Windows installations of Langflow Desktop require a C++ compiler that may not be present on your system. If you receive a ",(0,s.jsx)(n.code,{children:"C++ Build Tools Required!"})," error, follow the on-screen prompt to install Microsoft C++ Build Tools, or ",(0,s.jsx)(n.a,{href:"https://visualstudio.microsoft.com/downloads/",children:"install Microsoft Visual Studio"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-startup-issues",children:"Langflow startup issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when attempting to start Langflow."}),"\n",(0,s.jsxs)(n.h3,{id:"no-langflow__main__-module",children:["No ",(0,s.jsx)(n.code,{children:"langflow.__main__"})," module"]}),"\n",(0,s.jsxs)(n.p,{children:["When you try to run Langflow with the command ",(0,s.jsx)(n.code,{children:"langflow run"}),", you encounter the following error:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:">",props:{style:{color:"#FF7B72"}}},{content:" No module named ",props:{style:{color:"#C9D1D9"}}},{content:"'langflow.__main__'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"To resolve this issue, try the following:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Run ",(0,s.jsx)(n.code,{children:"uv run langflow run"})," instead of ",(0,s.jsx)(n.code,{children:"langflow run"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["If that doesn't work, reinstall the latest Langflow version with ",(0,s.jsx)(n.code,{children:"uv pip install langflow -U"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["If that doesn't work, reinstall Langflow and its dependencies with ",(0,s.jsx)(n.code,{children:"uv pip install langflow --pre -U --force-reinstall"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-runtraceback",children:"Langflow runTraceback"}),"\n",(0,s.jsxs)(n.p,{children:["When you try to run Langflow using the command ",(0,s.jsx)(n.code,{children:"langflow run"}),", you encounter the following error:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:">",props:{style:{color:"#FF7B72"}}},{content:" langflow runTraceback (",props:{style:{color:"#C9D1D9"}}},{content:"most ",props:{style:{color:"#FFA657"}}},{content:"recent call last",props:{style:{color:"#A5D6FF"}}},{content:"): File ",props:{style:{color:"#C9D1D9"}}},{content:'".../langflow"',props:{style:{color:"#A5D6FF"}}},{content:", line 5, ",props:{style:{color:"#C9D1D9"}}},{content:"in <",props:{style:{color:"#FF7B72"}}},{content:"module",props:{style:{color:"#C9D1D9"}}},{content:">",props:{style:{color:"#FF7B72"}}},{content:" from langflow.__main__ import mainModuleNotFoundError: No module named ",props:{style:{color:"#C9D1D9"}}},{content:"'langflow.__main__'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"There are two possible reasons for this error:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Multiple Langflow installations"}),": You installed Langflow using ",(0,s.jsx)(n.code,{children:"pip install langflow"})," but you already had a previous version of Langflow installed in your system. In this case, you might be running the wrong executable."]}),"\n",(0,s.jsxs)(n.p,{children:["To solve this issue, run the correct executable by running ",(0,s.jsx)(n.code,{children:"python -m langflow run"})," instead of ",(0,s.jsx)(n.code,{children:"langflow run"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If that doesn't work, try uninstalling and reinstalling Langflow with ",(0,s.jsx)(n.code,{children:"uv pip install langflow --pre -U"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Version conflict during installation"}),": Some version conflicts might have occurred during the installation process. To resolve this issue, reinstall Langflow and its dependencies by running ",(0,s.jsx)(n.code,{children:"python -m pip install langflow --pre -U --force-reinstall"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"environment-variables-not-available-from-terminal",children:"Environment variables not available from terminal"}),"\n",(0,s.jsxs)(n.p,{children:["Environment variables set in your terminal aren't automatically available to GUI-based applications like Langflow Desktop when launched through the Finder or the Start Menu.\nTo set environment variables for Langflow Desktop, see ",(0,s.jsx)(n.a,{href:"/environment-variables#set-environment-variables-for-langflow-desktop",children:"Set environment variables for Langflow Desktop"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"package-is-not-installed",children:"Package is not installed"}),"\n",(0,s.jsx)(n.p,{children:"In Langflow OSS, you can follow the error message's instructions to install the missing dependency."}),"\n",(0,s.jsxs)(n.p,{children:["To manage dependencies in Langflow Desktop, see ",(0,s.jsx)(n.a,{href:"/install-custom-dependencies#langflow-desktop",children:"Install custom dependencies in Langflow Desktop"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-upgrade-issues",children:"Langflow upgrade issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when upgrading your Langflow version."}),"\n",(0,s.jsxs)(n.p,{children:["For information about managing Langflow versions, see ",(0,s.jsx)(n.a,{href:"/get-started-installation",children:"Install Langflow"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"something-went-wrong-running-migrations",children:"Something went wrong running migrations"}),"\n",(0,s.jsxs)(n.p,{children:["The following error can occur during Langflow upgrades when the new version can't override ",(0,s.jsx)(n.code,{children:"langflow-pre.db"})," in the Langflow cache folder:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:">",props:{style:{color:"#FF7B72"}}},{content:" Something went wrong running migrations. Please, run ",props:{style:{color:"#C9D1D9"}}},{content:"'langflow migration --fix'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["To resolve this error, clear the cache by deleting the contents of your Langflow cache folder.\nThe filepath depends on your operating system, installation type, and configuration options.\nFor more information and default filepaths, see ",(0,s.jsx)(n.a,{href:"/memory#flow-storage-and-logs",children:"Memory management options"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"important",children:(0,s.jsx)(n.p,{children:"Clearing the cache erases your settings.\nIf you want to retain your settings files, create a backup of those files before clearing the cache folder."})}),"\n",(0,s.jsx)(n.h2,{id:"langflow-uninstall-issues",children:"Langflow uninstall issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when uninstalling Langflow."}),"\n",(0,s.jsx)(n.h3,{id:"dot-directory-isnt-deleted-when-uninstalling-langflow-desktop-on-macos",children:"Dot directory isn't deleted when uninstalling Langflow Desktop on macOS"}),"\n",(0,s.jsxs)(n.p,{children:["On macOS, uninstalling Langflow Desktop deletes the ",(0,s.jsx)(n.code,{children:".app"})," file but doesn't delete files in ",(0,s.jsx)(n.code,{children:"~/.langflow"}),", which includes files generated during usage like cache and settings."]}),"\n",(0,s.jsx)(n.p,{children:"If you reinstall Langflow Desktop, it starts with the existing data from the previous installation."}),"\n",(0,s.jsxs)(n.p,{children:["To fully remove a Langflow Desktop macOS installation, you must also delete ",(0,s.jsx)(n.code,{children:"~/.langflow"}),":"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"rm ",props:{style:{color:"#FFA657"}}},{content:"-rf ",props:{style:{color:"#79C0FF"}}},{content:".langflow",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.h2,{id:"mcp-server-issues",children:"MCP server issues"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/mcp-server#test-and-debug-flows",children:"Use MCP Inspector to test and debug flows"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/mcp-server#troubleshooting-mcp-server",children:"Troubleshooting MCP server"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"custom-components-and-integrations-issues",children:"Custom components and integrations issues"}),"\n",(0,s.jsx)(n.p,{children:"For troubleshooting advice for a third-party integration, see the information about that integration in the Langflow documentation and the provider's documentation."}),"\n",(0,s.jsxs)(n.p,{children:["If you are building a custom component, see ",(0,s.jsx)(n.a,{href:"/components-custom-components#error-handling-and-logging",children:"Error handling and logging for custom Python components"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/contributing-github-issues",children:"Langflow GitHub Issues and Discussions"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/contributing-telemetry",children:"Langflow telemetry"})}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}function f(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[4341],{11470:(e,n,o)=>{o.d(n,{A:()=>j});var t=o(96540),s=o(18215),l=o(23104),r=o(56347),i=o(205),a=o(57485),c=o(31682),d=o(70679);function u(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:o}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:o,default:t}})=>({value:e,label:n,attributes:o,default:t}))}(o);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,o])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const o=(0,r.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,a.aZ)(s),(0,t.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(o.location.search);n.set(s,e),o.replace({...o.location,search:n.toString()})},[s,o])]}function f(e){const{defaultValue:n,queryString:o=!1,groupId:s}=e,l=h(e),[r,a]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const o=n.find(e=>e.default)??n[0];if(!o)throw new Error("Unexpected error: 0 tabValues");return o.value}({defaultValue:n,tabValues:l})),[c,u]=g({queryString:o,groupId:s}),[f,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[o,s]=(0,d.Dv)(n);return[o,(0,t.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),w=(()=>{const e=c??f;return p({value:e,tabValues:l})?e:null})();(0,i.A)(()=>{w&&a(w)},[w]);return{selectedValue:r,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);a(e),u(e),m(e)},[u,m,l]),tabValues:l}}var m=o(92303);const w={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var b=o(74848);function v({className:e,block:n,selectedValue:o,selectValue:t,tabValues:r}){const i=[],{blockElementScrollPositionUntilNextRender:a}=(0,l.a_)(),c=e=>{const n=e.currentTarget,s=i.indexOf(n),l=r[s].value;l!==o&&(a(n),t(l))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const o=i.indexOf(e.currentTarget)+1;n=i[o]??i[0];break}case"ArrowLeft":{const o=i.indexOf(e.currentTarget)-1;n=i[o]??i[i.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:r.map(({value:e,label:n,attributes:t})=>(0,b.jsx)("li",{role:"tab",tabIndex:o===e?0:-1,"aria-selected":o===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:c,...t,className:(0,s.A)("tabs__item",w.tabItem,t?.className,{"tabs__item--active":o===e}),children:n??e},e))})}function x({lazy:e,children:n,selectedValue:o}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===o);return e?(0,t.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==o}))})}function y(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,s.A)("tabs-container",w.tabList),children:[(0,b.jsx)(v,{...n,...e}),(0,b.jsx)(x,{...n,...e})]})}function j(e){const n=(0,m.A)();return(0,b.jsx)(y,{...e,children:u(e.children)},String(n))}},19365:(e,n,o)=>{o.d(n,{A:()=>r});o(96540);var t=o(18215);const s={tabItem:"tabItem_Ymn6"};var l=o(74848);function r({children:e,hidden:n,className:o}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(s.tabItem,o),hidden:n,children:e})}},28453:(e,n,o)=>{o.d(n,{R:()=>r,x:()=>i});var t=o(96540);const s={},l=t.createContext(s);function r(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:r(e.components),t.createElement(l.Provider,{value:n},e.children)}},91724:(e,n,o)=>{o.r(n),o.d(n,{CH:()=>d,assets:()=>c,chCodeConfig:()=>u,contentTitle:()=>a,default:()=>g,frontMatter:()=>i,metadata:()=>t,toc:()=>h});const t=JSON.parse('{"id":"Support/troubleshooting","title":"Troubleshoot Langflow","description":"This page provides troubleshooting advice for issues you might encounter when using Langflow or contributing to Langflow.","source":"@site/docs/Support/troubleshooting.mdx","sourceDirName":"Support","slug":"/troubleshoot","permalink":"/troubleshoot","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Troubleshoot Langflow","slug":"/troubleshoot"},"sidebar":"docs","previous":{"title":"Release notes","permalink":"/release-notes"},"next":{"title":"Get help and request enhancements","permalink":"/contributing-github-issues"}}');var s=o(74848),l=o(28453),r=o(24754);o(11470),o(19365);const i={title:"Troubleshoot Langflow",slug:"/troubleshoot"},a=void 0,c={},d={annotations:r.hk,Code:r.Cy},u={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},h=[{value:"Missing components",id:"missing-components",level:2},{value:"No input in the Playground",id:"no-input-in-the-playground",level:2},{value:"Missing key, no key found, or invalid API key",id:"missing-key-no-key-found-or-invalid-api-key",level:2},{value:"Langflow installation issues",id:"langflow-installation-issues",level:2},{value:"Langflow installation freezes at pip dependency resolution",id:"langflow-installation-freezes-at-pip-dependency-resolution",level:3},{value:"Linux installation fails to build required package",id:"linux-installation-fails-to-build-required-package",level:3},{value:"Installation failure from webrtcvad package",id:"installation-failure-from-webrtcvad-package",level:3},{value:"C++ build tools required for Langflow Desktop on Windows",id:"c-build-tools-required-for-langflow-desktop-on-windows",level:3},{value:"Langflow startup issues",id:"langflow-startup-issues",level:2},{value:"No langflow.__main__ module",id:"no-langflow__main__-module",level:3},{value:"Langflow runTraceback",id:"langflow-runtraceback",level:3},{value:"Environment variables not available from terminal",id:"environment-variables-not-available-from-terminal",level:3},{value:"Package is not installed",id:"package-is-not-installed",level:3},{value:"Langflow upgrade issues",id:"langflow-upgrade-issues",level:2},{value:"Something went wrong running migrations",id:"something-went-wrong-running-migrations",level:3},{value:"Langflow uninstall issues",id:"langflow-uninstall-issues",level:2},{value:"Dot directory isn't deleted when uninstalling Langflow Desktop on macOS",id:"dot-directory-isnt-deleted-when-uninstalling-langflow-desktop-on-macos",level:3},{value:"MCP server issues",id:"mcp-server-issues",level:2},{value:"Custom components and integrations issues",id:"custom-components-and-integrations-issues",level:2},{value:"See also",id:"see-also",level:2}];function p(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,l.R)(),...e.components};return d||f("CH",!1),d.Code||f("CH.Code",!0),(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)("style",{dangerouslySetInnerHTML:{__html:'[data-ch-theme="github-dark"] { --ch-t-colorScheme: dark;--ch-t-foreground: #c9d1d9;--ch-t-background: #0d1117;--ch-t-lighter-inlineBackground: #0d1117e6;--ch-t-editor-background: #0d1117;--ch-t-editor-foreground: #c9d1d9;--ch-t-editor-lineHighlightBackground: #6e76811a;--ch-t-editor-rangeHighlightBackground: #ffffff0b;--ch-t-editor-infoForeground: #3794FF;--ch-t-editor-selectionBackground: #264F78;--ch-t-focusBorder: #1f6feb;--ch-t-tab-activeBackground: #0d1117;--ch-t-tab-activeForeground: #c9d1d9;--ch-t-tab-inactiveBackground: #010409;--ch-t-tab-inactiveForeground: #8b949e;--ch-t-tab-border: #30363d;--ch-t-tab-activeBorder: #0d1117;--ch-t-editorGroup-border: #30363d;--ch-t-editorGroupHeader-tabsBackground: #010409;--ch-t-editorLineNumber-foreground: #6e7681;--ch-t-input-background: #0d1117;--ch-t-input-foreground: #c9d1d9;--ch-t-input-border: #30363d;--ch-t-icon-foreground: #8b949e;--ch-t-sideBar-background: #010409;--ch-t-sideBar-foreground: #c9d1d9;--ch-t-sideBar-border: #30363d;--ch-t-list-activeSelectionBackground: #6e768166;--ch-t-list-activeSelectionForeground: #c9d1d9;--ch-t-list-hoverBackground: #6e76811a;--ch-t-list-hoverForeground: #c9d1d9; }'}}),"\n","\n",(0,s.jsx)(n.p,{children:"This page provides troubleshooting advice for issues you might encounter when using Langflow or contributing to Langflow."}),"\n",(0,s.jsx)(n.h2,{id:"missing-components",children:"Missing components"}),"\n",(0,s.jsx)(n.p,{children:"As Langflow development continues, components are often recategorized or deprecated for better alignment or to prepare for new components."}),"\n",(0,s.jsxs)(n.p,{children:["If a component appears to be missing from the expected location on the ",(0,s.jsx)(n.strong,{children:"Components"})," menu, try the following:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Search for the component or check other component categories, including ",(0,s.jsx)(n.a,{href:"/components-bundle-components",children:"bundles"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/concepts-components#component-menus",children:"Expose legacy components"}),", which are hidden by default."]}),"\n",(0,s.jsxs)(n.li,{children:["Check the ",(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/langflow/releases/latest",children:"Changelog"})," for component changes in recent releases."]}),"\n",(0,s.jsx)(n.li,{children:"Make sure the component isn't already present in your flow if it is a single-use component."}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["If you still cannot locate the component, see ",(0,s.jsx)(n.a,{href:"/contributing-github-issues",children:"Langflow GitHub Issues and Discussions"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"no-input-in-the-playground",children:"No input in the Playground"}),"\n",(0,s.jsxs)(n.p,{children:["If there is no message input field in the ",(0,s.jsx)(n.strong,{children:"Playground"}),", make sure your flow has a ",(0,s.jsxs)(n.a,{href:"/components-io#chat-io",children:[(0,s.jsx)(n.strong,{children:"Chat Input"})," component"]})," that is connected, directly or indirectly, to the ",(0,s.jsx)(n.strong,{children:"Input"})," port of a ",(0,s.jsx)(n.strong,{children:"Language Model"})," or ",(0,s.jsx)(n.strong,{children:"Agent"})," component."]}),"\n",(0,s.jsxs)(n.p,{children:["Because the ",(0,s.jsx)(n.strong,{children:"Playground"})," is designed for flows that use an LLM in a query-and-response format, such as chatbots and agents, a flow must have ",(0,s.jsx)(n.strong,{children:"Chat Input"}),", ",(0,s.jsx)(n.strong,{children:"Language Model"}),"/",(0,s.jsx)(n.strong,{children:"Agent"}),", and ",(0,s.jsx)(n.strong,{children:"Chat Output"})," components to be fully supported by the ",(0,s.jsx)(n.strong,{children:"Playground"})," chat interface."]}),"\n",(0,s.jsxs)(n.p,{children:["For more information, see ",(0,s.jsx)(n.a,{href:"/concepts-playground",children:"Test flows in the Playground"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"missing-key-no-key-found-or-invalid-api-key",children:"Missing key, no key found, or invalid API key"}),"\n",(0,s.jsx)(n.p,{children:"If you get an API key error when running a flow, try the following:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For all components that require credentials, make sure those components have a valid credential in the component's settings, such as the ",(0,s.jsx)(n.strong,{children:"API Key"})," field."]}),"\n",(0,s.jsxs)(n.li,{children:["If you store your credentials in ",(0,s.jsx)(n.a,{href:"/configuration-global-variables",children:"Langflow global variables"}),", make sure you selected the correct global variable and that the variable contains a valid credential."]}),"\n",(0,s.jsx)(n.li,{children:"Make sure the provided credentials are active, have the required permissions, and, if applicable, have sufficient funds in the account to execute the required action. For example, model providers require credits to use their LLMs."}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-installation-issues",children:"Langflow installation issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when installing Langflow."}),"\n",(0,s.jsx)(n.h3,{id:"langflow-installation-freezes-at-pip-dependency-resolution",children:"Langflow installation freezes at pip dependency resolution"}),"\n",(0,s.jsxs)(n.p,{children:["Installing Langflow OSS with ",(0,s.jsx)(n.code,{children:"pip install langflow"})," slowly fails with this error message:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"pip is looking at multiple versions of <> to determine which version is compatible with other requirements. This could take a while.",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["To work around this issue, install Langflow with ",(0,s.jsx)(n.code,{children:"uv"})," instead of ",(0,s.jsx)(n.code,{children:"pip"}),", as explained in ",(0,s.jsx)(n.a,{href:"/get-started-installation#install-and-run-the-langflow-oss-python-package",children:"Install and run the Langflow OSS Python package"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"linux-installation-fails-to-build-required-package",children:"Linux installation fails to build required package"}),"\n",(0,s.jsx)(n.p,{children:"When you try to install Langflow OSS on Linux, installation fails because of outdated or missing packages:"}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"Resolved ",props:{style:{color:"#FFA657"}}},{content:"455 ",props:{style:{color:"#79C0FF"}}},{content:"packages in ",props:{style:{color:"#A5D6FF"}}},{content:"18.92s",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:" \xd7 ",props:{style:{color:"#FFA657"}}},{content:"Failed to build `",props:{style:{color:"#A5D6FF"}}},{content:"webrtcvad",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"=",props:{style:{color:"#A5D6FF"}}},{content:"2.0.10",props:{style:{color:"#79C0FF"}}},{content:"`",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" \u251c\u2500\u25b6",props:{style:{color:"#FFA657"}}},{content:" The build backend returned an error",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" \u2570\u2500\u25b6",props:{style:{color:"#FFA657"}}},{content:" Call to `setuptools.build_meta:__legacy__.build_wheel` ",props:{style:{color:"#A5D6FF"}}},{content:"failed",props:{style:{color:"#FFA657"}}},{content:" (exit status: ",props:{style:{color:"#A5D6FF"}}},{content:"1",props:{style:{color:"#79C0FF"}}},{content:")",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"To resolve this error, install the required build dependencies, and then retry the Langflow installation:"}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sudo ",props:{style:{color:"#FFA657"}}},{content:"apt-get update",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"sudo ",props:{style:{color:"#FFA657"}}},{content:"apt-get install build-essential python3-dev",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["If upgrading your packages doesn't fix the issue, install ",(0,s.jsx)(n.code,{children:"gcc"})," separately, and then retry the Langflow installation:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"sudo ",props:{style:{color:"#FFA657"}}},{content:"apt-get install gcc",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsxs)(n.h3,{id:"installation-failure-from-webrtcvad-package",children:["Installation failure from ",(0,s.jsx)(n.code,{children:"webrtcvad"})," package"]}),"\n",(0,s.jsxs)(n.p,{children:["If you experience an error from the ",(0,s.jsx)(n.code,{children:"webrtcvad"})," package, run ",(0,s.jsx)(n.code,{children:"uv pip install webrtcvad-wheels"})," in your virtual environment, and then retry the Langflow installation."]}),"\n",(0,s.jsx)(n.h3,{id:"c-build-tools-required-for-langflow-desktop-on-windows",children:"C++ build tools required for Langflow Desktop on Windows"}),"\n",(0,s.jsxs)(n.p,{children:["Microsoft Windows installations of Langflow Desktop require a C++ compiler that may not be present on your system. If you receive a ",(0,s.jsx)(n.code,{children:"C++ Build Tools Required!"})," error, follow the on-screen prompt to install Microsoft C++ Build Tools, or ",(0,s.jsx)(n.a,{href:"https://visualstudio.microsoft.com/downloads/",children:"install Microsoft Visual Studio"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-startup-issues",children:"Langflow startup issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when attempting to start Langflow."}),"\n",(0,s.jsxs)(n.h3,{id:"no-langflow__main__-module",children:["No ",(0,s.jsx)(n.code,{children:"langflow.__main__"})," module"]}),"\n",(0,s.jsxs)(n.p,{children:["When you try to run Langflow with the command ",(0,s.jsx)(n.code,{children:"langflow run"}),", you encounter the following error:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:">",props:{style:{color:"#FF7B72"}}},{content:" No module named ",props:{style:{color:"#C9D1D9"}}},{content:"'langflow.__main__'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"To resolve this issue, try the following:"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["Run ",(0,s.jsx)(n.code,{children:"uv run langflow run"})," instead of ",(0,s.jsx)(n.code,{children:"langflow run"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["If that doesn't work, reinstall the latest Langflow version with ",(0,s.jsx)(n.code,{children:"uv pip install langflow -U"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["If that doesn't work, reinstall Langflow and its dependencies with ",(0,s.jsx)(n.code,{children:"uv pip install langflow --pre -U --force-reinstall"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"langflow-runtraceback",children:"Langflow runTraceback"}),"\n",(0,s.jsxs)(n.p,{children:["When you try to run Langflow using the command ",(0,s.jsx)(n.code,{children:"langflow run"}),", you encounter the following error:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:">",props:{style:{color:"#FF7B72"}}},{content:" langflow runTraceback (",props:{style:{color:"#C9D1D9"}}},{content:"most ",props:{style:{color:"#FFA657"}}},{content:"recent call last",props:{style:{color:"#A5D6FF"}}},{content:"): File ",props:{style:{color:"#C9D1D9"}}},{content:'".../langflow"',props:{style:{color:"#A5D6FF"}}},{content:", line 5, ",props:{style:{color:"#C9D1D9"}}},{content:"in <",props:{style:{color:"#FF7B72"}}},{content:"module",props:{style:{color:"#C9D1D9"}}},{content:">",props:{style:{color:"#FF7B72"}}},{content:" from langflow.__main__ import mainModuleNotFoundError: No module named ",props:{style:{color:"#C9D1D9"}}},{content:"'langflow.__main__'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.p,{children:"There are two possible reasons for this error:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Multiple Langflow installations"}),": You installed Langflow using ",(0,s.jsx)(n.code,{children:"pip install langflow"})," but you already had a previous version of Langflow installed in your system. In this case, you might be running the wrong executable."]}),"\n",(0,s.jsxs)(n.p,{children:["To solve this issue, run the correct executable by running ",(0,s.jsx)(n.code,{children:"python -m langflow run"})," instead of ",(0,s.jsx)(n.code,{children:"langflow run"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If that doesn't work, try uninstalling and reinstalling Langflow with ",(0,s.jsx)(n.code,{children:"uv pip install langflow --pre -U"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Version conflict during installation"}),": Some version conflicts might have occurred during the installation process. To resolve this issue, reinstall Langflow and its dependencies by running ",(0,s.jsx)(n.code,{children:"python -m pip install langflow --pre -U --force-reinstall"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"environment-variables-not-available-from-terminal",children:"Environment variables not available from terminal"}),"\n",(0,s.jsxs)(n.p,{children:["Environment variables set in your terminal aren't automatically available to GUI-based applications like Langflow Desktop when launched through the Finder or the Start Menu.\nTo set environment variables for Langflow Desktop, see ",(0,s.jsx)(n.a,{href:"/environment-variables#set-environment-variables-for-langflow-desktop",children:"Set environment variables for Langflow Desktop"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"package-is-not-installed",children:"Package is not installed"}),"\n",(0,s.jsx)(n.p,{children:"In Langflow OSS, you can follow the error message's instructions to install the missing dependency."}),"\n",(0,s.jsxs)(n.p,{children:["To manage dependencies in Langflow Desktop, see ",(0,s.jsx)(n.a,{href:"/install-custom-dependencies#langflow-desktop",children:"Install custom dependencies in Langflow Desktop"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"langflow-upgrade-issues",children:"Langflow upgrade issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when upgrading your Langflow version."}),"\n",(0,s.jsxs)(n.p,{children:["For information about managing Langflow versions, see ",(0,s.jsx)(n.a,{href:"/get-started-installation",children:"Install Langflow"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"something-went-wrong-running-migrations",children:"Something went wrong running migrations"}),"\n",(0,s.jsxs)(n.p,{children:["The following error can occur during Langflow upgrades when the new version can't override ",(0,s.jsx)(n.code,{children:"langflow-pre.db"})," in the Langflow cache folder:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:">",props:{style:{color:"#FF7B72"}}},{content:" Something went wrong running migrations. Please, run ",props:{style:{color:"#C9D1D9"}}},{content:"'langflow migration --fix'",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsxs)(n.p,{children:["To resolve this error, clear the cache by deleting the contents of your Langflow cache folder.\nThe filepath depends on your operating system, installation type, and configuration options.\nFor more information and default filepaths, see ",(0,s.jsx)(n.a,{href:"/memory",children:"Memory management options"}),"."]}),"\n",(0,s.jsx)(n.admonition,{type:"important",children:(0,s.jsx)(n.p,{children:"Clearing the cache erases your settings.\nIf you want to retain your settings files, create a backup of those files before clearing the cache folder."})}),"\n",(0,s.jsx)(n.h2,{id:"langflow-uninstall-issues",children:"Langflow uninstall issues"}),"\n",(0,s.jsx)(n.p,{children:"The following issues can occur when uninstalling Langflow."}),"\n",(0,s.jsx)(n.h3,{id:"dot-directory-isnt-deleted-when-uninstalling-langflow-desktop-on-macos",children:"Dot directory isn't deleted when uninstalling Langflow Desktop on macOS"}),"\n",(0,s.jsxs)(n.p,{children:["On macOS, uninstalling Langflow Desktop deletes the ",(0,s.jsx)(n.code,{children:".app"})," file but doesn't delete files in ",(0,s.jsx)(n.code,{children:"~/.langflow"}),", which includes files generated during usage like cache and settings."]}),"\n",(0,s.jsx)(n.p,{children:"If you reinstall Langflow Desktop, it starts with the existing data from the previous installation."}),"\n",(0,s.jsxs)(n.p,{children:["To fully remove a Langflow Desktop macOS installation, you must also delete ",(0,s.jsx)(n.code,{children:"~/.langflow"}),":"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:u,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"rm ",props:{style:{color:"#FFA657"}}},{content:"-rf ",props:{style:{color:"#79C0FF"}}},{content:".langflow",props:{style:{color:"#A5D6FF"}}}]}],lang:"bash"},annotations:[]}]}),"\n",(0,s.jsx)(n.h2,{id:"mcp-server-issues",children:"MCP server issues"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/mcp-server#test-and-debug-flows",children:"Use MCP Inspector to test and debug flows"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/mcp-server#troubleshooting-mcp-server",children:"Troubleshooting MCP server"})}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"custom-components-and-integrations-issues",children:"Custom components and integrations issues"}),"\n",(0,s.jsx)(n.p,{children:"For troubleshooting advice for a third-party integration, see the information about that integration in the Langflow documentation and the provider's documentation."}),"\n",(0,s.jsxs)(n.p,{children:["If you are building a custom component, see ",(0,s.jsx)(n.a,{href:"/components-custom-components#error-handling-and-logging",children:"Error handling and logging for custom Python components"}),"."]}),"\n",(0,s.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/contributing-github-issues",children:"Langflow GitHub Issues and Discussions"})}),"\n",(0,s.jsx)(n.li,{children:(0,s.jsx)(n.a,{href:"/contributing-telemetry",children:"Langflow telemetry"})}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}function f(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}}}]); \ No newline at end of file diff --git a/assets/js/e6c6a4d2.2332c420.js b/assets/js/e6c6a4d2.6642715a.js similarity index 56% rename from assets/js/e6c6a4d2.2332c420.js rename to assets/js/e6c6a4d2.6642715a.js index 9c9ce5040b..676f94d1a0 100644 --- a/assets/js/e6c6a4d2.2332c420.js +++ b/assets/js/e6c6a4d2.6642715a.js @@ -1 +1 @@ -"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[8504],{28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var s=n(96540);const i={},o=s.createContext(i);function a(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:t},e.children)}},94910:(e,t,n)=>{n.r(t),n.d(t,{contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>r});const s=JSON.parse('{"type":"api","id":"experimental-run-flow","title":"Experimental Run Flow","description":"","slug":"/experimental-run-flow","frontMatter":{},"api":{"tags":["Base"],"description":"Executes a specified flow by ID with optional input values, output selection, tweaks, and streaming capability.\\n\\nThis endpoint supports running flows with caching to enhance performance and efficiency.\\n\\n### Parameters:\\n- `flow_id` (str): The unique identifier of the flow to be executed.\\n- `inputs` (List[InputValueRequest], optional): A list of inputs specifying the input values and components\\n for the flow. Each input can target specific components and provide custom values.\\n- `outputs` (List[str], optional): A list of output names to retrieve from the executed flow.\\n If not provided, all outputs are returned.\\n- `tweaks` (Optional[Tweaks], optional): A dictionary of tweaks to customize the flow execution.\\n The tweaks can be used to modify the flow\'s parameters and components.\\n Tweaks can be overridden by the input values.\\n- `stream` (bool, optional): Specifies whether the results should be streamed. Defaults to False.\\n- `session_id` (Union[None, str], optional): An optional session ID to utilize existing session data for the flow\\n execution.\\n- `api_key_user` (User): The user associated with the current API key. Automatically resolved from the API key.\\n\\n### Returns:\\nA `RunResponse` object containing the selected outputs (or all if not specified) of the executed flow\\nand the session ID.\\nThe structure of the response accommodates multiple inputs, providing a nested list of outputs for each input.\\n\\n### Raises:\\nHTTPException: Indicates issues with finding the specified flow, invalid input formats, or internal errors during\\nflow execution.\\n\\n### Example usage:\\n```json\\nPOST /run/flow_id\\nx-api-key: YOUR_API_KEY\\nPayload:\\n{\\n \\"inputs\\": [\\n {\\"components\\": [\\"component1\\"], \\"input_value\\": \\"value1\\"},\\n {\\"components\\": [\\"component3\\"], \\"input_value\\": \\"value2\\"}\\n ],\\n \\"outputs\\": [\\"Component Name\\", \\"component_id\\"],\\n \\"tweaks\\": {\\"parameter_name\\": \\"value\\", \\"Component Name\\": {\\"parameter_name\\": \\"value\\"}, \\"component_id\\": {\\"parameter_name\\": \\"value\\"}}\\n \\"stream\\": false\\n}\\n```\\n\\nThis endpoint facilitates complex flow executions with customized inputs, outputs, and configurations,\\ncatering to diverse application requirements.","operationId":"experimental_run_flow_api_v1_run_advanced__flow_id__post","security":[{"API key query":[]},{"API key header":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Flow Id"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"inputs":{"anyOf":[{"items":{"properties":{"components":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Components","default":[]},"input_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Value"},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"},"type":{"anyOf":[{"type":"string","enum":["chat","text","any"]},{"type":"null"}],"title":"Type","description":"Defines on which components the input value should be applied. \'any\' applies to all input components.","default":"any"}},"additionalProperties":false,"type":"object","title":"InputValueRequest","examples":[{"components":["components_id","Component Name"],"input_value":"input_value","session":"session_id"},{"components":["Component Name"],"input_value":"input_value"},{"input_value":"input_value"},{"components":["Component Name"],"input_value":"input_value","session":"session_id"},{"input_value":"input_value","session":"session_id"},{"input_value":"input_value","type":"chat"},{"input_value":"{\\"key\\": \\"value\\"}","type":"json"}]},"type":"array"},{"type":"null"}],"title":"Inputs"},"outputs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Outputs"},"tweaks":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"object"}]},"type":"object","title":"Tweaks","description":"A dictionary of tweaks to adjust the flow\'s execution. Allows customizing flow behavior dynamically. All tweaks are overridden by the input values.","examples":[{"Component Name":{"parameter_name":"value"},"component_id":{"parameter_name":"value"},"parameter_name":"value"}]},{"type":"null"}]},"stream":{"type":"boolean","title":"Stream","default":false},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"Body_experimental_run_flow_api_v1_run_advanced__flow_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"outputs":{"anyOf":[{"items":{"properties":{"inputs":{"type":"object","title":"Inputs"},"outputs":{"items":{"anyOf":[{"properties":{"results":{"anyOf":[{},{"type":"null"}],"title":"Results"},"artifacts":{"anyOf":[{},{"type":"null"}],"title":"Artifacts"},"outputs":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Outputs"},"logs":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Logs"},"messages":{"anyOf":[{"items":{"properties":{"message":{"anyOf":[{"type":"string"},{"items":{"anyOf":[{"type":"string"},{"type":"object"}]},"type":"array"}],"title":"Message"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender","default":"Machine"},"sender_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Name","default":"AI"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"stream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Url"},"component_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Id"},"files":{"items":{"properties":{"path":{"type":"string","title":"Path"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"}},"type":"object","required":["path","name","type"],"title":"File","description":"File schema."},"type":"array","title":"Files","default":[]},"type":{"type":"string","title":"Type"}},"type":"object","required":["message","type"],"title":"ChatOutputResponse","description":"Chat output response schema."},"type":"array"},{"type":"null"}],"title":"Messages"},"timedelta":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timedelta"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"component_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Display Name"},"component_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Id"},"used_frozen_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Used Frozen Result","default":false}},"type":"object","title":"ResultData"},{"type":"null"}]},"type":"array","title":"Outputs"}},"type":"object","title":"RunOutputs"},"type":"array"},{"type":"null"}],"title":"Outputs","default":[]},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"RunResponse","description":"Run response schema."}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}},"method":"post","path":"/api/v1/run/advanced/{flow_id}","securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"api/v1/login"}}},"API key query":{"type":"apiKey","in":"query","name":"x-api-key"},"API key header":{"type":"apiKey","in":"header","name":"x-api-key"}},"jsonRequestBodyExample":{"stream":false},"info":{"title":"Langflow","version":"1.5.0.post1"},"postman":{"name":"Experimental Run Flow","description":{"content":"Executes a specified flow by ID with optional input values, output selection, tweaks, and streaming capability.\\n\\nThis endpoint supports running flows with caching to enhance performance and efficiency.\\n\\n### Parameters:\\n- `flow_id` (str): The unique identifier of the flow to be executed.\\n- `inputs` (List[InputValueRequest], optional): A list of inputs specifying the input values and components\\n for the flow. Each input can target specific components and provide custom values.\\n- `outputs` (List[str], optional): A list of output names to retrieve from the executed flow.\\n If not provided, all outputs are returned.\\n- `tweaks` (Optional[Tweaks], optional): A dictionary of tweaks to customize the flow execution.\\n The tweaks can be used to modify the flow\'s parameters and components.\\n Tweaks can be overridden by the input values.\\n- `stream` (bool, optional): Specifies whether the results should be streamed. Defaults to False.\\n- `session_id` (Union[None, str], optional): An optional session ID to utilize existing session data for the flow\\n execution.\\n- `api_key_user` (User): The user associated with the current API key. Automatically resolved from the API key.\\n\\n### Returns:\\nA `RunResponse` object containing the selected outputs (or all if not specified) of the executed flow\\nand the session ID.\\nThe structure of the response accommodates multiple inputs, providing a nested list of outputs for each input.\\n\\n### Raises:\\nHTTPException: Indicates issues with finding the specified flow, invalid input formats, or internal errors during\\nflow execution.\\n\\n### Example usage:\\n```json\\nPOST /run/flow_id\\nx-api-key: YOUR_API_KEY\\nPayload:\\n{\\n \\"inputs\\": [\\n {\\"components\\": [\\"component1\\"], \\"input_value\\": \\"value1\\"},\\n {\\"components\\": [\\"component3\\"], \\"input_value\\": \\"value2\\"}\\n ],\\n \\"outputs\\": [\\"Component Name\\", \\"component_id\\"],\\n \\"tweaks\\": {\\"parameter_name\\": \\"value\\", \\"Component Name\\": {\\"parameter_name\\": \\"value\\"}, \\"component_id\\": {\\"parameter_name\\": \\"value\\"}}\\n \\"stream\\": false\\n}\\n```\\n\\nThis endpoint facilitates complex flow executions with customized inputs, outputs, and configurations,\\ncatering to diverse application requirements.","type":"text/plain"},"url":{"path":["api","v1","run","advanced",":flow_id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"disabled":false,"description":{"content":"(Required) ","type":"text/plain"},"type":"any","value":"","key":"flow_id"}]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"{\\n \\"inputs\\": [\\n {\\n \\"components\\": [\\n \\"\\",\\n \\"\\"\\n ],\\n \\"input_value\\": \\"\\",\\n \\"session\\": \\"\\",\\n \\"type\\": \\"\\"\\n },\\n {\\n \\"components\\": [\\n \\"\\",\\n \\"\\"\\n ],\\n \\"input_value\\": \\"\\",\\n \\"session\\": \\"\\",\\n \\"type\\": \\"\\"\\n }\\n ],\\n \\"outputs\\": [\\n \\"\\",\\n \\"\\"\\n ],\\n \\"tweaks\\": {\\n \\"Excepteur4\\": \\"\\"\\n },\\n \\"stream\\": false,\\n \\"session_id\\": \\"\\"\\n}","options":{"raw":{"language":"json"}}},"auth":{"type":"apikey","apikey":[{"type":"any","value":"x-api-key","key":"key"},{"type":"any","value":"{{apiKey}}","key":"value"},{"type":"any","value":"query","key":"in"}]}}},"source":"@site/openapi.json","sourceDirName":".","permalink":"/api/experimental-run-flow","previous":{"title":"Webhook Run Flow","permalink":"/api/webhook-run-flow"},"next":{"title":"Process","permalink":"/api/process"}}');var i=n(74848),o=n(28453);const a={},l="Experimental Run Flow",r=[{value:"Parameters:",id:"parameters",level:3},{value:"Returns:",id:"returns",level:3},{value:"Raises:",id:"raises",level:3},{value:"Example usage:",id:"example-usage",level:3}];function p(e){const t={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"experimental-run-flow",children:"Experimental Run Flow"})}),"\n",(0,i.jsx)(t.p,{children:"Executes a specified flow by ID with optional input values, output selection, tweaks, and streaming capability."}),"\n",(0,i.jsx)(t.p,{children:"This endpoint supports running flows with caching to enhance performance and efficiency."}),"\n",(0,i.jsx)(t.h3,{id:"parameters",children:"Parameters:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"flow_id"})," (str): The unique identifier of the flow to be executed."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"inputs"})," (List[InputValueRequest], optional): A list of inputs specifying the input values and components\nfor the flow. Each input can target specific components and provide custom values."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"outputs"})," (List[str], optional): A list of output names to retrieve from the executed flow.\nIf not provided, all outputs are returned."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"tweaks"})," (Optional[Tweaks], optional): A dictionary of tweaks to customize the flow execution.\nThe tweaks can be used to modify the flow's parameters and components.\nTweaks can be overridden by the input values."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"stream"})," (bool, optional): Specifies whether the results should be streamed. Defaults to False."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"session_id"})," (Union[None, str], optional): An optional session ID to utilize existing session data for the flow\nexecution."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"api_key_user"})," (User): The user associated with the current API key. Automatically resolved from the API key."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"returns",children:"Returns:"}),"\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.code,{children:"RunResponse"})," object containing the selected outputs (or all if not specified) of the executed flow\nand the session ID.\nThe structure of the response accommodates multiple inputs, providing a nested list of outputs for each input."]}),"\n",(0,i.jsx)(t.h3,{id:"raises",children:"Raises:"}),"\n",(0,i.jsx)(t.p,{children:"HTTPException: Indicates issues with finding the specified flow, invalid input formats, or internal errors during\nflow execution."}),"\n",(0,i.jsx)(t.h3,{id:"example-usage",children:"Example usage:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-json",children:'POST /run/flow_id\nx-api-key: YOUR_API_KEY\nPayload:\n{\n "inputs": [\n {"components": ["component1"], "input_value": "value1"},\n {"components": ["component3"], "input_value": "value2"}\n ],\n "outputs": ["Component Name", "component_id"],\n "tweaks": {"parameter_name": "value", "Component Name": {"parameter_name": "value"}, "component_id": {"parameter_name": "value"}}\n "stream": false\n}\n'})}),"\n",(0,i.jsx)(t.p,{children:"This endpoint facilitates complex flow executions with customized inputs, outputs, and configurations,\ncatering to diverse application requirements."}),"\n",(0,i.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsx)("th",{style:{textAlign:"left"},children:"Path Parameters"})})}),(0,i.jsx)("tbody",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"flow_id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" uuid"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-required)"},children:" REQUIRED"})]})})})]}),"\n",(0,i.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("th",{style:{textAlign:"left"},children:[(0,i.jsx)("span",{children:"Request Body "}),(0,i.jsx)("div",{})]})})}),(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"inputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Inputs"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"outputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Outputs"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"tweaks"}),(0,i.jsx)("span",{style:{opacity:"0.6"}})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"stream"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Stream"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"session_id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Session Id"})]})})]})]}),"\n",(0,i.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsx)("th",{style:{textAlign:"left"},children:"Responses"})})}),(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsxs)("div",{style:{display:"flex"},children:[(0,i.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,i.jsx)("code",{children:"200"})}),(0,i.jsx)("div",{children:(0,i.jsx)(t.p,{children:"Successful Response"})})]}),(0,i.jsx)("div",{children:(0,i.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("th",{style:{textAlign:"left"},children:[(0,i.jsx)("span",{children:"Schema "}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,i.jsx)("div",{})]})})}),(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"outputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Outputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"session_id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Session Id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"})]})})]})]})})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsxs)("div",{style:{display:"flex"},children:[(0,i.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,i.jsx)("code",{children:"422"})}),(0,i.jsx)("div",{children:(0,i.jsx)(t.p,{children:"Validation Error"})})]}),(0,i.jsx)("div",{children:(0,i.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("th",{style:{textAlign:"left"},children:[(0,i.jsx)("span",{children:"Schema "}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,i.jsx)("div",{})]})})}),(0,i.jsx)("tbody",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"detail"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" object[]"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,i.jsx)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"loc"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" undefined[]"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"msg"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Message"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"type"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Error Type"})]})})]})})]})})})]})})]})})]})]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file +"use strict";(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[8504],{28453:(e,t,n)=>{n.d(t,{R:()=>a,x:()=>l});var s=n(96540);const i={},o=s.createContext(i);function a(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(o.Provider,{value:t},e.children)}},94910:(e,t,n)=>{n.r(t),n.d(t,{contentTitle:()=>l,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>r});const s=JSON.parse('{"type":"api","id":"experimental-run-flow","title":"Experimental Run Flow","description":"","slug":"/experimental-run-flow","frontMatter":{},"api":{"tags":["Base"],"description":"Executes a specified flow by ID with optional input values, output selection, tweaks, and streaming capability.\\n\\nThis endpoint supports running flows with caching to enhance performance and efficiency.\\n\\n### Parameters:\\n- `flow_id` (str): The unique identifier of the flow to be executed.\\n- `inputs` (List[InputValueRequest], optional): A list of inputs specifying the input values and components\\n for the flow. Each input can target specific components and provide custom values.\\n- `outputs` (List[str], optional): A list of output names to retrieve from the executed flow.\\n If not provided, all outputs are returned.\\n- `tweaks` (Optional[Tweaks], optional): A dictionary of tweaks to customize the flow execution.\\n The tweaks can be used to modify the flow\'s parameters and components.\\n Tweaks can be overridden by the input values.\\n- `stream` (bool, optional): Specifies whether the results should be streamed. Defaults to False.\\n- `session_id` (Union[None, str], optional): An optional session ID to utilize existing session data for the flow\\n execution.\\n- `api_key_user` (User): The user associated with the current API key. Automatically resolved from the API key.\\n\\n### Returns:\\nA `RunResponse` object containing the selected outputs (or all if not specified) of the executed flow\\nand the session ID.\\nThe structure of the response accommodates multiple inputs, providing a nested list of outputs for each input.\\n\\n### Raises:\\nHTTPException: Indicates issues with finding the specified flow, invalid input formats, or internal errors during\\nflow execution.\\n\\n### Example usage:\\n```json\\nPOST /run/flow_id\\nx-api-key: YOUR_API_KEY\\nPayload:\\n{\\n \\"inputs\\": [\\n {\\"components\\": [\\"component1\\"], \\"input_value\\": \\"value1\\"},\\n {\\"components\\": [\\"component3\\"], \\"input_value\\": \\"value2\\"}\\n ],\\n \\"outputs\\": [\\"Component Name\\", \\"component_id\\"],\\n \\"tweaks\\": {\\"parameter_name\\": \\"value\\", \\"Component Name\\": {\\"parameter_name\\": \\"value\\"}, \\"component_id\\": {\\"parameter_name\\": \\"value\\"}}\\n \\"stream\\": false\\n}\\n```\\n\\nThis endpoint facilitates complex flow executions with customized inputs, outputs, and configurations,\\ncatering to diverse application requirements.","operationId":"experimental_run_flow_api_v1_run_advanced__flow_id__post","security":[{"API key query":[]},{"API key header":[]}],"parameters":[{"name":"flow_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Flow Id"}}],"requestBody":{"content":{"application/json":{"schema":{"properties":{"inputs":{"anyOf":[{"items":{"properties":{"components":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Components","default":[]},"input_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Input Value"},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session"},"type":{"anyOf":[{"type":"string","enum":["chat","text","any"]},{"type":"null"}],"title":"Type","description":"Defines on which components the input value should be applied. \'any\' applies to all input components.","default":"any"}},"additionalProperties":false,"type":"object","title":"InputValueRequest","examples":[{"components":["components_id","Component Name"],"input_value":"input_value","session":"session_id"},{"components":["Component Name"],"input_value":"input_value"},{"input_value":"input_value"},{"components":["Component Name"],"input_value":"input_value","session":"session_id"},{"input_value":"input_value","session":"session_id"},{"input_value":"input_value","type":"chat"},{"input_value":"{\\"key\\": \\"value\\"}","type":"json"}]},"type":"array"},{"type":"null"}],"title":"Inputs"},"outputs":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Outputs"},"tweaks":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"object"}]},"type":"object","title":"Tweaks","description":"A dictionary of tweaks to adjust the flow\'s execution. Allows customizing flow behavior dynamically. All tweaks are overridden by the input values.","examples":[{"Component Name":{"parameter_name":"value"},"component_id":{"parameter_name":"value"},"parameter_name":"value"}]},{"type":"null"}]},"stream":{"type":"boolean","title":"Stream","default":false},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"Body_experimental_run_flow_api_v1_run_advanced__flow_id__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"properties":{"outputs":{"anyOf":[{"items":{"properties":{"inputs":{"type":"object","title":"Inputs"},"outputs":{"items":{"anyOf":[{"properties":{"results":{"anyOf":[{},{"type":"null"}],"title":"Results"},"artifacts":{"anyOf":[{},{"type":"null"}],"title":"Artifacts"},"outputs":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Outputs"},"logs":{"anyOf":[{"type":"object"},{"type":"null"}],"title":"Logs"},"messages":{"anyOf":[{"items":{"properties":{"message":{"anyOf":[{"type":"string"},{"items":{"anyOf":[{"type":"string"},{"type":"object"}]},"type":"array"}],"title":"Message"},"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender","default":"Machine"},"sender_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender Name","default":"AI"},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"},"stream_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stream Url"},"component_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Id"},"files":{"items":{"properties":{"path":{"type":"string","title":"Path"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"}},"type":"object","required":["path","name","type"],"title":"File","description":"File schema."},"type":"array","title":"Files","default":[]},"type":{"type":"string","title":"Type"}},"type":"object","required":["message","type"],"title":"ChatOutputResponse","description":"Chat output response schema."},"type":"array"},{"type":"null"}],"title":"Messages"},"timedelta":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Timedelta"},"duration":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Duration"},"component_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Display Name"},"component_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Component Id"},"used_frozen_result":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Used Frozen Result","default":false}},"type":"object","title":"ResultData"},{"type":"null"}]},"type":"array","title":"Outputs"}},"type":"object","title":"RunOutputs"},"type":"array"},{"type":"null"}],"title":"Outputs","default":[]},"session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Session Id"}},"type":"object","title":"RunResponse","description":"Run response schema."}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"properties":{"detail":{"items":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"}}}}},"method":"post","path":"/api/v1/run/advanced/{flow_id}","securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"api/v1/login"}}},"API key query":{"type":"apiKey","in":"query","name":"x-api-key"},"API key header":{"type":"apiKey","in":"header","name":"x-api-key"}},"jsonRequestBodyExample":{"stream":false},"info":{"title":"Langflow","version":"1.5.0.post1"},"postman":{"name":"Experimental Run Flow","description":{"content":"Executes a specified flow by ID with optional input values, output selection, tweaks, and streaming capability.\\n\\nThis endpoint supports running flows with caching to enhance performance and efficiency.\\n\\n### Parameters:\\n- `flow_id` (str): The unique identifier of the flow to be executed.\\n- `inputs` (List[InputValueRequest], optional): A list of inputs specifying the input values and components\\n for the flow. Each input can target specific components and provide custom values.\\n- `outputs` (List[str], optional): A list of output names to retrieve from the executed flow.\\n If not provided, all outputs are returned.\\n- `tweaks` (Optional[Tweaks], optional): A dictionary of tweaks to customize the flow execution.\\n The tweaks can be used to modify the flow\'s parameters and components.\\n Tweaks can be overridden by the input values.\\n- `stream` (bool, optional): Specifies whether the results should be streamed. Defaults to False.\\n- `session_id` (Union[None, str], optional): An optional session ID to utilize existing session data for the flow\\n execution.\\n- `api_key_user` (User): The user associated with the current API key. Automatically resolved from the API key.\\n\\n### Returns:\\nA `RunResponse` object containing the selected outputs (or all if not specified) of the executed flow\\nand the session ID.\\nThe structure of the response accommodates multiple inputs, providing a nested list of outputs for each input.\\n\\n### Raises:\\nHTTPException: Indicates issues with finding the specified flow, invalid input formats, or internal errors during\\nflow execution.\\n\\n### Example usage:\\n```json\\nPOST /run/flow_id\\nx-api-key: YOUR_API_KEY\\nPayload:\\n{\\n \\"inputs\\": [\\n {\\"components\\": [\\"component1\\"], \\"input_value\\": \\"value1\\"},\\n {\\"components\\": [\\"component3\\"], \\"input_value\\": \\"value2\\"}\\n ],\\n \\"outputs\\": [\\"Component Name\\", \\"component_id\\"],\\n \\"tweaks\\": {\\"parameter_name\\": \\"value\\", \\"Component Name\\": {\\"parameter_name\\": \\"value\\"}, \\"component_id\\": {\\"parameter_name\\": \\"value\\"}}\\n \\"stream\\": false\\n}\\n```\\n\\nThis endpoint facilitates complex flow executions with customized inputs, outputs, and configurations,\\ncatering to diverse application requirements.","type":"text/plain"},"url":{"path":["api","v1","run","advanced",":flow_id"],"host":["{{baseUrl}}"],"query":[],"variable":[{"disabled":false,"description":{"content":"(Required) ","type":"text/plain"},"type":"any","value":"","key":"flow_id"}]},"header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"method":"POST","body":{"mode":"raw","raw":"{\\n \\"inputs\\": [\\n {\\n \\"components\\": [\\n \\"\\",\\n \\"\\"\\n ],\\n \\"input_value\\": \\"\\",\\n \\"session\\": \\"\\",\\n \\"type\\": \\"\\"\\n },\\n {\\n \\"components\\": [\\n \\"\\",\\n \\"\\"\\n ],\\n \\"input_value\\": \\"\\",\\n \\"session\\": \\"\\",\\n \\"type\\": \\"\\"\\n }\\n ],\\n \\"outputs\\": [\\n \\"\\",\\n \\"\\"\\n ],\\n \\"tweaks\\": {\\n \\"anim9\\": \\"\\",\\n \\"in_c1b\\": \\"\\"\\n },\\n \\"stream\\": false,\\n \\"session_id\\": \\"\\"\\n}","options":{"raw":{"language":"json"}}},"auth":{"type":"apikey","apikey":[{"type":"any","value":"x-api-key","key":"key"},{"type":"any","value":"{{apiKey}}","key":"value"},{"type":"any","value":"query","key":"in"}]}}},"source":"@site/openapi.json","sourceDirName":".","permalink":"/api/experimental-run-flow","previous":{"title":"Webhook Run Flow","permalink":"/api/webhook-run-flow"},"next":{"title":"Process","permalink":"/api/process"}}');var i=n(74848),o=n(28453);const a={},l="Experimental Run Flow",r=[{value:"Parameters:",id:"parameters",level:3},{value:"Returns:",id:"returns",level:3},{value:"Raises:",id:"raises",level:3},{value:"Example usage:",id:"example-usage",level:3}];function p(e){const t={code:"code",h1:"h1",h3:"h3",header:"header",li:"li",p:"p",pre:"pre",ul:"ul",...(0,o.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(t.header,{children:(0,i.jsx)(t.h1,{id:"experimental-run-flow",children:"Experimental Run Flow"})}),"\n",(0,i.jsx)(t.p,{children:"Executes a specified flow by ID with optional input values, output selection, tweaks, and streaming capability."}),"\n",(0,i.jsx)(t.p,{children:"This endpoint supports running flows with caching to enhance performance and efficiency."}),"\n",(0,i.jsx)(t.h3,{id:"parameters",children:"Parameters:"}),"\n",(0,i.jsxs)(t.ul,{children:["\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"flow_id"})," (str): The unique identifier of the flow to be executed."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"inputs"})," (List[InputValueRequest], optional): A list of inputs specifying the input values and components\nfor the flow. Each input can target specific components and provide custom values."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"outputs"})," (List[str], optional): A list of output names to retrieve from the executed flow.\nIf not provided, all outputs are returned."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"tweaks"})," (Optional[Tweaks], optional): A dictionary of tweaks to customize the flow execution.\nThe tweaks can be used to modify the flow's parameters and components.\nTweaks can be overridden by the input values."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"stream"})," (bool, optional): Specifies whether the results should be streamed. Defaults to False."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"session_id"})," (Union[None, str], optional): An optional session ID to utilize existing session data for the flow\nexecution."]}),"\n",(0,i.jsxs)(t.li,{children:[(0,i.jsx)(t.code,{children:"api_key_user"})," (User): The user associated with the current API key. Automatically resolved from the API key."]}),"\n"]}),"\n",(0,i.jsx)(t.h3,{id:"returns",children:"Returns:"}),"\n",(0,i.jsxs)(t.p,{children:["A ",(0,i.jsx)(t.code,{children:"RunResponse"})," object containing the selected outputs (or all if not specified) of the executed flow\nand the session ID.\nThe structure of the response accommodates multiple inputs, providing a nested list of outputs for each input."]}),"\n",(0,i.jsx)(t.h3,{id:"raises",children:"Raises:"}),"\n",(0,i.jsx)(t.p,{children:"HTTPException: Indicates issues with finding the specified flow, invalid input formats, or internal errors during\nflow execution."}),"\n",(0,i.jsx)(t.h3,{id:"example-usage",children:"Example usage:"}),"\n",(0,i.jsx)(t.pre,{children:(0,i.jsx)(t.code,{className:"language-json",children:'POST /run/flow_id\nx-api-key: YOUR_API_KEY\nPayload:\n{\n "inputs": [\n {"components": ["component1"], "input_value": "value1"},\n {"components": ["component3"], "input_value": "value2"}\n ],\n "outputs": ["Component Name", "component_id"],\n "tweaks": {"parameter_name": "value", "Component Name": {"parameter_name": "value"}, "component_id": {"parameter_name": "value"}}\n "stream": false\n}\n'})}),"\n",(0,i.jsx)(t.p,{children:"This endpoint facilitates complex flow executions with customized inputs, outputs, and configurations,\ncatering to diverse application requirements."}),"\n",(0,i.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsx)("th",{style:{textAlign:"left"},children:"Path Parameters"})})}),(0,i.jsx)("tbody",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"flow_id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" uuid"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-required)"},children:" REQUIRED"})]})})})]}),"\n",(0,i.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("th",{style:{textAlign:"left"},children:[(0,i.jsx)("span",{children:"Request Body "}),(0,i.jsx)("div",{})]})})}),(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"inputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Inputs"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"outputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Outputs"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"tweaks"}),(0,i.jsx)("span",{style:{opacity:"0.6"}})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"stream"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Stream"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"session_id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Session Id"})]})})]})]}),"\n",(0,i.jsxs)("table",{style:{display:"table",width:"100%"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsx)("th",{style:{textAlign:"left"},children:"Responses"})})}),(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsxs)("div",{style:{display:"flex"},children:[(0,i.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,i.jsx)("code",{children:"200"})}),(0,i.jsx)("div",{children:(0,i.jsx)(t.p,{children:"Successful Response"})})]}),(0,i.jsx)("div",{children:(0,i.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("th",{style:{textAlign:"left"},children:[(0,i.jsx)("span",{children:"Schema "}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,i.jsx)("div",{})]})})}),(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"outputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Outputs"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"session_id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Session Id"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"})]})})]})]})})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsxs)("div",{style:{display:"flex"},children:[(0,i.jsx)("div",{style:{marginRight:"var(--ifm-table-cell-padding)"},children:(0,i.jsx)("code",{children:"422"})}),(0,i.jsx)("div",{children:(0,i.jsx)(t.p,{children:"Validation Error"})})]}),(0,i.jsx)("div",{children:(0,i.jsxs)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:[(0,i.jsx)("thead",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("th",{style:{textAlign:"left"},children:[(0,i.jsx)("span",{children:"Schema "}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,i.jsx)("div",{})]})})}),(0,i.jsx)("tbody",{children:(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"detail"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" object[]"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" \u2014 "}),(0,i.jsx)("strong",{style:{fontSize:"var(--ifm-code-font-size)",color:"var(--openapi-optional)"},children:" OPTIONAL"}),(0,i.jsx)("table",{style:{display:"table",width:"100%",marginTop:"var(--ifm-table-cell-padding)",marginBottom:"0px"},children:(0,i.jsxs)("tbody",{children:[(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"loc"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" undefined[]"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"msg"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Message"})]})}),(0,i.jsx)("tr",{children:(0,i.jsxs)("td",{children:[(0,i.jsx)("code",{children:"type"}),(0,i.jsx)("span",{style:{opacity:"0.6"},children:" Error Type"})]})})]})})]})})})]})})]})})]})]})]})}function d(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,i.jsx)(t,{...e,children:(0,i.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file diff --git a/assets/js/main.35957350.js b/assets/js/main.35957350.js new file mode 100644 index 0000000000..3fdf592921 --- /dev/null +++ b/assets/js/main.35957350.js @@ -0,0 +1,2 @@ +/*! For license information please see main.35957350.js.LICENSE.txt */ +(self.webpackChunklangflow_docs=self.webpackChunklangflow_docs||[]).push([[8792],{205:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(96540);const o=n(38193).A.canUseDOM?r.useLayoutEffect:r.useEffect},641:(e,t,n)=>{"use strict";n.r(t)},1093:e=>{"use strict";var t=Object.prototype.toString;e.exports=function(e){var n=t.call(e),r="[object Arguments]"===n;return r||(r="[object Array]"!==n&&null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Function]"===t.call(e.callee)),r}},1189:(e,t,n)=>{"use strict";var r=Array.prototype.slice,o=n(1093),a=Object.keys,i=a?function(e){return a(e)}:n(28875),s=Object.keys;i.shim=function(){if(Object.keys){var e=function(){var e=Object.keys(arguments);return e&&e.length===arguments.length}(1,2);e||(Object.keys=function(e){return o(e)?s(r.call(e)):s(e)})}else Object.keys=i;return Object.keys||i},e.exports=i},2694:(e,t,n)=>{"use strict";var r=n(6925);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,i){if(i!==r){var s=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw s.name="Invariant Violation",s}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},2833:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),i=Object.keys(t);if(a.length!==i.length)return!1;for(var s=Object.prototype.hasOwnProperty.bind(t),l=0;l{"use strict";n.d(t,{C:()=>r});const r="default"},3918:(e,t,n)=>{"use strict";var r=n(65606);function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;te.length)&&(n=e.length),e.substring(n-t.length,n)===t}var w="",x="",k="",S="",_={deepStrictEqual:"Expected values to be strictly deep-equal:",strictEqual:"Expected values to be strictly equal:",strictEqualObject:'Expected "actual" to be reference-equal to "expected":',deepEqual:"Expected values to be loosely deep-equal:",equal:"Expected values to be loosely equal:",notDeepStrictEqual:'Expected "actual" not to be strictly deep-equal to:',notStrictEqual:'Expected "actual" to be strictly unequal to:',notStrictEqualObject:'Expected "actual" not to be reference-equal to "expected":',notDeepEqual:'Expected "actual" not to be loosely deep-equal to:',notEqual:'Expected "actual" to be loosely unequal to:',notIdentical:"Values identical but not reference-equal:"};function E(e){var t=Object.keys(e),n=Object.create(Object.getPrototypeOf(e));return t.forEach(function(t){n[t]=e[t]}),Object.defineProperty(n,"message",{value:e.message}),n}function j(e){return b(e,{compact:!1,customInspect:!1,depth:1e3,maxArrayLength:1/0,showHidden:!1,breakLength:1/0,showProxy:!1,sorted:!0,getters:!0})}function O(e,t,n){var o="",a="",i=0,s="",l=!1,c=j(e),u=c.split("\n"),d=j(t).split("\n"),p=0,f="";if("strictEqual"===n&&"object"===g(e)&&"object"===g(t)&&null!==e&&null!==t&&(n="strictEqualObject"),1===u.length&&1===d.length&&u[0]!==d[0]){var m=u[0].length+d[0].length;if(m<=10){if(!("object"===g(e)&&null!==e||"object"===g(t)&&null!==t||0===e&&0===t))return"".concat(_[n],"\n\n")+"".concat(u[0]," !== ").concat(d[0],"\n")}else if("strictEqualObject"!==n){if(m<(r.stderr&&r.stderr.isTTY?r.stderr.columns:80)){for(;u[0][p]===d[0][p];)p++;p>2&&(f="\n ".concat(function(e,t){if(t=Math.floor(t),0==e.length||0==t)return"";var n=e.length*t;for(t=Math.floor(Math.log(t)/Math.log(2));t;)e+=e,t--;return e+e.substring(0,n-e.length)}(" ",p),"^"),p=0)}}}for(var h=u[u.length-1],b=d[d.length-1];h===b&&(p++<2?s="\n ".concat(h).concat(s):o=h,u.pop(),d.pop(),0!==u.length&&0!==d.length);)h=u[u.length-1],b=d[d.length-1];var y=Math.max(u.length,d.length);if(0===y){var E=c.split("\n");if(E.length>30)for(E[26]="".concat(w,"...").concat(S);E.length>27;)E.pop();return"".concat(_.notIdentical,"\n\n").concat(E.join("\n"),"\n")}p>3&&(s="\n".concat(w,"...").concat(S).concat(s),l=!0),""!==o&&(s="\n ".concat(o).concat(s),o="");var O=0,A=_[n]+"\n".concat(x,"+ actual").concat(S," ").concat(k,"- expected").concat(S),C=" ".concat(w,"...").concat(S," Lines skipped");for(p=0;p1&&p>2&&(P>4?(a+="\n".concat(w,"...").concat(S),l=!0):P>3&&(a+="\n ".concat(d[p-2]),O++),a+="\n ".concat(d[p-1]),O++),i=p,o+="\n".concat(k,"-").concat(S," ").concat(d[p]),O++;else if(d.length1&&p>2&&(P>4?(a+="\n".concat(w,"...").concat(S),l=!0):P>3&&(a+="\n ".concat(u[p-2]),O++),a+="\n ".concat(u[p-1]),O++),i=p,a+="\n".concat(x,"+").concat(S," ").concat(u[p]),O++;else{var T=d[p],I=u[p],R=I!==T&&(!v(I,",")||I.slice(0,-1)!==T);R&&v(T,",")&&T.slice(0,-1)===I&&(R=!1,I+=","),R?(P>1&&p>2&&(P>4?(a+="\n".concat(w,"...").concat(S),l=!0):P>3&&(a+="\n ".concat(u[p-2]),O++),a+="\n ".concat(u[p-1]),O++),i=p,a+="\n".concat(x,"+").concat(S," ").concat(I),o+="\n".concat(k,"-").concat(S," ").concat(T),O+=2):(a+=o,o="",1!==P&&0!==p||(a+="\n ".concat(I),O++))}if(O>20&&p30)for(f[26]="".concat(w,"...").concat(S);f.length>27;)f.pop();t=1===f.length?p.call(this,"".concat(d," ").concat(f[0])):p.call(this,"".concat(d,"\n\n").concat(f.join("\n"),"\n"))}else{var m=j(i),h="",b=_[o];"notDeepEqual"===o||"notEqual"===o?(m="".concat(_[o],"\n\n").concat(m)).length>1024&&(m="".concat(m.slice(0,1021),"...")):(h="".concat(j(s)),m.length>512&&(m="".concat(m.slice(0,509),"...")),h.length>512&&(h="".concat(h.slice(0,509),"...")),"deepEqual"===o||"equal"===o?m="".concat(b,"\n\n").concat(m,"\n\nshould equal\n\n"):h=" ".concat(o," ").concat(h)),t=p.call(this,"".concat(m).concat(h))}return Error.stackTraceLimit=l,t.generatedMessage=!n,Object.defineProperty(u(t),"name",{value:"AssertionError [ERR_ASSERTION]",enumerable:!1,writable:!0,configurable:!0}),t.code="ERR_ASSERTION",t.actual=i,t.expected=s,t.operator=o,Error.captureStackTrace&&Error.captureStackTrace(u(t),a),t.stack,t.name="AssertionError",c(t)}return i=v,(l=[{key:"toString",value:function(){return"".concat(this.name," [").concat(this.code,"]: ").concat(this.message)}},{key:t,value:function(e,t){return b(this,a(a({},t),{},{customInspect:!1,depth:0}))}}])&&s(i.prototype,l),d&&s(i,d),Object.defineProperty(i,"prototype",{writable:!1}),v}(d(Error),b.custom);e.exports=A},4146:(e,t,n)=>{"use strict";var r=n(44363),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},s={};function l(e){return r.isMemo(e)?i:s[e.$$typeof]||o}s[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},s[r.Memo]=i;var c=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var o=f(n);o&&o!==m&&e(t,o,r)}var i=u(n);d&&(i=i.concat(d(n)));for(var s=l(t),h=l(n),g=0;g{"use strict";n.d(t,{A:()=>r});const r={title:"Langflow Documentation",tagline:"Langflow is a low-code app builder for RAG and multi-agent AI applications.",favicon:"img/favicon.ico",url:"https://docs.langflow.org",baseUrl:"/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"warn",onBrokenAnchors:"warn",organizationName:"langflow-ai",projectName:"langflow",trailingSlash:!1,staticDirectories:["static"],i18n:{defaultLocale:"en",locales:["en"],path:"i18n",localeConfigs:{}},headTags:[{tagName:"link",attributes:{rel:"stylesheet",href:"https://fonts.googleapis.com/css2?family=Sora:wght@550;600&display=swap"}},{tagName:"script",attributes:{},innerHTML:'!function(){window.semaphore=window.semaphore||[],window.ketch=function(){window.semaphore.push(arguments)};var e=document.createElement("script");e.type="text/javascript",e.src="https://global.ketchcdn.com/web/v3/config/datastax/langflow_org_web/boot.js",e.defer=e.async=!0,document.getElementsByTagName("head")[0].appendChild(e)}();'},{tagName:"script",attributes:{defer:"true"},innerHTML:"\n ;(function () {\n const onKetchConsentGtagTrack = (consent) => {\n if (window.gtag &&\n consent.purposes &&\n 'analytics' in consent.purposes &&\n 'targeted_advertising' in consent.purposes\n ) {\n const analyticsString = consent.purposes.analytics === true ? 'granted' : 'denied'\n const targetedAdsString = consent.purposes.targeted_advertising === true ? 'granted' : 'denied'\n const gtagObject = {\n analytics_storage: analyticsString,\n ad_personalization: targetedAdsString,\n ad_storage: targetedAdsString,\n ad_user_data: targetedAdsString,\n }\n window.gtag('consent', 'update', gtagObject)\n }\n }\n if (window.ketch) {\n window.ketch('on', 'consent', onKetchConsentGtagTrack)\n }\n })()\n "}],presets:[["docusaurus-preset-openapi",{api:{path:"openapi.json",routeBasePath:"/api"},docs:{routeBasePath:"/",sidebarPath:"/home/runner/work/langflow/langflow/docs/sidebars.js",sidebarCollapsed:!0,beforeDefaultRemarkPlugins:[[null,{theme:"github-dark",showCopyButton:!0,lineNumbers:!0}]]},sitemap:{lastmod:"datetime",changefreq:null,priority:null,ignorePatterns:["/preferences"]},gtag:{trackingID:"G-SLQFLQ3KPT"},blog:!1,theme:{customCss:["/home/runner/work/langflow/langflow/docs/node_modules/@code-hike/mdx/dist/index.css","/home/runner/work/langflow/langflow/docs/css/custom.css","/home/runner/work/langflow/langflow/docs/css/docu-notion-styles.css","/home/runner/work/langflow/langflow/docs/css/gifplayer.css"]}}]],plugins:[["docusaurus-node-polyfills",{excludeAliases:["console"]}],"docusaurus-plugin-image-zoom",["./src/plugins/segment",{segmentPublicWriteKey:"60AfGDrVxy8nAGJngo3fCYWG4LvhMAlG",allowedInDev:!0}],["./src/plugins/scroll-tracking",{segmentPublicWriteKey:"60AfGDrVxy8nAGJngo3fCYWG4LvhMAlG",allowedInDev:!0,selectors:[{selector:"h1, h2, h3, h4, h5, h6",eventName:"Docs.langflow.org - Heading Viewed",properties:{element_type:"heading"}},{selector:".ch-codeblock",eventName:"Docs.langflow.org - Codeblock Viewed",properties:{element_type:"code",language:"helper:codeLanguage"}}]}],["@docusaurus/plugin-client-redirects",{redirects:[{to:"/",from:["/whats-new-a-new-chapter-langflow","/\ud83d\udc4b Welcome-to-Langflow","/getting-started-welcome-to-langflow","/guides-new-to-llms"]},{to:"/get-started-installation",from:["/getting-started-installation","/getting-started-common-installation-issues"]},{to:"/get-started-quickstart",from:"/getting-started-quickstart"},{to:"concepts-overview",from:["/workspace-overview","/365085a8-a90a-43f9-a779-f8769ec7eca1","/My-Collection","/workspace","/settings-project-general-settings"]},{to:"/concepts-components",from:["/components","/components-overview"]},{to:"/configuration-global-variables",from:"/settings-global-variables"},{to:"/concepts-playground",from:["/workspace-playground","/workspace-logs","/guides-chat-memory"]},{to:"/data-types",from:["/guides-data-message","/configuration-objects"]},{to:"/concepts-flows",from:["/travel-planning-agent","/starter-projects-travel-planning-agent","/tutorials-travel-planning-agent","/starter-projects-dynamic-agent/","/simple-agent","/math-agent","/starter-projects-simple-agent","/starter-projects-math-agent","/tutorials-math-agent","/sequential-agent","/starter-projects-sequential-agent","/tutorials-sequential-agent","/memory-chatbot","/starter-projects-memory-chatbot","/tutorials-memory-chatbot","/financial-report-parser","/document-qa","/starter-projects-document-qa","/tutorials-document-qa","/blog-writer","/starter-projects-blog-writer","/tutorials-blog-writer","/basic-prompting","/starter-projects-basic-prompting","/vector-store-rag","/starter-projects-vector-store-rag"]},{to:"/components-vector-stores",from:"/components-rag"},{to:"/api-keys-and-authentication",from:["/configuration-api-keys","/configuration-authentication","/configuration-security-best-practices","/Configuration/configuration-security-best-practices"]},{to:"/environment-variables",from:["/configuration-auto-saving","/Configuration/configuration-auto-saving","/configuration-backend-only","/Configuration/configuration-backend-only"]},{to:"/concepts-publish",from:["/concepts-api","/workspace-api"]},{to:"/components-custom-components",from:"/components/custom"},{to:"/components-bundle-components",from:"/components-loaders"},{to:"/mcp-server",from:"/integrations-mcp"},{to:"/integrations-nvidia-g-assist",from:"/integrations-nvidia-system-assist"},{to:"/deployment-kubernetes-dev",from:"/deployment-kubernetes"},{to:"/contributing-github-issues",from:"/contributing-github-discussions"},{to:"/agents",from:"/agents-tool-calling-agent-component"},{to:"/concepts-publish",from:"/embedded-chat-widget"},{to:"/bundles-google",from:"/integrations-setup-google-oauth-langflow"},{to:"/bundles-vertexai",from:"/integrations-setup-google-cloud-vertex-ai-langflow"},{to:"/develop-application",from:"/develop-overview"},{to:"/data-types",from:"/concepts-objects"}]}],null],themeConfig:{navbar:{hideOnScroll:!0,logo:{alt:"Langflow",src:"img/lf-docs-light.svg",srcDark:"img/lf-docs-dark.svg"},items:[{position:"right",href:"https://github.com/langflow-ai/langflow",className:"header-github-link",target:"_blank",rel:null,"data-event":"Docs.langflow.org - Social Clicked","data-platform":"github"},{position:"right",href:"https://twitter.com/langflow_ai",className:"header-twitter-link",target:"_blank",rel:null,"data-event":"Docs.langflow.org - Social Clicked","data-platform":"x"},{position:"right",href:"https://discord.gg/EqksyE2EX9",className:"header-discord-link",target:"_blank",rel:null,"data-event":"Docs.langflow.org - Social Clicked","data-platform":"discord"}]},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!0},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:[],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},zoom:{selector:".markdown :not(a) > img:not(.no-zoom)",background:{light:"rgba(240, 240, 240, 0.9)"},config:{}},docs:{sidebar:{hideable:!1,autoCollapseCategories:!1},versionPersistence:"localStorage"},footer:{logo:{alt:"Langflow",src:"img/lf-docs-light.svg",srcDark:"img/lf-docs-dark.svg",width:160,height:40},links:[{title:null,items:[{html:''}]}],style:"light"},algolia:{appId:"UZK6BDPCVY",apiKey:"adbd7686dceb1cd510d5ce20d04bf74c",indexName:"langflow",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,future:{v4:{removeLegacyPostBuildHeadAttribute:!1,useCssCascadeLayers:!1},experimental_faster:{swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1,rspackBundler:!1,rspackPersistentCache:!1,ssgWorkerThreads:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onDuplicateRoutes:"warn",customFields:{},themes:[],scripts:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1,markdown:{format:"mdx",mermaid:!1,mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}}}},5260:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(96540);var r=n(80545),o=n(74848);function a(e){return(0,o.jsx)(r.mg,{...e})}},5338:(e,t,n)=>{"use strict";var r=n(40961);t.createRoot=r.createRoot,t.hydrateRoot=r.hydrateRoot},5556:(e,t,n)=>{e.exports=n(2694)()},5947:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
    '};function o(e,t,n){return en?n:e}function a(e){return 100*(-1+e)}function i(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),c=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,s(function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,i(e,u,d)),1===e?(l(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout(function(){l(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout(function(){n.remove(),t()},u)},u)):setTimeout(t,u)}),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout(function(){n.status&&(n.trickle(),e())},r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always(function(){0===--t?(e=0,n.done()):n.set((e-t)/e)}),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,i=t.querySelector(r.barSelector),s=e?"-100":a(n.status||0),c=document.querySelector(r.parent);return l(i,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var s=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(e,t){return t.toUpperCase()})}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function c(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;c(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);c(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},6125:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>i});var r=n(96540),o=n(74848);const a=r.createContext(!1);function i({children:e}){const[t,n]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{n(!0)},[]),(0,o.jsx)(a.Provider,{value:t,children:e})}},6188:e=>{"use strict";e.exports=Math.max},6342:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(44586);function o(){return(0,r.A)().siteConfig.themeConfig}},6549:e=>{"use strict";e.exports=Object.getOwnPropertyDescriptor},6925:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},6969:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:["sh","shell"],aliasTitles:{sh:"Shell",shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bbj:{title:"BBj",owner:"hyyan"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},bqn:{title:"BQN",owner:"yewscion"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},cilkc:{title:"Cilk/C",require:"c",alias:"cilk-c",owner:"OpenCilk"},cilkcpp:{title:"Cilk/C++",require:"cpp",alias:["cilk-cpp","cilk"],owner:"OpenCilk"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},gradle:{title:"Gradle",require:"clike",owner:"zeabdelkhalek-badido18"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},metafont:{title:"METAFONT",owner:"LaeriExNihilo"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (SCSS)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wgsl:{title:"WGSL",owner:"Dr4gonthree"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},7176:(e,t,n)=>{"use strict";var r,o=n(73126),a=n(75795);try{r=[].__proto__===Array.prototype}catch(c){if(!c||"object"!=typeof c||!("code"in c)||"ERR_PROTO_ACCESS"!==c.code)throw c}var i=!!r&&a&&a(Object.prototype,"__proto__"),s=Object,l=s.getPrototypeOf;e.exports=i&&"function"==typeof i.get?o([i.get]):"function"==typeof l&&function(e){return l(null==e?e:s(e))}},7463:(e,t,n)=>{"use strict";var r=n(96763);function o(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(!(0>>1;rs(l,n))cs(u,l)?(e[r]=u,e[c]=n,r=c):(e[r]=l,e[i]=n,r=i);else{if(!(cs(u,n)))break e;e[r]=u,e[c]=n,r=c}}}return t}function s(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if("object"==typeof performance&&"function"==typeof performance.now){var l=performance;t.unstable_now=function(){return l.now()}}else{var c=Date,u=c.now();t.unstable_now=function(){return c.now()-u}}var d=[],p=[],f=1,m=null,h=3,g=!1,b=!1,y=!1,v="function"==typeof setTimeout?setTimeout:null,w="function"==typeof clearTimeout?clearTimeout:null,x="undefined"!=typeof setImmediate?setImmediate:null;function k(e){for(var t=a(p);null!==t;){if(null===t.callback)i(p);else{if(!(t.startTime<=e))break;i(p),t.sortIndex=t.expirationTime,o(d,t)}t=a(p)}}function S(e){if(y=!1,k(e),!b)if(null!==a(d))b=!0,D(_);else{var t=a(p);null!==t&&L(S,t.startTime-e)}}function _(e,n){b=!1,y&&(y=!1,w(A),A=-1),g=!0;var r=h;try{for(k(n),m=a(d);null!==m&&(!(m.expirationTime>n)||e&&!T());){var o=m.callback;if("function"==typeof o){m.callback=null,h=m.priorityLevel;var s=o(m.expirationTime<=n);n=t.unstable_now(),"function"==typeof s?m.callback=s:m===a(d)&&i(d),k(n)}else i(d);m=a(d)}if(null!==m)var l=!0;else{var c=a(p);null!==c&&L(S,c.startTime-n),l=!1}return l}finally{m=null,h=r,g=!1}}"undefined"!=typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var E,j=!1,O=null,A=-1,C=5,P=-1;function T(){return!(t.unstable_now()-Pe||125i?(e.sortIndex=r,o(p,e),null===a(d)&&e===a(p)&&(y?(w(A),A=-1):y=!0,L(S,r-i))):(e.sortIndex=s,o(d,e),b||g||(b=!0,D(_))),e},t.unstable_shouldYield=T,t.unstable_wrapCallback=function(e){var t=h;return function(){var n=h;h=t;try{return e.apply(this,arguments)}finally{h=n}}}},8505:(e,t,n)=>{var r=n(64634);e.exports=h,e.exports.parse=a,e.exports.compile=function(e,t){return c(a(e,t),t)},e.exports.tokensToFunction=c,e.exports.tokensToRegExp=m;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,s=0,l="",c=t&&t.delimiter||"/";null!=(n=o.exec(e));){var u=n[0],p=n[1],f=n.index;if(l+=e.slice(s,f),s=f+u.length,p)l+=p[1];else{var m=e[s],h=n[2],g=n[3],b=n[4],y=n[5],v=n[6],w=n[7];l&&(r.push(l),l="");var x=null!=h&&null!=m&&m!==h,k="+"===v||"*"===v,S="?"===v||"*"===v,_=h||c,E=b||y,j=h||("string"==typeof r[r.length-1]?r[r.length-1]:"");r.push({name:g||a++,prefix:h||"",delimiter:_,optional:S,repeat:k,partial:x,asterisk:!!w,pattern:E?d(E):w?".*":i(_,j)})}}return s-1?"[^"+u(e)+"]+?":u(t)+"|(?:(?!"+u(t)+")[^"+u(e)+"])+?"}function s(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function l(e){return encodeURI(e).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function c(e,t){for(var n=new Array(e.length),o=0;o{var r=n(96763);const o=n(6969),a=n(98380),i=new Set;function s(e){void 0===e?e=Object.keys(o.languages).filter(e=>"meta"!=e):Array.isArray(e)||(e=[e]);const t=[...i,...Object.keys(Prism.languages)];a(o,e,t).load(e=>{if(!(e in o.languages))return void(s.silent||r.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(63157).resolve(t)],delete Prism.languages[e],n(63157)(t),i.add(e)})}s.silent=!1,e.exports=s},9394:(e,t,n)=>{"use strict";var r=n(89211);e.exports=function(){return"function"==typeof Object.is?Object.is:r}},9957:(e,t,n)=>{"use strict";var r=Function.prototype.call,o=Object.prototype.hasOwnProperty,a=n(66743);e.exports=a.call(r,o)},10076:e=>{"use strict";e.exports=Function.prototype.call},10119:(e,t,n)=>{"use strict";n.r(t)},10487:(e,t,n)=>{"use strict";var r=n(96897),o=n(30655),a=n(73126),i=n(12205);e.exports=function(e){var t=a(arguments),n=e.length-(arguments.length-1);return r(t,1+(n>0?n:0),!0)},o?o(e.exports,"apply",{value:i}):e.exports.apply=i},11002:e=>{"use strict";e.exports=Function.prototype.apply},11514:(e,t,n)=>{"use strict";var r=n(38403);e.exports=function(){return Object.assign?function(){if(!Object.assign)return!1;for(var e="abcdefghijklmnopqrst",t=e.split(""),n={},r=0;r{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},11818:(e,t,n)=>{"use strict";n.r(t)},12205:(e,t,n)=>{"use strict";var r=n(66743),o=n(11002),a=n(13144);e.exports=function(){return a(r,o,arguments)}},12838:(e,t,n)=>{"use strict";n.d(t,{A:()=>qt});var r=n(96540),o=n(18215),a=n(67489),i=n(45500),s=n(56347),l=n(21312),c=n(75062),u=n(74848);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,s.W6)(),n=(0,r.useCallback)(e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)},[]);return(0,c.$)(({location:n})=>{e.current&&!n.hash&&"PUSH"===t&&p(e.current)}),{containerRef:e,onClick:n}}const m=(0,l.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function h(e){const t=e.children??m,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":m,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(17559),b=n(14090);const y={skipToContent:"skipToContent_fXgn"};function v(){return(0,u.jsx)(h,{className:y.skipToContent})}var w=n(6342),x=n(65041);function k({width:e=21,height:t=21,color:n="currentColor",strokeWidth:r=1.2,className:o,...a}){return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:e,height:t,...a,children:(0,u.jsx)("g",{stroke:n,strokeWidth:r,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const S={closeButton:"closeButton_CVFx"};function _(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",S.closeButton,e.className),children:(0,u.jsx)(k,{width:14,height:14,strokeWidth:3.1})})}const E={content:"content_knG7"};function j(e){const{announcementBar:t}=(0,w.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(E.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const O={announcementBar:"announcementBar_mb4j",announcementBarPlaceholder:"announcementBarPlaceholder_vyr4",announcementBarClose:"announcementBarClose_gvF7",announcementBarContent:"announcementBarContent_xLdY"};function A(){const{announcementBar:e}=(0,w.p)(),{isActive:t,close:n}=(0,x.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:i}=e;return(0,u.jsxs)("div",{className:(0,o.A)(g.G.announcementBar.container,O.announcementBar),style:{backgroundColor:r,color:a},role:"banner",children:[i&&(0,u.jsx)("div",{className:O.announcementBarPlaceholder}),(0,u.jsx)(j,{className:O.announcementBarContent}),i&&(0,u.jsx)(_,{onClick:n,className:O.announcementBarClose})]})}var C=n(22069),P=n(23104);var T=n(89532),I=n(75600);const R=r.createContext(null);function N({children:e}){const t=function(){const e=(0,C.M)(),t=(0,I.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,i=(0,T.ZC)(a);return(0,r.useEffect)(()=>{a&&!i&&o(!0)},[a,i]),(0,r.useEffect)(()=>{a?e.shown||o(!0):o(!1)},[e.shown,a]),(0,r.useMemo)(()=>[n,o],[n])}();return(0,u.jsx)(R.Provider,{value:t,children:e})}function D(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function L(){const e=(0,r.useContext)(R);if(!e)throw new T.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)(()=>n(!1),[n]),a=(0,I.YL)();return(0,r.useMemo)(()=>({shown:t,hide:o,content:D(a)}),[o,a,t])}function M(e){return parseInt(r.version.split(".")[0],10)<19?{inert:e?"":void 0}:{inert:e}}function F({children:e,inert:t}){return(0,u.jsx)("div",{className:(0,o.A)(g.G.layout.navbar.mobileSidebar.panel,"navbar-sidebar__item menu"),...M(t),children:e})}function z({header:e,primaryMenu:t,secondaryMenu:n}){const{shown:r}=L();return(0,u.jsxs)("div",{className:(0,o.A)(g.G.layout.navbar.mobileSidebar.container,"navbar-sidebar"),children:[e,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":r}),children:[(0,u.jsx)(F,{inert:r,children:t}),(0,u.jsx)(F,{inert:!r,children:n})]})]})}var B=n(95293),U=n(92303);function q(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function $(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}function H(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"})})}const G="toggle_vylO",V="toggleButton_gllP",W="toggleIcon_g3eP",K="systemToggleIcon_QzmC",Q="lightToggleIcon_pyhR",Y="darkToggleIcon_wfgR",J="toggleButtonDisabled_aARS";function Z(e){switch(e){case null:return(0,l.T)({message:"system mode",id:"theme.colorToggle.ariaLabel.mode.system",description:"The name for the system color mode"});case"light":return(0,l.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"});case"dark":return(0,l.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"});default:throw new Error(`unexpected color mode ${e}`)}}function X(e){return(0,l.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the color mode toggle"},{mode:Z(e)})}function ee(){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(q,{"aria-hidden":!0,className:(0,o.A)(W,Q)}),(0,u.jsx)($,{"aria-hidden":!0,className:(0,o.A)(W,Y)}),(0,u.jsx)(H,{"aria-hidden":!0,className:(0,o.A)(W,K)})]})}function te({className:e,buttonClassName:t,respectPrefersColorScheme:n,value:r,onChange:a}){const i=(0,U.A)();return(0,u.jsx)("div",{className:(0,o.A)(G,e),children:(0,u.jsx)("button",{className:(0,o.A)("clean-btn",V,!i&&J,t),type:"button",onClick:()=>a(function(e,t){if(!t)return"dark"===e?"light":"dark";switch(e){case null:return"light";case"light":return"dark";case"dark":return null;default:throw new Error(`unexpected color mode ${e}`)}}(r,n)),disabled:!i,title:Z(r),"aria-label":X(r),children:(0,u.jsx)(ee,{})})})}const ne=r.memo(te),re={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_X3D1"};function oe({className:e}){const t=(0,w.p)().navbar.style,{disableSwitch:n,respectPrefersColorScheme:r}=(0,w.p)().colorMode,{colorModeChoice:o,setColorMode:a}=(0,B.G)();return n?null:(0,u.jsx)(ne,{className:e,buttonClassName:"dark"===t?re.darkNavbarColorModeToggle:void 0,respectPrefersColorScheme:r,value:o,onChange:a})}var ae=n(23465);function ie(){return(0,u.jsx)(ae.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function se(){const e=(0,C.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,l.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(k,{color:"var(--ifm-color-emphasis-600)"})})}function le(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(ie,{}),(0,u.jsx)(oe,{className:"margin-right--md"}),(0,u.jsx)(se,{})]})}var ce=n(28774),ue=n(86025),de=n(16654),pe=n(91252),fe=n(43186);function me({activeBasePath:e,activeBaseRegex:t,to:n,href:r,label:o,html:a,isDropdownLink:i,prependBaseUrlToHref:s,...l}){const c=(0,ue.Ay)(n),d=(0,ue.Ay)(e),p=(0,ue.Ay)(r,{forcePrependBaseUrl:!0}),f=o&&r&&!(0,de.A)(r),m=a?{dangerouslySetInnerHTML:{__html:a}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,f&&(0,u.jsx)(fe.A,{...i&&{width:12,height:12}})]})};return r?(0,u.jsx)(ce.A,{href:s?p:r,...l,...m}):(0,u.jsx)(ce.A,{to:c,isNavLink:!0,...(e||t)&&{isActive:(e,n)=>t?(0,pe.G)(t,n.pathname):n.pathname.startsWith(d)},...l,...m})}function he({className:e,isDropdownItem:t,...n}){return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(me,{className:(0,o.A)("menu__link",e),...n})})}function ge({className:e,isDropdownItem:t=!1,...n}){const r=(0,u.jsx)(me,{className:(0,o.A)(t?"dropdown__link":"navbar__item navbar__link",e),isDropdownLink:t,...n});return t?(0,u.jsx)("li",{children:r}):r}function be({mobile:e=!1,position:t,...n}){const r=e?he:ge;return(0,u.jsx)(r,{...n,activeClassName:n.activeClassName??(e?"menu__link--active":"navbar__link--active")})}var ye=n(41422),ve=n(99169),we=n(44586);const xe="dropdownNavbarItemMobile_J0Sd";function ke(e,t){return e.some(e=>function(e,t){return!!(0,ve.ys)(e.to,t)||!!(0,pe.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t))}function Se({collapsed:e,onClick:t}){return(0,u.jsx)("button",{"aria-label":e?(0,l.T)({id:"theme.navbar.mobileDropdown.collapseButton.expandAriaLabel",message:"Expand the dropdown",description:"The ARIA label of the button to expand the mobile dropdown navbar item"}):(0,l.T)({id:"theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel",message:"Collapse the dropdown",description:"The ARIA label of the button to collapse the mobile dropdown navbar item"}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:t})}function _e({items:e,className:t,position:n,onClick:a,...i}){const l=function(){const{siteConfig:{baseUrl:e}}=(0,we.A)(),{pathname:t}=(0,s.zy)();return t.replace(e,"/")}(),c=(0,ve.ys)(i.to,l),d=ke(e,l),{collapsed:p,toggleCollapsed:f}=function({active:e}){const{collapsed:t,toggleCollapsed:n,setCollapsed:o}=(0,ye.u)({initialState:()=>!e});return(0,r.useEffect)(()=>{e&&o(!1)},[e,o]),{collapsed:t,toggleCollapsed:n}}({active:c||d}),m=i.to?void 0:"#";return(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":c}),children:[(0,u.jsx)(me,{role:"button",className:(0,o.A)(xe,"menu__link menu__link--sublist",t),href:m,...i,onClick:e=>{"#"===m&&e.preventDefault(),f()},children:i.children??i.label}),(0,u.jsx)(Se,{collapsed:p,onClick:e=>{e.preventDefault(),f()}})]}),(0,u.jsx)(ye.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:e.map((e,t)=>(0,r.createElement)(Xe,{mobile:!0,isDropdownItem:!0,onClick:a,activeClassName:"menu__link--active",...e,key:t}))})]})}function Ee({items:e,position:t,className:n,onClick:a,...i}){const s=(0,r.useRef)(null),[l,c]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{const e=e=>{s.current&&!s.current.contains(e.target)&&c(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}},[s]),(0,u.jsxs)("div",{ref:s,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===t,"dropdown--show":l}),children:[(0,u.jsx)(me,{"aria-haspopup":"true","aria-expanded":l,role:"button",href:i.to?void 0:"#",className:(0,o.A)("navbar__link",n),...i,onClick:i.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),c(!l))},children:i.children??i.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:e.map((e,t)=>(0,r.createElement)(Xe,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t}))})]})}function je({mobile:e=!1,...t}){const n=e?_e:Ee;return(0,u.jsx)(n,{...t})}var Oe=n(32131);function Ae({width:e=20,height:t=20,...n}){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:e,height:t,"aria-hidden":!0,...n,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const Ce="iconLanguage_nlXk";var Pe=n(40961),Te=n(55600),Ie=n(5260),Re=n(24255),Ne=n(51062),De=n(2967),Le=n(82565);function Me(){return[`language:${(0,we.A)().i18n.currentLocale}`,function(){const e=(0,Le.v)();return[De.C,...e]}().map(e=>`docusaurus_tag:${e}`)]}const Fe={button:{buttonText:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,l.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,l.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,l.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,l.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,l.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,l.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,l.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,l.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,l.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,l.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,l.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,l.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,l.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,l.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let ze=null;function Be(){return ze?Promise.resolve():Promise.all([n.e(8158).then(n.bind(n,48158)),Promise.all([n.e(1869),n.e(8913)]).then(n.bind(n,58913)),Promise.all([n.e(1869),n.e(416)]).then(n.bind(n,90416))]).then(([{DocSearchModal:e}])=>{ze=e})}function Ue({hit:e,children:t}){return(0,u.jsx)(ce.A,{to:e.url,children:t})}function qe({state:e,onClose:t}){const n=(0,Re.w)();return(0,u.jsx)(ce.A,{to:n(e.query),onClick:t,children:(0,u.jsx)(l.A,{id:"theme.SearchBar.seeAll",values:{count:e.context.nbHits},children:"See all {count} results"})})}function $e({externalUrlRegex:e,...t}){const n=function({externalUrlRegex:e}){const t=(0,s.W6)(),[n]=(0,r.useState)(()=>({navigate(n){(0,pe.G)(e,n.itemUrl)?window.location.href=n.itemUrl:t.push(n.itemUrl)}}));return n}({externalUrlRegex:e}),o=function({contextualSearch:e,...t}){const n=Me(),r=t.searchParameters?.facetFilters??[],o=e?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(n,r):r;return{...t.searchParameters,facetFilters:o}}({...t}),a=function(e){const t=(0,Ne.C)(),[n]=(0,r.useState)(()=>n=>e.transformItems?e.transformItems(n):n.map(e=>({...e,url:t(e.url)})));return n}(t),i=function(){const{siteMetadata:{docusaurusVersion:e}}=(0,we.A)();return(0,r.useCallback)(t=>(t.addAlgoliaAgent("docusaurus",e),t),[e])}(),l=(0,r.useRef)(null),c=(0,r.useRef)(null),[d,p]=(0,r.useState)(!1),[f,m]=(0,r.useState)(void 0),h=(0,r.useCallback)(()=>{if(!l.current){const e=document.createElement("div");l.current=e,document.body.insertBefore(e,document.body.firstChild)}},[]),g=(0,r.useCallback)(()=>{h(),Be().then(()=>p(!0))},[h]),b=(0,r.useCallback)(()=>{p(!1),c.current?.focus(),m(void 0)},[]),y=(0,r.useCallback)(e=>{"f"===e.key&&(e.metaKey||e.ctrlKey)||(e.preventDefault(),m(e.key),g())},[g]),v=function({closeModal:e}){return(0,r.useMemo)(()=>({state:t})=>(0,u.jsx)(qe,{state:t,onClose:e}),[e])}({closeModal:b});return(0,Te.E8)({isOpen:d,onOpen:g,onClose:b,onInput:y,searchButtonRef:c}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ie.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${t.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(Te.Bc,{onTouchStart:Be,onFocus:Be,onMouseOver:Be,onClick:g,ref:c,translations:t.translations?.button??Fe.button}),d&&ze&&l.current&&(0,Pe.createPortal)((0,u.jsx)(ze,{onClose:b,initialScrollY:window.scrollY,initialQuery:f,navigator:n,transformItems:a,hitComponent:Ue,transformSearchClient:i,...t.searchPagePath&&{resultsFooterComponent:v},placeholder:Fe.placeholder,...t,translations:t.translations?.modal??Fe.modal,searchParameters:o}),l.current)]})}function He(){const{siteConfig:e}=(0,we.A)();return(0,u.jsx)($e,{...e.themeConfig.algolia})}const Ge={navbarSearchContainer:"navbarSearchContainer_Bca1"};function Ve({children:e,className:t}){return(0,u.jsx)("div",{className:(0,o.A)(t,Ge.navbarSearchContainer),children:e})}var We=n(44070),Ke=n(26972);var Qe=n(53886);function Ye({docsPluginId:e,configs:t}){return function(e,t){if(t){const n=new Map(e.map(e=>[e.name,e])),r=(t,r)=>{const o=n.get(t);if(!o)throw new Error(`No docs version exist for name '${t}', please verify your 'docsVersionDropdown' navbar item versions config.\nAvailable version names:\n- ${e.map(e=>`${e.name}`).join("\n- ")}`);return{version:o,label:r?.label??o.label}};return Array.isArray(t)?t.map(e=>r(e,void 0)):Object.entries(t).map(([e,t])=>r(e,t))}return e.map(e=>({version:e,label:e.label}))}((0,We.jh)(e),t)}function Je(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find(t=>t.id===e.mainDocId)}(e)}const Ze={default:be,localeDropdown:function({mobile:e,dropdownItemsBefore:t,dropdownItemsAfter:n,queryString:r="",...o}){const{i18n:{currentLocale:a,locales:i,localeConfigs:c}}=(0,we.A)(),d=(0,Oe.o)(),{search:p,hash:f}=(0,s.zy)(),m=[...t,...i.map(t=>{const n=`${`pathname://${d.createUrl({locale:t,fullyQualified:!1})}`}${p}${f}${r}`;return{label:c[t].label,lang:c[t].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:t===a?e?"menu__link--active":"dropdown__link--active":""}}),...n],h=e?(0,l.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):c[a].label;return(0,u.jsx)(je,{...o,mobile:e,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Ae,{className:Ce}),h]}),items:m})},search:function({mobile:e,className:t}){return e?null:(0,u.jsx)(Ve,{className:t,children:(0,u.jsx)(He,{})})},dropdown:je,html:function({value:e,className:t,mobile:n=!1,isDropdownItem:r=!1}){const a=r?"li":"div";return(0,u.jsx)(a,{className:(0,o.A)({navbar__item:!n&&!r,"menu__list-item":n},t),dangerouslySetInnerHTML:{__html:e}})},doc:function({docId:e,label:t,docsPluginId:n,...r}){const{activeDoc:o}=(0,We.zK)(n),a=(0,Ke.QB)(e,n),i=o?.path===a?.path;return null===a||a.unlisted&&!i?null:(0,u.jsx)(be,{exact:!0,...r,isActive:()=>i||!!o?.sidebar&&o.sidebar===a.sidebar,label:t??a.id,to:a.path})},docSidebar:function({sidebarId:e,label:t,docsPluginId:n,...r}){const{activeDoc:o}=(0,We.zK)(n),a=(0,Ke.fW)(e,n).link;if(!a)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${e}" doesn't have anything to be linked to.`);return(0,u.jsx)(be,{exact:!0,...r,isActive:()=>o?.sidebar===e,label:t??a.label,to:a.path})},docsVersion:function({label:e,to:t,docsPluginId:n,...r}){const o=(0,Ke.Vd)(n)[0],a=e??o.label,i=t??(e=>e.docs.find(t=>t.id===e.mainDocId))(o).path;return(0,u.jsx)(be,{...r,label:a,to:i})},docsVersionDropdown:function({mobile:e,docsPluginId:t,dropdownActiveClassDisabled:n,dropdownItemsBefore:r,dropdownItemsAfter:o,versions:a,...i}){const{search:c,hash:d}=(0,s.zy)(),p=(0,We.zK)(t),{savePreferredVersionName:f}=(0,Qe.g1)(t),m=Ye({docsPluginId:t,configs:a}),h=function({docsPluginId:e,versionItems:t}){return(0,Ke.Vd)(e).map(e=>t.find(t=>t.version===e)).filter(e=>void 0!==e)[0]??t[0]}({docsPluginId:t,versionItems:m}),g=[...r,...m.map(function({version:e,label:t}){return{label:t,to:`${Je(e,p).path}${c}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>f(e.name)}}),...o],b=e&&g.length>1?(0,l.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):h.label,y=e&&g.length>1?void 0:Je(h.version,p).path;return g.length<=1?(0,u.jsx)(be,{...i,mobile:e,label:b,to:y,isActive:n?()=>!1:void 0}):(0,u.jsx)(je,{...i,mobile:e,label:b,to:y,items:g,isActive:n?()=>!1:void 0})}};function Xe({type:e,...t}){const n=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(e,t),r=Ze[n];if(!r)throw new Error(`No NavbarItem component found for type "${e}".`);return(0,u.jsx)(r,{...t})}function et(){const e=(0,C.M)(),t=(0,w.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map((t,n)=>(0,r.createElement)(Xe,{mobile:!0,...t,onClick:()=>e.toggle(),key:n}))})}function tt(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(l.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function nt(){const e=0===(0,w.p)().navbar.items.length,t=L();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(tt,{onClick:()=>t.hide()}),t.content]})}function rt(){const e=(0,C.M)();return function(e=!0){(0,r.useEffect)(()=>(document.body.style.overflow=e?"hidden":"visible",()=>{document.body.style.overflow="visible"}),[e])}(e.shown),e.shouldRender?(0,u.jsx)(z,{header:(0,u.jsx)(le,{}),primaryMenu:(0,u.jsx)(et,{}),secondaryMenu:(0,u.jsx)(nt,{})}):null}const ot={navbarHideable:"navbarHideable_m1mJ",navbarHidden:"navbarHidden_jGov"};function at(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function it({children:e}){const{navbar:{hideOnScroll:t,style:n}}=(0,w.p)(),a=(0,C.M)(),{navbarRef:i,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),i=(0,r.useCallback)(e=>{null!==e&&(a.current=e.getBoundingClientRect().height)},[]);return(0,P.Mq)(({scrollY:t},r)=>{if(!e)return;if(t=i?n(!1):t+l{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)}),{navbarRef:i,isNavbarVisible:t}}(t);return(0,u.jsxs)("nav",{ref:i,"aria-label":(0,l.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)(g.G.layout.navbar.container,"navbar","navbar--fixed-top",t&&[ot.navbarHideable,!s&&ot.navbarHidden],{"navbar--dark":"dark"===n,"navbar--primary":"primary"===n,"navbar-sidebar--show":a.shown}),children:[e,(0,u.jsx)(at,{onClick:a.toggle}),(0,u.jsx)(rt,{})]})}var st=n(70440);const lt={errorBoundaryError:"errorBoundaryError_a6uf",errorBoundaryFallback:"errorBoundaryFallback_VBag"};function ct(e){return(0,u.jsx)("button",{type:"button",...e,children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function ut({error:e}){const t=(0,st.rA)(e).map(e=>e.message).join("\n\nCause:\n");return(0,u.jsx)("p",{className:lt.errorBoundaryError,children:t})}class dt extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}const pt="right";function ft({width:e=30,height:t=30,className:n,...r}){return(0,u.jsx)("svg",{className:n,width:e,height:t,viewBox:"0 0 30 30","aria-hidden":"true",...r,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function mt(){const{toggle:e,shown:t}=(0,C.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,l.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(ft,{})})}const ht={colorModeToggle:"colorModeToggle_DEke"};function gt({items:e}){return(0,u.jsx)(u.Fragment,{children:e.map((e,t)=>(0,u.jsx)(dt,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Xe,{...e})},t))})}function bt({left:e,right:t}){return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:(0,o.A)(g.G.layout.navbar.containerLeft,"navbar__items"),children:e}),(0,u.jsx)("div",{className:(0,o.A)(g.G.layout.navbar.containerRight,"navbar__items navbar__items--right"),children:t})]})}function yt(){const e=(0,C.M)(),t=(0,w.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??pt)}return[e.filter(t),e.filter(e=>!t(e))]}(t),o=t.find(e=>"search"===e.type);return(0,u.jsx)(bt,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(mt,{}),(0,u.jsx)(ie,{}),(0,u.jsx)(gt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(gt,{items:r}),(0,u.jsx)(oe,{className:ht.colorModeToggle}),!o&&(0,u.jsx)(Ve,{children:(0,u.jsx)(He,{})})]})})}function vt(){return(0,u.jsx)(it,{children:(0,u.jsx)(yt,{})})}function wt({item:e}){const{to:t,href:n,label:r,prependBaseUrlToHref:a,className:i,...s}=e,l=(0,ue.Ay)(t),c=(0,ue.Ay)(n,{forcePrependBaseUrl:!0});return(0,u.jsxs)(ce.A,{className:(0,o.A)("footer__link-item",i),...n?{href:a?c:n}:{to:l},...s,children:[r,n&&!(0,de.A)(n)&&(0,u.jsx)(fe.A,{})]})}function xt({item:e}){return e.html?(0,u.jsx)("li",{className:(0,o.A)("footer__item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(wt,{item:e})},e.href??e.to)}function kt({column:e}){return(0,u.jsxs)("div",{className:(0,o.A)(g.G.layout.footer.column,"col footer__col",e.className),children:[(0,u.jsx)("div",{className:"footer__title",children:e.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:e.items.map((e,t)=>(0,u.jsx)(xt,{item:e},t))})]})}function St({columns:e}){return(0,u.jsx)("div",{className:"row footer__links",children:e.map((e,t)=>(0,u.jsx)(kt,{column:e},t))})}function _t(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function Et({item:e}){return e.html?(0,u.jsx)("span",{className:(0,o.A)("footer__link-item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,u.jsx)(wt,{item:e})}function jt({links:e}){return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:e.map((t,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(Et,{item:t}),e.length!==n+1&&(0,u.jsx)(_t,{})]},n))})})}function Ot({links:e}){return function(e){return"title"in e[0]}(e)?(0,u.jsx)(St,{columns:e}):(0,u.jsx)(jt,{links:e})}var At=n(21122);const Ct="footerLogoLink_BH7S";function Pt({logo:e}){const{withBaseUrl:t}=(0,ue.hH)(),n={light:t(e.src),dark:t(e.srcDark??e.src)};return(0,u.jsx)(At.A,{className:(0,o.A)("footer__logo",e.className),alt:e.alt,sources:n,width:e.width,height:e.height,style:e.style})}function Tt({logo:e}){return e.href?(0,u.jsx)(ce.A,{href:e.href,className:Ct,target:e.target,children:(0,u.jsx)(Pt,{logo:e})}):(0,u.jsx)(Pt,{logo:e})}function It({copyright:e}){return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:e}})}function Rt({style:e,links:t,logo:n,copyright:r}){return(0,u.jsx)("footer",{className:(0,o.A)(g.G.layout.footer.container,"footer",{"footer--dark":"dark"===e}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[t,(n||r)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[n&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:n}),r]})]})})}function Nt(){const{footer:e}=(0,w.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(Rt,{style:o,links:n&&n.length>0&&(0,u.jsx)(Ot,{links:n}),logo:r&&(0,u.jsx)(Tt,{logo:r}),copyright:t&&(0,u.jsx)(It,{copyright:t})})}const Dt=r.memo(Nt);function Lt(e){const[t,n]=(0,r.useState)(!1),o=r.useRef(null);(0,Te.E8)({isOpen:!1,onOpen:()=>{o.current?.click()}});const a=(0,u.jsxs)("div",{ref:o,onClick:()=>{document.querySelector(".DocSearch-Button")?.click()},onMouseEnter:()=>n(!0),onMouseLeave:()=>n(!1),style:{position:"fixed",right:"20px",bottom:"20px",zIndex:100,display:"flex",alignItems:"center",gap:"10px",cursor:"pointer"},children:[t&&(0,u.jsx)("div",{style:{backgroundColor:"#f6f6f6",padding:"8px 16px",borderRadius:"20px",color:"#000",fontSize:"14px",boxShadow:"0 2px 4px rgba(0,0,0,0.1)"},children:"Hi, how can I help you?"}),(0,u.jsx)("div",{style:{backgroundColor:"#f6f6f6",borderRadius:"50%",width:"48px",height:"48px",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 2px 4px rgba(0,0,0,0.1)"},children:(0,u.jsx)("img",{src:"/img/langflow-icon-black-transparent.svg",style:{width:"40px"},alt:"Search"})})]});return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Dt,{...e}),a]})}const Mt=(0,T.fM)([B.a,x.o,P.Tv,Qe.VQ,i.Jx,function({children:e}){return(0,u.jsx)(I.y_,{children:(0,u.jsx)(C.e,{children:(0,u.jsx)(N,{children:e})})})}]);function Ft({children:e}){return(0,u.jsx)(Mt,{children:e})}var zt=n(51107);function Bt({error:e,tryAgain:t}){return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(zt.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(l.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(ct,{onClick:t,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(ut,{error:e})})]})})})}const Ut={mainWrapper:"mainWrapper_z2l0"};function qt(e){const{children:t,noFooter:n,wrapperClassName:r,title:s,description:l}=e;return(0,b.J)(),(0,u.jsxs)(Ft,{children:[(0,u.jsx)(i.be,{title:s,description:l}),(0,u.jsx)(v,{}),(0,u.jsx)(A,{}),(0,u.jsx)(vt,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.layout.main.container,g.G.wrapper.main,Ut.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Bt,{...e}),children:t})}),!n&&(0,u.jsx)(Lt,{})]})}},12983:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[i]=e.split(/[#?]/),s="/"===i||i===r?i:(l=i,c=n,c?o(l):a(l));var l,c;return e.replace(i,s)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(42566);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},13003:e=>{"use strict";e.exports=function(e){return e!=e}},13144:(e,t,n)=>{"use strict";var r=n(66743),o=n(11002),a=n(10076),i=n(47119);e.exports=i||r.call(a,o)},14035:(e,t,n)=>{"use strict";var r,o=n(36556),a=n(49092)(),i=n(9957),s=n(75795);if(a){var l=o("RegExp.prototype.exec"),c={},u=function(){throw c},d={toString:u,valueOf:u};"symbol"==typeof Symbol.toPrimitive&&(d[Symbol.toPrimitive]=u),r=function(e){if(!e||"object"!=typeof e)return!1;var t=s(e,"lastIndex");if(!(t&&i(t,"value")))return!1;try{l(e,d)}catch(n){return n===c}}}else{var p=o("Object.prototype.toString");r=function(e){return!(!e||"object"!=typeof e&&"function"!=typeof e)&&"[object RegExp]"===p(e)}}e.exports=r},14090:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(96540);const o="navigation-with-keyboard";function a(){(0,r.useEffect)(()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}},[])}},14563:(e,t,n)=>{"use strict";n.d(t,{AL:()=>u,s$:()=>d});var r=n(96540),o=n(44586),a=n(36803),i=n(89532),s=n(74848);const l=({title:e,siteTitle:t,titleDelimiter:n})=>{const r=e?.trim();return r&&r!==t?`${r} ${n} ${t}`:t},c=(0,r.createContext)(null);function u({formatter:e,children:t}){return(0,s.jsx)(c.Provider,{value:e,children:t})}function d(){const e=function(){const e=(0,r.useContext)(c);if(null===e)throw new i.dV("TitleFormatterProvider");return e}(),{siteConfig:t}=(0,o.A)(),{title:n,titleDelimiter:s}=t,{plugin:u}=(0,a.A)();return{format:t=>e({title:t,siteTitle:n,titleDelimiter:s,plugin:u,defaultFormatter:l})}}},14875:(e,t,n)=>{"use strict";n.r(t),n.d(t,{onRouteDidUpdate:()=>d});var r=n(38193),o=n(96763);let a=!1;const i={codeLanguage:e=>{const t=e.querySelector("[data-ch-lang]")||e.closest("[data-ch-lang]");if(t){const e=t.getAttribute("data-ch-lang");if(e&&"text"!==e)return e}const n=e.closest(".theme-code-block")||e.parentElement?.closest('[class*="code"]')||e.parentElement;if(n){const e=n.querySelector('li[role="tab"][aria-selected="true"]');if(e){const t=e.textContent?.trim();if(t&&"text"!==t.toLowerCase())return t.toLowerCase()}}if(n){const e=n.querySelector('li[role="tab"]');if(e){const t=e.textContent?.trim();if(t&&"text"!==t.toLowerCase())return t.toLowerCase()}}return null}},s={selectors:[{selector:"h1, h2, h3, h4, h5, h6",eventName:"Scroll - Heading Viewed",properties:{element_type:"heading"}}]};function l(e,t={}){const n={};return Object.keys(t).forEach(r=>{const a=t[r];if("function"==typeof a)try{const t=a(e);null!=t&&(n[r]=t)}catch(s){o.warn(`Scroll tracking: Error executing function for property "${r}":`,s)}else if("string"==typeof a&&a.startsWith("helper:")){const t=a.replace("helper:","");if(i[t])try{const o=i[t](e);null!=o&&(n[r]=o)}catch(s){o.warn(`Scroll tracking: Error executing helper "${t}" for property "${r}":`,s)}else o.warn(`Scroll tracking: Unknown helper function "${t}"`)}else n[r]=a}),n.page_path=window.location.pathname,n.page_url=window.location.href,n.scroll_depth=function(){const e=window.pageYOffset||document.documentElement.scrollTop,t=Math.max(document.body.scrollHeight,document.body.offsetHeight,document.documentElement.clientHeight,document.documentElement.scrollHeight,document.documentElement.offsetHeight)-window.innerHeight;return t<=0?100:Math.min(100,Math.round(e/t*100))}(),e.tagName&&(n.tag_name=e.tagName.toLowerCase()),e.id&&(n.element_id=e.id),e.className&&(n.element_class=e.className),e.tagName&&e.tagName.match(/^H[1-6]$/)&&(n.heading_level=e.tagName.toLowerCase(),n.heading_text=e.textContent?.trim().substring(0,200),n.text=e.textContent?.trim().substring(0,200)),n}function c(e={}){if(!r.A.canUseDOM||a)return;const t=window.__SCROLL_TRACKING_CONFIG__||{},n=function(e){if(!window.IntersectionObserver)return void o.warn("IntersectionObserver not supported, element tracking disabled");const t=new IntersectionObserver(t=>{t.forEach(t=>{if(t.isIntersecting){const n=e.selectors.find(e=>t.target.matches(e.selector));if(n){const e=window.innerWidth<=768,r=t.target.matches(".ch-codeblock");setTimeout(()=>{const e=l(t.target,n.properties||{});window.analytics&&"function"==typeof window.analytics.track&&window.analytics.track(n.eventName,e)},e&&r?100:0)}}})},{threshold:.1,rootMargin:"0px"}),n=e=>{document.querySelectorAll(e.selector).forEach(e=>{e._scrollTrackingObserved||(t.observe(e),e._scrollTrackingObserved=!0)})};if(e.selectors.forEach(n),setTimeout(()=>{e.selectors.forEach(n)},1e3),window.MutationObserver){const n=new MutationObserver(n=>{n.forEach(n=>{n.addedNodes.forEach(n=>{n.nodeType===Node.ELEMENT_NODE&&e.selectors.forEach(e=>{n.matches&&n.matches(e.selector)&&(n._scrollTrackingObserved||(t.observe(n),n._scrollTrackingObserved=!0)),(n.querySelectorAll?n.querySelectorAll(e.selector):[]).forEach(e=>{e._scrollTrackingObserved||(t.observe(e),e._scrollTrackingObserved=!0)})})})})});n.observe(document.body,{childList:!0,subtree:!0}),t._mutationObserver=n}return t}({...s,...t,...e});a=!0,window._scrollTrackingObserver=n}function u(){window._scrollTrackingObserver&&(window._scrollTrackingObserver._mutationObserver&&window._scrollTrackingObserver._mutationObserver.disconnect(),window._scrollTrackingObserver.disconnect(),window._scrollTrackingObserver=null),document.querySelectorAll("[data-scroll-tracked]").forEach(e=>{delete e._scrollTrackingObserved,e.removeAttribute("data-scroll-tracked")}),a=!1}if(r.A.canUseDOM){const e=()=>{setTimeout(()=>{c()},250)};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",e):"interactive"===document.readyState?setTimeout(e,100):e(),window.addEventListener("popstate",()=>{u(),setTimeout(()=>c(),100)})}function d({location:e,previousLocation:t}){r.A.canUseDOM&&t&&e.pathname!==t.pathname&&(u(),setTimeout(()=>c(),100))}},15066:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;to});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n{"use strict";var n=Symbol.for("react.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),i=Symbol.for("react.profiler"),s=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var m={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},h=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||m}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var w=v.prototype=new y;w.constructor=v,h(w,b.prototype),w.isPureReactComponent=!0;var x=Array.isArray,k=Object.prototype.hasOwnProperty,S={current:null},_={key:!0,ref:!0,__self:!0,__source:!0};function E(e,t,r){var o,a={},i=null,s=null;if(null!=t)for(o in void 0!==t.ref&&(s=t.ref),void 0!==t.key&&(i=""+t.key),t)k.call(t,o)&&!_.hasOwnProperty(o)&&(a[o]=t[o]);var l=arguments.length-2;if(1===l)a.children=r;else if(1{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},17065:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},17559:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},announcementBar:{container:"theme-announcement-bar"},layout:{navbar:{container:"theme-layout-navbar",containerLeft:"theme-layout-navbar-left",containerRight:"theme-layout-navbar-right",mobileSidebar:{container:"theme-layout-navbar-sidebar",panel:"theme-layout-navbar-sidebar-panel"}},main:{container:"theme-layout-main"},footer:{container:"theme-layout-footer",column:"theme-layout-footer-column"}},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},18215:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;to});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n{var r={"./":8722};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=18692},19700:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(o,function(e){if("function"==typeof a&&!a(e))return e;for(var o,s=i.length;-1!==n.code.indexOf(o=t(r,s));)++s;return i[s]=e,o}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function i(s){for(var l=0;l=a.length);l++){var c=s[l];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof c?c:c.content,f=t(r,u),m=p.indexOf(f);if(m>-1){++o;var h=p.substring(0,m),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(m+f.length),y=[];h&&y.push.apply(y,i([h])),y.push(g),b&&y.push.apply(y,i([b])),"string"==typeof c?s.splice.apply(s,[l,1].concat(y)):c.content=y}}else c.content&&i(c.content)}return s}(n.tokens)}}}})}(Prism)},20311:e=>{"use strict";e.exports=function(e,t,n,r,o,a,i,s){if(!e){var l;if(void 0===t)l=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,s],u=0;(l=new Error(t.replace(/%s/g,function(){return c[u++]}))).name="Invariant Violation"}throw l.framesToPop=1,l}}},21020:(e,t,n)=>{"use strict";var r=n(96540),o=Symbol.for("react.element"),a=Symbol.for("react.fragment"),i=Object.prototype.hasOwnProperty,s=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,l={key:!0,ref:!0,__self:!0,__source:!0};function c(e,t,n){var r,a={},c=null,u=null;for(r in void 0!==n&&(c=""+n),void 0!==t.key&&(c=""+t.key),void 0!==t.ref&&(u=t.ref),t)i.call(t,r)&&!l.hasOwnProperty(r)&&(a[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps)void 0===a[r]&&(a[r]=t[r]);return{$$typeof:o,type:e,key:c,ref:u,props:a,_owner:s.current}}t.Fragment=a,t.jsx=c,t.jsxs=c},21122:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(96540),o=n(15066),a=n(92303),i=n(95293);const s={themedComponent:"themedComponent_mlkZ","themedComponent--light":"themedComponent--light_NVdE","themedComponent--dark":"themedComponent--dark_xIcU"};var l=n(74848);function c({className:e,children:t}){const n=(0,a.A)(),{colorMode:c}=(0,i.G)();return(0,l.jsx)(l.Fragment,{children:(n?"dark"===c?["dark"]:["light"]:["light","dark"]).map(n=>{const a=t({theme:n,className:(0,o.A)(e,s.themedComponent,s[`themedComponent--${n}`])});return(0,l.jsx)(r.Fragment,{children:a},n)})})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,l.jsx)(c,{className:n,children:({theme:e,className:n})=>(0,l.jsx)("img",{src:t[e],alt:r,className:n,...o})})}},21312:(e,t,n)=>{"use strict";n.d(t,{A:()=>u,T:()=>c});var r=n(96540),o=n(74848);function a(e,t){const n=e.split(/(\{\w+\})/).map((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e});return n.some(e=>(0,r.isValidElement)(e))?n.map((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e).filter(e=>""!==e):n.join("")}var i=n(22654),s=n(96763);function l({id:e,message:t}){if(void 0===e&&void 0===t)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return i[e??t]??t??e}function c({message:e,id:t},n){return a(l({message:e,id:t}),n)}function u({children:e,id:t,values:n}){if(e&&"string"!=typeof e)throw s.warn("Illegal children",e),new Error("The Docusaurus component only accept simple string values");const r=l({message:e,id:t});return(0,o.jsx)(o.Fragment,{children:a(r,n)})}},21798:(e,t,n)=>{"use strict";n.r(t)},22067:(e,t,n)=>{"use strict";var r=n(96540),o=n(5338),a=n(80545),i=n(54625),s=n(4784),l=n(38193);const c=[n(31911),n(10119),n(26134),n(76294),n(641),n(21798),n(68665),n(11818),n(73796),n(29492),n(88135),n(14875)];var u=n(35947),d=n(56347),p=n(22831),f=n(74848);function m({children:e}){return(0,f.jsx)(f.Fragment,{children:e})}var h=n(14563);const g=e=>e.defaultFormatter(e);function b({children:e}){return(0,f.jsx)(h.AL,{formatter:g,children:e})}function y({children:e}){return(0,f.jsx)(b,{children:e})}var v=n(5260),w=n(44586),x=n(86025),k=n(6342),S=n(45500),_=n(32131),E=n(14090),j=n(2967),O=n(70440),A=n(41463);function C(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,w.A)(),r=(0,_.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(v.A,{children:[Object.entries(n).map(([e,{htmlLang:t}])=>(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:e,fullyQualified:!0}),hrefLang:t},e)),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter(e=>o!==e.htmlLang).map(e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`))]})}function P({permalink:e}){const{siteConfig:{url:t}}=(0,w.A)(),n=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,w.A)(),{pathname:r}=(0,d.zy)();return e+(0,O.Ks)((0,x.Ay)(r),{trailingSlash:n,baseUrl:t})}(),r=e?`${t}${e}`:n;return(0,f.jsxs)(v.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:r}),(0,f.jsx)("link",{rel:"canonical",href:r})]})}function T(){const{i18n:{currentLocale:e}}=(0,w.A)(),{metadata:t,image:n}=(0,k.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(v.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:E.w})]}),n&&(0,f.jsx)(S.be,{image:n}),(0,f.jsx)(P,{}),(0,f.jsx)(C,{}),(0,f.jsx)(A.A,{tag:j.C,locale:e}),(0,f.jsx)(v.A,{children:t.map((e,t)=>(0,f.jsx)("meta",{...e},t))})]})}const I=new Map;var R=n(6125),N=n(26988),D=n(205);function L(e,...t){const n=c.map(n=>{const r=n.default?.[e]??n[e];return r?.(...t)});return()=>n.forEach(e=>e?.())}const M=function({children:e,location:t,previousLocation:n}){return(0,D.A)(()=>{n!==t&&(!function({location:e,previousLocation:t}){if(!t)return;const n=e.pathname===t.pathname,r=e.hash===t.hash,o=e.search===t.search;if(n&&r&&!o)return;const{hash:a}=e;if(a){const e=decodeURIComponent(a.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:t,previousLocation:n}),L("onRouteDidUpdate",{previousLocation:n,location:t}))},[n,t]),e};function F(e){const t=Array.from(new Set([e,decodeURI(e)])).map(e=>(0,p.u)(u.A,e)).flat();return Promise.all(t.map(e=>e.route.component.preload?.()))}var z=n(96763);class B extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=l.A.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),F(n.pathname).then(()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})}).catch(e=>{z.warn(e),window.location.reload()}),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(M,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const U=B,q="__docusaurus-base-url-issue-banner-suggestion-container";function $(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n
    \n

    Your Docusaurus site did not load properly.

    \n

    A very common reason is a wrong site baseUrl configuration.

    \n

    Current configured baseUrl = ${e} ${"/"===e?" (default value)":""}

    \n

    We suggest trying baseUrl =

    \n
    \n`}(e)).replace(/!0===e.exact))return I.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return I.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(U,{location:e,children:Y})}function Z(){return(0,f.jsx)(W.A,{children:(0,f.jsx)(N.l,{children:(0,f.jsxs)(R.x,{children:[(0,f.jsx)(m,{children:(0,f.jsxs)(y,{children:[(0,f.jsx)(V,{}),(0,f.jsx)(T,{}),(0,f.jsx)(G,{}),(0,f.jsx)(J,{})]})}),(0,f.jsx)(Q,{})]})})})}var X=n(84054);const ee=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)})}:function(e){return new Promise((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)})};var te=n(86921);const ne=new Set,re=new Set,oe=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,ae={prefetch:e=>{if(!(e=>!oe()&&!re.has(e)&&!ne.has(e))(e))return!1;ne.add(e);const t=(0,p.u)(u.A,e).flatMap(e=>{return t=e.route.path,Object.entries(X).filter(([e])=>e.replace(/-[^-]+$/,"")===t).flatMap(([,e])=>Object.values((0,te.A)(e)));var t});return Promise.all(t.map(e=>{const t=n.gca(e);return t&&!t.includes("undefined")?ee(t).catch(()=>{}):Promise.resolve()}))},preload:e=>!!(e=>!oe()&&!re.has(e))(e)&&(re.add(e),F(e))},ie=Object.freeze(ae);var se=n(96763);function le({children:e}){return"hash"===s.A.future.experimental_router?(0,f.jsx)(i.I9,{children:e}):(0,f.jsx)(i.Kd,{children:e})}const ce=Boolean(!0);if(l.A.canUseDOM){window.docusaurus=ie;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(le,{children:(0,f.jsx)(Z,{})})}),n=(e,t)=>{se.error("Docusaurus React Root onRecoverableError:",e,t)},i=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ce)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};F(window.location.pathname).then(()=>{(0,r.startTransition)(i)})}},22069:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,e:()=>f});var r=n(96540),o=n(75600),a=n(24581),i=n(57485),s=n(6342),l=n(89532),c=n(74848);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,s.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1),c=(0,r.useCallback)(()=>{l(e=>!e)},[]);return(0,r.useEffect)(()=>{"desktop"===t&&l(!1)},[t]),(0,r.useMemo)(()=>({disabled:e,shouldRender:n,toggle:c,shown:i}),[e,n,c,i])}function p({handler:e}){return(0,i.$Z)(e),null}function f({children:e}){const t=d();return(0,c.jsxs)(c.Fragment,{children:[t.shown&&(0,c.jsx)(p,{handler:()=>(t.toggle(),!1)}),(0,c.jsx)(u.Provider,{value:t,children:e})]})}function m(){const e=r.useContext(u);if(void 0===e)throw new l.dV("NavbarMobileSidebarProvider");return e}},22551:(e,t,n)=>{"use strict";var r=n(96763),o=n(96540),a=n(69982);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n
  • +

    Connect DataFrame, Data, or Message output from another component to the Save File component's Input port.

    +

    You can connect the same output to multiple Save File components if you want to create multiple files, save the data in different file formats, or save files to multiple locations.

    +
  • +
  • +

    In File Name, enter a file name and an optional path.

    +

    The File Name parameter controls where the file is saved. +It can contain a file name or an entire file path:

      -
    • csv
    • -
    • excel
    • -
    • json
    • -
    • markdown
    • -
    • pdf
    • +
    • +

      Default location: If you only provide a file name, then the file is stored in .langflow/data.

      +
    • +
    • +

      Subdirectory: To store files in subdirectories, add the path to the File Name parameter. +For example, subdirectory/my_file creates my_file in .langflow/data/subdirectory. +If a given subdirectory doesn't already exist, Langflow automatically creates it.

      +
    • +
    • +

      Absolute or relative path: To store files elsewhere in your .langflow installation or the local file system, provide the absolute or relative path to the desired location. +For example, ~/Desktop/my_file saves my_file to the desktop.

      +
    -

    For Message inputs, the component can create:

    +

    Don't include an extension in the file name. +If you do, the extension is treated as part of the file name; it has no impact on the File Format parameter.

    +
  • +
  • +

    In the component's header menu, click Controls, select the desired file format, and then click Close.

    +

    The available File Format options depend on the input data type:

      -
    • txt
    • -
    • json
    • -
    • markdown
    • -
    • pdf
    • +
    • +

      DataFrame can be saved to CSV (default), Excel (requires openpyxl custom dependency), JSON (fallback default), or Markdown.

      +
    • +
    • +

      Data can be saved to CSV, Excel (requires openpyxl custom dependency), JSON (default), or Markdown.

      +
    • +
    • +

      Message can be saved to TXT, JSON (default), or Markdown.

      +
    -
    Parameters

    Inputs

    NameDisplay NameInfo
    input_textInput TextThe text to analyze and extract patterns from.
    patternRegex PatternThe regular expression pattern to match in the text.
    input_typeInput TypeThe type of input to save.
    dfDataFrameThe DataFrame to save.
    dataDataThe Data object to save.
    messageMessageThe Message to save.
    file_formatFile FormatThe file format to save the input in.
    file_pathFile PathThe full file path including filename and extension.

    Outputs

    NameDisplay NameInfo
    dataDataA list of extracted matches as Data objects.
    textMessageThe extracted matches formatted as a Message object.
    confirmationConfirmationThe confirmation message after saving the file.
    +
    Overwrites allowed

    If you have multiple Save File components, in one or more flows, with the same file name, path, and extension, the file contains the data from the most recent run only. +Langflow doesn't block overwrites if a matching file already exists. +To avoid unintended overwrites, use unique file names and paths.

    +
  • +
  • +

    To test the Save File component, click Run component, and then click Inspect output to get the filepath where the file was saved.

    +

    The component's literal output is a Message containing the original data type, the file name and extension, and the absolute filepath to the file based on the File Name parameter. +For example:

    +

    _10
    DataFrame saved successfully as 'my_file.csv' at /Users/user.name/.langflow/data/my_file.csv

    +

    If the File Name contains a subdirectory or other non-default path, this is reflected in the Message output. +For example, a CSV file with the file name ~/Desktop/my_file could produce the following output:

    +

    _10
    DataFrame saved successfully as '/Users/user.name/Desktop/my_file.csv' at /Users/user.name/Desktop/my_file.csv

    +
  • +
  • +

    Optional: If you want to use the saved file in a flow, you must use an API call or another component to retrieve the file from the given filepath.

    +
  • +

    Smart Function

    In Langflow version 1.5, this component was renamed from Lambda Filter to Smart Function.

    -

    This component uses an LLM to generate a function for filtering or transforming structured data.

    -

    To use the Smart Function component, you must connect it to a Language Model component, which the Smart Filter component uses to generate a function based on the natural language instructions in the Instructions field.

    -

    This example gets JSON data from the https://jsonplaceholder.typicode.com/users API endpoint. -The Instructions field in the Smart Function component specifies the task extract emails. -The connected LLM creates a filter based on the instructions, and successfully extracts a list of email addresses from the JSON data.

    -

    Smart function connected to an LLM

    -
    Parameters

    Inputs

    NameDisplay NameInfo
    dataDataThe structured data to filter or transform using a Lambda function.
    llmLanguage ModelThe connection port for a Language Model component.
    filter_instructionInstructionsThe natural language instructions for how to filter or transform the data using a Lambda function, such as Filter the data to only include items where the 'status' is 'active'.
    sample_sizeSample SizeFor large datasets, the number of characters to sample from the dataset head and tail.
    max_sizeMax SizeThe number of characters for the data to be considered "large", which triggers sampling by the sample_size value.

    Outputs

    NameDisplay NameInfo
    filtered_dataFiltered DataThe filtered or transformed Data object.
    dataframeDataFrameThe filtered data as a DataFrame.
    +

    The Smart Function component uses an LLM to generate a Lambda function to filter or transform structured data based on natural language instructions. +You must connect this component to a Language Model component, which is used to generate a function based on the natural language instructions you provide in the Instructions parameter. +The LLM runs the function against the data input, and then outputs the results as Data.

    +
    tip

    Provide brief, clear instructions, focusing on the desired outcome or specific actions, such as Filter the data to only include items where the 'status' is 'active'. +One sentence or less is preferred because end punctuation, like periods, can cause errors or unexpected behavior.

    If you need to provide more details instructions that aren't directly relevant to the Lambda function, you can input them in the Language Model component's Input field or through a Prompt Template component.

    +

    The following example uses the API Request endpoint to pass JSON data from the https://jsonplaceholder.typicode.com/users endpoint to the Smart Function component. +Then, the Smart Function component passes the data and the instruction extract emails to the attached Language Model component. +From there, the LLM generates a filter function that extracts email addresses from the JSON data, returning the filtered data as chat output.

    +

    A small flow using a Smart Function component to extract data from an API response.

    +

    Smart Function parameters

    +

    Some Smart Function component input parameters are hidden by default in the visual editor. +You can toggle parameters through the Controls in the component's header menu.

    +
    NameDisplay NameInfo
    dataDataInput parameter. The structured data to filter or transform using a Lambda function.
    llmLanguage ModelInput parameter. Connect LanguageModel output from a Language Model component.
    filter_instructionInstructionsInput parameter. The natural language instructions for how to filter or transform the data. The LLM uses these instructions to create a Lambda function.
    sample_sizeSample SizeInput parameter. For large datasets, the number of characters to sample from the dataset head and tail. Only applied if the dataset meets or exceeds max_size. Default: 1000.
    max_sizeMax SizeInput parameter. The number of characters for the dataset to be considered large, which triggers sampling by the sample_size value. Default: 30000.

    Split Text

    -

    This component splits text into chunks based on specified criteria. It's ideal for chunking data to be tokenized and embedded into vector databases.

    -

    The Split Text component outputs Chunks or DataFrame. -The Chunks output returns a list of individual text chunks. -The DataFrame output returns a structured data format, with additional text and metadata columns applied.

    -
      -
    1. To use this component in a flow, connect a component that outputs Data or DataFrame to the Split Text component's Data port. -This example uses the URL component, which is fetching JSON placeholder data.
    2. -
    -

    Split Text and Chroma DB components

    -
      -
    1. In the Split Text component, define your data splitting parameters.
    2. -
    -

    This example splits incoming JSON data at the separator },, so each chunk contains one JSON object.

    -

    The order of precedence is Separator, then Chunk Size, and then Chunk Overlap. -If any segment after separator splitting is longer than chunk_size, it is split again to fit within chunk_size.

    -

    After chunk_size, Chunk Overlap is applied between chunks to maintain context.

    -
      -
    1. Connect a Chat Output component to the Split Text component's DataFrame output to view its output.
    2. -
    3. Click Playground, and then click Run Flow. -The output contains a table of JSON objects split at },.
    4. -
    -

    _16
    {
    _16
    "userId": 1,
    _16
    "id": 1,
    _16
    "title": "Introduction to Artificial Intelligence",
    _16
    "body": "Learn the basics of Artificial Intelligence and its applications in various industries.",
    _16
    "link": "https://example.com/article1",
    _16
    "comment_count": 8
    _16
    },
    _16
    {
    _16
    "userId": 2,
    _16
    "id": 2,
    _16
    "title": "Web Development with React",
    _16
    "body": "Build modern web applications using React.js and explore its powerful features.",
    _16
    "link": "https://example.com/article2",
    _16
    "comment_count": 12
    _16
    },

    -
      -
    1. Clear the Separator field, and then run the flow again. -Instead of JSON objects, the output contains 50-character lines of text with 10 characters of overlap.
    2. -
    -

    _10
    First chunk: "title": "Introduction to Artificial Intelligence""
    _10
    Second chunk: "elligence", "body": "Learn the basics of Artif"
    _10
    Third chunk: "s of Artificial Intelligence and its applications"

    -
    Parameters

    Inputs

    NameDisplay NameInfo
    data_inputsInput DocumentsThe data to split. The component accepts Data or DataFrame objects.
    chunk_overlapChunk OverlapThe number of characters to overlap between chunks. Default: 200.
    chunk_sizeChunk SizeThe maximum number of characters in each chunk. Default: 1000.
    separatorSeparatorThe character to split on. Default: newline.
    text_keyText KeyThe key to use for the text column. Default: text.

    Outputs

    NameDisplay NameInfo
    chunksChunksA list of split text chunks as Data objects.
    dataframeDataFrameA list of split text chunks as DataFrame objects.
    +

    The Split Text component splits data into chunks based on parameters like chunk size and separator. +It is often used to chunk data to be tokenized and embedded into vector databases. +For examples, see Use Vector Store components in a flow, Use Embedding Model components in a flow, and Create a Vector RAG chatbot.

    +

    An embedding generation flow that uses a Split Text component to chunk data.

    +

    The component accepts Message, Data, or DataFrame, and then outputs either Chunks or DataFrame. +The Chunks output returns a list of Data objects containing individual text chunks. +The DataFrame output returns the list of chunks as a structured DataFrame with additional text and metadata columns.

    +

    Split Text parameters

    +

    The Split Text component's parameters control how the text is split into chunks, specifically the chunk_size, chunk_overlap, and separator parameters.

    +

    To test the chunking behavior, add a Text Input or File component with some sample data to chunk, click Run component on the Split Text component, and then click Inspect output to view the list of chunks and their metadata. The text column contains the actual text chunks created from your chunking settings. +If the chunks aren't split as you expect, adjust the parameters, rerun the component, and then inspect the new output.

    +

    Some Split Text component input parameters are hidden by default in the visual editor. +You can toggle parameters through the Controls in the component's header menu.

    +
    NameDisplay NameInfo
    data_inputsInputInput parameter. The data to split. Input must be in Message, Data, or DataFrame format.
    chunk_overlapChunk OverlapInput parameter. The number of characters to overlap between chunks. This helps maintain context across chunks. When a separator is encountered, the overlap is applied at the point of the separator so that the subsequent chunk contains the last n characters of the preceding chunk. Default: 200.
    chunk_sizeChunk SizeInput parameter. The target length for each chunk after splitting. The data is first split by separator, and then chunks smaller than the chunk_size are merged up to this limit. However, if the initial separator split produces any chunks larger than the chunk_size, those chunks are neither further subdivided nor combined with any smaller chunks; these chunks will be output as-is even though they exceed the the chunk_size. Default: 1000.
    separatorSeparatorInput parameter. A string defining a character to split on, such as \n to split on new line characters, \n\n to split at paragraph breaks, or }, to split at the end of JSON objects. You can directly provide the separator string, or pass a separator string from another component as Message input.
    text_keyText KeyInput parameter. The key to use for the text column that is extracted from the input and then split. Default: text.
    keep_separatorKeep SeparatorInput parameter. Select how to handle separators in output chunks. If False, separators are omitted from output chunks. Options include False (remove separators), True (keep separators in chunks without preference for placement), Start (place separators at the beginning of chunks), or End (place separators at the end of chunks). Default: False.

    Other text splitters

    See LangChain text splitter components.

    -

    Structured output

    -

    This component transforms LLM responses into structured data formats.

    -

    In this example from the Financial Support Parser template, the Structured Output component transforms unstructured financial reports into structured data.

    -

    Structured output example

    -

    The connected LLM model is prompted by the Structured Output component's Format Instructions parameter to extract structured output from the unstructured text. Format Instructions is utilized as the system prompt for the Structured Output component.

    -

    In the Structured Output component, click the Open table button to view the Output Schema table. -The Output Schema parameter defines the structure and data types for the model's output using a table with the following fields:

    -
      -
    • Name: The name of the output field.
    • -
    • Description: The purpose of the output field.
    • -
    • Type: The data type of the output field. The available types are str, int, float, bool, list, or dict. The default is text.
    • -
    • Multiple (deprecated): Always true to allow multiple output values for a single field.
    • -
    -

    The Parse DataFrame component parses the structured output into a template for orderly presentation in chat output. The template receives the values from the output_schema table with curly braces.

    -

    For example, the template EBITDA: {EBITDA} , Net Income: {NET_INCOME} , GROSS_PROFIT: {GROSS_PROFIT} presents the extracted values in the Playground as EBITDA: 900 million , Net Income: 500 million , GROSS_PROFIT: 1.2 billion.

    -
    Parameters

    Inputs

    NameTypeDescription
    llmLanguageModelThe language model to use to generate the structured output.
    input_valueStringThe input message to the language model.
    system_promptStringThe instructions to the language model for formatting the output.
    schema_nameStringThe name for the output data schema.
    output_schemaTableThe structure and data types for the model's output.
    multipleBoolean[Deprecated] Always true.

    Outputs

    NameTypeDescription
    structured_outputDataThe structured output is a Data object based on the defined schema.
    -

    Type convert

    -

    This component converts data types between different formats. It can transform data between Data, DataFrame, and Message objects.

    -
      -
    • Data: A structured object that contains both text and metadata.
    • -
    -

    _10
    {
    _10
    "text": "User Profile",
    _10
    "data": {
    _10
    "name": "John Smith",
    _10
    "age": 30,
    _10
    "email": "john@example.com"
    _10
    }
    _10
    }

    -
      -
    • DataFrame: A tabular data structure with rows and columns. -Keys are columns, and each dictionary (a collection of key-value pairs) in the list is a row.
    • -
    -

    _12
    [
    _12
    {
    _12
    "name": "John Smith",
    _12
    "age": 30,
    _12
    "email": "john@example.com"
    _12
    },
    _12
    {
    _12
    "name": "Jane Doe",
    _12
    "age": 25,
    _12
    "email": "jane@example.com"
    _12
    }
    _12
    ]

    -
      -
    • Message: A string, such as"Name: John Smith, Age: 30, Email: john@example.com".
    • -
    -

    To use this component in a flow, do the following:

    +

    Structured Output

    +

    The Structured Output component uses an LLM to transform any input into structured data (Data or DataFrame) using natural language formatting instructions and an output schema definition. +For example, you can extract specific details from documents, like email messages or scientific papers.

    +

    Use the Structured Output component in a flow

    +

    To use the Structured Output component in a flow, do the following:

    1. -

      Add the Web Search component to the Basic Prompting template. In the Search Query field, enter a query, such as environmental news.

      +

      Provide an Input Message, which is the source material from which you want to extract structured data. +This can come from practically any component, but it is typically a Chat Input, File, or other component that provides some unstructured or semi-structured input.

      +
      tip

      Not all source material has to become structured output. +The power of the Structured Output component is that you can specify the information you want to extract, even if that data isn't explicitly labeled or an exact keyword match. +Then, the LLM can use your instructions to analyze the source material, extract the relevant data, and format it according to your specifications. +Any irrelevant source material isn't included in the structured output.

    2. -

      Connect the Web Search component's output to a component that accepts the DataFrame input. -This example uses a Prompt Template component to give the chatbot context, so you must convert the Web Search component's DataFrame output to a Message type.

      +

      Define Format Instructions and an Output Schema to specify the data to extract from the source material and how to structure it in the final Data or DataFrame output.

      +

      The instructions are a prompt that tell the LLM what data to extract, how to format it, how to handle exceptions, and any other instructions relevant to preparing the structured data.

      +

      The schema is a table that defines the fields (keys) and data types to organize the data extracted by the LLM into a structured Data or DataFrame object. +For more information, see Output Schema options

    3. -

      Connect a Type Convert component to convert the DataFrame to a Message.

      +

      Attach a Language Model component that is set to emit LanguageModel output.

      +

      The Language Model component uses the Input Message and Format Instructions from the Structured Output component to extract specific pieces of data from the input text. +The output schema is applied to the model's response to produce the final Data or DataFrame structured object.

    4. -

      In the Type Convert component, in the Output Type field, select Message.

      -

      Type convert web search output to chat

      -
    5. -
    6. -

      In the Language Model component, in the OpenAI API Key field, add your OpenAI API key.

      -
    7. -
    8. -

      Click Playground, and then ask about latest news.

      +

      Optional: Typically, the structured output is passed to downstream components that use the extracted data for other processes, such as other Processing components like the Parser or Data Operations components.

    -

    The search results are returned to the Playground as a message.

    -

    Result:

    -

    _10
    Latest news
    _10
    AI
    _10
    gpt-4o-mini
    _10
    Here are some of the latest news articles related to the environment:
    _10
    Ozone Pollution and Global Warming: A recent study highlights that ozone pollution is a significant global environmental concern, threatening human health and crop production while exacerbating global warming. Read more
    _10
    ...

    -
    Parameters

    Inputs

    NameDisplay NameInfo
    input_dataInput DataThe data to convert. Accepts Data, DataFrame, or Message objects.
    output_typeOutput TypeThe desired output type. Options: Data, DataFrame, or Message.

    Outputs

    NameDisplay NameInfo
    outputOutputThe converted data in the specified format.
    +

    A basic flow with Structured Output, Language Model, Type Convert, and Chat Input and Output components.

    +
    Structured Output example: Financial Report Parser template

    The Financial Report Parser template provides an example of how the Structured Output component can be used to extract structured data from unstructured text.

    The template's Structured Output component has the following configuration:

      +
    • +

      The Input Message comes from a Chat Input component that is preloaded with quotes from sample financial reports

      +
    • +
    • +

      The Format Instructions are as follows:

      +

      _10
      You are an AI that extracts structured JSON objects from unstructured text.
      _10
      Use a predefined schema with expected types (str, int, float, bool, dict).
      _10
      Extract ALL relevant instances that match the schema - if multiple patterns exist, capture them all.
      _10
      Fill missing or ambiguous values with defaults: null for missing values.
      _10
      Remove exact duplicates but keep variations that have different field values.
      _10
      Always return valid JSON in the expected format, never throw errors.
      _10
      If multiple objects can be extracted, return them all in the structured format.

      +
    • +
    • +

      The Output Schema includes keys for EBITDA, NET_INCOME, and GROSS_PROFIT.

      +
    • +

    The structured Data object is passed to a Parser component that produces a text string by mapping the schema keys to variables in the parsing template:


    _10
    EBITDA: {EBITDA} , Net Income: {NET_INCOME} , GROSS_PROFIT: {GROSS_PROFIT}

    When printed to the Playground, the resulting Message replaces the variables with the actual values extracted by the Structured Output component. For example:


    _10
    EBITDA: 900 million , Net Income: 500 million , GROSS_PROFIT: 1.2 billion

    +

    Structured Output parameters

    +

    Some Structured Output component input parameters are hidden by default in the visual editor. +You can toggle parameters through the Controls in the component's header menu.

    +
    NameTypeDescription
    Language Model (llm)LanguageModelInput parameter. The LanguageModel output from a Language Model component that defines the LLM to use to analyze, extract, and prepare the structured output.
    Input Message (input_value)StringInput parameter. The input message containing source material for extraction.
    Format Instructions (system_prompt)StringInput parameter. The instructions to the language model for extracting and formatting the output.
    Schema Name (schema_name)StringInput parameter. An optional title for the Output Schema.
    Output Schema (output_schema)TableInput parameter. A table describing the schema of the desired structured output, ultimately determining the content of the Data or DataFrame output. See Output Schema options.
    Structured Output (structured_output)Data or DataFrameOutput parameter. The final structured output produced by the component. Near the component's output port, you can select the output data type as either Structured Output Data or Structured Output DataFrame. The specific content and structure of the output depends on the input parameters.
    +

    Output Schema options

    +

    After the LLM extracts the relevant data from the Input Message and Format Instructions, the data is organized according to the Output Schema.

    +

    The schema is a table that defines the fields (keys) and data types for the final Data or DataFrame output from the Structured Output component.

    +

    The default schema is a single field string.

    +

    To add a key to the schema, click Add a new row, and then edit each column to define the schema:

    +
      +
    • +

      Name: The name of the output field. Typically a specific key for which you want to extract a value.

      +

      You can reference these keys as variables in downstream components, such as a Parser component's template. +For example, the schema key NET_INCOME could be referenced by the variable {NET_INCOME}.

      +
    • +
    • +

      Description: An optional metadata description of the field's contents and purpose.

      +
    • +
    • +

      Type: The data type of the value stored in the field. +Supported types are str (default), int, float, bool, and dict.

      +
    • +
    • +

      As List: Enable this setting if you want the field to contain a list of values rather than a single value.

      +
    • +
    +

    For simple schemas, you might only extract a few string or int fields. +For more complex schemas with lists and dictionaries, it might help to refer to the Data and DataFrame structures and attributes, as described in Langflow data types. +You can also emit a rough Data or DataFrame, and then use downstream components for further refinement, such as a Data Operations component.

    +

    Type Convert

    +

    The Type Convert component converts data from one type to another. +It supports Data, DataFrame, and Message data types.

    +

    A Data object is a structured object that contains a primary text key and other key-value pairs:


    _10
    "data": {
    _10
    "text": "User Profile",
    _10
    "name": "Charlie Lastname",
    _10
    "age": 28,
    _10
    "email": "charlie.lastname@example.com"
    _10
    },

    The larger context associated with a component's data dictionary also identifies which key is the primary text_key, and it can provide an optional default value if the primary key isn't specified. +For example:


    _10
    {
    _10
    "text_key": "text",
    _10
    "data": {
    _10
    "text": "User Profile",
    _10
    "name": "Charlie Lastname",
    _10
    "age": 28,
    _10
    "email": "charlie.lastname@example.com"
    _10
    },
    _10
    "default_value": ""
    _10
    }

    +

    For more information, see Langflow data types.

    +

    Use the Type Convert component in a flow

    +

    The Type Convert component is typically used to transform data into a format required by a downstream component. +For example, if a component outputs a Message, but the following component requires Data, then you can use the Type Convert component to reformat the Message as Data before passing it to the downstream component.

    +

    The following example uses the Type Convert component to convert the DataFrame output from a Web Search component into Message data that is passed as text input for an LLM:

    +
      +
    1. +

      Create a flow based on the Basic prompting template.

      +
    2. +
    3. +

      Add a Web Search component to the flow, and then enter a search query, such as environmental news.

      +
    4. +
    5. +

      In the Prompt Template component, replace the contents of the Template field with the following text:

      +

      _10
      Answer the user's question using the {context}

      +

      The curly braces define a prompt variable that becomes an input field on the Prompt Template component. +In this example, you will use the context field to pass the search results into the template, as explained in the next steps.

      +
    6. +
    7. +

      Add a Type Convert component to the flow, and then set the Output Type to Message.

      +

      Because the Web Search component's DataFrame output is incompatible with the context variable's Message input, you must use the Type Convert component to change the DataFrame to a Message in order to pass the search results to the Prompt Template component.

      +
    8. +
    9. +

      Connect the additional components to the rest of the flow:

      +
        +
      • Connect the Web Search component's output to the Type Convert component's input.
      • +
      • Connect the Type Convert component's output to the Prompt Template component's context input.
      • +
      +

      Convert web search output to text input

      +
    10. +
    11. +

      In the Language Model component, add your OpenAI API key.

      +

      If you want to use a different provider or model, edit the Model Provider, Model Name, and API Key fields accordingly.

      +
    12. +
    13. +

      Click Playground, and then ask something relevant to your search query, such as latest news or what's the latest research on the environment?.

      +
      Result

      The LLM uses the search results context, your chat message, and it's built-in training data to respond to your question. +For example:


      _10
      Here are some of the latest news articles related to the environment:
      _10
      Ozone Pollution and Global Warming: A recent study highlights that ozone pollution is a significant global environmental concern, threatening human health and crop production while exacerbating global warming. Read more
      _10
      ...

      +
    14. +
    +

    Type Convert parameters

    +
    NameDisplay NameInfo
    input_dataInput DataInput parameter. The data to convert. Accepts Data, DataFrame, or Message input.
    output_typeOutput TypeInput parameter. The desired output type, as one of Data, DataFrame or Message.
    outputOutputOutput parameter. The converted data in the specified format. The output port changes depending on the selected Output Type.

    Legacy Processing components

    The following Processing components are legacy components. You can still use them in your flows, but they are no longer supported and can be removed in a future release.

    @@ -433,7 +598,7 @@ Fields from the .data attribute become columns, and the .text
    Python Code Structured

    Replace this legacy component with the Python Interpreter component or another processing or logic component.

    This component creates a structured tool from Python code using a dataclass.

    The component dynamically updates its configuration based on the provided Python code, allowing for custom function arguments and descriptions.

    It accepts the following parameters:

    NameTypeDescription
    tool_codeStringInput parameter. The Python code for the tool's dataclass.
    tool_nameStringInput parameter. The name of the tool.
    tool_descriptionStringInput parameter. The description of the tool.
    return_directBooleanInput parameter. Whether to return the function output directly.
    tool_functionStringInput parameter. The selected function for the tool.
    global_variablesDictInput parameter. Global variables or data for the tool.
    result_toolToolOutput parameter. A structured tool created from the Python code.
    Regex Extractor

    Replace this legacy component with the Parser component.

    This component extracts patterns in text using regular expressions. It can be used to find and extract specific patterns or information in text.

    Select Data

    Replace this legacy component with the Data Operations component.

    This component selects a single Data object from a list.

    It accepts the following parameters:

    NameDisplay NameInfo
    data_listData ListInput parameter. List of data to select from
    data_indexData IndexInput parameter. Index of the data to select
    selected_dataSelected DataOutput parameter. The selected Data object.
    -
    Update Data

    Replace this legacy component with the Data Operations component.

    This component dynamically updates or appends data with specified fields.

    It accepts the following parameters:

    NameDisplay NameInfo
    old_dataDataInput parameter. The records to update.
    number_of_fieldsNumber of FieldsInput parameter. The number of fields to add. The maximum is 15.
    text_keyText KeyInput parameter. The key for text content.
    text_key_validatorText Key ValidatorInput parameter. Validates the text key presence.
    dataDataOutput parameter. The updated Data objects.