diff --git a/agent-tutorial.html b/agent-tutorial.html
index 3cae705a71..8b45cc7616 100644
--- a/agent-tutorial.html
+++ b/agent-tutorial.html
@@ -25,7 +25,7 @@
-
+
diff --git a/agents-tools.html b/agents-tools.html
index eef51de777..3867aa2720 100644
--- a/agents-tools.html
+++ b/agents-tools.html
@@ -25,7 +25,7 @@
-
+
diff --git a/agents.html b/agents.html
index 3709bec0b2..ea0aee94ee 100644
--- a/agents.html
+++ b/agents.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-build.html b/api-build.html
index 6438d430a9..2af3b8efda 100644
--- a/api-build.html
+++ b/api-build.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-files.html b/api-files.html
index 72182a5d2b..4dd09f3b8d 100644
--- a/api-files.html
+++ b/api-files.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-flows-run.html b/api-flows-run.html
index 986ce30f0f..0503f6e852 100644
--- a/api-flows-run.html
+++ b/api-flows-run.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-flows.html b/api-flows.html
index cbab3d244a..0e3a83d856 100644
--- a/api-flows.html
+++ b/api-flows.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-keys-and-authentication.html b/api-keys-and-authentication.html
index 4e82bfc1ba..cd6838b930 100644
--- a/api-keys-and-authentication.html
+++ b/api-keys-and-authentication.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-logs.html b/api-logs.html
index 6a9a1812b7..d203e060a9 100644
--- a/api-logs.html
+++ b/api-logs.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-monitor.html b/api-monitor.html
index bc9344c0e1..09df435170 100644
--- a/api-monitor.html
+++ b/api-monitor.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-openai-responses.html b/api-openai-responses.html
index e7ca435b75..a6080cc71d 100644
--- a/api-openai-responses.html
+++ b/api-openai-responses.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-projects.html b/api-projects.html
index 5438e3c9f7..bee9334ae6 100644
--- a/api-projects.html
+++ b/api-projects.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-reference-api-examples.html b/api-reference-api-examples.html
index 965904faee..06fed497f8 100644
--- a/api-reference-api-examples.html
+++ b/api-reference-api-examples.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-request.html b/api-request.html
index c63c183474..d3065b5ee3 100644
--- a/api-request.html
+++ b/api-request.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api-users.html b/api-users.html
index d0ee6b4cf7..c766108840 100644
--- a/api-users.html
+++ b/api-users.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api.html b/api.html
index bd3cd985e9..178ee52fd9 100644
--- a/api.html
+++ b/api.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api/openapi.json.html b/api/openapi.json.html
index 20799e7ff4..6fe2f42b43 100644
--- a/api/openapi.json.html
+++ b/api/openapi.json.html
@@ -25,7 +25,7 @@
-
+
diff --git a/api/workflow.html b/api/workflow.html
index 002708c4aa..75df056913 100644
--- a/api/workflow.html
+++ b/api/workflow.html
@@ -25,7 +25,7 @@
-
+
diff --git a/assets/js/2b56b65e.20952bb6.js b/assets/js/2b56b65e.20952bb6.js
new file mode 100644
index 0000000000..f980a523ec
--- /dev/null
+++ b/assets/js/2b56b65e.20952bb6.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunklangflow_docs=globalThis.webpackChunklangflow_docs||[]).push([[7824],{11470:(o,t,e)=>{e.d(t,{A:()=>k});var n=e(96540),s=e(18215),r=e(17559),l=e(23104),c=e(56347),a=e(205),p=e(57485),i=e(31682),d=e(70679);function h(o){return n.Children.toArray(o).filter(o=>"\n"!==o).map(o=>{if(!o||(0,n.isValidElement)(o)&&function(o){const{props:t}=o;return!!t&&"object"==typeof t&&"value"in t}(o))return o;throw new Error(`Docusaurus error: Bad child <${"string"==typeof o.type?o.type:o.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function u(o){const{values:t,children:e}=o;return(0,n.useMemo)(()=>{const o=t??function(o){return h(o).map(({props:{value:o,label:t,attributes:e,default:n}})=>({value:o,label:t,attributes:e,default:n}))}(e);return function(o){const t=(0,i.XI)(o,(o,t)=>o.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(o=>o.value).join(", ")}" found in . Every value needs to be unique.`)}(o),o},[t,e])}function y({value:o,tabValues:t}){return t.some(t=>t.value===o)}function D({queryString:o=!1,groupId:t}){const e=(0,c.W6)(),s=function({queryString:o=!1,groupId:t}){if("string"==typeof o)return o;if(!1===o)return null;if(!0===o&&!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:o,groupId:t});return[(0,p.aZ)(s),(0,n.useCallback)(o=>{if(!s)return;const t=new URLSearchParams(e.location.search);t.set(s,o),e.replace({...e.location,search:t.toString()})},[s,e])]}function F(o){const{defaultValue:t,queryString:e=!1,groupId:s}=o,r=u(o),[l,c]=(0,n.useState)(()=>function({defaultValue:o,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(o){if(!y({value:o,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${o}" but none of its children has the corresponding value. Available values are: ${t.map(o=>o.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return o}const e=t.find(o=>o.default)??t[0];if(!e)throw new Error("Unexpected error: 0 tabValues");return e.value}({defaultValue:t,tabValues:r})),[p,i]=D({queryString:e,groupId:s}),[h,F]=function({groupId:o}){const t=function(o){return o?`docusaurus.tab.${o}`:null}(o),[e,s]=(0,d.Dv)(t);return[e,(0,n.useCallback)(o=>{t&&s.set(o)},[t,s])]}({groupId:s}),f=(()=>{const o=p??h;return y({value:o,tabValues:r})?o:null})();(0,a.A)(()=>{f&&c(f)},[f]);return{selectedValue:l,selectValue:(0,n.useCallback)(o=>{if(!y({value:o,tabValues:r}))throw new Error(`Can't select invalid tab value=${o}`);c(o),i(o),F(o)},[i,F,r]),tabValues:r}}var f=e(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var C=e(74848);function m({className:o,block:t,selectedValue:e,selectValue:n,tabValues:r}){const c=[],{blockElementScrollPositionUntilNextRender:a}=(0,l.a_)(),p=o=>{const t=o.currentTarget,s=c.indexOf(t),l=r[s].value;l!==e&&(a(t),n(l))},i=o=>{let t=null;switch(o.key){case"Enter":p(o);break;case"ArrowRight":{const e=c.indexOf(o.currentTarget)+1;t=c[e]??c[0];break}case"ArrowLeft":{const e=c.indexOf(o.currentTarget)-1;t=c[e]??c[c.length-1];break}}t?.focus()};return(0,C.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},o),children:r.map(({value:o,label:t,attributes:n})=>(0,C.jsx)("li",{role:"tab",tabIndex:e===o?0:-1,"aria-selected":e===o,ref:o=>{c.push(o)},onKeyDown:i,onClick:p,...n,className:(0,s.A)("tabs__item",g.tabItem,n?.className,{"tabs__item--active":e===o}),children:t??o},o))})}function x({lazy:o,children:t,selectedValue:e}){const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(o){const o=r.find(o=>o.props.value===e);return o?(0,n.cloneElement)(o,{className:(0,s.A)("margin-top--md",o.props.className)}):null}return(0,C.jsx)("div",{className:"margin-top--md",children:r.map((o,t)=>(0,n.cloneElement)(o,{key:t,hidden:o.props.value!==e}))})}function b(o){const t=F(o);return(0,C.jsxs)("div",{className:(0,s.A)(r.G.tabs.container,"tabs-container",g.tabList),children:[(0,C.jsx)(m,{...t,...o}),(0,C.jsx)(x,{...t,...o})]})}function k(o){const t=(0,f.A)();return(0,C.jsx)(b,{...o,children:h(o.children)},String(t))}},19365:(o,t,e)=>{e.d(t,{A:()=>l});e(96540);var n=e(18215);const s={tabItem:"tabItem_Ymn6"};var r=e(74848);function l({children:o,hidden:t,className:e}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,e),hidden:t,children:o})}},59403:(o,t,e)=>{e.d(t,{A:()=>n});const n=e.p+"assets/images/tutorial-chatbot-embed-files-6157311fb4d16e7f944d55254f0cc0e2.png"},87636:(o,t,e)=>{e.r(t),e.d(t,{CH:()=>u,assets:()=>h,chCodeConfig:()=>y,contentTitle:()=>d,default:()=>f,frontMatter:()=>i,metadata:()=>n,toc:()=>D});const n=JSON.parse('{"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.","source":"@site/docs/Tutorials/chat-with-rag.mdx","sourceDirName":"Tutorials","slug":"/chat-with-rag","permalink":"/chat-with-rag","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Create a vector RAG chatbot","slug":"/chat-with-rag"},"sidebar":"docs","previous":{"title":"Quickstart","permalink":"/get-started-quickstart"},"next":{"title":"Create a chatbot that can ingest files","permalink":"/chat-with-files"}}');var s=e(74848),r=e(28453),l=e(24754),c=e(40619),a=e(11470),p=e(19365);const i={title:"Create a vector RAG chatbot",slug:"/chat-with-rag"},d=void 0,h={},u={annotations:l.hk,Code:l.Cy},y={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},D=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Create a vector RAG flow",id:"create-a-vector-rag-flow",level:2},{value:"Load data and generate embeddings",id:"load-data-and-generate-embeddings",level:2},{value:"Chat with your flow from a JavaScript application",id:"chat-with-your-flow-from-a-javascript-application",level:2},{value:"Next steps",id:"next-steps",level:2}];function F(o){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...o.components},{Details:n}=t;return u||g("CH",!1),u.Code||g("CH.Code",!0),n||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.jsx)(t.p,{children:"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."}),"\n",(0,s.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/get-started-installation",children:"Install and start Langflow"})}),"\n",(0,s.jsxs)(t.li,{children:["Create a ",(0,s.jsx)(t.a,{href:"/api-keys-and-authentication",children:"Langflow API key"})]}),"\n",(0,s.jsxs)(t.li,{children:["Create an ",(0,s.jsx)(t.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"})]}),"\n",(0,s.jsxs)(t.li,{children:["Install the ",(0,s.jsx)(t.a,{href:"/typescript-client",children:"Langflow JavaScript client"})]}),"\n",(0,s.jsx)(t.li,{children:"Be familiar with vector search concepts and applications, such as vector databases and RAG"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"create-a-vector-rag-flow",children:"Create a vector RAG flow"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In Langflow, click ",(0,s.jsx)(t.strong,{children:"New Flow"}),", and then select the ",(0,s.jsx)(t.strong,{children:"Vector Store RAG"})," template."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"About the Vector Store RAG template"}),(0,s.jsx)(t.p,{children:"This template has two flows."}),(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Load Data Flow"})," populates a vector store with data from a file.\nThis data is used to respond to queries submitted to the ",(0,s.jsx)(t.strong,{children:"Retriever Flow"}),"."]}),(0,s.jsxs)(t.p,{children:["Specifically, the ",(0,s.jsx)(t.strong,{children:"Load Data Flow"})," ingests data from a local file, splits the data into chunks, loads and indexes the data in your vector database, and then computes embeddings for the chunks. The embeddings are also stored with the loaded data. This flow only needs to run when you need to load data into your vector database."]}),(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Retriever Flow"})," receives chat input, generates an embedding for the input, and then uses several components to reconstruct chunks into text and generate a response by comparing the new embedding to the stored embeddings to find similar data."]})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Add your ",(0,s.jsx)(t.strong,{children:"OpenAI"})," API key to both ",(0,s.jsx)(t.strong,{children:"OpenAI Embeddings"})," components."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Optional: Replace both ",(0,s.jsx)(t.strong,{children:"Astra DB"})," vector store components with a ",(0,s.jsx)(t.strong,{children:"Chroma DB"})," or another vector store component of your choice.\nThis tutorial uses Chroma DB."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Load Data Flow"})," should have ",(0,s.jsx)(t.strong,{children:"Read File"}),", ",(0,s.jsx)(t.strong,{children:"Split Text"}),", ",(0,s.jsx)(t.strong,{children:"Embedding Model"}),", vector store (such as ",(0,s.jsx)(t.strong,{children:"Chroma DB"}),"), and ",(0,s.jsx)(t.strong,{children:"Chat Output"})," components:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"File loader chat flow",src:e(59403).A+"",width:"4000",height:"2512"})}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Retriever Flow"})," should have ",(0,s.jsx)(t.strong,{children:"Chat Input"}),", ",(0,s.jsx)(t.strong,{children:"Embedding Model"}),", vector store, ",(0,s.jsx)(t.strong,{children:"Parser"}),", ",(0,s.jsx)(t.strong,{children:"Prompt"}),", ",(0,s.jsx)(t.strong,{children:"Language Model"}),", and ",(0,s.jsx)(t.strong,{children:"Chat Output"})," components:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Chat with RAG flow",src:e(96973).A+"",width:"4000",height:"1324"})}),"\n",(0,s.jsx)(t.p,{children:"The flows are ready to use.\nContinue the tutorial to learn how to use the loading flow to load data into your vector store, and then call the chat flow in a chatbot application."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"load-data-and-generate-embeddings",children:"Load data and generate embeddings"}),"\n",(0,s.jsxs)(t.p,{children:["To load data and generate embeddings, you can use the visual editor or the ",(0,s.jsx)(t.code,{children:"/v2/files"})," endpoint."]}),"\n",(0,s.jsx)(t.p,{children:"The visual editor option is simpler, but it is only recommended for scenarios where the user who created the flow is the same user who loads data into the database."}),"\n",(0,s.jsx)(t.p,{children:"In situations where many users load data or you need to load data programmatically, use the Langflow API option."}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(p.A,{value:"visual",label:"Visual editor",default:!0,children:(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["In your RAG chatbot flow, click the ",(0,s.jsx)(t.strong,{children:"Read File"})," component, and then click ",(0,s.jsx)(t.strong,{children:"File"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Select the local file you want to upload, and then click ",(0,s.jsx)(t.strong,{children:"Open"}),".\nThe file is loaded to your Langflow server."]}),"\n",(0,s.jsxs)(t.li,{children:["To load the data into your vector database, click the vector store component, and then click ",(0,s.jsx)(c.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(t.strong,{children:"Run component"})," to run the selected component and all prior dependent components."]}),"\n"]})}),(0,s.jsxs)(p.A,{value:"API",label:"Langflow API",children:[(0,s.jsxs)(t.p,{children:["To load data programmatically, use the ",(0,s.jsx)(t.code,{children:"/v2/files/"})," and ",(0,s.jsx)(t.code,{children:"/v1/run/$FLOW_ID"})," endpoints. The first endpoint loads a file to your Langflow server, and then returns an uploaded file path. The second endpoint runs the ",(0,s.jsx)(t.strong,{children:"Load Data Flow"}),", referencing the uploaded file path, to chunk, embed, and load the data into the vector store."]}),(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["For an example of constructing file upload requests in Python, see the ",(0,s.jsx)(t.a,{href:"/chat-with-files#send-requests-to-your-flow-from-a-python-application",children:"Create a chatbot that can ingest files tutorial"}),"."]})}),(0,s.jsx)(t.p,{children:"The following script demonstrates this process."}),(0,s.jsx)(u.Code,{codeConfig:y,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"// Node 18+ example using global fetch, FormData, and Blob",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" fs ",props:{style:{color:"#C9D1D9"}}},{content:"from ",props:{style:{color:"#FF7B72"}}},{content:"'fs/promises'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// 1. Prepare the form data with the file to upload",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"fileBuffer ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" fs.",props:{style:{color:"#C9D1D9"}}},{content:"readFile",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_NAME'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"data ",props:{style:{color:"#79C0FF"}}},{content:"= new ",props:{style:{color:"#FF7B72"}}},{content:"FormData",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"data.",props:{style:{color:"#C9D1D9"}}},{content:"append",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'file'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"new ",props:{style:{color:"#FF7B72"}}},{content:"Blob",props:{style:{color:"#D2A8FF"}}},{content:"([fileBuffer]), ",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_NAME'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"headers ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" { ",props:{style:{color:"#C9D1D9"}}},{content:"'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}},{content:" };",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// 2. Upload the file to Langflow",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"uploadRes ",props:{style:{color:"#79C0FF"}}},{content:"= await ",props:{style:{color:"#FF7B72"}}},{content:"fetch",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_SERVER_ADDRESS/api/v2/files/'",props:{style:{color:"#A5D6FF"}}},{content:", {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" method: ",props:{style:{color:"#C9D1D9"}}},{content:"'POST'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" headers,",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" body: data",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"});",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"uploadData ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" uploadRes.",props:{style:{color:"#C9D1D9"}}},{content:"json",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"uploadedPath ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" uploadData.path;",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// 3. Call the Langflow run endpoint with the uploaded file path",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"payload ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" input_value: ",props:{style:{color:"#C9D1D9"}}},{content:'"Analyze this file"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" output_type: ",props:{style:{color:"#C9D1D9"}}},{content:'"chat"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" input_type: ",props:{style:{color:"#C9D1D9"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" tweaks: {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'FILE_COMPONENT_NAME'",props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" path: uploadedPath",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"};",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"runRes ",props:{style:{color:"#79C0FF"}}},{content:"= await ",props:{style:{color:"#FF7B72"}}},{content:"fetch",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID'",props:{style:{color:"#A5D6FF"}}},{content:", {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" method: ",props:{style:{color:"#C9D1D9"}}},{content:"'POST'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" headers: { ",props:{style:{color:"#C9D1D9"}}},{content:"'Content-Type'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}},{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" body: ",props:{style:{color:"#C9D1D9"}}},{content:"JSON",props:{style:{color:"#79C0FF"}}},{content:".",props:{style:{color:"#C9D1D9"}}},{content:"stringify",props:{style:{color:"#D2A8FF"}}},{content:"(payload)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"});",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"langflowData ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" runRes.",props:{style:{color:"#C9D1D9"}}},{content:"json",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// Output only the message",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(langflowData.outputs?.[",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"]?.outputs?.[",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"]?.results?.message?.data?.text);",props:{style:{color:"#C9D1D9"}}}]}],lang:"js"},annotations:[]}]})]})]}),"\n",(0,s.jsx)(t.p,{children:"When the flow runs, the flow ingests the selected file, chunks the data, loads the data into the vector store database, and then generates embeddings for the chunks, which are also stored in the vector store."}),"\n",(0,s.jsx)(t.p,{children:"Your database now contains data with vector embeddings that an LLM can use as context to respond to queries, as demonstrated in the next section of the tutorial."}),"\n",(0,s.jsx)(t.h2,{id:"chat-with-your-flow-from-a-javascript-application",children:"Chat with your flow from a JavaScript application"}),"\n",(0,s.jsxs)(t.p,{children:["To chat with the data in your vector database, create a chatbot application that runs the ",(0,s.jsx)(t.strong,{children:"Retriever Flow"})," programmatically."]}),"\n",(0,s.jsx)(t.p,{children:"This tutorial uses JavaScript for demonstration purposes."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"To construct the chatbot, gather the following information:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"LANGFLOW_SERVER_ADDRESS"}),": Your Langflow server's domain. The default value is ",(0,s.jsx)(t.code,{children:"127.0.0.1:7860"}),". You can get this value from the code snippets on your flow's ",(0,s.jsxs)(t.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(t.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"FLOW_ID"}),": Your flow's UUID or custom endpoint name. You can get this value from the code snippets on your flow's ",(0,s.jsxs)(t.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(t.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"LANGFLOW_API_KEY"}),": A valid ",(0,s.jsx)(t.a,{href:"/api-keys-and-authentication",children:"Langflow API key"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Copy the following script into a JavaScript file, and then replace the placeholders with the information you gathered in the previous step:"}),"\n",(0,s.jsx)(u.Code,{codeConfig:y,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"readline ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"require",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'readline'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const",props:{style:{color:"#FF7B72"}}},{content:" { ",props:{style:{color:"#C9D1D9"}}},{content:"LangflowClient",props:{style:{color:"#79C0FF"}}},{content:" } ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"require",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'@datastax/langflow-client'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# ",props:{style:{color:"#C9D1D9"}}},{content:"pragma",props:{style:{color:"#FFA657"}}},{content:": allowlist nextline secret",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"API_KEY ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"SERVER ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"'LANGFLOW_SERVER_ADDRESS'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"FLOW_ID ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"'FLOW_ID'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"rl ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" readline.",props:{style:{color:"#C9D1D9"}}},{content:"createInterface",props:{style:{color:"#D2A8FF"}}},{content:"({ input: process.stdin, output: process.stdout });",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// Initialize the Langflow client",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"client ",props:{style:{color:"#79C0FF"}}},{content:"= new ",props:{style:{color:"#FF7B72"}}},{content:"LangflowClient",props:{style:{color:"#D2A8FF"}}},{content:"({",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" baseUrl: ",props:{style:{color:"#C9D1D9"}}},{content:"SERVER",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" apiKey: ",props:{style:{color:"#C9D1D9"}}},{content:"API_KEY",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"});",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"async function ",props:{style:{color:"#FF7B72"}}},{content:"sendMessage",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"message",props:{style:{color:"#FFA657"}}},{content:") {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" try",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" const ",props:{style:{color:"#FF7B72"}}},{content:"response ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" client.",props:{style:{color:"#C9D1D9"}}},{content:"flow",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"FLOW_ID",props:{style:{color:"#79C0FF"}}},{content:").",props:{style:{color:"#C9D1D9"}}},{content:"run",props:{style:{color:"#D2A8FF"}}},{content:"(message, {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" session_id: ",props:{style:{color:"#C9D1D9"}}},{content:"'user_1'",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" });",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" // Use the convenience method to get the chat output text",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" return",props:{style:{color:"#FF7B72"}}},{content:" response.",props:{style:{color:"#C9D1D9"}}},{content:"chatOutputText",props:{style:{color:"#D2A8FF"}}},{content:"() ",props:{style:{color:"#C9D1D9"}}},{content:"|| ",props:{style:{color:"#FF7B72"}}},{content:"'No response'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" } ",props:{style:{color:"#C9D1D9"}}},{content:"catch",props:{style:{color:"#FF7B72"}}},{content:" (error) {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" return ",props:{style:{color:"#FF7B72"}}},{content:"`Error: ${",props:{style:{color:"#A5D6FF"}}},{content:"error",props:{style:{color:"#C9D1D9"}}},{content:".",props:{style:{color:"#A5D6FF"}}},{content:"message",props:{style:{color:"#C9D1D9"}}},{content:"}`",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"function ",props:{style:{color:"#FF7B72"}}},{content:"chat",props:{style:{color:"#D2A8FF"}}},{content:"() {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:'\'\ud83e\udd16 Langflow RAG Chatbot (type "quit" to exit)',props:{style:{color:"#A5D6FF"}}},{content:"\\n",props:{style:{color:"#79C0FF"}}},{content:"'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" const ",props:{style:{color:"#FF7B72"}}},{content:"ask ",props:{style:{color:"#D2A8FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" () ",props:{style:{color:"#C9D1D9"}}},{content:"=>",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" rl.",props:{style:{color:"#C9D1D9"}}},{content:"question",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'\ud83d\udc64 You: '",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"async",props:{style:{color:"#FF7B72"}}},{content:" (",props:{style:{color:"#C9D1D9"}}},{content:"input",props:{style:{color:"#FFA657"}}},{content:") ",props:{style:{color:"#C9D1D9"}}},{content:"=>",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" if",props:{style:{color:"#FF7B72"}}},{content:" ([",props:{style:{color:"#C9D1D9"}}},{content:"'quit'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'exit'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'bye'",props:{style:{color:"#A5D6FF"}}},{content:"].",props:{style:{color:"#C9D1D9"}}},{content:"includes",props:{style:{color:"#D2A8FF"}}},{content:"(input.",props:{style:{color:"#C9D1D9"}}},{content:"trim",props:{style:{color:"#D2A8FF"}}},{content:"().",props:{style:{color:"#C9D1D9"}}},{content:"toLowerCase",props:{style:{color:"#D2A8FF"}}},{content:"())) {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'\ud83d\udc4b Goodbye!'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" rl.",props:{style:{color:"#C9D1D9"}}},{content:"close",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" return",props:{style:{color:"#FF7B72"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" const ",props:{style:{color:"#FF7B72"}}},{content:"response ",props:{style:{color:"#79C0FF"}}},{content:"= await ",props:{style:{color:"#FF7B72"}}},{content:"sendMessage",props:{style:{color:"#D2A8FF"}}},{content:"(input.",props:{style:{color:"#C9D1D9"}}},{content:"trim",props:{style:{color:"#D2A8FF"}}},{content:"());",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"`\ud83e\udd16 Assistant: ${",props:{style:{color:"#A5D6FF"}}},{content:"response",props:{style:{color:"#C9D1D9"}}},{content:"}",props:{style:{color:"#A5D6FF"}}},{content:"\\n",props:{style:{color:"#79C0FF"}}},{content:"`",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ask",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" });",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" };",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ask",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"chat",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]}],lang:"js"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:["The script creates a Node application that chats with the content in your vector database, using the ",(0,s.jsx)(t.code,{children:"chat"})," input and output types to communicate with your flow.\nChat maintains ongoing conversation context across multiple messages. If you used ",(0,s.jsx)(t.code,{children:"text"})," type inputs and outputs, each request is a standalone text string."]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.a,{href:"/typescript-client",children:"Langflow TypeScript client"})," has a ",(0,s.jsx)(t.code,{children:"chatOutputText()"})," convenience method that simplifies working with Langflow's complex JSON response structure.\nInstead of manually navigating through multiple levels of nested objects with ",(0,s.jsx)(t.code,{children:"data.outputs[0].outputs[0].results.message.data.text"}),", the client automatically extracts the message text and handles potentially undefined values gracefully."]})}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Save and run the script to send the requests and test the flow."}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Result"}),(0,s.jsx)(t.p,{children:"The following is an example response from this tutorial's flow. Due to the nature of LLMs and variations in your inputs, your response might be different."}),(0,s.jsx)(u.Code,{codeConfig:y,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"\ud83d\udc64 You: Do you have any documents about engines?",props:{}}]},{tokens:[{content:"\ud83e\udd16 Assistant: Yes, the provided text contains several warnings and guidelines related to engine installation, maintenance, and selection. It emphasizes the importance of using the correct engine for specific applications, ensuring all components are in good condition, and following safety precautions to prevent fire or explosion. If you need more specific information or details, please let me know!",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"\ud83d\udc64 You: It should be about a Briggs and Stratton engine.",props:{}}]},{tokens:[{content:"\ud83e\udd16 Assistant: The text provides important safety and installation guidelines for Briggs & Stratton engines. It emphasizes that these engines should not be used on 3-wheel All-Terrain Vehicles (ATVs), motor bikes, aircraft products, or vehicles intended for competitive events, as such uses are not approved by Briggs & Stratton.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"If you have any specific questions about Briggs & Stratton engines or need further information, feel free to ask!",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsx)(t.p,{children:"For more information on building or extending this tutorial, see the following:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/mcp-server",children:"Model Context Protocol (MCP) servers"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/deployment-overview",children:"Langflow deployment overview"})}),"\n"]})]})}function f(o={}){const{wrapper:t}={...(0,r.R)(),...o.components};return t?(0,s.jsx)(t,{...o,children:(0,s.jsx)(F,{...o})}):F(o)}function g(o,t){throw new Error("Expected "+(t?"component":"object")+" `"+o+"` to be defined: you likely forgot to import, pass, or provide it.")}},96973:(o,t,e)=>{e.d(t,{A:()=>n});const n=e.p+"assets/images/tutorial-chatbot-chat-flow-af7257d77ff0259ab1a0980641d464ce.png"}}]);
\ No newline at end of file
diff --git a/assets/js/2b56b65e.48ec5133.js b/assets/js/2b56b65e.48ec5133.js
deleted file mode 100644
index 0da68df0ed..0000000000
--- a/assets/js/2b56b65e.48ec5133.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(globalThis.webpackChunklangflow_docs=globalThis.webpackChunklangflow_docs||[]).push([[7824],{11470:(o,t,e)=>{e.d(t,{A:()=>k});var n=e(96540),s=e(18215),r=e(17559),l=e(23104),c=e(56347),a=e(205),p=e(57485),i=e(31682),d=e(70679);function h(o){return n.Children.toArray(o).filter(o=>"\n"!==o).map(o=>{if(!o||(0,n.isValidElement)(o)&&function(o){const{props:t}=o;return!!t&&"object"==typeof t&&"value"in t}(o))return o;throw new Error(`Docusaurus error: Bad child <${"string"==typeof o.type?o.type:o.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function u(o){const{values:t,children:e}=o;return(0,n.useMemo)(()=>{const o=t??function(o){return h(o).map(({props:{value:o,label:t,attributes:e,default:n}})=>({value:o,label:t,attributes:e,default:n}))}(e);return function(o){const t=(0,i.XI)(o,(o,t)=>o.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(o=>o.value).join(", ")}" found in . Every value needs to be unique.`)}(o),o},[t,e])}function y({value:o,tabValues:t}){return t.some(t=>t.value===o)}function D({queryString:o=!1,groupId:t}){const e=(0,c.W6)(),s=function({queryString:o=!1,groupId:t}){if("string"==typeof o)return o;if(!1===o)return null;if(!0===o&&!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:o,groupId:t});return[(0,p.aZ)(s),(0,n.useCallback)(o=>{if(!s)return;const t=new URLSearchParams(e.location.search);t.set(s,o),e.replace({...e.location,search:t.toString()})},[s,e])]}function F(o){const{defaultValue:t,queryString:e=!1,groupId:s}=o,r=u(o),[l,c]=(0,n.useState)(()=>function({defaultValue:o,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(o){if(!y({value:o,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${o}" but none of its children has the corresponding value. Available values are: ${t.map(o=>o.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return o}const e=t.find(o=>o.default)??t[0];if(!e)throw new Error("Unexpected error: 0 tabValues");return e.value}({defaultValue:t,tabValues:r})),[p,i]=D({queryString:e,groupId:s}),[h,F]=function({groupId:o}){const t=function(o){return o?`docusaurus.tab.${o}`:null}(o),[e,s]=(0,d.Dv)(t);return[e,(0,n.useCallback)(o=>{t&&s.set(o)},[t,s])]}({groupId:s}),f=(()=>{const o=p??h;return y({value:o,tabValues:r})?o:null})();(0,a.A)(()=>{f&&c(f)},[f]);return{selectedValue:l,selectValue:(0,n.useCallback)(o=>{if(!y({value:o,tabValues:r}))throw new Error(`Can't select invalid tab value=${o}`);c(o),i(o),F(o)},[i,F,r]),tabValues:r}}var f=e(92303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var C=e(74848);function m({className:o,block:t,selectedValue:e,selectValue:n,tabValues:r}){const c=[],{blockElementScrollPositionUntilNextRender:a}=(0,l.a_)(),p=o=>{const t=o.currentTarget,s=c.indexOf(t),l=r[s].value;l!==e&&(a(t),n(l))},i=o=>{let t=null;switch(o.key){case"Enter":p(o);break;case"ArrowRight":{const e=c.indexOf(o.currentTarget)+1;t=c[e]??c[0];break}case"ArrowLeft":{const e=c.indexOf(o.currentTarget)-1;t=c[e]??c[c.length-1];break}}t?.focus()};return(0,C.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":t},o),children:r.map(({value:o,label:t,attributes:n})=>(0,C.jsx)("li",{role:"tab",tabIndex:e===o?0:-1,"aria-selected":e===o,ref:o=>{c.push(o)},onKeyDown:i,onClick:p,...n,className:(0,s.A)("tabs__item",g.tabItem,n?.className,{"tabs__item--active":e===o}),children:t??o},o))})}function x({lazy:o,children:t,selectedValue:e}){const r=(Array.isArray(t)?t:[t]).filter(Boolean);if(o){const o=r.find(o=>o.props.value===e);return o?(0,n.cloneElement)(o,{className:(0,s.A)("margin-top--md",o.props.className)}):null}return(0,C.jsx)("div",{className:"margin-top--md",children:r.map((o,t)=>(0,n.cloneElement)(o,{key:t,hidden:o.props.value!==e}))})}function b(o){const t=F(o);return(0,C.jsxs)("div",{className:(0,s.A)(r.G.tabs.container,"tabs-container",g.tabList),children:[(0,C.jsx)(m,{...t,...o}),(0,C.jsx)(x,{...t,...o})]})}function k(o){const t=(0,f.A)();return(0,C.jsx)(b,{...o,children:h(o.children)},String(t))}},19365:(o,t,e)=>{e.d(t,{A:()=>l});e(96540);var n=e(18215);const s={tabItem:"tabItem_Ymn6"};var r=e(74848);function l({children:o,hidden:t,className:e}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,n.A)(s.tabItem,e),hidden:t,children:o})}},59403:(o,t,e)=>{e.d(t,{A:()=>n});const n=e.p+"assets/images/tutorial-chatbot-embed-files-6157311fb4d16e7f944d55254f0cc0e2.png"},87636:(o,t,e)=>{e.r(t),e.d(t,{CH:()=>u,assets:()=>h,chCodeConfig:()=>y,contentTitle:()=>d,default:()=>f,frontMatter:()=>i,metadata:()=>n,toc:()=>D});const n=JSON.parse('{"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.","source":"@site/docs/Tutorials/chat-with-rag.mdx","sourceDirName":"Tutorials","slug":"/chat-with-rag","permalink":"/chat-with-rag","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Create a vector RAG chatbot","slug":"/chat-with-rag"},"sidebar":"docs","previous":{"title":"Quickstart","permalink":"/get-started-quickstart"},"next":{"title":"Create a chatbot that can ingest files","permalink":"/chat-with-files"}}');var s=e(74848),r=e(28453),l=e(24754),c=e(40619),a=e(11470),p=e(19365);const i={title:"Create a vector RAG chatbot",slug:"/chat-with-rag"},d=void 0,h={},u={annotations:l.hk,Code:l.Cy},y={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},D=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Create a vector RAG flow",id:"create-a-vector-rag-flow",level:2},{value:"Load data and generate embeddings",id:"load-data-and-generate-embeddings",level:2},{value:"Chat with your flow from a JavaScript application",id:"chat-with-your-flow-from-a-javascript-application",level:2},{value:"Next steps",id:"next-steps",level:2}];function F(o){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...o.components},{Details:n}=t;return u||g("CH",!1),u.Code||g("CH.Code",!0),n||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.jsx)(t.p,{children:"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."}),"\n",(0,s.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/get-started-installation",children:"Install and start Langflow"})}),"\n",(0,s.jsxs)(t.li,{children:["Create a ",(0,s.jsx)(t.a,{href:"/api-keys-and-authentication",children:"Langflow API key"})]}),"\n",(0,s.jsxs)(t.li,{children:["Create an ",(0,s.jsx)(t.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"})]}),"\n",(0,s.jsxs)(t.li,{children:["Install the ",(0,s.jsx)(t.a,{href:"/typescript-client",children:"Langflow JavaScript client"})]}),"\n",(0,s.jsx)(t.li,{children:"Be familiar with vector search concepts and applications, such as vector databases and RAG"}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"create-a-vector-rag-flow",children:"Create a vector RAG flow"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In Langflow, click ",(0,s.jsx)(t.strong,{children:"New Flow"}),", and then select the ",(0,s.jsx)(t.strong,{children:"Vector Store RAG"})," template."]}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"About the Vector Store RAG template"}),(0,s.jsx)(t.p,{children:"This template has two flows."}),(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Load Data Flow"})," populates a vector store with data from a file.\nThis data is used to respond to queries submitted to the ",(0,s.jsx)(t.strong,{children:"Retriever Flow"}),"."]}),(0,s.jsxs)(t.p,{children:["Specifically, the ",(0,s.jsx)(t.strong,{children:"Load Data Flow"})," ingests data from a local file, splits the data into chunks, loads and indexes the data in your vector database, and then computes embeddings for the chunks. The embeddings are also stored with the loaded data. This flow only needs to run when you need to load data into your vector database."]}),(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Retriever Flow"})," receives chat input, generates an embedding for the input, and then uses several components to reconstruct chunks into text and generate a response by comparing the new embedding to the stored embeddings to find similar data."]})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Add your ",(0,s.jsx)(t.strong,{children:"OpenAI"})," API key to both ",(0,s.jsx)(t.strong,{children:"OpenAI Embeddings"})," components."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Optional: Replace both ",(0,s.jsx)(t.strong,{children:"Astra DB"})," vector store components with a ",(0,s.jsx)(t.strong,{children:"Chroma DB"})," or another vector store component of your choice.\nThis tutorial uses Chroma DB."]}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Load Data Flow"})," should have ",(0,s.jsx)(t.strong,{children:"Read File"}),", ",(0,s.jsx)(t.strong,{children:"Split Text"}),", ",(0,s.jsx)(t.strong,{children:"Embedding Model"}),", vector store (such as ",(0,s.jsx)(t.strong,{children:"Chroma DB"}),"), and ",(0,s.jsx)(t.strong,{children:"Chat Output"})," components:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"File loader chat flow",src:e(59403).A+"",width:"4000",height:"2512"})}),"\n",(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.strong,{children:"Retriever Flow"})," should have ",(0,s.jsx)(t.strong,{children:"Chat Input"}),", ",(0,s.jsx)(t.strong,{children:"Embedding Model"}),", vector store, ",(0,s.jsx)(t.strong,{children:"Parser"}),", ",(0,s.jsx)(t.strong,{children:"Prompt"}),", ",(0,s.jsx)(t.strong,{children:"Language Model"}),", and ",(0,s.jsx)(t.strong,{children:"Chat Output"})," components:"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"Chat with RAG flow",src:e(96973).A+"",width:"4000",height:"1324"})}),"\n",(0,s.jsx)(t.p,{children:"The flows are ready to use.\nContinue the tutorial to learn how to use the loading flow to load data into your vector store, and then call the chat flow in a chatbot application."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"load-data-and-generate-embeddings",children:"Load data and generate embeddings"}),"\n",(0,s.jsxs)(t.p,{children:["To load data and generate embeddings, you can use the visual editor or the ",(0,s.jsx)(t.code,{children:"/v2/files"})," endpoint."]}),"\n",(0,s.jsx)(t.p,{children:"The visual editor option is simpler, but it is only recommended for scenarios where the user who created the flow is the same user who loads data into the database."}),"\n",(0,s.jsx)(t.p,{children:"In situations where many users load data or you need to load data programmatically, use the Langflow API option."}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(p.A,{value:"visual",label:"Visual editor",default:!0,children:(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["In your RAG chatbot flow, click the ",(0,s.jsx)(t.strong,{children:"Read File"})," component, and then click ",(0,s.jsx)(t.strong,{children:"File"}),"."]}),"\n",(0,s.jsxs)(t.li,{children:["Select the local file you want to upload, and then click ",(0,s.jsx)(t.strong,{children:"Open"}),".\nThe file is loaded to your Langflow server."]}),"\n",(0,s.jsxs)(t.li,{children:["To load the data into your vector database, click the vector store component, and then click ",(0,s.jsx)(c.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(t.strong,{children:"Run component"})," to run the selected component and all prior dependent components."]}),"\n"]})}),(0,s.jsxs)(p.A,{value:"API",label:"Langflow API",children:[(0,s.jsxs)(t.p,{children:["To load data programmatically, use the ",(0,s.jsx)(t.code,{children:"/v2/files/"})," and ",(0,s.jsx)(t.code,{children:"/v1/run/$FLOW_ID"})," endpoints. The first endpoint loads a file to your Langflow server, and then returns an uploaded file path. The second endpoint runs the ",(0,s.jsx)(t.strong,{children:"Load Data Flow"}),", referencing the uploaded file path, to chunk, embed, and load the data into the vector store."]}),(0,s.jsxs)(t.p,{children:["The following script demonstrates this process.\nFor help with creating this script, use the ",(0,s.jsx)(t.a,{href:"https://langflow-file-upload-examples.21cgwws14kdz.us-east.codeengine.appdomain.cloud/",children:"Langflow File Upload Utility"}),"."]}),(0,s.jsx)(u.Code,{codeConfig:y,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"// Node 18+ example using global fetch, FormData, and Blob",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" fs ",props:{style:{color:"#C9D1D9"}}},{content:"from ",props:{style:{color:"#FF7B72"}}},{content:"'fs/promises'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// 1. Prepare the form data with the file to upload",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"fileBuffer ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" fs.",props:{style:{color:"#C9D1D9"}}},{content:"readFile",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_NAME'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"data ",props:{style:{color:"#79C0FF"}}},{content:"= new ",props:{style:{color:"#FF7B72"}}},{content:"FormData",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"data.",props:{style:{color:"#C9D1D9"}}},{content:"append",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'file'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"new ",props:{style:{color:"#FF7B72"}}},{content:"Blob",props:{style:{color:"#D2A8FF"}}},{content:"([fileBuffer]), ",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_NAME'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"headers ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" { ",props:{style:{color:"#C9D1D9"}}},{content:"'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}},{content:" };",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// 2. Upload the file to Langflow",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"uploadRes ",props:{style:{color:"#79C0FF"}}},{content:"= await ",props:{style:{color:"#FF7B72"}}},{content:"fetch",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_SERVER_ADDRESS/api/v2/files/'",props:{style:{color:"#A5D6FF"}}},{content:", {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" method: ",props:{style:{color:"#C9D1D9"}}},{content:"'POST'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" headers,",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" body: data",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"});",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"uploadData ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" uploadRes.",props:{style:{color:"#C9D1D9"}}},{content:"json",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"uploadedPath ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" uploadData.path;",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// 3. Call the Langflow run endpoint with the uploaded file path",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"payload ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" input_value: ",props:{style:{color:"#C9D1D9"}}},{content:'"Analyze this file"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" output_type: ",props:{style:{color:"#C9D1D9"}}},{content:'"chat"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" input_type: ",props:{style:{color:"#C9D1D9"}}},{content:'"text"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" tweaks: {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'FILE_COMPONENT_NAME'",props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" path: uploadedPath",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"};",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"runRes ",props:{style:{color:"#79C0FF"}}},{content:"= await ",props:{style:{color:"#FF7B72"}}},{content:"fetch",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID'",props:{style:{color:"#A5D6FF"}}},{content:", {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" method: ",props:{style:{color:"#C9D1D9"}}},{content:"'POST'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" headers: { ",props:{style:{color:"#C9D1D9"}}},{content:"'Content-Type'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}},{content:" },",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" body: ",props:{style:{color:"#C9D1D9"}}},{content:"JSON",props:{style:{color:"#79C0FF"}}},{content:".",props:{style:{color:"#C9D1D9"}}},{content:"stringify",props:{style:{color:"#D2A8FF"}}},{content:"(payload)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"});",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"langflowData ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" runRes.",props:{style:{color:"#C9D1D9"}}},{content:"json",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// Output only the message",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(langflowData.outputs?.[",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"]?.outputs?.[",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"]?.results?.message?.data?.text);",props:{style:{color:"#C9D1D9"}}}]}],lang:"js"},annotations:[]}]})]})]}),"\n",(0,s.jsx)(t.p,{children:"When the flow runs, the flow ingests the selected file, chunks the data, loads the data into the vector store database, and then generates embeddings for the chunks, which are also stored in the vector store."}),"\n",(0,s.jsx)(t.p,{children:"Your database now contains data with vector embeddings that an LLM can use as context to respond to queries, as demonstrated in the next section of the tutorial."}),"\n",(0,s.jsx)(t.h2,{id:"chat-with-your-flow-from-a-javascript-application",children:"Chat with your flow from a JavaScript application"}),"\n",(0,s.jsxs)(t.p,{children:["To chat with the data in your vector database, create a chatbot application that runs the ",(0,s.jsx)(t.strong,{children:"Retriever Flow"})," programmatically."]}),"\n",(0,s.jsx)(t.p,{children:"This tutorial uses JavaScript for demonstration purposes."}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"To construct the chatbot, gather the following information:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"LANGFLOW_SERVER_ADDRESS"}),": Your Langflow server's domain. The default value is ",(0,s.jsx)(t.code,{children:"127.0.0.1:7860"}),". You can get this value from the code snippets on your flow's ",(0,s.jsxs)(t.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(t.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"FLOW_ID"}),": Your flow's UUID or custom endpoint name. You can get this value from the code snippets on your flow's ",(0,s.jsxs)(t.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(t.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"LANGFLOW_API_KEY"}),": A valid ",(0,s.jsx)(t.a,{href:"/api-keys-and-authentication",children:"Langflow API key"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Copy the following script into a JavaScript file, and then replace the placeholders with the information you gathered in the previous step:"}),"\n",(0,s.jsx)(u.Code,{codeConfig:y,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"readline ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"require",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'readline'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const",props:{style:{color:"#FF7B72"}}},{content:" { ",props:{style:{color:"#C9D1D9"}}},{content:"LangflowClient",props:{style:{color:"#79C0FF"}}},{content:" } ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"require",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'@datastax/langflow-client'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# ",props:{style:{color:"#C9D1D9"}}},{content:"pragma",props:{style:{color:"#FFA657"}}},{content:": allowlist nextline secret",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"API_KEY ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"SERVER ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"'LANGFLOW_SERVER_ADDRESS'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"FLOW_ID ",props:{style:{color:"#79C0FF"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"'FLOW_ID'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"rl ",props:{style:{color:"#79C0FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" readline.",props:{style:{color:"#C9D1D9"}}},{content:"createInterface",props:{style:{color:"#D2A8FF"}}},{content:"({ input: process.stdin, output: process.stdout });",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"// Initialize the Langflow client",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"const ",props:{style:{color:"#FF7B72"}}},{content:"client ",props:{style:{color:"#79C0FF"}}},{content:"= new ",props:{style:{color:"#FF7B72"}}},{content:"LangflowClient",props:{style:{color:"#D2A8FF"}}},{content:"({",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" baseUrl: ",props:{style:{color:"#C9D1D9"}}},{content:"SERVER",props:{style:{color:"#79C0FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" apiKey: ",props:{style:{color:"#C9D1D9"}}},{content:"API_KEY",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"});",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"async function ",props:{style:{color:"#FF7B72"}}},{content:"sendMessage",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"message",props:{style:{color:"#FFA657"}}},{content:") {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" try",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" const ",props:{style:{color:"#FF7B72"}}},{content:"response ",props:{style:{color:"#79C0FF"}}},{content:"= await",props:{style:{color:"#FF7B72"}}},{content:" client.",props:{style:{color:"#C9D1D9"}}},{content:"flow",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"FLOW_ID",props:{style:{color:"#79C0FF"}}},{content:").",props:{style:{color:"#C9D1D9"}}},{content:"run",props:{style:{color:"#D2A8FF"}}},{content:"(message, {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" session_id: ",props:{style:{color:"#C9D1D9"}}},{content:"'user_1'",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" });",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" // Use the convenience method to get the chat output text",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" return",props:{style:{color:"#FF7B72"}}},{content:" response.",props:{style:{color:"#C9D1D9"}}},{content:"chatOutputText",props:{style:{color:"#D2A8FF"}}},{content:"() ",props:{style:{color:"#C9D1D9"}}},{content:"|| ",props:{style:{color:"#FF7B72"}}},{content:"'No response'",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" } ",props:{style:{color:"#C9D1D9"}}},{content:"catch",props:{style:{color:"#FF7B72"}}},{content:" (error) {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" return ",props:{style:{color:"#FF7B72"}}},{content:"`Error: ${",props:{style:{color:"#A5D6FF"}}},{content:"error",props:{style:{color:"#C9D1D9"}}},{content:".",props:{style:{color:"#A5D6FF"}}},{content:"message",props:{style:{color:"#C9D1D9"}}},{content:"}`",props:{style:{color:"#A5D6FF"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"function ",props:{style:{color:"#FF7B72"}}},{content:"chat",props:{style:{color:"#D2A8FF"}}},{content:"() {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:'\'\ud83e\udd16 Langflow RAG Chatbot (type "quit" to exit)',props:{style:{color:"#A5D6FF"}}},{content:"\\n",props:{style:{color:"#79C0FF"}}},{content:"'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" const ",props:{style:{color:"#FF7B72"}}},{content:"ask ",props:{style:{color:"#D2A8FF"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" () ",props:{style:{color:"#C9D1D9"}}},{content:"=>",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" rl.",props:{style:{color:"#C9D1D9"}}},{content:"question",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'\ud83d\udc64 You: '",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"async",props:{style:{color:"#FF7B72"}}},{content:" (",props:{style:{color:"#C9D1D9"}}},{content:"input",props:{style:{color:"#FFA657"}}},{content:") ",props:{style:{color:"#C9D1D9"}}},{content:"=>",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" if",props:{style:{color:"#FF7B72"}}},{content:" ([",props:{style:{color:"#C9D1D9"}}},{content:"'quit'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'exit'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'bye'",props:{style:{color:"#A5D6FF"}}},{content:"].",props:{style:{color:"#C9D1D9"}}},{content:"includes",props:{style:{color:"#D2A8FF"}}},{content:"(input.",props:{style:{color:"#C9D1D9"}}},{content:"trim",props:{style:{color:"#D2A8FF"}}},{content:"().",props:{style:{color:"#C9D1D9"}}},{content:"toLowerCase",props:{style:{color:"#D2A8FF"}}},{content:"())) {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'\ud83d\udc4b Goodbye!'",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" rl.",props:{style:{color:"#C9D1D9"}}},{content:"close",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" return",props:{style:{color:"#FF7B72"}}},{content:";",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" const ",props:{style:{color:"#FF7B72"}}},{content:"response ",props:{style:{color:"#79C0FF"}}},{content:"= await ",props:{style:{color:"#FF7B72"}}},{content:"sendMessage",props:{style:{color:"#D2A8FF"}}},{content:"(input.",props:{style:{color:"#C9D1D9"}}},{content:"trim",props:{style:{color:"#D2A8FF"}}},{content:"());",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" console.",props:{style:{color:"#C9D1D9"}}},{content:"log",props:{style:{color:"#D2A8FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"`\ud83e\udd16 Assistant: ${",props:{style:{color:"#A5D6FF"}}},{content:"response",props:{style:{color:"#C9D1D9"}}},{content:"}",props:{style:{color:"#A5D6FF"}}},{content:"\\n",props:{style:{color:"#79C0FF"}}},{content:"`",props:{style:{color:"#A5D6FF"}}},{content:");",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ask",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" });",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" };",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" ask",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"chat",props:{style:{color:"#D2A8FF"}}},{content:"();",props:{style:{color:"#C9D1D9"}}}]}],lang:"js"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:["The script creates a Node application that chats with the content in your vector database, using the ",(0,s.jsx)(t.code,{children:"chat"})," input and output types to communicate with your flow.\nChat maintains ongoing conversation context across multiple messages. If you used ",(0,s.jsx)(t.code,{children:"text"})," type inputs and outputs, each request is a standalone text string."]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["The ",(0,s.jsx)(t.a,{href:"/typescript-client",children:"Langflow TypeScript client"})," has a ",(0,s.jsx)(t.code,{children:"chatOutputText()"})," convenience method that simplifies working with Langflow's complex JSON response structure.\nInstead of manually navigating through multiple levels of nested objects with ",(0,s.jsx)(t.code,{children:"data.outputs[0].outputs[0].results.message.data.text"}),", the client automatically extracts the message text and handles potentially undefined values gracefully."]})}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Save and run the script to send the requests and test the flow."}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Result"}),(0,s.jsx)(t.p,{children:"The following is an example response from this tutorial's flow. Due to the nature of LLMs and variations in your inputs, your response might be different."}),(0,s.jsx)(u.Code,{codeConfig:y,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"\ud83d\udc64 You: Do you have any documents about engines?",props:{}}]},{tokens:[{content:"\ud83e\udd16 Assistant: Yes, the provided text contains several warnings and guidelines related to engine installation, maintenance, and selection. It emphasizes the importance of using the correct engine for specific applications, ensuring all components are in good condition, and following safety precautions to prevent fire or explosion. If you need more specific information or details, please let me know!",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"\ud83d\udc64 You: It should be about a Briggs and Stratton engine.",props:{}}]},{tokens:[{content:"\ud83e\udd16 Assistant: The text provides important safety and installation guidelines for Briggs & Stratton engines. It emphasizes that these engines should not be used on 3-wheel All-Terrain Vehicles (ATVs), motor bikes, aircraft products, or vehicles intended for competitive events, as such uses are not approved by Briggs & Stratton.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"If you have any specific questions about Briggs & Stratton engines or need further information, feel free to ask!",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsx)(t.p,{children:"For more information on building or extending this tutorial, see the following:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/mcp-server",children:"Model Context Protocol (MCP) servers"})}),"\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/deployment-overview",children:"Langflow deployment overview"})}),"\n"]})]})}function f(o={}){const{wrapper:t}={...(0,r.R)(),...o.components};return t?(0,s.jsx)(t,{...o,children:(0,s.jsx)(F,{...o})}):F(o)}function g(o,t){throw new Error("Expected "+(t?"component":"object")+" `"+o+"` to be defined: you likely forgot to import, pass, or provide it.")}},96973:(o,t,e)=>{e.d(t,{A:()=>n});const n=e.p+"assets/images/tutorial-chatbot-chat-flow-af7257d77ff0259ab1a0980641d464ce.png"}}]);
\ No newline at end of file
diff --git a/assets/js/2fc7e024.5cdd44e5.js b/assets/js/2fc7e024.5cdd44e5.js
deleted file mode 100644
index 796e17acd4..0000000000
--- a/assets/js/2fc7e024.5cdd44e5.js
+++ /dev/null
@@ -1 +0,0 @@
-"use strict";(globalThis.webpackChunklangflow_docs=globalThis.webpackChunklangflow_docs||[]).push([[1408],{47617:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/tutorial-chat-file-loader-099f2f4c5e4343412557b1a78c4b9209.png"},57844:(e,o,t)=>{t.r(o),t.d(o,{CH:()=>d,assets:()=>a,chCodeConfig:()=>h,contentTitle:()=>p,default:()=>f,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"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.","source":"@site/docs/Tutorials/chat-with-files.mdx","sourceDirName":"Tutorials","slug":"/chat-with-files","permalink":"/chat-with-files","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Create a chatbot that can ingest files","slug":"/chat-with-files"},"sidebar":"docs","previous":{"title":"Create a vector RAG chatbot","permalink":"/chat-with-rag"},"next":{"title":"Connect applications to agents","permalink":"/agent-tutorial"}}');var s=t(74848),r=t(28453),l=t(24754),c=t(40619);const i={title:"Create a chatbot that can ingest files",slug:"/chat-with-files"},p=void 0,a={},d={annotations:l.hk,Code:l.Cy},h={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Create a flow that accepts file input",id:"create-a-flow-that-accepts-file-input",level:2},{value:"Send requests to your flow from a Python application",id:"send-requests-to-your-flow-from-a-python-application",level:2},{value:"Next steps",id:"next-steps",level:2},{value:"Process multiple files loaded at runtime",id:"process-multiple-files-loaded-at-runtime",level:3},{value:"Upload external files at runtime",id:"upload-external-files-at-runtime",level:3},{value:"Preload files outside the chat session",id:"preload-files-outside-the-chat-session",level:3}];function y(e){const o={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:n}=o;return d||D("CH",!1),d.Code||D("CH.Code",!0),n||D("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)(o.p,{children:"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."}),"\n",(0,s.jsx)(o.p,{children:"For example, you could upload a contract and ask, \u201cWhat are the termination clauses in this agreement?\u201d Or upload a resume and ask, \u201cDoes this candidate have experience with marketing analytics?\u201d"}),"\n",(0,s.jsx)(o.p,{children:"The main focus of this tutorial is to show you how to provide files as input to a Langflow flow, so your chatbot can use the content of those files in its responses."}),"\n",(0,s.jsx)(o.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsx)(o.li,{children:(0,s.jsx)(o.a,{href:"/get-started-installation",children:"Install and start Langflow"})}),"\n",(0,s.jsxs)(o.li,{children:["Create a ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication",children:"Langflow API key"})]}),"\n",(0,s.jsxs)(o.li,{children:["Create an ",(0,s.jsx)(o.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"})]}),"\n"]}),"\n",(0,s.jsx)(o.p,{children:"This tutorial uses an OpenAI LLM. If you want to use a different provider, you need a valid credential for that provider."}),"\n",(0,s.jsx)(o.h2,{id:"create-a-flow-that-accepts-file-input",children:"Create a flow that accepts file input"}),"\n",(0,s.jsxs)(o.p,{children:["To ingest files, your flow must have a ",(0,s.jsx)(o.strong,{children:"Read File"})," component attached to a component that receives input, such as a ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," or ",(0,s.jsx)(o.strong,{children:"Agent"})," component."]}),"\n",(0,s.jsxs)(o.p,{children:["The following steps modify the ",(0,s.jsx)(o.strong,{children:"Basic Prompting"})," template to accept file input:"]}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["In Langflow, click ",(0,s.jsx)(o.strong,{children:"New Flow"}),", and then select the ",(0,s.jsx)(o.strong,{children:"Basic Prompting"})," template."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["In the ",(0,s.jsx)(o.strong,{children:"Language Model"})," component, enter your OpenAI API key."]}),"\n",(0,s.jsxs)(o.p,{children:["If you want to use a different provider or model, edit the ",(0,s.jsx)(o.strong,{children:"Model Provider"}),", ",(0,s.jsx)(o.strong,{children:"Model Name"}),", and ",(0,s.jsx)(o.strong,{children:"API Key"})," fields accordingly."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["To verify that your API key is valid, click ",(0,s.jsx)(c.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(o.strong,{children:"Playground"}),", and then ask the LLM a question.\nThe LLM should respond according to the specifications in the ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," component's ",(0,s.jsx)(o.strong,{children:"Template"})," field."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Exit the ",(0,s.jsx)(o.strong,{children:"Playground"}),", and then modify the ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," component to accept file input in addition to chat input.\nTo do this, edit the ",(0,s.jsx)(o.strong,{children:"Template"})," field, and then replace the default prompt with the following text:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"ChatInput:",props:{}}]},{tokens:[{content:"{chat-input}",props:{}}]},{tokens:[{content:"File:",props:{}}]},{tokens:[{content:"{file}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(o.admonition,{type:"tip",children:[(0,s.jsxs)(o.p,{children:["You can use any string to name your template variables.\nThese strings become the names of the fields (input ports) on the ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," component."]}),(0,s.jsxs)(o.p,{children:["For this tutorial, the variables are named after the components that connect to them: ",(0,s.jsx)(o.strong,{children:"chat-input"})," for the ",(0,s.jsx)(o.strong,{children:"Chat Input"})," component and ",(0,s.jsx)(o.strong,{children:"file"})," for the ",(0,s.jsx)(o.strong,{children:"Read File"})," component."]})]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsxs)(o.p,{children:["Add a ",(0,s.jsxs)(o.a,{href:"/read-file",children:[(0,s.jsx)(o.strong,{children:"Read File"})," component"]})," to the flow, and then connect the ",(0,s.jsx)(o.strong,{children:"Raw Content"})," output port to the ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," component's ",(0,s.jsx)(o.strong,{children:"file"})," input port.\nTo connect ports, click and drag from one port to the other."]}),"\n",(0,s.jsxs)(o.p,{children:["You can add files directly to the ",(0,s.jsx)(o.strong,{children:"Read File"})," component to pre-load input before running the flow, or you can load files at runtime. The next section of this tutorial covers runtime file uploads."]}),"\n",(0,s.jsxs)(o.p,{children:["At this point your flow has five components. The ",(0,s.jsx)(o.strong,{children:"Chat Input"})," and ",(0,s.jsx)(o.strong,{children:"Read File"})," components are connected to the ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," component's input ports. Then, the ",(0,s.jsx)(o.strong,{children:"Prompt Template"})," component's output port is connected to the ",(0,s.jsx)(o.strong,{children:"Language Model"})," component's input port. Finally, the ",(0,s.jsx)(o.strong,{children:"Language Model"})," component's output port is connected to the ",(0,s.jsx)(o.strong,{children:"Chat Output"})," component, which returns the final response to the user."]}),"\n",(0,s.jsx)(o.p,{children:(0,s.jsx)(o.img,{alt:"File loader chat flow",src:t(47617).A+"",width:"4000",height:"1564"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(o.h2,{id:"send-requests-to-your-flow-from-a-python-application",children:"Send requests to your flow from a Python application"}),"\n",(0,s.jsx)(o.p,{children:"This section of the tutorial demonstrates how you can send file input to a flow from an application."}),"\n",(0,s.jsxs)(o.p,{children:["To do this, your application must send a ",(0,s.jsx)(o.code,{children:"POST /run"})," request to your Langflow server with the file you want to upload and a text prompt.\nThe result includes the outcome of the flow run and the LLM's response."]}),"\n",(0,s.jsxs)(o.p,{children:["This example uses a local Langflow instance, and it asks the LLM to evaluate a sample resume.\nIf you don't have a resume on hand, you can download ",(0,s.jsx)(o.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:t(87481).A+"",children:"fake-resume.txt"}),"."]}),"\n",(0,s.jsx)(o.admonition,{type:"tip",children:(0,s.jsxs)(o.p,{children:["For help with constructing file upload requests in Python, JavaScript, and curl, see the ",(0,s.jsx)(o.a,{href:"https://langflow-file-upload-examples.21cgwws14kdz.us-east.codeengine.appdomain.cloud/",children:"Langflow File Upload Utility"}),"."]})}),"\n",(0,s.jsxs)(o.ol,{children:["\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"To construct the request, gather the following information:"}),"\n",(0,s.jsxs)(o.ul,{children:["\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"LANGFLOW_SERVER_ADDRESS"}),": Your Langflow server's domain. The default value is ",(0,s.jsx)(o.code,{children:"127.0.0.1:7860"}),". You can get this value from the code snippets on your flow's ",(0,s.jsxs)(o.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(o.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"FLOW_ID"}),": Your flow's UUID or custom endpoint name. You can get this value from the code snippets on your flow's ",(0,s.jsxs)(o.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(o.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"FILE_COMPONENT_ID"}),": The UUID of the ",(0,s.jsx)(o.strong,{children:"Read File"})," component in your flow, such as ",(0,s.jsx)(o.code,{children:"File-KZP68"}),". To find the component ID, open your flow in Langflow, click the ",(0,s.jsx)(o.strong,{children:"Read File"})," component, and then click ",(0,s.jsx)(o.strong,{children:"Controls"}),". The component ID is at the top of the ",(0,s.jsx)(o.strong,{children:"Controls"})," pane."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"CHAT_INPUT"}),": The message you want to send to the Chat Input of your flow, such as ",(0,s.jsx)(o.code,{children:"Evaluate this resume for a job opening in my Marketing department."})]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"FILE_NAME"})," and ",(0,s.jsx)(o.code,{children:"FILE_PATH"}),": The name and path to the local file that you want to send to your flow."]}),"\n",(0,s.jsxs)(o.li,{children:[(0,s.jsx)(o.code,{children:"LANGFLOW_API_KEY"}),": A valid ",(0,s.jsx)(o.a,{href:"/api-keys-and-authentication",children:"Langflow API key"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Copy the following script into a Python file, and then replace the placeholders with the information you gathered in the previous step:"}),"\n",(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"# Python example using requests",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" requests",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" json",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 1. Set the upload URL",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"url ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:'"http://LANGFLOW_SERVER_ADDRESS/api/v2/files/"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 2. Prepare the file and payload",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"payload ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"files ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" [",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" (",props:{style:{color:"#C9D1D9"}}},{content:"'file'",props:{style:{color:"#A5D6FF"}}},{content:", (",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_PATH'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"open",props:{style:{color:"#79C0FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_NAME'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'rb'",props:{style:{color:"#A5D6FF"}}},{content:"), ",props:{style:{color:"#C9D1D9"}}},{content:"'application/octet-stream'",props:{style:{color:"#A5D6FF"}}},{content:"))",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"headers ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'Accept'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 3. Upload the file to Langflow",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"response ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" requests.request(",props:{style:{color:"#C9D1D9"}}},{content:'"POST"',props:{style:{color:"#A5D6FF"}}},{content:", url, ",props:{style:{color:"#C9D1D9"}}},{content:"headers",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"headers, ",props:{style:{color:"#C9D1D9"}}},{content:"data",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"payload, ",props:{style:{color:"#C9D1D9"}}},{content:"files",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"files)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(response.text)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 4. Get the uploaded file path from the response",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"uploaded_data ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" response.json()",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"uploaded_path ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" uploaded_data.get(",props:{style:{color:"#C9D1D9"}}},{content:"'path'",props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 5. Call the Langflow run endpoint with the uploaded file path",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"run_url ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:'"http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"run_payload ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "input_value"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"CHAT_INPUT"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "output_type"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"chat"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "input_type"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"chat"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "tweaks"',props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "FILE_COMPONENT_ID"',props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "path"',props:{style:{color:"#A5D6FF"}}},{content:": uploaded_path",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"run_headers ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'Content-Type'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'Accept'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"run_response ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" requests.post(run_url, ",props:{style:{color:"#C9D1D9"}}},{content:"headers",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"run_headers, ",props:{style:{color:"#C9D1D9"}}},{content:"data",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"json.dumps(run_payload))",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"langflow_data ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" run_response.json()",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Output only the message",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"message ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"None",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"try",props:{style:{color:"#FF7B72"}}},{content:":",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" message ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" langflow_data[",props:{style:{color:"#C9D1D9"}}},{content:"'outputs'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'outputs'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'results'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'message'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'data'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'text'",props:{style:{color:"#A5D6FF"}}},{content:"]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"except",props:{style:{color:"#FF7B72"}}},{content:" (",props:{style:{color:"#C9D1D9"}}},{content:"KeyError",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"IndexError",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"TypeError",props:{style:{color:"#79C0FF"}}},{content:"):",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" pass",props:{style:{color:"#FF7B72"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(message)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsx)(o.p,{children:"This script contains two requests."}),"\n",(0,s.jsxs)(o.p,{children:["The first request uploads a file, such as ",(0,s.jsx)(o.code,{children:"fake-resume.txt"}),", to your Langflow server at the ",(0,s.jsx)(o.code,{children:"/v2/files"})," endpoint. This request returns a file path that can be referenced in subsequent Langflow requests, such as ",(0,s.jsx)(o.code,{children:"02791d46-812f-4988-ab1c-7c430214f8d5/fake-resume.txt"})]}),"\n",(0,s.jsxs)(o.p,{children:["The second request sends a chat message to the Langflow flow at the ",(0,s.jsx)(o.code,{children:"/v1/run/"})," endpoint.\nThe ",(0,s.jsx)(o.code,{children:"tweaks"})," parameter includes the path to the uploaded file as the variable ",(0,s.jsx)(o.code,{children:"uploaded_path"}),", and sends this file directly to the ",(0,s.jsx)(o.strong,{children:"Read File"})," component."]}),"\n"]}),"\n",(0,s.jsxs)(o.li,{children:["\n",(0,s.jsx)(o.p,{children:"Save and run the script to send the requests and test the flow."}),"\n",(0,s.jsx)(o.p,{children:"The initial output contains the JSON response object from the file upload endpoint, including the internal path where Langflow stores the file.\nThen, the LLM retrieves the file and evaluates its content, in this case the suitability of the resume for a job position."}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Result"}),(0,s.jsx)(o.p,{children:"The following is an example response from this tutorial's flow. Due to the nature of LLMs and variations in your inputs, your response might be different."}),(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:'{"id":"793ba3d8-5e7a-4499-8b89-d9a7b6325fee","name":"fake-resume (1)","path":"02791d46-812f-4988-ab1c-7c430214f8d5/fake-resume.txt","size":1779,"provider":null}',props:{}}]},{tokens:[{content:"The resume for Emily J. Wilson presents a strong candidate for a position in your Marketing department. Here are some key points to consider:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"### Strengths:",props:{}}]},{tokens:[{content:"1. **Experience**: With over 8 years in marketing, Emily has held progressively responsible positions, culminating in her current role as Marketing Director. This indicates a solid foundation in the field.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"2. **Quantifiable Achievements**: The resume highlights specific accomplishments, such as a 25% increase in brand recognition and a 30% sales increase after launching new product lines. These metrics demonstrate her ability to drive results.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"3. **Diverse Skill Set**: Emily's skills encompass various aspects of marketing, including strategy development, team management, social media marketing, event planning, and data analysis. This versatility can be beneficial in a dynamic marketing environment.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"4. **Educational Background**: Her MBA and a Bachelor's degree in Marketing provide a strong academic foundation, which is often valued in marketing roles.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"5. **Certifications**: The Certified Marketing Professional (CMP) and Google Analytics Certification indicate a commitment to professional development and staying current with industry standards.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"### Areas for Improvement:",props:{}}]},{tokens:[{content:"1. **Specificity in Skills**: While the skills listed are relevant, providing examples of how she has applied these skills in her previous roles could strengthen her resume further.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"2. **References**: While stating that references are available upon request is standard, including a couple of testimonials or notable endorsements could enhance credibility.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"3. **Formatting**: Ensure that the resume is visually appealing and easy to read. Clear headings and bullet points help in quickly identifying key information.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"### Conclusion:",props:{}}]},{tokens:[{content:"Overall, Emily J. Wilson's resume reflects a well-rounded marketing professional with a proven track record of success. If her experience aligns with the specific needs of your Marketing department, she could be a valuable addition to your team. Consider inviting her for an interview to further assess her fit for the role.",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(o.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsx)(o.p,{children:"To continue building on this tutorial, try these next steps."}),"\n",(0,s.jsx)(o.h3,{id:"process-multiple-files-loaded-at-runtime",children:"Process multiple files loaded at runtime"}),"\n",(0,s.jsxs)(o.p,{children:["To process multiple files in a single flow run, add a separate ",(0,s.jsx)(o.strong,{children:"Read File"})," component for each file you want to ingest. Then, modify your script to upload each file, retrieve each returned file path, and then pass a unique file path to each ",(0,s.jsx)(o.strong,{children:"Read File"})," component ID."]}),"\n",(0,s.jsxs)(o.p,{children:["For example, you can modify ",(0,s.jsx)(o.code,{children:"tweaks"})," to accept multiple ",(0,s.jsx)(o.strong,{children:"Read File"})," components.\nThe following code is just an example; it isn't working code:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"## set multiple file paths",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"file_paths ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" FILE_COMPONENT_1",props:{style:{color:"#79C0FF"}}},{content:": uploaded_path_1,",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" FILE_COMPONENT_2",props:{style:{color:"#79C0FF"}}},{content:": uploaded_path_2",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"def ",props:{style:{color:"#FF7B72"}}},{content:"chat_with_flow",props:{style:{color:"#D2A8FF"}}},{content:"(input_message, file_paths):",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' """Compare the contents of these two files."""',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" run_url ",props:{style:{color:"#C9D1D9"}}},{content:"= f",props:{style:{color:"#FF7B72"}}},{content:'"',props:{style:{color:"#A5D6FF"}}},{content:"{LANGFLOW_SERVER_ADDRESS}",props:{style:{color:"#79C0FF"}}},{content:"/api/v1/run/",props:{style:{color:"#A5D6FF"}}},{content:"{FLOW_ID}",props:{style:{color:"#79C0FF"}}},{content:'"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" # Prepare tweaks with both file paths",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" tweaks ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" for",props:{style:{color:"#FF7B72"}}},{content:" component_id, file_path ",props:{style:{color:"#C9D1D9"}}},{content:"in",props:{style:{color:"#FF7B72"}}},{content:" file_paths.items():",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" tweaks[component_id] ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}},{content:'"path"',props:{style:{color:"#A5D6FF"}}},{content:": file_path}",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsxs)(o.p,{children:["You can also use a ",(0,s.jsxs)(o.a,{href:"/directory",children:[(0,s.jsx)(o.strong,{children:"Directory"})," component"]})," to load all files in a directory or pass an archive file to the ",(0,s.jsx)(o.strong,{children:"Read File"})," component."]}),"\n",(0,s.jsx)(o.h3,{id:"upload-external-files-at-runtime",children:"Upload external files at runtime"}),"\n",(0,s.jsxs)(o.p,{children:["To upload files from another machine that isn't your local environment, your Langflow server must first be accessible over the internet. Then, authenticated users can upload files to your public Langflow server's ",(0,s.jsx)(o.code,{children:"/v2/files/"})," endpoint, as shown in the tutorial. For more information, see ",(0,s.jsx)(o.a,{href:"/deployment-overview",children:"Langflow deployment overview"}),"."]}),"\n",(0,s.jsx)(o.h3,{id:"preload-files-outside-the-chat-session",children:"Preload files outside the chat session"}),"\n",(0,s.jsxs)(o.p,{children:["You can use the ",(0,s.jsx)(o.strong,{children:"Read File"})," component to load files anywhere in a flow, not just in a chat session."]}),"\n",(0,s.jsxs)(o.p,{children:["In the visual editor, you can preload files to the ",(0,s.jsx)(o.strong,{children:"Read File"})," component by selecting them from your local machine or ",(0,s.jsx)(o.a,{href:"/concepts-file-management",children:"Langflow file management"}),"."]}),"\n",(0,s.jsx)(o.p,{children:"For example, you can preload an instructions file for a prompt template, or you can preload a vector store with documents that you want to query in a Retrieval Augmented Generation (RAG) flow."}),"\n",(0,s.jsxs)(o.p,{children:["For more information about the ",(0,s.jsx)(o.strong,{children:"Read File"})," component and other data loading components, see the ",(0,s.jsxs)(o.a,{href:"/read-file",children:[(0,s.jsx)(o.strong,{children:"Read File"})," component"]}),"."]})]})}function f(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(y,{...e})}):y(e)}function D(e,o){throw new Error("Expected "+(o?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},87481:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/files/fake-resume-fa337cbdb18306bd29e3168f73409745.txt"}}]);
\ No newline at end of file
diff --git a/assets/js/2fc7e024.88a7766e.js b/assets/js/2fc7e024.88a7766e.js
new file mode 100644
index 0000000000..8570658f48
--- /dev/null
+++ b/assets/js/2fc7e024.88a7766e.js
@@ -0,0 +1 @@
+"use strict";(globalThis.webpackChunklangflow_docs=globalThis.webpackChunklangflow_docs||[]).push([[1408],{47617:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/images/tutorial-chat-file-loader-099f2f4c5e4343412557b1a78c4b9209.png"},57844:(e,t,o)=>{o.r(t),o.d(t,{CH:()=>d,assets:()=>p,chCodeConfig:()=>h,contentTitle:()=>a,default:()=>f,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"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.","source":"@site/docs/Tutorials/chat-with-files.mdx","sourceDirName":"Tutorials","slug":"/chat-with-files","permalink":"/chat-with-files","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"title":"Create a chatbot that can ingest files","slug":"/chat-with-files"},"sidebar":"docs","previous":{"title":"Create a vector RAG chatbot","permalink":"/chat-with-rag"},"next":{"title":"Connect applications to agents","permalink":"/agent-tutorial"}}');var s=o(74848),r=o(28453),l=o(24754),c=o(40619);const i={title:"Create a chatbot that can ingest files",slug:"/chat-with-files"},a=void 0,p={},d={annotations:l.hk,Code:l.Cy},h={staticMediaQuery:"not screen, (max-width: 768px)",lineNumbers:!0,showCopyButton:!0,themeName:"github-dark"},u=[{value:"Prerequisites",id:"prerequisites",level:2},{value:"Create a flow that accepts file input",id:"create-a-flow-that-accepts-file-input",level:2},{value:"Send requests to your flow from a Python application",id:"send-requests-to-your-flow-from-a-python-application",level:2},{value:"Next steps",id:"next-steps",level:2},{value:"Process multiple files loaded at runtime",id:"process-multiple-files-loaded-at-runtime",level:3},{value:"Upload external files at runtime",id:"upload-external-files-at-runtime",level:3},{value:"Preload files outside the chat session",id:"preload-files-outside-the-chat-session",level:3}];function y(e){const t={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:n}=t;return d||D("CH",!1),d.Code||D("CH.Code",!0),n||D("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:"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."}),"\n",(0,s.jsx)(t.p,{children:"For example, you could upload a contract and ask, \u201cWhat are the termination clauses in this agreement?\u201d Or upload a resume and ask, \u201cDoes this candidate have experience with marketing analytics?\u201d"}),"\n",(0,s.jsx)(t.p,{children:"The main focus of this tutorial is to show you how to provide files as input to a Langflow flow, so your chatbot can use the content of those files in its responses."}),"\n",(0,s.jsx)(t.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsx)(t.li,{children:(0,s.jsx)(t.a,{href:"/get-started-installation",children:"Install and start Langflow"})}),"\n",(0,s.jsxs)(t.li,{children:["Create a ",(0,s.jsx)(t.a,{href:"/api-keys-and-authentication",children:"Langflow API key"})]}),"\n",(0,s.jsxs)(t.li,{children:["Create an ",(0,s.jsx)(t.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"})]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:"This tutorial uses an OpenAI LLM. If you want to use a different provider, you need a valid credential for that provider."}),"\n",(0,s.jsx)(t.h2,{id:"create-a-flow-that-accepts-file-input",children:"Create a flow that accepts file input"}),"\n",(0,s.jsxs)(t.p,{children:["To ingest files, your flow must have a ",(0,s.jsx)(t.strong,{children:"Read File"})," component attached to a component that receives input, such as a ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," or ",(0,s.jsx)(t.strong,{children:"Agent"})," component."]}),"\n",(0,s.jsxs)(t.p,{children:["The following steps modify the ",(0,s.jsx)(t.strong,{children:"Basic Prompting"})," template to accept file input:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In Langflow, click ",(0,s.jsx)(t.strong,{children:"New Flow"}),", and then select the ",(0,s.jsx)(t.strong,{children:"Basic Prompting"})," template."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["In the ",(0,s.jsx)(t.strong,{children:"Language Model"})," component, enter your OpenAI API key."]}),"\n",(0,s.jsxs)(t.p,{children:["If you want to use a different provider or model, edit the ",(0,s.jsx)(t.strong,{children:"Model Provider"}),", ",(0,s.jsx)(t.strong,{children:"Model Name"}),", and ",(0,s.jsx)(t.strong,{children:"API Key"})," fields accordingly."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["To verify that your API key is valid, click ",(0,s.jsx)(c.A,{name:"Play","aria-hidden":"true"})," ",(0,s.jsx)(t.strong,{children:"Playground"}),", and then ask the LLM a question.\nThe LLM should respond according to the specifications in the ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," component's ",(0,s.jsx)(t.strong,{children:"Template"})," field."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Exit the ",(0,s.jsx)(t.strong,{children:"Playground"}),", and then modify the ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," component to accept file input in addition to chat input.\nTo do this, edit the ",(0,s.jsx)(t.strong,{children:"Template"})," field, and then replace the default prompt with the following text:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"ChatInput:",props:{}}]},{tokens:[{content:"{chat-input}",props:{}}]},{tokens:[{content:"File:",props:{}}]},{tokens:[{content:"{file}",props:{}}]}],lang:"text"},annotations:[]}]}),"\n",(0,s.jsxs)(t.admonition,{type:"tip",children:[(0,s.jsxs)(t.p,{children:["You can use any string to name your template variables.\nThese strings become the names of the fields (input ports) on the ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," component."]}),(0,s.jsxs)(t.p,{children:["For this tutorial, the variables are named after the components that connect to them: ",(0,s.jsx)(t.strong,{children:"chat-input"})," for the ",(0,s.jsx)(t.strong,{children:"Chat Input"})," component and ",(0,s.jsx)(t.strong,{children:"file"})," for the ",(0,s.jsx)(t.strong,{children:"Read File"})," component."]})]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Add a ",(0,s.jsxs)(t.a,{href:"/read-file",children:[(0,s.jsx)(t.strong,{children:"Read File"})," component"]})," to the flow, and then connect the ",(0,s.jsx)(t.strong,{children:"Raw Content"})," output port to the ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," component's ",(0,s.jsx)(t.strong,{children:"file"})," input port.\nTo connect ports, click and drag from one port to the other."]}),"\n",(0,s.jsxs)(t.p,{children:["You can add files directly to the ",(0,s.jsx)(t.strong,{children:"Read File"})," component to pre-load input before running the flow, or you can load files at runtime. The next section of this tutorial covers runtime file uploads."]}),"\n",(0,s.jsxs)(t.p,{children:["At this point your flow has five components. The ",(0,s.jsx)(t.strong,{children:"Chat Input"})," and ",(0,s.jsx)(t.strong,{children:"Read File"})," components are connected to the ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," component's input ports. Then, the ",(0,s.jsx)(t.strong,{children:"Prompt Template"})," component's output port is connected to the ",(0,s.jsx)(t.strong,{children:"Language Model"})," component's input port. Finally, the ",(0,s.jsx)(t.strong,{children:"Language Model"})," component's output port is connected to the ",(0,s.jsx)(t.strong,{children:"Chat Output"})," component, which returns the final response to the user."]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"File loader chat flow",src:o(47617).A+"",width:"4000",height:"1564"})}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"send-requests-to-your-flow-from-a-python-application",children:"Send requests to your flow from a Python application"}),"\n",(0,s.jsx)(t.p,{children:"This section of the tutorial demonstrates how you can send file input to a flow from an application."}),"\n",(0,s.jsxs)(t.p,{children:["To do this, your application must send a ",(0,s.jsx)(t.code,{children:"POST /run"})," request to your Langflow server with the file you want to upload and a text prompt.\nThe result includes the outcome of the flow run and the LLM's response."]}),"\n",(0,s.jsxs)(t.p,{children:["This example uses a local Langflow instance, and it asks the LLM to evaluate a sample resume.\nIf you don't have a resume on hand, you can download ",(0,s.jsx)(t.a,{target:"_blank","data-noBrokenLinkCheck":!0,href:o(87481).A+"",children:"fake-resume.txt"}),"."]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["For an example of constructing file upload requests in JavaScript, see the ",(0,s.jsx)(t.a,{href:"/chat-with-rag#load-data-and-generate-embeddings",children:"Create a vector RAG chatbot tutorial"}),"."]})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"To construct the request, gather the following information:"}),"\n",(0,s.jsxs)(t.ul,{children:["\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"LANGFLOW_SERVER_ADDRESS"}),": Your Langflow server's domain. The default value is ",(0,s.jsx)(t.code,{children:"127.0.0.1:7860"}),". You can get this value from the code snippets on your flow's ",(0,s.jsxs)(t.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(t.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"FLOW_ID"}),": Your flow's UUID or custom endpoint name. You can get this value from the code snippets on your flow's ",(0,s.jsxs)(t.a,{href:"/concepts-publish#api-access",children:[(0,s.jsx)(t.strong,{children:"API access"})," pane"]}),"."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"FILE_COMPONENT_ID"}),": The UUID of the ",(0,s.jsx)(t.strong,{children:"Read File"})," component in your flow, such as ",(0,s.jsx)(t.code,{children:"File-KZP68"}),". To find the component ID, open your flow in Langflow, click the ",(0,s.jsx)(t.strong,{children:"Read File"})," component, and then click ",(0,s.jsx)(t.strong,{children:"Controls"}),". The component ID is at the top of the ",(0,s.jsx)(t.strong,{children:"Controls"})," pane."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"CHAT_INPUT"}),": The message you want to send to the Chat Input of your flow, such as ",(0,s.jsx)(t.code,{children:"Evaluate this resume for a job opening in my Marketing department."})]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"FILE_NAME"})," and ",(0,s.jsx)(t.code,{children:"FILE_PATH"}),": The name and path to the local file that you want to send to your flow."]}),"\n",(0,s.jsxs)(t.li,{children:[(0,s.jsx)(t.code,{children:"LANGFLOW_API_KEY"}),": A valid ",(0,s.jsx)(t.a,{href:"/api-keys-and-authentication",children:"Langflow API key"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Copy the following script into a Python file, and then replace the placeholders with the information you gathered in the previous step:"}),"\n",(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"# Python example using requests",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" requests",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"import",props:{style:{color:"#FF7B72"}}},{content:" json",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 1. Set the upload URL",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"url ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:'"http://LANGFLOW_SERVER_ADDRESS/api/v2/files/"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 2. Prepare the file and payload",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"payload ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"files ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" [",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" (",props:{style:{color:"#C9D1D9"}}},{content:"'file'",props:{style:{color:"#A5D6FF"}}},{content:", (",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_PATH'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"open",props:{style:{color:"#79C0FF"}}},{content:"(",props:{style:{color:"#C9D1D9"}}},{content:"'FILE_NAME'",props:{style:{color:"#A5D6FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"'rb'",props:{style:{color:"#A5D6FF"}}},{content:"), ",props:{style:{color:"#C9D1D9"}}},{content:"'application/octet-stream'",props:{style:{color:"#A5D6FF"}}},{content:"))",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"headers ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'Accept'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 3. Upload the file to Langflow",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"response ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" requests.request(",props:{style:{color:"#C9D1D9"}}},{content:'"POST"',props:{style:{color:"#A5D6FF"}}},{content:", url, ",props:{style:{color:"#C9D1D9"}}},{content:"headers",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"headers, ",props:{style:{color:"#C9D1D9"}}},{content:"data",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"payload, ",props:{style:{color:"#C9D1D9"}}},{content:"files",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"files)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(response.text)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 4. Get the uploaded file path from the response",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"uploaded_data ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" response.json()",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"uploaded_path ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" uploaded_data.get(",props:{style:{color:"#C9D1D9"}}},{content:"'path'",props:{style:{color:"#A5D6FF"}}},{content:")",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# 5. Call the Langflow run endpoint with the uploaded file path",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"run_url ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:'"http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"run_payload ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "input_value"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"CHAT_INPUT"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "output_type"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"chat"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "input_type"',props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:'"chat"',props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "tweaks"',props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "FILE_COMPONENT_ID"',props:{style:{color:"#A5D6FF"}}},{content:": {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' "path"',props:{style:{color:"#A5D6FF"}}},{content:": uploaded_path",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" }",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"run_headers ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'Content-Type'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'Accept'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'application/json'",props:{style:{color:"#A5D6FF"}}},{content:",",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" 'x-api-key'",props:{style:{color:"#A5D6FF"}}},{content:": ",props:{style:{color:"#C9D1D9"}}},{content:"'LANGFLOW_API_KEY'",props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"run_response ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" requests.post(run_url, ",props:{style:{color:"#C9D1D9"}}},{content:"headers",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"run_headers, ",props:{style:{color:"#C9D1D9"}}},{content:"data",props:{style:{color:"#FFA657"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:"json.dumps(run_payload))",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"langflow_data ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" run_response.json()",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"# Output only the message",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"message ",props:{style:{color:"#C9D1D9"}}},{content:"= ",props:{style:{color:"#FF7B72"}}},{content:"None",props:{style:{color:"#79C0FF"}}}]},{tokens:[{content:"try",props:{style:{color:"#FF7B72"}}},{content:":",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" message ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" langflow_data[",props:{style:{color:"#C9D1D9"}}},{content:"'outputs'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'outputs'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"0",props:{style:{color:"#79C0FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'results'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'message'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'data'",props:{style:{color:"#A5D6FF"}}},{content:"][",props:{style:{color:"#C9D1D9"}}},{content:"'text'",props:{style:{color:"#A5D6FF"}}},{content:"]",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"except",props:{style:{color:"#FF7B72"}}},{content:" (",props:{style:{color:"#C9D1D9"}}},{content:"KeyError",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"IndexError",props:{style:{color:"#79C0FF"}}},{content:", ",props:{style:{color:"#C9D1D9"}}},{content:"TypeError",props:{style:{color:"#79C0FF"}}},{content:"):",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" pass",props:{style:{color:"#FF7B72"}}}]},{tokens:[{content:"print",props:{style:{color:"#79C0FF"}}},{content:"(message)",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsx)(t.p,{children:"This script contains two requests."}),"\n",(0,s.jsxs)(t.p,{children:["The first request uploads a file, such as ",(0,s.jsx)(t.code,{children:"fake-resume.txt"}),", to your Langflow server at the ",(0,s.jsx)(t.code,{children:"/v2/files"})," endpoint. This request returns a file path that can be referenced in subsequent Langflow requests, such as ",(0,s.jsx)(t.code,{children:"02791d46-812f-4988-ab1c-7c430214f8d5/fake-resume.txt"})]}),"\n",(0,s.jsxs)(t.p,{children:["The second request sends a chat message to the Langflow flow at the ",(0,s.jsx)(t.code,{children:"/v1/run/"})," endpoint.\nThe ",(0,s.jsx)(t.code,{children:"tweaks"})," parameter includes the path to the uploaded file as the variable ",(0,s.jsx)(t.code,{children:"uploaded_path"}),", and sends this file directly to the ",(0,s.jsx)(t.strong,{children:"Read File"})," component."]}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Save and run the script to send the requests and test the flow."}),"\n",(0,s.jsx)(t.p,{children:"The initial output contains the JSON response object from the file upload endpoint, including the internal path where Langflow stores the file.\nThen, the LLM retrieves the file and evaluates its content, in this case the suitability of the resume for a job position."}),"\n",(0,s.jsxs)(n,{children:[(0,s.jsx)("summary",{children:"Result"}),(0,s.jsx)(t.p,{children:"The following is an example response from this tutorial's flow. Due to the nature of LLMs and variations in your inputs, your response might be different."}),(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:'{"id":"793ba3d8-5e7a-4499-8b89-d9a7b6325fee","name":"fake-resume (1)","path":"02791d46-812f-4988-ab1c-7c430214f8d5/fake-resume.txt","size":1779,"provider":null}',props:{}}]},{tokens:[{content:"The resume for Emily J. Wilson presents a strong candidate for a position in your Marketing department. Here are some key points to consider:",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"### Strengths:",props:{}}]},{tokens:[{content:"1. **Experience**: With over 8 years in marketing, Emily has held progressively responsible positions, culminating in her current role as Marketing Director. This indicates a solid foundation in the field.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"2. **Quantifiable Achievements**: The resume highlights specific accomplishments, such as a 25% increase in brand recognition and a 30% sales increase after launching new product lines. These metrics demonstrate her ability to drive results.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"3. **Diverse Skill Set**: Emily's skills encompass various aspects of marketing, including strategy development, team management, social media marketing, event planning, and data analysis. This versatility can be beneficial in a dynamic marketing environment.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"4. **Educational Background**: Her MBA and a Bachelor's degree in Marketing provide a strong academic foundation, which is often valued in marketing roles.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"5. **Certifications**: The Certified Marketing Professional (CMP) and Google Analytics Certification indicate a commitment to professional development and staying current with industry standards.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"### Areas for Improvement:",props:{}}]},{tokens:[{content:"1. **Specificity in Skills**: While the skills listed are relevant, providing examples of how she has applied these skills in her previous roles could strengthen her resume further.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"2. **References**: While stating that references are available upon request is standard, including a couple of testimonials or notable endorsements could enhance credibility.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"3. **Formatting**: Ensure that the resume is visually appealing and easy to read. Clear headings and bullet points help in quickly identifying key information.",props:{}}]},{tokens:[{content:"",props:{}}]},{tokens:[{content:"### Conclusion:",props:{}}]},{tokens:[{content:"Overall, Emily J. Wilson's resume reflects a well-rounded marketing professional with a proven track record of success. If her experience aligns with the specific needs of your Marketing department, she could be a valuable addition to your team. Consider inviting her for an interview to further assess her fit for the role.",props:{}}]}],lang:"text"},annotations:[]}]})]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsx)(t.p,{children:"To continue building on this tutorial, try these next steps."}),"\n",(0,s.jsx)(t.h3,{id:"process-multiple-files-loaded-at-runtime",children:"Process multiple files loaded at runtime"}),"\n",(0,s.jsxs)(t.p,{children:["To process multiple files in a single flow run, add a separate ",(0,s.jsx)(t.strong,{children:"Read File"})," component for each file you want to ingest. Then, modify your script to upload each file, retrieve each returned file path, and then pass a unique file path to each ",(0,s.jsx)(t.strong,{children:"Read File"})," component ID."]}),"\n",(0,s.jsxs)(t.p,{children:["For example, you can modify ",(0,s.jsx)(t.code,{children:"tweaks"})," to accept multiple ",(0,s.jsx)(t.strong,{children:"Read File"})," components.\nThe following code is just an example; it isn't working code:"]}),"\n",(0,s.jsx)(d.Code,{codeConfig:h,northPanel:{tabs:[""],active:"",heightRatio:1},files:[{name:"",focus:"",code:{lines:[{tokens:[{content:"## set multiple file paths",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:"file_paths ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" FILE_COMPONENT_1",props:{style:{color:"#79C0FF"}}},{content:": uploaded_path_1,",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" FILE_COMPONENT_2",props:{style:{color:"#79C0FF"}}},{content:": uploaded_path_2",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:"def ",props:{style:{color:"#FF7B72"}}},{content:"chat_with_flow",props:{style:{color:"#D2A8FF"}}},{content:"(input_message, file_paths):",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:' """Compare the contents of these two files."""',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" run_url ",props:{style:{color:"#C9D1D9"}}},{content:"= f",props:{style:{color:"#FF7B72"}}},{content:'"',props:{style:{color:"#A5D6FF"}}},{content:"{LANGFLOW_SERVER_ADDRESS}",props:{style:{color:"#79C0FF"}}},{content:"/api/v1/run/",props:{style:{color:"#A5D6FF"}}},{content:"{FLOW_ID}",props:{style:{color:"#79C0FF"}}},{content:'"',props:{style:{color:"#A5D6FF"}}}]},{tokens:[{content:" # Prepare tweaks with both file paths",props:{style:{color:"#8B949E"}}}]},{tokens:[{content:" tweaks ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {}",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" for",props:{style:{color:"#FF7B72"}}},{content:" component_id, file_path ",props:{style:{color:"#C9D1D9"}}},{content:"in",props:{style:{color:"#FF7B72"}}},{content:" file_paths.items():",props:{style:{color:"#C9D1D9"}}}]},{tokens:[{content:" tweaks[component_id] ",props:{style:{color:"#C9D1D9"}}},{content:"=",props:{style:{color:"#FF7B72"}}},{content:" {",props:{style:{color:"#C9D1D9"}}},{content:'"path"',props:{style:{color:"#A5D6FF"}}},{content:": file_path}",props:{style:{color:"#C9D1D9"}}}]}],lang:"python"},annotations:[]}]}),"\n",(0,s.jsxs)(t.p,{children:["You can also use a ",(0,s.jsxs)(t.a,{href:"/directory",children:[(0,s.jsx)(t.strong,{children:"Directory"})," component"]})," to load all files in a directory or pass an archive file to the ",(0,s.jsx)(t.strong,{children:"Read File"})," component."]}),"\n",(0,s.jsx)(t.h3,{id:"upload-external-files-at-runtime",children:"Upload external files at runtime"}),"\n",(0,s.jsxs)(t.p,{children:["To upload files from another machine that isn't your local environment, your Langflow server must first be accessible over the internet. Then, authenticated users can upload files to your public Langflow server's ",(0,s.jsx)(t.code,{children:"/v2/files/"})," endpoint, as shown in the tutorial. For more information, see ",(0,s.jsx)(t.a,{href:"/deployment-overview",children:"Langflow deployment overview"}),"."]}),"\n",(0,s.jsx)(t.h3,{id:"preload-files-outside-the-chat-session",children:"Preload files outside the chat session"}),"\n",(0,s.jsxs)(t.p,{children:["You can use the ",(0,s.jsx)(t.strong,{children:"Read File"})," component to load files anywhere in a flow, not just in a chat session."]}),"\n",(0,s.jsxs)(t.p,{children:["In the visual editor, you can preload files to the ",(0,s.jsx)(t.strong,{children:"Read File"})," component by selecting them from your local machine or ",(0,s.jsx)(t.a,{href:"/concepts-file-management",children:"Langflow file management"}),"."]}),"\n",(0,s.jsx)(t.p,{children:"For example, you can preload an instructions file for a prompt template, or you can preload a vector store with documents that you want to query in a Retrieval Augmented Generation (RAG) flow."}),"\n",(0,s.jsxs)(t.p,{children:["For more information about the ",(0,s.jsx)(t.strong,{children:"Read File"})," component and other data loading components, see the ",(0,s.jsxs)(t.a,{href:"/read-file",children:[(0,s.jsx)(t.strong,{children:"Read File"})," component"]}),"."]})]})}function f(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(y,{...e})}):y(e)}function D(e,t){throw new Error("Expected "+(t?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}},87481:(e,t,o)=>{o.d(t,{A:()=>n});const n=o.p+"assets/files/fake-resume-fa337cbdb18306bd29e3168f73409745.txt"}}]);
\ No newline at end of file
diff --git a/assets/js/runtime~main.b43acfc0.js b/assets/js/runtime~main.de456ad1.js
similarity index 99%
rename from assets/js/runtime~main.b43acfc0.js
rename to assets/js/runtime~main.de456ad1.js
index 9763c99c86..cb9857844c 100644
--- a/assets/js/runtime~main.b43acfc0.js
+++ b/assets/js/runtime~main.de456ad1.js
@@ -1 +1 @@
-(()=>{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return c[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=c,r.c=t,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i=b)&&Object.keys(r.O).every(e=>r.O[e](f[o]))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach(a=>c[a]=()=>e[a]);return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((a,f)=>(r.f[f](e,a),a),[])),r.u=e=>"assets/js/"+({15:"d803fa53",30:"db8c087e",38:"a99a45c9",44:"e3f369d5",78:"b768a3a5",93:"a3702f61",126:"ae70dfbf",129:"dfa3dc90",253:"bb45d4f9",351:"b9acb8d9",360:"e4dcfb14",375:"3d81f1cf",446:"a4232cf8",534:"76e36fb0",596:"c2e0ed62",598:"db4f3bbd",600:"ee87c775",676:"7631f8d2",681:"ffa0f8b1",750:"33b5ee95",879:"8bee5443",883:"1dfb8d43",889:"08b309e9",953:"bd7e5f4a",956:"03735ec1",957:"c141421f",1006:"47e58a89",1162:"f7e6b9d6",1193:"444a6da6",1303:"41d45d82",1308:"ec030ab7",1345:"fe6d5b4f",1408:"2fc7e024",1446:"c78349fc",1490:"0f761898",1567:"22dd74f7",1703:"ff8bad6c",1861:"8ad67c3b",1876:"5c3b537a",1895:"d375ca1d",1966:"b1582da4",2076:"common",2102:"755d162a",2116:"0f1bef30",2138:"1a4e3797",2272:"ca5faf5d",2278:"c4280da9",2348:"f2da9399",2360:"017d425f",2394:"c2ea283c",2423:"19bcb67f",2457:"46abd5bb",2460:"954b19af",2469:"cd086441",2472:"62f97fbe",2475:"1ab69cbd",2565:"622fd833",2651:"8cd0650d",2741:"43ad9ba4",2752:"e14655eb",2888:"32270e71",2909:"144a43f5",2969:"f0ad3fbb",2990:"1d50b418",3035:"87b7bbd6",3038:"6df123cd",3140:"1a29c454",3147:"c83c70df",3164:"67f2dc6c",3240:"b079b393",3247:"f0b67137",3263:"730da84e",3284:"6398c398",3345:"040305fb",3353:"2b4d41d7",3359:"6d032186",3361:"8f633f11",3368:"efa0f9ee",3387:"3d67876e",3468:"c76bd485",3500:"c3c63498",3536:"2eb731bc",3683:"5a0b74d9",3992:"18dc6e4d",4036:"fbcfc90d",4085:"cb17b4e0",4090:"a8ca941b",4173:"d51059db",4263:"9a5e6f6b",4314:"f6a246db",4341:"e1a0f423",4351:"13786dcf",4356:"7b864b08",4384:"622bdc6f",4474:"3db73d6f",4573:"baacc2a1",4612:"6a9eca1a",4614:"e55b8e98",4644:"d3e886ab",4876:"44691977",4907:"86116998",4919:"ce43de4b",4995:"62266e9d",5045:"f2ec4536",5048:"3c440e04",5110:"e9fe1d10",5144:"944c5f91",5200:"ff7f32ba",5217:"fb0a7a3f",5270:"99931d31",5281:"eeeaec82",5333:"70909872",5343:"1b10d5ba",5397:"eba86ea4",5412:"a6d50436",5627:"e27c2ac1",5660:"1b208f60",5663:"b1379b2b",5734:"cef46d81",5739:"69079906",5742:"aba21aa0",5757:"ad42ff54",5838:"bbb8ec1d",5903:"69d616f2",5985:"e3536031",6108:"2fed9fb3",6224:"ef9aa223",6256:"6888b60e",6311:"cce672fb",6329:"a7b545c5",6459:"290c78e6",6513:"f13693f0",6538:"719cba95",6559:"7431813e",6601:"81bb6a5c",6801:"acefda8b",6839:"80866714",6999:"d5ec984b",7098:"a7bd4aaa",7118:"7996108c",7243:"5d9d4350",7356:"2ea623f2",7484:"ad01e028",7498:"e4400415",7502:"1a547ad8",7512:"4c09a7b3",7567:"4545d55b",7705:"2b91b6ca",7720:"3bfbe7c9",7807:"1a8a0a64",7824:"2b56b65e",7829:"7c27dc91",7859:"593d9d00",7902:"619c7267",7964:"ff35961a",7968:"9b0af131",8090:"6e85978c",8240:"0102a83b",8267:"02f8077b",8268:"a4b6c971",8269:"c7f91cbe",8294:"f2bedfce",8336:"e7fd9095",8381:"147f5874",8392:"20177945",8401:"17896441",8508:"10dd1586",8571:"da1ad91e",8593:"56350599",8607:"681e5335",8611:"0c23d011",8625:"3a9e0e6c",8649:"7de42fc9",8702:"42962acd",8750:"8a484c94",8765:"1a2eaade",8786:"614cb771",8822:"555ae514",8862:"e87b52ac",8963:"56c23a02",8990:"5f1a63c6",9033:"9f55b2fc",9048:"a94703ab",9213:"62d1268c",9227:"7e40e6b3",9264:"c7f32161",9315:"16faf8bf",9331:"ffcd190c",9363:"f3312674",9459:"97254d1d",9482:"a9c1003f",9522:"85dc2a2b",9610:"453ae64a",9640:"3b25a2ae",9647:"5e95c892",9674:"feac1fba",9712:"d8c8efb9",9758:"439d880a",9763:"aece522a",9781:"b796be74",9897:"f0eeb72e",9976:"230d5fdc",9986:"d1f3cfe5"}[e]||e)+"."+{15:"d4103b44",30:"5e412f6d",38:"3a4fac77",44:"6310a01a",78:"670c02e8",93:"622a1f88",126:"b234a8d7",129:"df86eec6",253:"35cb6896",351:"2a1a8be1",360:"d17e0b29",375:"b2953002",416:"bba44855",446:"c334deef",534:"795dab19",596:"7c1db8af",598:"5b1053df",600:"2a163757",676:"d9ff9a6d",681:"26c49a71",750:"aa0a84ad",879:"a07813c0",883:"a54ab8cd",889:"df4f3b30",953:"628fe802",956:"657667b5",957:"9350e3d5",1006:"7f9a6238",1083:"38f76bcf",1162:"12f31dbe",1193:"e8a52c78",1303:"cb77a67a",1308:"19ab43fe",1345:"66bea9d5",1408:"5cdd44e5",1446:"bc1d8376",1490:"7a3af458",1567:"8327ab0e",1703:"81ffc5c2",1861:"080fa5c2",1876:"198d048f",1895:"47c5ca9a",1966:"529c371f",2076:"a147e1aa",2102:"e04c4c2c",2116:"66ba19b7",2138:"b9e35d57",2237:"6bbae924",2272:"fe4b9a67",2278:"dc2f3640",2348:"4cb98c8a",2360:"b8419a64",2394:"2541a8c1",2423:"9a704566",2457:"473c611f",2460:"2ac05431",2469:"0c7b3f7c",2472:"dc63bd2c",2475:"95e18472",2565:"10b561f1",2651:"92578320",2693:"380feae7",2741:"5b07a55d",2752:"9575b8a2",2888:"603c895a",2909:"1e643600",2969:"51e6616d",2990:"244599e4",3035:"b2adcd04",3038:"746b5104",3140:"80d4a164",3147:"80f96c59",3164:"afb9b764",3240:"759d13b9",3247:"d418a16f",3263:"3d0f082d",3284:"36307cad",3345:"5569535b",3353:"f158ad34",3359:"7ff07aa0",3361:"e6042c27",3368:"ae419940",3387:"1e3dfa97",3468:"8ce253e7",3500:"efe030c8",3536:"6c16d55f",3683:"34100144",3992:"73fbda8d",4036:"15898141",4085:"0fd46b78",4090:"62a13c39",4115:"d07268e6",4173:"cff8d83a",4263:"a16a248b",4314:"2202791a",4341:"cf603161",4351:"0d5905f3",4356:"5405f198",4384:"727a5b43",4474:"d742b4c0",4573:"04372438",4612:"195892fa",4614:"e7c5fca9",4644:"75273c72",4754:"78f469df",4876:"227e7868",4907:"5ddf17c6",4919:"e665854e",4995:"ece12ff2",5045:"cca37a20",5048:"b43aa9f1",5110:"456d4c24",5144:"d825c9b4",5200:"dff043ce",5217:"393cf74c",5270:"cd08b649",5281:"4b19c528",5333:"f53e44bc",5343:"5c5f5f29",5397:"a8e80b52",5412:"0694303a",5480:"127c0842",5627:"8aad549c",5660:"57b46a92",5663:"c98a5d9f",5734:"89eb55f3",5739:"2a563c92",5742:"8cdbe811",5757:"c7a308e1",5838:"0993f6d4",5903:"3900f4c5",5985:"bc98da4a",6108:"365e2569",6224:"b8bf79da",6256:"a846f457",6311:"690fa063",6329:"a5b86d52",6459:"2463c0f5",6513:"13baf1e4",6538:"207e3a0a",6559:"91875c22",6601:"66f73f50",6801:"6897bd64",6839:"9c7bfd1a",6990:"2d009052",6999:"64627d58",7098:"e566890f",7118:"204687e4",7243:"930b5bd6",7356:"dc4b5e2f",7484:"87f5d367",7498:"bc1d0911",7502:"f4acd00b",7512:"33f7eed4",7567:"eddb6d25",7705:"16858a84",7720:"24a92496",7807:"9ed7d10f",7824:"48ec5133",7829:"5bfdb1e8",7859:"acd80658",7902:"b293db8d",7964:"b889e714",7968:"8658e795",8090:"3e91a2e5",8240:"d4f52412",8267:"53fed409",8268:"7ed10065",8269:"c3b18741",8287:"7f586667",8294:"e344768e",8336:"4c5df02d",8381:"cdc18a0f",8392:"32fde553",8401:"9b189e06",8508:"e9d8e178",8571:"e11e0da7",8593:"e0584060",8607:"3c24e2c5",8611:"03e3ae2a",8625:"d22660bd",8649:"540f0784",8702:"046f5c3a",8750:"56e811df",8765:"c381c5fb",8786:"f1e32c3e",8822:"77921987",8862:"2272a76a",8913:"fd271a57",8963:"66693d3f",8990:"9bb3ef07",9033:"11737f6f",9048:"fbe061ed",9213:"7dd93294",9227:"a58d07fa",9264:"924f1a5d",9315:"167ce0df",9331:"b33d24ee",9363:"66313398",9459:"bcd99a3a",9482:"d79e999d",9522:"9a97e8c5",9610:"1ecfdc0a",9640:"8da65214",9647:"a3e58221",9674:"078d3e13",9712:"f5eaa1ca",9758:"5f1367ed",9763:"8017d111",9781:"c9db232c",9897:"cb0ce060",9976:"32ddde62",9986:"87289072"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},b="langflow-docs:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach(e=>e(f)),a)return a(f)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={17896441:"8401",20177945:"8392",44691977:"4876",56350599:"8593",69079906:"5739",70909872:"5333",80866714:"6839",86116998:"4907",d803fa53:"15",db8c087e:"30",a99a45c9:"38",e3f369d5:"44",b768a3a5:"78",a3702f61:"93",ae70dfbf:"126",dfa3dc90:"129",bb45d4f9:"253",b9acb8d9:"351",e4dcfb14:"360","3d81f1cf":"375",a4232cf8:"446","76e36fb0":"534",c2e0ed62:"596",db4f3bbd:"598",ee87c775:"600","7631f8d2":"676",ffa0f8b1:"681","33b5ee95":"750","8bee5443":"879","1dfb8d43":"883","08b309e9":"889",bd7e5f4a:"953","03735ec1":"956",c141421f:"957","47e58a89":"1006",f7e6b9d6:"1162","444a6da6":"1193","41d45d82":"1303",ec030ab7:"1308",fe6d5b4f:"1345","2fc7e024":"1408",c78349fc:"1446","0f761898":"1490","22dd74f7":"1567",ff8bad6c:"1703","8ad67c3b":"1861","5c3b537a":"1876",d375ca1d:"1895",b1582da4:"1966",common:"2076","755d162a":"2102","0f1bef30":"2116","1a4e3797":"2138",ca5faf5d:"2272",c4280da9:"2278",f2da9399:"2348","017d425f":"2360",c2ea283c:"2394","19bcb67f":"2423","46abd5bb":"2457","954b19af":"2460",cd086441:"2469","62f97fbe":"2472","1ab69cbd":"2475","622fd833":"2565","8cd0650d":"2651","43ad9ba4":"2741",e14655eb:"2752","32270e71":"2888","144a43f5":"2909",f0ad3fbb:"2969","1d50b418":"2990","87b7bbd6":"3035","6df123cd":"3038","1a29c454":"3140",c83c70df:"3147","67f2dc6c":"3164",b079b393:"3240",f0b67137:"3247","730da84e":"3263","6398c398":"3284","040305fb":"3345","2b4d41d7":"3353","6d032186":"3359","8f633f11":"3361",efa0f9ee:"3368","3d67876e":"3387",c76bd485:"3468",c3c63498:"3500","2eb731bc":"3536","5a0b74d9":"3683","18dc6e4d":"3992",fbcfc90d:"4036",cb17b4e0:"4085",a8ca941b:"4090",d51059db:"4173","9a5e6f6b":"4263",f6a246db:"4314",e1a0f423:"4341","13786dcf":"4351","7b864b08":"4356","622bdc6f":"4384","3db73d6f":"4474",baacc2a1:"4573","6a9eca1a":"4612",e55b8e98:"4614",d3e886ab:"4644",ce43de4b:"4919","62266e9d":"4995",f2ec4536:"5045","3c440e04":"5048",e9fe1d10:"5110","944c5f91":"5144",ff7f32ba:"5200",fb0a7a3f:"5217","99931d31":"5270",eeeaec82:"5281","1b10d5ba":"5343",eba86ea4:"5397",a6d50436:"5412",e27c2ac1:"5627","1b208f60":"5660",b1379b2b:"5663",cef46d81:"5734",aba21aa0:"5742",ad42ff54:"5757",bbb8ec1d:"5838","69d616f2":"5903",e3536031:"5985","2fed9fb3":"6108",ef9aa223:"6224","6888b60e":"6256",cce672fb:"6311",a7b545c5:"6329","290c78e6":"6459",f13693f0:"6513","719cba95":"6538","7431813e":"6559","81bb6a5c":"6601",acefda8b:"6801",d5ec984b:"6999",a7bd4aaa:"7098","7996108c":"7118","5d9d4350":"7243","2ea623f2":"7356",ad01e028:"7484",e4400415:"7498","1a547ad8":"7502","4c09a7b3":"7512","4545d55b":"7567","2b91b6ca":"7705","3bfbe7c9":"7720","1a8a0a64":"7807","2b56b65e":"7824","7c27dc91":"7829","593d9d00":"7859","619c7267":"7902",ff35961a:"7964","9b0af131":"7968","6e85978c":"8090","0102a83b":"8240","02f8077b":"8267",a4b6c971:"8268",c7f91cbe:"8269",f2bedfce:"8294",e7fd9095:"8336","147f5874":"8381","10dd1586":"8508",da1ad91e:"8571","681e5335":"8607","0c23d011":"8611","3a9e0e6c":"8625","7de42fc9":"8649","42962acd":"8702","8a484c94":"8750","1a2eaade":"8765","614cb771":"8786","555ae514":"8822",e87b52ac:"8862","56c23a02":"8963","5f1a63c6":"8990","9f55b2fc":"9033",a94703ab:"9048","62d1268c":"9213","7e40e6b3":"9227",c7f32161:"9264","16faf8bf":"9315",ffcd190c:"9331",f3312674:"9363","97254d1d":"9459",a9c1003f:"9482","85dc2a2b":"9522","453ae64a":"9610","3b25a2ae":"9640","5e95c892":"9647",feac1fba:"9674",d8c8efb9:"9712","439d880a":"9758",aece522a:"9763",b796be74:"9781",f0eeb72e:"9897","230d5fdc":"9976",d1f3cfe5:"9986"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var b=new Promise((f,b)=>d=e[a]=[f,b]);f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}},"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,[c,t,o]=f,n=0;if(c.some(a=>0!==e[a])){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n{"use strict";var e,a,f,d,b,c={},t={};function r(e){var a=t[e];if(void 0!==a)return a.exports;var f=t[e]={id:e,loaded:!1,exports:{}};return c[e].call(f.exports,f,f.exports,r),f.loaded=!0,f.exports}r.m=c,r.c=t,e=[],r.O=(a,f,d,b)=>{if(!f){var c=1/0;for(i=0;i=b)&&Object.keys(r.O).every(e=>r.O[e](f[o]))?f.splice(o--,1):(t=!1,b0&&e[i-1][2]>b;i--)e[i]=e[i-1];e[i]=[f,d,b]},r.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return r.d(a,{a:a}),a},f=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,d){if(1&d&&(e=this(e)),8&d)return e;if("object"==typeof e&&e){if(4&d&&e.__esModule)return e;if(16&d&&"function"==typeof e.then)return e}var b=Object.create(null);r.r(b);var c={};a=a||[null,f({}),f([]),f(f)];for(var t=2&d&&e;"object"==typeof t&&!~a.indexOf(t);t=f(t))Object.getOwnPropertyNames(t).forEach(a=>c[a]=()=>e[a]);return c.default=()=>e,r.d(b,c),b},r.d=(e,a)=>{for(var f in a)r.o(a,f)&&!r.o(e,f)&&Object.defineProperty(e,f,{enumerable:!0,get:a[f]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((a,f)=>(r.f[f](e,a),a),[])),r.u=e=>"assets/js/"+({15:"d803fa53",30:"db8c087e",38:"a99a45c9",44:"e3f369d5",78:"b768a3a5",93:"a3702f61",126:"ae70dfbf",129:"dfa3dc90",253:"bb45d4f9",351:"b9acb8d9",360:"e4dcfb14",375:"3d81f1cf",446:"a4232cf8",534:"76e36fb0",596:"c2e0ed62",598:"db4f3bbd",600:"ee87c775",676:"7631f8d2",681:"ffa0f8b1",750:"33b5ee95",879:"8bee5443",883:"1dfb8d43",889:"08b309e9",953:"bd7e5f4a",956:"03735ec1",957:"c141421f",1006:"47e58a89",1162:"f7e6b9d6",1193:"444a6da6",1303:"41d45d82",1308:"ec030ab7",1345:"fe6d5b4f",1408:"2fc7e024",1446:"c78349fc",1490:"0f761898",1567:"22dd74f7",1703:"ff8bad6c",1861:"8ad67c3b",1876:"5c3b537a",1895:"d375ca1d",1966:"b1582da4",2076:"common",2102:"755d162a",2116:"0f1bef30",2138:"1a4e3797",2272:"ca5faf5d",2278:"c4280da9",2348:"f2da9399",2360:"017d425f",2394:"c2ea283c",2423:"19bcb67f",2457:"46abd5bb",2460:"954b19af",2469:"cd086441",2472:"62f97fbe",2475:"1ab69cbd",2565:"622fd833",2651:"8cd0650d",2741:"43ad9ba4",2752:"e14655eb",2888:"32270e71",2909:"144a43f5",2969:"f0ad3fbb",2990:"1d50b418",3035:"87b7bbd6",3038:"6df123cd",3140:"1a29c454",3147:"c83c70df",3164:"67f2dc6c",3240:"b079b393",3247:"f0b67137",3263:"730da84e",3284:"6398c398",3345:"040305fb",3353:"2b4d41d7",3359:"6d032186",3361:"8f633f11",3368:"efa0f9ee",3387:"3d67876e",3468:"c76bd485",3500:"c3c63498",3536:"2eb731bc",3683:"5a0b74d9",3992:"18dc6e4d",4036:"fbcfc90d",4085:"cb17b4e0",4090:"a8ca941b",4173:"d51059db",4263:"9a5e6f6b",4314:"f6a246db",4341:"e1a0f423",4351:"13786dcf",4356:"7b864b08",4384:"622bdc6f",4474:"3db73d6f",4573:"baacc2a1",4612:"6a9eca1a",4614:"e55b8e98",4644:"d3e886ab",4876:"44691977",4907:"86116998",4919:"ce43de4b",4995:"62266e9d",5045:"f2ec4536",5048:"3c440e04",5110:"e9fe1d10",5144:"944c5f91",5200:"ff7f32ba",5217:"fb0a7a3f",5270:"99931d31",5281:"eeeaec82",5333:"70909872",5343:"1b10d5ba",5397:"eba86ea4",5412:"a6d50436",5627:"e27c2ac1",5660:"1b208f60",5663:"b1379b2b",5734:"cef46d81",5739:"69079906",5742:"aba21aa0",5757:"ad42ff54",5838:"bbb8ec1d",5903:"69d616f2",5985:"e3536031",6108:"2fed9fb3",6224:"ef9aa223",6256:"6888b60e",6311:"cce672fb",6329:"a7b545c5",6459:"290c78e6",6513:"f13693f0",6538:"719cba95",6559:"7431813e",6601:"81bb6a5c",6801:"acefda8b",6839:"80866714",6999:"d5ec984b",7098:"a7bd4aaa",7118:"7996108c",7243:"5d9d4350",7356:"2ea623f2",7484:"ad01e028",7498:"e4400415",7502:"1a547ad8",7512:"4c09a7b3",7567:"4545d55b",7705:"2b91b6ca",7720:"3bfbe7c9",7807:"1a8a0a64",7824:"2b56b65e",7829:"7c27dc91",7859:"593d9d00",7902:"619c7267",7964:"ff35961a",7968:"9b0af131",8090:"6e85978c",8240:"0102a83b",8267:"02f8077b",8268:"a4b6c971",8269:"c7f91cbe",8294:"f2bedfce",8336:"e7fd9095",8381:"147f5874",8392:"20177945",8401:"17896441",8508:"10dd1586",8571:"da1ad91e",8593:"56350599",8607:"681e5335",8611:"0c23d011",8625:"3a9e0e6c",8649:"7de42fc9",8702:"42962acd",8750:"8a484c94",8765:"1a2eaade",8786:"614cb771",8822:"555ae514",8862:"e87b52ac",8963:"56c23a02",8990:"5f1a63c6",9033:"9f55b2fc",9048:"a94703ab",9213:"62d1268c",9227:"7e40e6b3",9264:"c7f32161",9315:"16faf8bf",9331:"ffcd190c",9363:"f3312674",9459:"97254d1d",9482:"a9c1003f",9522:"85dc2a2b",9610:"453ae64a",9640:"3b25a2ae",9647:"5e95c892",9674:"feac1fba",9712:"d8c8efb9",9758:"439d880a",9763:"aece522a",9781:"b796be74",9897:"f0eeb72e",9976:"230d5fdc",9986:"d1f3cfe5"}[e]||e)+"."+{15:"d4103b44",30:"5e412f6d",38:"3a4fac77",44:"6310a01a",78:"670c02e8",93:"622a1f88",126:"b234a8d7",129:"df86eec6",253:"35cb6896",351:"2a1a8be1",360:"d17e0b29",375:"b2953002",416:"bba44855",446:"c334deef",534:"795dab19",596:"7c1db8af",598:"5b1053df",600:"2a163757",676:"d9ff9a6d",681:"26c49a71",750:"aa0a84ad",879:"a07813c0",883:"a54ab8cd",889:"df4f3b30",953:"628fe802",956:"657667b5",957:"9350e3d5",1006:"7f9a6238",1083:"38f76bcf",1162:"12f31dbe",1193:"e8a52c78",1303:"cb77a67a",1308:"19ab43fe",1345:"66bea9d5",1408:"88a7766e",1446:"bc1d8376",1490:"7a3af458",1567:"8327ab0e",1703:"81ffc5c2",1861:"080fa5c2",1876:"198d048f",1895:"47c5ca9a",1966:"529c371f",2076:"a147e1aa",2102:"e04c4c2c",2116:"66ba19b7",2138:"b9e35d57",2237:"6bbae924",2272:"fe4b9a67",2278:"dc2f3640",2348:"4cb98c8a",2360:"b8419a64",2394:"2541a8c1",2423:"9a704566",2457:"473c611f",2460:"2ac05431",2469:"0c7b3f7c",2472:"dc63bd2c",2475:"95e18472",2565:"10b561f1",2651:"92578320",2693:"380feae7",2741:"5b07a55d",2752:"9575b8a2",2888:"603c895a",2909:"1e643600",2969:"51e6616d",2990:"244599e4",3035:"b2adcd04",3038:"746b5104",3140:"80d4a164",3147:"80f96c59",3164:"afb9b764",3240:"759d13b9",3247:"d418a16f",3263:"3d0f082d",3284:"36307cad",3345:"5569535b",3353:"f158ad34",3359:"7ff07aa0",3361:"e6042c27",3368:"ae419940",3387:"1e3dfa97",3468:"8ce253e7",3500:"efe030c8",3536:"6c16d55f",3683:"34100144",3992:"73fbda8d",4036:"15898141",4085:"0fd46b78",4090:"62a13c39",4115:"d07268e6",4173:"cff8d83a",4263:"a16a248b",4314:"2202791a",4341:"cf603161",4351:"0d5905f3",4356:"5405f198",4384:"727a5b43",4474:"d742b4c0",4573:"04372438",4612:"195892fa",4614:"e7c5fca9",4644:"75273c72",4754:"78f469df",4876:"227e7868",4907:"5ddf17c6",4919:"e665854e",4995:"ece12ff2",5045:"cca37a20",5048:"b43aa9f1",5110:"456d4c24",5144:"d825c9b4",5200:"dff043ce",5217:"393cf74c",5270:"cd08b649",5281:"4b19c528",5333:"f53e44bc",5343:"5c5f5f29",5397:"a8e80b52",5412:"0694303a",5480:"127c0842",5627:"8aad549c",5660:"57b46a92",5663:"c98a5d9f",5734:"89eb55f3",5739:"2a563c92",5742:"8cdbe811",5757:"c7a308e1",5838:"0993f6d4",5903:"3900f4c5",5985:"bc98da4a",6108:"365e2569",6224:"b8bf79da",6256:"a846f457",6311:"690fa063",6329:"a5b86d52",6459:"2463c0f5",6513:"13baf1e4",6538:"207e3a0a",6559:"91875c22",6601:"66f73f50",6801:"6897bd64",6839:"9c7bfd1a",6990:"2d009052",6999:"64627d58",7098:"e566890f",7118:"204687e4",7243:"930b5bd6",7356:"dc4b5e2f",7484:"87f5d367",7498:"bc1d0911",7502:"f4acd00b",7512:"33f7eed4",7567:"eddb6d25",7705:"16858a84",7720:"24a92496",7807:"9ed7d10f",7824:"20952bb6",7829:"5bfdb1e8",7859:"acd80658",7902:"b293db8d",7964:"b889e714",7968:"8658e795",8090:"3e91a2e5",8240:"d4f52412",8267:"53fed409",8268:"7ed10065",8269:"c3b18741",8287:"7f586667",8294:"e344768e",8336:"4c5df02d",8381:"cdc18a0f",8392:"32fde553",8401:"9b189e06",8508:"e9d8e178",8571:"e11e0da7",8593:"e0584060",8607:"3c24e2c5",8611:"03e3ae2a",8625:"d22660bd",8649:"540f0784",8702:"046f5c3a",8750:"56e811df",8765:"c381c5fb",8786:"f1e32c3e",8822:"77921987",8862:"2272a76a",8913:"fd271a57",8963:"66693d3f",8990:"9bb3ef07",9033:"11737f6f",9048:"fbe061ed",9213:"7dd93294",9227:"a58d07fa",9264:"924f1a5d",9315:"167ce0df",9331:"b33d24ee",9363:"66313398",9459:"bcd99a3a",9482:"d79e999d",9522:"9a97e8c5",9610:"1ecfdc0a",9640:"8da65214",9647:"a3e58221",9674:"078d3e13",9712:"f5eaa1ca",9758:"5f1367ed",9763:"8017d111",9781:"c9db232c",9897:"cb0ce060",9976:"32ddde62",9986:"87289072"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),d={},b="langflow-docs:",r.l=(e,a,f,c)=>{if(d[e])d[e].push(a);else{var t,o;if(void 0!==f)for(var n=document.getElementsByTagName("script"),i=0;i{t.onerror=t.onload=null,clearTimeout(s);var b=d[e];if(delete d[e],t.parentNode&&t.parentNode.removeChild(t),b&&b.forEach(e=>e(f)),a)return a(f)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=u.bind(null,t.onerror),t.onload=u.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),r.p="/",r.gca=function(e){return e={17896441:"8401",20177945:"8392",44691977:"4876",56350599:"8593",69079906:"5739",70909872:"5333",80866714:"6839",86116998:"4907",d803fa53:"15",db8c087e:"30",a99a45c9:"38",e3f369d5:"44",b768a3a5:"78",a3702f61:"93",ae70dfbf:"126",dfa3dc90:"129",bb45d4f9:"253",b9acb8d9:"351",e4dcfb14:"360","3d81f1cf":"375",a4232cf8:"446","76e36fb0":"534",c2e0ed62:"596",db4f3bbd:"598",ee87c775:"600","7631f8d2":"676",ffa0f8b1:"681","33b5ee95":"750","8bee5443":"879","1dfb8d43":"883","08b309e9":"889",bd7e5f4a:"953","03735ec1":"956",c141421f:"957","47e58a89":"1006",f7e6b9d6:"1162","444a6da6":"1193","41d45d82":"1303",ec030ab7:"1308",fe6d5b4f:"1345","2fc7e024":"1408",c78349fc:"1446","0f761898":"1490","22dd74f7":"1567",ff8bad6c:"1703","8ad67c3b":"1861","5c3b537a":"1876",d375ca1d:"1895",b1582da4:"1966",common:"2076","755d162a":"2102","0f1bef30":"2116","1a4e3797":"2138",ca5faf5d:"2272",c4280da9:"2278",f2da9399:"2348","017d425f":"2360",c2ea283c:"2394","19bcb67f":"2423","46abd5bb":"2457","954b19af":"2460",cd086441:"2469","62f97fbe":"2472","1ab69cbd":"2475","622fd833":"2565","8cd0650d":"2651","43ad9ba4":"2741",e14655eb:"2752","32270e71":"2888","144a43f5":"2909",f0ad3fbb:"2969","1d50b418":"2990","87b7bbd6":"3035","6df123cd":"3038","1a29c454":"3140",c83c70df:"3147","67f2dc6c":"3164",b079b393:"3240",f0b67137:"3247","730da84e":"3263","6398c398":"3284","040305fb":"3345","2b4d41d7":"3353","6d032186":"3359","8f633f11":"3361",efa0f9ee:"3368","3d67876e":"3387",c76bd485:"3468",c3c63498:"3500","2eb731bc":"3536","5a0b74d9":"3683","18dc6e4d":"3992",fbcfc90d:"4036",cb17b4e0:"4085",a8ca941b:"4090",d51059db:"4173","9a5e6f6b":"4263",f6a246db:"4314",e1a0f423:"4341","13786dcf":"4351","7b864b08":"4356","622bdc6f":"4384","3db73d6f":"4474",baacc2a1:"4573","6a9eca1a":"4612",e55b8e98:"4614",d3e886ab:"4644",ce43de4b:"4919","62266e9d":"4995",f2ec4536:"5045","3c440e04":"5048",e9fe1d10:"5110","944c5f91":"5144",ff7f32ba:"5200",fb0a7a3f:"5217","99931d31":"5270",eeeaec82:"5281","1b10d5ba":"5343",eba86ea4:"5397",a6d50436:"5412",e27c2ac1:"5627","1b208f60":"5660",b1379b2b:"5663",cef46d81:"5734",aba21aa0:"5742",ad42ff54:"5757",bbb8ec1d:"5838","69d616f2":"5903",e3536031:"5985","2fed9fb3":"6108",ef9aa223:"6224","6888b60e":"6256",cce672fb:"6311",a7b545c5:"6329","290c78e6":"6459",f13693f0:"6513","719cba95":"6538","7431813e":"6559","81bb6a5c":"6601",acefda8b:"6801",d5ec984b:"6999",a7bd4aaa:"7098","7996108c":"7118","5d9d4350":"7243","2ea623f2":"7356",ad01e028:"7484",e4400415:"7498","1a547ad8":"7502","4c09a7b3":"7512","4545d55b":"7567","2b91b6ca":"7705","3bfbe7c9":"7720","1a8a0a64":"7807","2b56b65e":"7824","7c27dc91":"7829","593d9d00":"7859","619c7267":"7902",ff35961a:"7964","9b0af131":"7968","6e85978c":"8090","0102a83b":"8240","02f8077b":"8267",a4b6c971:"8268",c7f91cbe:"8269",f2bedfce:"8294",e7fd9095:"8336","147f5874":"8381","10dd1586":"8508",da1ad91e:"8571","681e5335":"8607","0c23d011":"8611","3a9e0e6c":"8625","7de42fc9":"8649","42962acd":"8702","8a484c94":"8750","1a2eaade":"8765","614cb771":"8786","555ae514":"8822",e87b52ac:"8862","56c23a02":"8963","5f1a63c6":"8990","9f55b2fc":"9033",a94703ab:"9048","62d1268c":"9213","7e40e6b3":"9227",c7f32161:"9264","16faf8bf":"9315",ffcd190c:"9331",f3312674:"9363","97254d1d":"9459",a9c1003f:"9482","85dc2a2b":"9522","453ae64a":"9610","3b25a2ae":"9640","5e95c892":"9647",feac1fba:"9674",d8c8efb9:"9712","439d880a":"9758",aece522a:"9763",b796be74:"9781",f0eeb72e:"9897","230d5fdc":"9976",d1f3cfe5:"9986"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(a,f)=>{var d=r.o(e,a)?e[a]:void 0;if(0!==d)if(d)f.push(d[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var b=new Promise((f,b)=>d=e[a]=[f,b]);f.push(d[2]=b);var c=r.p+r.u(a),t=new Error;r.l(c,f=>{if(r.o(e,a)&&(0!==(d=e[a])&&(e[a]=void 0),d)){var b=f&&("load"===f.type?"missing":f.type),c=f&&f.target&&f.target.src;t.message="Loading chunk "+a+" failed.\n("+b+": "+c+")",t.name="ChunkLoadError",t.type=b,t.request=c,d[1](t)}},"chunk-"+a,a)}},r.O.j=a=>0===e[a];var a=(a,f)=>{var d,b,[c,t,o]=f,n=0;if(c.some(a=>0!==e[a])){for(d in t)r.o(t,d)&&(r.m[d]=t[d]);if(o)var i=o(r)}for(a&&a(f);n
-
+
diff --git a/bundles-agentics.html b/bundles-agentics.html
index 25b792072c..59fb7fb373 100644
--- a/bundles-agentics.html
+++ b/bundles-agentics.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-aiml.html b/bundles-aiml.html
index e7807fd561..f86c51ae66 100644
--- a/bundles-aiml.html
+++ b/bundles-aiml.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-altk.html b/bundles-altk.html
index cedc7a71a8..8600d2fbca 100644
--- a/bundles-altk.html
+++ b/bundles-altk.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-amazon.html b/bundles-amazon.html
index 3b53af1aba..e47c05fe27 100644
--- a/bundles-amazon.html
+++ b/bundles-amazon.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-anthropic.html b/bundles-anthropic.html
index f97ad08d66..3eba56f382 100644
--- a/bundles-anthropic.html
+++ b/bundles-anthropic.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-apify.html b/bundles-apify.html
index 0d5eccf054..d54017fae5 100644
--- a/bundles-apify.html
+++ b/bundles-apify.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-arxiv.html b/bundles-arxiv.html
index 897d58bf25..9a36b6b473 100644
--- a/bundles-arxiv.html
+++ b/bundles-arxiv.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-assemblyai.html b/bundles-assemblyai.html
index 55b8f1084a..34f4feab88 100644
--- a/bundles-assemblyai.html
+++ b/bundles-assemblyai.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-azure.html b/bundles-azure.html
index ae3604b615..0afc4a98a3 100644
--- a/bundles-azure.html
+++ b/bundles-azure.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-baidu.html b/bundles-baidu.html
index f4196bf9bc..49d0f0c9bd 100644
--- a/bundles-baidu.html
+++ b/bundles-baidu.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-bing.html b/bundles-bing.html
index 320e258b33..2605469823 100644
--- a/bundles-bing.html
+++ b/bundles-bing.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-cassandra.html b/bundles-cassandra.html
index 12446fbbf1..441a4bf061 100644
--- a/bundles-cassandra.html
+++ b/bundles-cassandra.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-chroma.html b/bundles-chroma.html
index 795f90c008..6f17d9d8fc 100644
--- a/bundles-chroma.html
+++ b/bundles-chroma.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-cleanlab.html b/bundles-cleanlab.html
index e6b48a64d7..14fb5dbf34 100644
--- a/bundles-cleanlab.html
+++ b/bundles-cleanlab.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-clickhouse.html b/bundles-clickhouse.html
index bbb412afa9..07c20a94b5 100644
--- a/bundles-clickhouse.html
+++ b/bundles-clickhouse.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-cloudflare.html b/bundles-cloudflare.html
index ddcf1ddafc..f174a0f7c2 100644
--- a/bundles-cloudflare.html
+++ b/bundles-cloudflare.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-cohere.html b/bundles-cohere.html
index fa4a2f7f23..16b5f45796 100644
--- a/bundles-cohere.html
+++ b/bundles-cohere.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-cometapi.html b/bundles-cometapi.html
index dc91c317d5..9ca2cb393f 100644
--- a/bundles-cometapi.html
+++ b/bundles-cometapi.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-composio.html b/bundles-composio.html
index d43febd49c..1b083bb9bf 100644
--- a/bundles-composio.html
+++ b/bundles-composio.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-couchbase.html b/bundles-couchbase.html
index 7fbdd4a7fa..0e76db384a 100644
--- a/bundles-couchbase.html
+++ b/bundles-couchbase.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-cuga.html b/bundles-cuga.html
index 958c631062..51337dd085 100644
--- a/bundles-cuga.html
+++ b/bundles-cuga.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-datastax.html b/bundles-datastax.html
index 8d76e82a4b..4a311839ce 100644
--- a/bundles-datastax.html
+++ b/bundles-datastax.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-deepseek.html b/bundles-deepseek.html
index e49bb7d59f..868016b6c5 100644
--- a/bundles-deepseek.html
+++ b/bundles-deepseek.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-docling.html b/bundles-docling.html
index 5f43691f3d..98f7b9944a 100644
--- a/bundles-docling.html
+++ b/bundles-docling.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-duckduckgo.html b/bundles-duckduckgo.html
index 1d6dbac502..8b0ab914ed 100644
--- a/bundles-duckduckgo.html
+++ b/bundles-duckduckgo.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-elastic.html b/bundles-elastic.html
index 9ec1aeadbb..f5ecd10cdd 100644
--- a/bundles-elastic.html
+++ b/bundles-elastic.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-exa.html b/bundles-exa.html
index d935d32599..d1d2621d8c 100644
--- a/bundles-exa.html
+++ b/bundles-exa.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-faiss.html b/bundles-faiss.html
index 901000cd80..081e970af2 100644
--- a/bundles-faiss.html
+++ b/bundles-faiss.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-glean.html b/bundles-glean.html
index 1ac00c380e..6ed8c23d0f 100644
--- a/bundles-glean.html
+++ b/bundles-glean.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-google.html b/bundles-google.html
index d96b1c8d8c..b4d052e68e 100644
--- a/bundles-google.html
+++ b/bundles-google.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-groq.html b/bundles-groq.html
index 9f6775c4c7..08e03d321d 100644
--- a/bundles-groq.html
+++ b/bundles-groq.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-huggingface.html b/bundles-huggingface.html
index 06225f3c71..26d3e01d77 100644
--- a/bundles-huggingface.html
+++ b/bundles-huggingface.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-ibm.html b/bundles-ibm.html
index 6cf406ade6..31d475d84a 100644
--- a/bundles-ibm.html
+++ b/bundles-ibm.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-icosacomputing.html b/bundles-icosacomputing.html
index 55190fb9f9..02ee14b19f 100644
--- a/bundles-icosacomputing.html
+++ b/bundles-icosacomputing.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-langchain.html b/bundles-langchain.html
index 680d944ff9..9b50e600b8 100644
--- a/bundles-langchain.html
+++ b/bundles-langchain.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-lite-llm.html b/bundles-lite-llm.html
index 51f36c129f..080b16a113 100644
--- a/bundles-lite-llm.html
+++ b/bundles-lite-llm.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-lmstudio.html b/bundles-lmstudio.html
index 33e0f8e05c..66a6b9848c 100644
--- a/bundles-lmstudio.html
+++ b/bundles-lmstudio.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-maritalk.html b/bundles-maritalk.html
index 5698c661b6..1736f60e02 100644
--- a/bundles-maritalk.html
+++ b/bundles-maritalk.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-mem0.html b/bundles-mem0.html
index f4f435305d..a412991c6e 100644
--- a/bundles-mem0.html
+++ b/bundles-mem0.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-milvus.html b/bundles-milvus.html
index cf67cd159e..77c46e5da8 100644
--- a/bundles-milvus.html
+++ b/bundles-milvus.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-mistralai.html b/bundles-mistralai.html
index 1264286fd4..c7e933356c 100644
--- a/bundles-mistralai.html
+++ b/bundles-mistralai.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-mongodb.html b/bundles-mongodb.html
index 63b68c433b..00c888c2c5 100644
--- a/bundles-mongodb.html
+++ b/bundles-mongodb.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-notion.html b/bundles-notion.html
index d7689ca258..a908e4e895 100644
--- a/bundles-notion.html
+++ b/bundles-notion.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-novita.html b/bundles-novita.html
index ee966cc63b..e7e8d106a1 100644
--- a/bundles-novita.html
+++ b/bundles-novita.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-nvidia.html b/bundles-nvidia.html
index 64319bc78a..d1ea4f1056 100644
--- a/bundles-nvidia.html
+++ b/bundles-nvidia.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-ollama.html b/bundles-ollama.html
index 90ed718d73..9910874add 100644
--- a/bundles-ollama.html
+++ b/bundles-ollama.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-openai.html b/bundles-openai.html
index 963f5bae49..8763b6cd50 100644
--- a/bundles-openai.html
+++ b/bundles-openai.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-openrouter.html b/bundles-openrouter.html
index 5baddc455c..3096321153 100644
--- a/bundles-openrouter.html
+++ b/bundles-openrouter.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-perplexity.html b/bundles-perplexity.html
index e2c59736e8..85d9d27573 100644
--- a/bundles-perplexity.html
+++ b/bundles-perplexity.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-pgvector.html b/bundles-pgvector.html
index 1fcd2a440f..cd2d3f677b 100644
--- a/bundles-pgvector.html
+++ b/bundles-pgvector.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-pinecone.html b/bundles-pinecone.html
index f372491fbb..a3a4f9c26b 100644
--- a/bundles-pinecone.html
+++ b/bundles-pinecone.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-qdrant.html b/bundles-qdrant.html
index 6673cb9e3a..f8c01a7cf3 100644
--- a/bundles-qdrant.html
+++ b/bundles-qdrant.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-redis.html b/bundles-redis.html
index c583744ffe..4df3975c7e 100644
--- a/bundles-redis.html
+++ b/bundles-redis.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-sambanova.html b/bundles-sambanova.html
index 96679a1e50..d16009b514 100644
--- a/bundles-sambanova.html
+++ b/bundles-sambanova.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-searchapi.html b/bundles-searchapi.html
index b2b59b57ae..1109fed61c 100644
--- a/bundles-searchapi.html
+++ b/bundles-searchapi.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-serper.html b/bundles-serper.html
index 50f1b290d1..b8fc9a7681 100644
--- a/bundles-serper.html
+++ b/bundles-serper.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-supabase.html b/bundles-supabase.html
index 0e37680f29..940b793cf8 100644
--- a/bundles-supabase.html
+++ b/bundles-supabase.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-upstash.html b/bundles-upstash.html
index c43e9d0283..0161583018 100644
--- a/bundles-upstash.html
+++ b/bundles-upstash.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-vectara.html b/bundles-vectara.html
index 2fdf8c3ee1..8614b68398 100644
--- a/bundles-vectara.html
+++ b/bundles-vectara.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-vertexai.html b/bundles-vertexai.html
index eada4950bb..041d373794 100644
--- a/bundles-vertexai.html
+++ b/bundles-vertexai.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-vllm.html b/bundles-vllm.html
index 02d63730e0..33b23a43eb 100644
--- a/bundles-vllm.html
+++ b/bundles-vllm.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-weaviate.html b/bundles-weaviate.html
index e9ab2ee8a0..bc241dd585 100644
--- a/bundles-weaviate.html
+++ b/bundles-weaviate.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-wikipedia.html b/bundles-wikipedia.html
index 0c56d1b724..96dd73e937 100644
--- a/bundles-wikipedia.html
+++ b/bundles-wikipedia.html
@@ -25,7 +25,7 @@
-
+
diff --git a/bundles-xai.html b/bundles-xai.html
index 9acc575b23..c90e8937f5 100644
--- a/bundles-xai.html
+++ b/bundles-xai.html
@@ -25,7 +25,7 @@
-
+
diff --git a/calculator.html b/calculator.html
index 35217fea34..3813ef498b 100644
--- a/calculator.html
+++ b/calculator.html
@@ -25,7 +25,7 @@
-
+
diff --git a/chat-input-and-output.html b/chat-input-and-output.html
index dc014a3f39..55061cc49b 100644
--- a/chat-input-and-output.html
+++ b/chat-input-and-output.html
@@ -25,7 +25,7 @@
-
+
diff --git a/chat-with-files.html b/chat-with-files.html
index f98cbca5c1..12c54449d0 100644
--- a/chat-with-files.html
+++ b/chat-with-files.html
@@ -25,7 +25,7 @@
-
+
@@ -97,7 +97,7 @@ To connect ports, click and drag from one port to the other.
The result includes the outcome of the flow run and the LLM's response.
This example uses a local Langflow instance, and it asks the LLM to evaluate a sample resume.
If you don't have a resume on hand, you can download fake-resume.txt.
-
tip
For help with constructing file upload requests in Python, JavaScript, and curl, see the Langflow File Upload Utility.
To construct the request, gather the following information:
diff --git a/chat-with-rag.html b/chat-with-rag.html
index 1a4106c5c3..66c7b34097 100644
--- a/chat-with-rag.html
+++ b/chat-with-rag.html
@@ -25,7 +25,7 @@
-
+
@@ -90,8 +90,7 @@ Continue the tutorial to learn how to use the loading flow to load data into you
Select the local file you want to upload, and then click Open.
The file is loaded to your Langflow server.
To load the data into your vector database, click the vector store component, and then click Run component to run the selected component and all prior dependent components.
-
To load data programmatically, use the /v2/files/ and /v1/run/$FLOW_ID endpoints. The first endpoint loads a file to your Langflow server, and then returns an uploaded file path. The second endpoint runs the Load Data Flow, referencing the uploaded file path, to chunk, embed, and load the data into the vector store.
The following script demonstrates this process.
-For help with creating this script, use the Langflow File Upload Utility.
_37
// Node 18+ example using global fetch, FormData, and Blob
_37
import fs from 'fs/promises';
_37
_37
// 1. Prepare the form data with the file to upload
To load data programmatically, use the /v2/files/ and /v1/run/$FLOW_ID endpoints. The first endpoint loads a file to your Langflow server, and then returns an uploaded file path. The second endpoint runs the Load Data Flow, referencing the uploaded file path, to chunk, embed, and load the data into the vector store.
When the flow runs, the flow ingests the selected file, chunks the data, loads the data into the vector store database, and then generates embeddings for the chunks, which are also stored in the vector store.
Your database now contains data with vector embeddings that an LLM can use as context to respond to queries, as demonstrated in the next section of the tutorial.
Chat with your flow from a JavaScript application​