Files
langflow/langflow-assistant.html
2026-06-25 13:37:38 +00:00

179 lines
62 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-1.10.0 docs-doc-page docs-doc-id-Flows/langflow-assistant" data-has-hydrated="false">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v3.9.2">
<title data-rh="true">Build flows and components with Langflow Assistant | Langflow Documentation</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://docs.langflow.org/langflow-assistant"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docusaurus_version" content="1.10.0"><meta data-rh="true" name="docusaurus_tag" content="docs-default-1.10.0"><meta data-rh="true" name="docsearch:version" content="1.10.0"><meta data-rh="true" name="docsearch:docusaurus_tag" content="docs-default-1.10.0"><meta data-rh="true" property="og:title" content="Build flows and components with Langflow Assistant | Langflow Documentation"><meta data-rh="true" name="description" content="Langflow Assistant is an in-app virtual assistant pane accessible from the canvas toolbar."><meta data-rh="true" property="og:description" content="Langflow Assistant is an in-app virtual assistant pane accessible from the canvas toolbar."><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://docs.langflow.org/langflow-assistant"><link data-rh="true" rel="alternate" href="https://docs.langflow.org/langflow-assistant" hreflang="en"><link data-rh="true" rel="alternate" href="https://docs.langflow.org/langflow-assistant" hreflang="x-default"><link data-rh="true" rel="preconnect" href="https://UZK6BDPCVY-dsn.algolia.net" crossorigin="anonymous"><script data-rh="true" type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Build flows and components with Langflow Assistant","item":"https://docs.langflow.org/langflow-assistant"}]}</script><link rel="preconnect" href="https://www.google-analytics.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-SLQFLQ3KPT"></script>
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("js",new Date),gtag("config","G-SLQFLQ3KPT",{})</script>
<link rel="search" type="application/opensearchdescription+xml" title="Langflow Documentation" href="/opensearch.xml">
<script>window._ibmAnalytics={settings:{name:"DataStax",tealiumProfileName:"ibm-subsidiary"},trustarc:{privacyPolicyLink:"https://ibm.com/privacy"},"digitalData.page.services.google.enabled":!0},window.digitalData={page:{pageInfo:{ibm:{siteId:"IBM_"+_ibmAnalytics.settings.name},segment:{enabled:!0,env:"prod",key:"B04fNhD06DqDPuaRfQl5lZ2iQICdxxuh",coremetrics:!1,carbonComponentEvents:!1}},category:{primaryCategory:"PC230"}},commonProperties:{productTitle:"IBM Elite Support for Langflow",productCode:"5900BUB",productCodeType:"WWPC",UT30:"30AS5",instanceId:"docs-site",subscriptionId:"public-access",productPlanName:"Public",productPlanType:"freemium",userId:"IBMid-ANONYMOUS"}}</script>
<script src="//1.www.s81c.com/common/stats/ibm-common.js" async="true"></script>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Geist:wght@300;400;500;600;700&amp;family=Geist+Mono:wght@400;500&amp;family=Sora:wght@550;600&amp;display=swap">
<script>function gtag(){dataLayer.push(arguments)}window.dataLayer=window.dataLayer||[],gtag("consent","default",{ad_storage:"denied",ad_user_data:"denied",ad_personalization:"denied",analytics_storage:"denied"})</script>
<script>!function(){function e(){if(void 0!==window.truste&&window.truste.cma){var e=window.truste.cma.callApi("getConsent",window.location.href)||{},n=1===e[2],t=1===e[3];gtag("consent","update",{ad_storage:n?"granted":"denied",ad_user_data:n?"granted":"denied",ad_personalization:n?"granted":"denied",analytics_storage:t?"granted":"denied"})}}window.addEventListener&&(window.addEventListener("cm_data_subject_consent_changed",e),window.addEventListener("cm_consent_preferences_set",e)),"complete"===document.readyState?e():window.addEventListener("load",e)}()</script><link rel="stylesheet" href="/assets/css/styles.0d9d771d.css">
<script src="/assets/js/runtime~main.c313665b.js" defer="defer"></script>
<script src="/assets/js/main.12b252df.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
<svg style="display: none;"><defs>
<symbol id="theme-svg-external-link" viewBox="0 0 24 24"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></symbol>
</defs></svg>
<script>!function(){var t=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();document.documentElement.setAttribute("data-theme",t||(window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light")),document.documentElement.setAttribute("data-theme-choice",t||"system")}(),function(){try{const c=new URLSearchParams(window.location.search).entries();for(var[t,e]of c)if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}()</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="theme-layout-navbar navbar navbar--fixed-top"><div class="navbar__inner"><div class="theme-layout-navbar-left navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/lf-docs-light.svg" alt="Langflow" class="themedComponent_mlkZ themedComponent--light_NVdE"><img src="/img/lf-docs-dark.svg" alt="Langflow" class="themedComponent_mlkZ themedComponent--dark_xIcU"></div></a><div class="navbar__item dropdown dropdown--hoverable"><a aria-current="page" class="navbar__link active" aria-haspopup="true" aria-expanded="false" role="button" href="/langflow-assistant">1.10.x</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/next/langflow-assistant">1.11.x (Next)</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/langflow-assistant">1.10.x</a></li><li><a class="dropdown__link" href="/1.9.0/langflow-assistant">1.9.x</a></li><li><a class="dropdown__link" href="/1.8.0">1.8.x</a></li></ul></div></div><div class="theme-layout-navbar-right navbar__items navbar__items--right"><a href="https://github.com/langflow-ai/langflow" target="_blank" class="navbar__item navbar__link header-github-link" aria-label="GitHub" data-event="UI Interaction" data-action="clicked" data-channel="docs" data-element-id="social-github" data-namespace="header" data-platform-title="Langflow"></a><a href="https://twitter.com/langflow_ai" target="_blank" class="navbar__item navbar__link header-twitter-link" aria-label="Twitter" data-event="UI Interaction" data-action="clicked" data-channel="docs" data-element-id="social-twitter" data-namespace="header" data-platform-title="Langflow"></a><a href="https://discord.gg/EqksyE2EX9" target="_blank" class="navbar__item navbar__link header-discord-link" aria-label="Discord" data-event="UI Interaction" data-action="clicked" data-channel="docs" data-element-id="social-discord" data-namespace="header" data-platform-title="Langflow"></a><div class="toggle_MW0i colorModeToggle_DEke"><button class="clean-btn toggleButton_yw5v toggleButtonDisabled_BJd7" type="button" disabled="" title="system mode" aria-label="Switch between dark and light mode (currently system mode)"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" role="presentation" class="toggleIcon_oIOL lightToggleIcon_SFTY"><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"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" role="presentation" class="toggleIcon_oIOL darkToggleIcon_ekgs"><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"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" role="presentation" class="toggleIcon_oIOL systemToggleIcon_yi_a"><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"></path></svg></button></div><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search (Meta+k)" aria-keyshortcuts="Meta+k"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="8" stroke="currentColor" fill="none" stroke-width="1.4"></circle><path d="m21 21-4.3-4.3" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="theme-layout-main main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside aria-label="Documentation sidebar" class="theme-doc-sidebar-container docSidebarContainer_RSuS"><div class="sidebarViewport_pYEE"><div class="sidebar_njMd"><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 sidebar-group-divider"><div class="sidebar-group-label">Build</div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-rocket"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/"><span title="Get started" class="categoryLinkLabel_W154">Get started</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item sidebar-category-with-icon sidebar-icon-workflow"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true" href="/concepts-overview"><span title="Flows" class="categoryLinkLabel_W154">Flows</span></a></div><ul class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/concepts-overview"><span title="Use the visual editor" class="linkLabel_WmDU">Use the visual editor</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/concepts-flows"><span title="Build flows" class="linkLabel_WmDU">Build flows</span></a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0" href="/concepts-publish"><span title="Run flows" class="categoryLinkLabel_W154">Run flows</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/concepts-playground"><span title="Test flows" class="linkLabel_WmDU">Test flows</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/concepts-flows-import"><span title="Import and export flows" class="linkLabel_WmDU">Import and export flows</span></a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/langflow-assistant"><span title="Build flows and components with Langflow Assistant" class="linkLabel_WmDU">Build flows and components with Langflow Assistant</span></a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-bot"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/agents"><span title="Agents" class="categoryLinkLabel_W154">Agents</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-plug"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/mcp-client"><span title="Model Context Protocol (MCP)" class="categoryLinkLabel_W154">Model Context Protocol (MCP)</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 sidebar-group-divider"><div class="sidebar-group-label">Develop & Deploy</div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-code"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/api-keys-and-authentication"><span title="Develop" class="categoryLinkLabel_W154">Develop</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-cloud"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/deployment-overview"><span title="Deploy" class="categoryLinkLabel_W154">Deploy</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 sidebar-group-divider"><div class="sidebar-group-label">Reference</div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-blocks"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/concepts-components"><span title="Components reference" class="categoryLinkLabel_W154">Components reference</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-fileCode"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/api-reference-api-examples"><span title="API reference" class="categoryLinkLabel_W154">API reference</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 sidebar-group-divider"><div class="sidebar-group-label">Community</div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-gitPR"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/contributing-community"><span title="Contribute" class="categoryLinkLabel_W154">Contribute</span></a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed sidebar-category-with-icon sidebar-icon-helpCircle"><div class="menu__list-item-collapsible"><a class="categoryLink_byQd menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" href="/troubleshoot"><span title="Support" class="categoryLinkLabel_W154">Support</span></a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 sidebar-ad">
<a href="https://www.langflow.org/desktop" target="_blank" rel="noopener noreferrer" class="menu__link">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" aria-hidden="true">
<g clip-path="url(#clip0_1645_37)">
<path d="M12 17H20C21.1046 17 22 16.1046 22 15V13M12 17H4C2.89543 17 2 16.1046 2 15V5C2 3.89543 2.89543 3 4 3H10M12 17V21M8 21H12M12 21H16M11.75 10.2917H13.2083L16.125 7.375H17.5833L20.5 4.45833H21.9583M16.125 11.75H17.5833L20.5 8.83333H21.9583M11.75 5.91667H13.2083L16.125 3H17.5833" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_1645_37">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>
<div class="sidebar-ad-text-container">
<span class="sidebar-ad-text">Get started in minutes</span>
<span class="sidebar-ad-text sidebar-ad-text-gradient">Download Langflow Desktop</span>
</div>
</a>
</li></ul></nav></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_z5aJ"><div class="docItemContainer_c0TR"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" aria-hidden="true" focusable="false" role="presentation" class="breadcrumbHomeIcon_xK9p"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">Flows</span></li><li class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link">Build flows and components with Langflow Assistant</span></li></ul></nav><div class="docMetaRow_c2hx"><div class="root_Eutc"><button type="button" class="button_gpNY"><span aria-hidden="true" class="icon_Bm9L"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-copy"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"></rect><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"></path></svg></span><span class="label_LzDG">Copy page</span></button></div><span class="theme-doc-version-badge badge badge--secondary">Version: 1.10.x</span></div><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Build flows and components with Langflow Assistant</h1></header><style>[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; }</style>
<!-- -->
<p><strong>Langflow Assistant</strong> is an in-app virtual assistant pane accessible from the canvas toolbar.</p>
<p>It can answer questions about the application and help you get more out of Langflow.</p>
<p><strong>Langflow Assistant</strong> understands the structure of the Langflow graph, so it can build complete flows or create individual components from natural language prompts.</p>
<p>Behind the scenes, <strong>Langflow Assistant</strong> runs a built-in Langflow flow on your Langflow server each time you send a message.
This flow is distinct from the flow that is open in the canvas, and has its own language model.
The language model in <strong>Langflow Assistant</strong> only has the currently opened flow in your workspace for context.
To give <strong>Langflow Assistant</strong> context for a different flow, switch to that flow in your workspace, and open <strong>Langflow Assistant</strong>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no"></a></h2>
<ul>
<li class="">
<p>Connect an LLM provider in the <a class="" href="/components-models">Global model providers page</a> for <strong>Langflow Assistant</strong> to use</p>
</li>
<li class="">
<p>Custom component creation must be enabled and permitted for your user role:</p>
<ul>
<li class=""><code>LANGFLOW_ALLOW_CUSTOM_COMPONENTS</code> must be <code>true</code> (default).</li>
<li class=""><code>LANGFLOW_CUSTOM_COMPONENT_ADMIN_ONLY</code> must be <code>false</code> (default) for non-superusers. For superusers, this option is irrelevant.</li>
</ul>
<p>For more information, see <a class="" href="/deployment-block-custom-components">Restrict custom component creation to superusers</a>.</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="create-a-custom-component-with-langflow-assistant">Create a custom component with Langflow Assistant<a href="#create-a-custom-component-with-langflow-assistant" class="hash-link" aria-label="Direct link to Create a custom component with Langflow Assistant" title="Direct link to Create a custom component with Langflow Assistant" translate="no"></a></h2>
<p>In this example, you&#x27;ll prompt <strong>Langflow Assistant</strong> to create a custom component that validates and normalizes a list of URLs.</p>
<p>You&#x27;ll then iterate on the code based on the results in the <strong>Playground</strong>.</p>
<ol>
<li class="">
<p>In the canvas toolbar, click the <!-- --> <strong>Langflow</strong> icon.
The <strong>Langflow Assistant</strong> pane opens.</p>
</li>
<li class="">
<p>Optionally, ask <code>What can you help me with?</code> for a list of <strong>Langflow Assistant&#x27;s</strong> capabilities.</p>
</li>
<li class="">
<p>Prompt <strong>Langflow Assistant</strong> to generate a custom component. For example:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>Create a custom component URLTitleExtractor with:</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>input: text</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>output: list of {url, title, status}</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>timeout handling + per-URL error handling</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>clean docstring and typed methods.”</span></div></div><br></code></div></div>
</li>
<li class="">
<p><strong>Langflow Assistant</strong> generates component code from your prompt. Because generation is model-driven, your code may differ from the example below.</p>
<details class="details_lb9f alert alert--info details_b_Ee" data-collapsed="true"><summary>Python component code</summary><div><div class="collapsibleContent_i85q"><div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>import html</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>import re</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>from typing import Any</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>from urllib.error import HTTPError, URLError</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>from urllib.request import Request, urlopen</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>from lfx.custom import Component</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>from lfx.io import FloatInput, MessageTextInput, Output</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>from lfx.schema import DataFrame</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span>class URLTitleExtractor(Component):</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> &quot;&quot;&quot;Extract URLs from text, fetch each page, and return URL/title/status rows.&quot;&quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> display_name = &quot;URLTitleExtractor&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> description = &quot;Extracts URLs from input text and fetches page titles with per-URL status handling.&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> icon = &quot;Link&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> inputs = [</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> MessageTextInput(</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> name=&quot;text&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> display_name=&quot;Text&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> info=&quot;Text that may contain one or more URLs.&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> required=True,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> ),</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> FloatInput(</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> name=&quot;timeout&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> display_name=&quot;Timeout&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> value=5.0,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> info=&quot;HTTP request timeout in seconds for each URL.&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> range_spec={&quot;min&quot;: 0.1, &quot;max&quot;: 60.0, &quot;step&quot;: 0.1, &quot;step_type&quot;: &quot;float&quot;},</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> ),</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> ]</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> outputs = [</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> Output(</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> name=&quot;dataframe&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> display_name=&quot;DataFrame&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> method=&quot;build_dataframe&quot;,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> ),</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> ]</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> URL_PATTERN = re.compile(r&quot;https?://[^\s&lt;&gt;\]\&quot;&#x27;`{}|\\^]+&quot;, re.IGNORECASE)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> TITLE_PATTERN = re.compile(r&quot;&lt;title\b[^&gt;]*&gt;(.*?)&lt;/title&gt;&quot;, re.IGNORECASE | re.DOTALL)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> def build_dataframe(self) -&gt; DataFrame:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> &quot;&quot;&quot;Build a DataFrame containing URL, extracted title, and request status.&quot;&quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> urls = self._extract_urls(self.text)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> rows = [self._process_url(url, self.timeout) for url in urls]</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return DataFrame(rows)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> def _extract_urls(self, text: str) -&gt; list[str]:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> &quot;&quot;&quot;Extract unique URLs from text using a conservative regex.&quot;&quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> if not text:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return []</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> matches = self.URL_PATTERN.findall(text)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> cleaned_urls: list[str] = []</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> seen: set[str] = set()</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> for url in matches:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> cleaned = url.rstrip(&quot;.,);:!?]}&quot;)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> if cleaned and cleaned not in seen:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> seen.add(cleaned)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> cleaned_urls.append(cleaned)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return cleaned_urls</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> def _process_url(self, url: str, timeout: float) -&gt; dict[str, Any]:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> &quot;&quot;&quot;Fetch a URL and return a row with url, title, and status.&quot;&quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> request = Request(</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> url,</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> headers={</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> &quot;User-Agent&quot;: &quot;Mozilla/5.0 (compatible; Langflow URLTitleExtractor/1.0)&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> },</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> )</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> try:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> with urlopen(request, timeout=float(timeout)) as response:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> status_code = getattr(response, &quot;status&quot;, 200)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> content_bytes = response.read()</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> content_type = response.headers.get_content_charset() or &quot;utf-8&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> html_text = content_bytes.decode(content_type, errors=&quot;replace&quot;)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> title = self._extract_title(html_text)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return {&quot;url&quot;: url, &quot;title&quot;: title, &quot;status&quot;: str(status_code)}</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> except HTTPError as exc:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> title = &quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> try:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> body = exc.read()</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> charset = exc.headers.get_content_charset() if exc.headers else None</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> if body:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> html_text = body.decode(charset or &quot;utf-8&quot;, errors=&quot;replace&quot;)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> title = self._extract_title(html_text)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> except Exception:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> title = &quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return {&quot;url&quot;: url, &quot;title&quot;: title, &quot;status&quot;: str(exc.code)}</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> except TimeoutError:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return {&quot;url&quot;: url, &quot;title&quot;: &quot;&quot;, &quot;status&quot;: &quot;timeout&quot;}</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> except URLError as exc:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> reason = getattr(exc, &quot;reason&quot;, None)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> if isinstance(reason, TimeoutError):</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> status = &quot;timeout&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> else:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> status = &quot;request_error&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return {&quot;url&quot;: url, &quot;title&quot;: &quot;&quot;, &quot;status&quot;: status}</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> except Exception:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return {&quot;url&quot;: url, &quot;title&quot;: &quot;&quot;, &quot;status&quot;: &quot;request_error&quot;}</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> def _extract_title(self, html_text: str) -&gt; str:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> &quot;&quot;&quot;Extract and normalize the HTML title from a document string.&quot;&quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> if not html_text:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return &quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> match = self.TITLE_PATTERN.search(html_text)</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> if not match:</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return &quot;&quot;</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span></span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> title = html.unescape(match.group(1))</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> title = re.sub(r&quot;\s+&quot;, &quot; &quot;, title).strip()</span></div></div><div><span class="ch-code-line-number">_<!-- -->124</span><div style="display:inline-block;margin-left:16px"><span> return title</span></div></div><br></code></div></div></div></div></details>
<p>To inspect the code, click <strong>View Code</strong>.
To add the component to the canvas, click <strong>Add to Canvas</strong>.</p>
</li>
<li class="">
<p>Connect the component to <strong>Chat Input</strong> and <strong>Chat Output</strong> components.
At this point your flow has three connected components:</p>
<ul>
<li class=""><strong>Chat Input</strong> sends the text that contains URLs into the <strong>URLTitleExtractor</strong> so the flow runs when you chat in the <strong>Playground</strong> or send a prompt from an app.</li>
<li class=""><strong>URLTitleExtractor</strong> reads that text, finds URLs, fetches each page, and outputs a <a class="" href="/data-types#table">Table</a> with <code>url</code>, <code>title</code>, and <code>status</code> columns.</li>
<li class=""><strong>Chat Output</strong> receives <strong>URLTitleExtractor</strong>&#x27;s result and displays the <a class="" href="/data-types#table">Table</a> back to the user or calling application.</li>
</ul>
<p><img decoding="async" loading="lazy" alt="A custom URL Title Extractor component connected to a chat input and chat output" src="/assets/images/lf-assistant-flow-e9cc6f3e0c4bf57a66116b346c320157.png" width="2700" height="1092" class="img_ev3q"></p>
</li>
<li class="">
<p>Open the <strong>Playground</strong>, and tell Langflow to check a list of URLs.
For example:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>Check these links: https://langflow.org</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://github.com/langflow-ai/langflow</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://python.org</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://this-domain-should-not-resolve-12345.invalid</span></div></div><br></code></div></div>
</li>
<li class="">
<p>Run the flow.
The output will be similar to the following, with a <a class="" href="/data-types#table">Table</a> with one row per URL, including page titles and status codes.</p>
<table><thead><tr><th>url</th><th>title</th><th>status</th></tr></thead><tbody><tr><td><a href="https://langflow.org" target="_blank" rel="noopener noreferrer" class="">https://langflow.org</a></td><td>Langflow | Low-code AI builder for agentic and RAG applications</td><td>200</td></tr><tr><td><a href="https://github.com/langflow-ai/langflow" target="_blank" rel="noopener noreferrer" class="">https://github.com/langflow-ai/langflow</a></td><td>GitHub - langflow-ai/langflow: Langflow is a powerful tool for building and deploying AI-powered agents and workflows. - GitHub</td><td>200</td></tr><tr><td><a href="https://python.org" target="_blank" rel="noopener noreferrer" class="">https://python.org</a></td><td>Welcome to Python.org</td><td>200</td></tr><tr><td><a href="https://this-domain-should-not-resolve-12345.invalid" target="_blank" rel="noopener noreferrer" class="">https://this-domain-should-not-resolve-12345.invalid</a></td><td></td><td></td></tr></tbody></table>
</li>
<li class="">
<p>To iterate further, tell <strong>Langflow Assistant</strong> what you want.
For example, prompt it to <code>Update URLTitleExtractor to add max_urls (default 5) and skip duplicates.</code>.</p>
<p><strong>Langflow Assistant</strong> generates an updated <strong>URLTitleExtractor</strong> component (again, the exact code may differ from a previous run).</p>
</li>
<li class="">
<p>Replace the old component with the new component.
Set <strong>max_urls</strong> to <code>3</code>.
In the <strong>Playground</strong>, enter a list that includes a duplicate URL and the invalid URL from before:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>Check these links: https://langflow.org</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://github.com/langflow-ai/langflow</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://python.org</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://langflow.org</span></div></div><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>https://this-domain-should-not-resolve-12345.invalid</span></div></div><br></code></div></div>
</li>
<li class="">
<p>Run the flow.
The output will be similar to the following, with the duplicate <code>https://langflow.org</code> removed and only 3 valid URLs displayed.</p>
<table><thead><tr><th>url</th><th>title</th><th>status</th></tr></thead><tbody><tr><td><a href="https://langflow.org" target="_blank" rel="noopener noreferrer" class="">https://langflow.org</a></td><td>Langflow | Low-code AI builder for agentic and RAG applications</td><td>200</td></tr><tr><td><a href="https://github.com/langflow-ai/langflow" target="_blank" rel="noopener noreferrer" class="">https://github.com/langflow-ai/langflow</a></td><td>GitHub - langflow-ai/langflow: Langflow is a powerful tool for building and deploying AI-powered agents and workflows. - GitHub</td><td>200</td></tr><tr><td><a href="https://python.org" target="_blank" rel="noopener noreferrer" class="">https://python.org</a></td><td>Welcome to Python.org</td><td>200</td></tr></tbody></table>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="build-an-agent-flow-with-langflow-assistant">Build an agent flow with Langflow Assistant<a href="#build-an-agent-flow-with-langflow-assistant" class="hash-link" aria-label="Direct link to Build an agent flow with Langflow Assistant" title="Direct link to Build an agent flow with Langflow Assistant" translate="no"></a></h2>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>warning</div><div class="admonitionContent_BuS1"><p>Building a flow reads and writes the entire Langflow graph on every turn, which can use significantly more tokens than single-component generation.</p></div></div>
<p>In addition to generating individual components, <strong>Langflow Assistant</strong> can create a flow from a single prompt.</p>
<p>Continuing from the <a href="#create-a-custom-component-with-langflow-assistant" class="">Create a custom component with Langflow Assistant</a> example, ask <strong>Langflow Assistant</strong> to build a simple agent flow that uses the <strong>URLTitleExtractor</strong> custom component as a tool.</p>
<ol>
<li class="">
<p>With the <strong>URLTitleExtractor</strong> component still on the canvas, open <strong>Langflow Assistant</strong> and prompt it to build the agent flow:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>Build a simple agent flow using the URLTitleExtractor custom component as a tool.</span></div></div><br></code></div></div>
</li>
<li class="">
<p>Langflow Assistant presents a diagram of the flow it is proposing.
To approve, click <strong>Add to Canvas</strong>.</p>
<p><strong>Langflow Assistant</strong> adds an <strong>Agent</strong> component, connects the <strong>URLTitleExtractor</strong> to its <strong>Tools</strong> input, and connects <strong>Chat Input</strong> and <strong>Chat Output</strong> to complete the flow.
Flow generation is model-driven, so the exact wiring may differ from this example.</p>
</li>
<li class="">
<p>To iterate, describe changes to <strong>Langflow Assistant</strong>, and then click <strong>Replace canvas</strong> to replace the entire flow currently on the canvas. For example:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>Connect the URLTitleExtractor component&#x27;s Toolset port to the Agent&#x27;s Tools port.</span></div></div><br></code></div></div>
</li>
<li class="">
<p>Open the <strong>Playground</strong> and ask the agent to check a URL:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>What is the title of the page at https://langflow.org?</span></div></div><br></code></div></div>
<p>The agent uses the <strong>URLTitleExtractor</strong> tool to fetch the page and return the title.</p>
</li>
<li class="">
<p><strong>Langflow Assistant</strong> can further iterate on the flow, or answer questions about Langflow.
For example, ask Langflow Assistant <code>How do I send an API request to chat with this flow in Python?</code>
The response includes a request sourced from the Langflow documentation that you can copy and paste into your application.</p>
</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reference-canvas-components-in-your-prompts">Reference canvas components in your prompts<a href="#reference-canvas-components-in-your-prompts" class="hash-link" aria-label="Direct link to Reference canvas components in your prompts" title="Direct link to Reference canvas components in your prompts" translate="no"></a></h2>
<p>Reference components and their fields directly in a <strong>Langflow Assistant</strong> prompt using the <code>@</code> and <code>.</code> selectors.</p>
<p>In the <strong>Langflow Assistant</strong> prompt input, enter <code>@</code> to list all available components, and then select a component to insert its reference.
To select a specific field within a component, enter <code>.</code> after the component.</p>
<p>For example, to prompt <strong>Langflow Assistant</strong> to update the system prompt field on an Agent component, enter the following:</p>
<div class="ch-codeblock not-prose" data-ch-theme="github-dark"><div class="ch-code-wrapper ch-code" data-ch-measured="false"><code class="ch-code-scroll-parent"><br><div><span class="ch-code-line-number">_<!-- -->10</span><div style="display:inline-block;margin-left:16px"><span>Update @Agent.System Prompt to always respond in bullet points.</span></div></div><br></code></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="see-also">See also<a href="#see-also" class="hash-link" aria-label="Direct link to See also" title="Direct link to See also" translate="no"></a></h2>
<ul>
<li class=""><a class="" href="/concepts-flows">Build flows</a></li>
<li class=""><a class="" href="/components-custom-components">Custom components</a></li>
<li class=""><a class="" href="/concepts-publish">Trigger flows with the Langflow API</a></li>
</ul></div></article><nav class="docusaurus-mt-lg pagination-nav" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/concepts-flows-import"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Import and export flows</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/agents"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Use Langflow agents</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#prerequisites" class="table-of-contents__link toc-highlight">Prerequisites</a></li><li><a href="#create-a-custom-component-with-langflow-assistant" class="table-of-contents__link toc-highlight">Create a custom component with Langflow Assistant</a></li><li><a href="#build-an-agent-flow-with-langflow-assistant" class="table-of-contents__link toc-highlight">Build an agent flow with Langflow Assistant</a></li><li><a href="#reference-canvas-components-in-your-prompts" class="table-of-contents__link toc-highlight">Reference canvas components in your prompts</a></li><li><a href="#see-also" class="table-of-contents__link toc-highlight">See also</a></li></ul></div></div></div></div></main></div></div></div><footer class="theme-layout-footer footer"><div class="container container-fluid"><div class="row footer__links"><div class="theme-layout-footer-column col footer__col"><div class="footer__title"></div><ul class="footer__items clean-list"><li class="footer__item"><div class="footer-links">
<span>© 2026 Langflow</span>
<span id="preferenceCenterContainer"> ·&nbsp; <a href="#" onclick='return"undefined"!=typeof window&&window.truste&&window.truste.eu&&window.truste.eu.clickListener&&window.truste.eu.clickListener(),!1' style="cursor: pointer;">Manage Privacy Choices</a></span>
</div></li></ul></div></div></div></footer><div style="position:fixed;right:21px;bottom:21px;z-index:100;display:flex;align-items:center;gap:10px;cursor:pointer"><div style="background-color:#f6f6f6;border-radius:50%;width:48px;height:48px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px rgba(0,0,0,0.1)"><img src="/img/langflow-icon-black-transparent.svg" style="width:40px" alt="Search"></div></div></div>
</body>
</html>