diff --git a/404.html b/404.html index 269e3ad4..8fea2608 100644 --- a/404.html +++ b/404.html @@ -4,7 +4,7 @@ OpenRAG - + diff --git a/agents/index.html b/agents/index.html index 7e966531..6182b1f8 100644 --- a/agents/index.html +++ b/agents/index.html @@ -4,7 +4,7 @@ Use Langflow in OpenRAG | OpenRAG - + diff --git a/assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg b/assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg deleted file mode 100644 index f50bef7d..00000000 --- a/assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OpenRAG TUI - - - - - - - - - - - - - - - - - - - - - - -██████╗ ██████╗ ███████╗███╗   ██╗██████╗  █████╗  ██████╗  -██╔═══██╗██╔══██╗██╔════╝████╗  ██║██╔══██╗██╔══██╗██╔════╝  -██║   ██║██████╔╝█████╗  ██╔██╗ ██║██████╔╝███████║██║  ███╗ -██║   ██║██╔═══╝ ██╔══╝  ██║╚██╗██║██╔══██╗██╔══██║██║   ██║ -╚██████╔╝██║     ███████╗██║ ╚████║██║  ██║██║  ██║╚██████╔╝ -╚═════╝ ╚═╝     ╚══════╝╚═╝  ╚═══╝╚═╝  ╚═╝╚═╝  ╚═╝╚═════╝ -Terminal User Interface for OpenRAG - -OAuth credentials detected — Advanced Setup recommended - - - - -▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ - Advanced Setup  Monitor Services  -▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ - - - - - - - - - - - - - - q Quit  1 Basic Setup  2 Advanced Setup  3 Monitor Services  4 Diagnostics ^p palette - - - diff --git a/assets/images/openrag_tui_dec_2025-c7022e66cc6675f25aced7b8acd8274d.png b/assets/images/openrag_tui_dec_2025-c7022e66cc6675f25aced7b8acd8274d.png new file mode 100644 index 00000000..fd3f6f77 Binary files /dev/null and b/assets/images/openrag_tui_dec_2025-c7022e66cc6675f25aced7b8acd8274d.png differ diff --git a/assets/js/03ef5215.7da8ea5b.js b/assets/js/03ef5215.7da8ea5b.js deleted file mode 100644 index 6b0be5e3..00000000 --- a/assets/js/03ef5215.7da8ea5b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[8186],{937:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={admonition:"admonition",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsx)(n.p,{children:"This is a destructive operation that does the following:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Destroys all OpenRAG containers, volumes, and local images."}),"\n",(0,r.jsx)(n.li,{children:"Prunes any additional container objects."}),"\n",(0,r.jsxs)(n.li,{children:["Deletes the contents of the ",(0,r.jsx)(n.code,{children:"~/.openrag"})," directory ",(0,r.jsx)(n.em,{children:"except"})," for OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"/documents"})," subdirectory."]}),"\n"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)("p",{}),"Destroyed containers and deleted data are lost and cannot be recovered after running this operation."]})]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1263:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>x,frontMatter:()=>d,metadata:()=>r,toc:()=>p});const r=JSON.parse('{"id":"get-started/manage-services","title":"Manage OpenRAG containers and services","description":"Service management is an essential part of maintaining your OpenRAG deployment.","source":"@site/docs/get-started/manage-services.mdx","sourceDirName":"get-started","slug":"/manage-services","permalink":"/manage-services","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/manage-services.mdx","tags":[],"version":"current","frontMatter":{"title":"Manage OpenRAG containers and services","slug":"/manage-services"},"sidebar":"tutorialSidebar","previous":{"title":"Use the TUI","permalink":"/tui"},"next":{"title":"Flows","permalink":"/agents"}}');var t=s(4848),a=s(8453),o=s(1470),i=s(9365),c=(s(1381),s(9809),s(937)),l=s(9870);const d={title:"Manage OpenRAG containers and services",slug:"/manage-services"},u=void 0,h={},p=[{value:"Monitor services",id:"monitor-services",level:2},{value:"Stop and start containers",id:"stop-and-start-containers",level:2},{value:"Stop, start, and inspect native services (Docling)",id:"start-native-services",level:2},{value:"Upgrade services",id:"upgrade-services",level:2},{value:"Reset containers (destructive)",id:"reset-containers",level:2},...c.RM,...l.RM,...l.RM,{value:"See also",id:"see-also",level:2}];function m(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Service management is an essential part of maintaining your OpenRAG deployment."}),"\n",(0,t.jsx)(n.p,{children:"Most OpenRAG services run in containers.\nHowever, some services, like Docling, run directly on the local machine."}),"\n",(0,t.jsxs)(n.p,{children:["If you ",(0,t.jsx)(n.a,{href:"/install-options",children:"installed OpenRAG"})," with the automated installer script, ",(0,t.jsx)(n.code,{children:"uv"}),", or ",(0,t.jsx)(n.code,{children:"uvx"}),", you can use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to manage your OpenRAG configuration and services."]}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.a,{href:"/docker",children:"self-managed deployments"}),", run Docker or Podman commands to manage your OpenRAG services."]}),"\n",(0,t.jsx)(n.h2,{id:"monitor-services",children:"Monitor services"}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsx)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"TUI Status menu"}),": In the ",(0,t.jsx)(n.strong,{children:"Status"})," menu (",(0,t.jsx)("kbd",{children:"3"}),"), you can access streaming logs for all OpenRAG services.\nSelect the service you want to view, and then press ",(0,t.jsx)("kbd",{children:"l"}),".\nTo copy the logs, click ",(0,t.jsx)(n.strong,{children:"Copy to Clipboard"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"TUI Diagnostics menu"}),": The TUI's ",(0,t.jsx)(n.strong,{children:"Diagnostics"})," menu (",(0,t.jsx)("kbd",{children:"4"}),") provides health monitoring for your container runtimes and monitoring of your OpenSearch instance."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Docling"}),": See ",(0,t.jsx)(n.a,{href:"#start-native-services",children:"Stop, start, and inspect native services"}),"."]}),"\n"]}),"\n"]})}),(0,t.jsx)(i.A,{value:"env",label:"Self-managed services",children:(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Containers"}),": Get container logs with ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/reference/cli/docker/compose/logs/",children:(0,t.jsx)(n.code,{children:"docker compose logs"})})," or ",(0,t.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-logs.1.html",children:(0,t.jsx)(n.code,{children:"podman logs"})}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Docling"}),": See ",(0,t.jsx)(n.a,{href:"#start-native-services",children:"Stop, start, and inspect native services"}),"."]}),"\n"]}),"\n"]})})]}),"\n",(0,t.jsx)(n.h2,{id:"stop-and-start-containers",children:"Stop and start containers"}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsxs)(n.p,{children:["In the TUI's ",(0,t.jsx)(n.strong,{children:"Status"})," menu (",(0,t.jsx)("kbd",{children:"3"}),"), click ",(0,t.jsx)(n.strong,{children:"Stop Services"})," to stop all OpenRAG container-based services.\nThen, click ",(0,t.jsx)(n.strong,{children:"Start All Services"})," to restart the OpenRAG containers."]}),(0,t.jsxs)(n.p,{children:["When you click ",(0,t.jsx)(n.strong,{children:"Start All Services"}),", the following processes are triggered:"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["OpenRAG automatically detects your container runtime, and then checks if your machine has compatible GPU support by checking for ",(0,t.jsx)(n.code,{children:"CUDA"}),", ",(0,t.jsx)(n.code,{children:"NVIDIA_SMI"}),", and Docker/Podman runtime support. This check determines which Docker Compose file OpenRAG uses because there are separate Docker Compose files for GPU and CPU deployments."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["OpenRAG pulls the OpenRAG container images with ",(0,t.jsx)(n.code,{children:"docker compose pull"})," if any images are missing."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["OpenRAG deploys the containers with ",(0,t.jsx)(n.code,{children:"docker compose up -d"}),"."]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/reference/cli/docker/compose/down/",children:(0,t.jsx)(n.code,{children:"docker compose down"})})," and ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/reference/cli/docker/compose/up/",children:(0,t.jsx)(n.code,{children:"docker compose up -d"})}),"."]}),(0,t.jsxs)(n.p,{children:["To stop or start individual containers, use targeted commands like ",(0,t.jsx)(n.code,{children:"docker stop CONTAINER_ID"})," and ",(0,t.jsx)(n.code,{children:"docker start CONTAINER_ID"}),"."]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"start-native-services",children:"Stop, start, and inspect native services (Docling)"}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.em,{children:"native service"})," in OpenRAG is a service that runs locally on your machine, not within a container. For example, the ",(0,t.jsx)(n.code,{children:"docling serve"})," process is an OpenRAG native service because this document processing service runs on your local machine, separate from the OpenRAG containers."]}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsxs)(n.p,{children:["From the TUI's ",(0,t.jsx)(n.strong,{children:"Status"})," menu (",(0,t.jsx)("kbd",{children:"3"}),"), click ",(0,t.jsx)(n.strong,{children:"Native Services"})," to do the following:"]}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:"View the service's status, port, and process ID (PID)."}),"\n",(0,t.jsx)(n.li,{children:"Stop, start, and restart native services."}),"\n"]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsx)(n.p,{children:"Because the Docling service doesn't run in a container, you must start and stop it manually on the host machine:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Stop ",(0,t.jsx)(n.code,{children:"docling serve"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start ",(0,t.jsx)(n.code,{children:"docling serve"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py start --port 5001\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Check that ",(0,t.jsx)(n.code,{children:"docling serve"})," is running:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py status\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"docling serve"})," is running, the output includes the status, address, and process ID (PID):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"Status: running\nEndpoint: http://127.0.0.1:5001\nDocs: http://127.0.0.1:5001/docs\nPID: 27746\n"})}),"\n"]}),"\n"]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-services",children:"Upgrade services"}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"/upgrade",children:"Upgrade OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"reset-containers",children:"Reset containers (destructive)"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsxs)(n.p,{children:["Use these steps to reset your OpenRAG deployment by recreating the containers and deleting all data in the ",(0,t.jsx)(n.code,{children:"~/.openrag"})," directory ",(0,t.jsx)(n.em,{children:"except"})," for the ",(0,t.jsx)(n.code,{children:".env"})," file and the ",(0,t.jsx)(n.code,{children:"/documents"})," subdirectory."]}),"\n",(0,t.jsxs)(n.p,{children:["This restores your OpenRAG deployment to a near-initial state while preserving your configuration (in ",(0,t.jsx)(n.code,{children:".env"}),") and uploaded documents (in ",(0,t.jsx)(n.code,{children:"/documents"}),").\nYour documents are reingested into a fresh OpenSearch index after the reset."]}),"\n",(0,t.jsxs)(n.p,{children:["To reset your OpenRAG deployment ",(0,t.jsx)(n.em,{children:"and"})," delete all OpenRAG data, see ",(0,t.jsx)(n.a,{href:"/reinstall",children:"Reinstall OpenRAG"}),"."]}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsx)(l.Ay,{}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["To destroy and recreate your OpenRAG containers, open the TUI's ",(0,t.jsx)(n.strong,{children:"Status"})," menu (",(0,t.jsx)("kbd",{children:"3"}),"), and then click ",(0,t.jsx)(n.strong,{children:"Factory Reset"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Repeat the ",(0,t.jsx)(n.a,{href:"/install#setup",children:"setup process"})," to restart the services and launch the OpenRAG app. Your OpenRAG passwords, OAuth credentials (if previously set), and onboarding configuration are restored from the ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsx)(l.Ay,{}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Recreate the containers:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up --build --force-recreate --remove-orphans\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up --build --force-recreate --remove-orphans\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Launch the OpenRAG app, and then repeat the ",(0,t.jsx)(n.a,{href:"/docker#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If you exported customized flows, ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"import your flows"})," into Langflow after completing the onboarding process."]}),"\n"]}),"\n"]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/uninstall",children:"Uninstall OpenRAG"})}),"\n"]})]})}function x(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(m,{...e})}):m(e)}},1381:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>k});var r=s(6540),t=s(4164),a=s(7559),o=s(3104),i=s(6347),c=s(205),l=s(7485),d=s(1682),u=s(679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const s=(0,i.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function j(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,a=p(e),[o,i]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:a})),[l,d]=x({queryString:s,groupId:t}),[h,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,u.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),g=(()=>{const e=l??h;return m({value:e,tabValues:a})?e:null})();(0,c.A)(()=>{g&&i(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),j(e)},[d,j,a]),tabValues:a}}var g=s(2303);const v={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=s(4848);function b({className:e,block:n,selectedValue:s,selectValue:r,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,o.a_)(),l=e=>{const n=e.currentTarget,t=i.indexOf(n),o=a[t].value;o!==s&&(c(n),r(o))},d=e=>{let n=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const s=i.indexOf(e.currentTarget)+1;n=i[s]??i[0];break}case"ArrowLeft":{const s=i.indexOf(e.currentTarget)-1;n=i[s]??i[i.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:r})=>(0,f.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:l,...r,className:(0,t.A)("tabs__item",v.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:s}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function A(e){const n=j(e);return(0,f.jsxs)("div",{className:(0,t.A)(a.G.tabs.container,"tabs-container",v.tabList),children:[(0,f.jsx)(b,{...n,...e}),(0,f.jsx)(y,{...n,...e})]})}function k(e){const n=(0,g.A)();return(0,f.jsx)(A,{...e,children:h(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},a=r.createContext(t);function o(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(a.Provider,{value:n},e.children)}},9365:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var a=s(4848);function o({children:e,hidden:n,className:s}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}},9809:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose down --volumes --remove-orphans --rmi local\npodman system prune -f\n"})})]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},9870:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={a:"a",li:"li",ol:"ol",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["If you modified the built-in flows or created custom flows in your ",(0,r.jsx)(n.a,{href:"/agents",children:"OpenRAG Langflow instance"}),", and you want to preserve those changes, then you must ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed."]}),"\n"]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/assets/js/03ef5215.c65167a4.js b/assets/js/03ef5215.c65167a4.js new file mode 100644 index 00000000..ce80ee4b --- /dev/null +++ b/assets/js/03ef5215.c65167a4.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[8186],{937:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={admonition:"admonition",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsx)(n.p,{children:"This is a destructive operation that does the following:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Destroys all OpenRAG containers, volumes, and local images."}),"\n",(0,r.jsx)(n.li,{children:"Prunes any additional container objects."}),"\n",(0,r.jsxs)(n.li,{children:["Deletes the contents of the ",(0,r.jsx)(n.code,{children:"~/.openrag"})," directory ",(0,r.jsx)(n.em,{children:"except"})," for OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"/documents"})," subdirectory."]}),"\n"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)("p",{}),"Destroyed containers and deleted data are lost and cannot be recovered after running this operation."]})]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1263:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>h,contentTitle:()=>u,default:()=>x,frontMatter:()=>d,metadata:()=>r,toc:()=>p});const r=JSON.parse('{"id":"get-started/manage-services","title":"Manage OpenRAG containers and services","description":"Service management is an essential part of maintaining your OpenRAG deployment.","source":"@site/docs/get-started/manage-services.mdx","sourceDirName":"get-started","slug":"/manage-services","permalink":"/manage-services","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/manage-services.mdx","tags":[],"version":"current","frontMatter":{"title":"Manage OpenRAG containers and services","slug":"/manage-services"},"sidebar":"tutorialSidebar","previous":{"title":"Use the TUI","permalink":"/tui"},"next":{"title":"Flows","permalink":"/agents"}}');var t=s(4848),a=s(8453),o=s(1470),i=s(9365),c=(s(1381),s(9809),s(937)),l=s(9870);const d={title:"Manage OpenRAG containers and services",slug:"/manage-services"},u=void 0,h={},p=[{value:"Monitor services and view logs",id:"monitor-services-and-view-logs",level:2},{value:"Stop and start containers",id:"stop-and-start-containers",level:2},{value:"Stop, start, and inspect native services (Docling)",id:"start-native-services",level:2},{value:"Upgrade services",id:"upgrade-services",level:2},{value:"Reset containers (destructive)",id:"reset-containers",level:2},...c.RM,...l.RM,...l.RM,{value:"See also",id:"see-also",level:2}];function m(e){const n={a:"a",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Service management is an essential part of maintaining your OpenRAG deployment."}),"\n",(0,t.jsx)(n.p,{children:"Most OpenRAG services run in containers.\nHowever, some services, like Docling, run directly on the local machine."}),"\n",(0,t.jsxs)(n.p,{children:["If you ",(0,t.jsx)(n.a,{href:"/install-options",children:"installed OpenRAG"})," with the automated installer script, ",(0,t.jsx)(n.code,{children:"uv"}),", or ",(0,t.jsx)(n.code,{children:"uvx"}),", you can use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to manage your OpenRAG configuration and services."]}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.a,{href:"/docker",children:"self-managed deployments"}),", run Docker or Podman commands to manage your OpenRAG services."]}),"\n",(0,t.jsx)(n.h2,{id:"monitor-services-and-view-logs",children:"Monitor services and view logs"}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsxs)(n.p,{children:["In the TUI, click ",(0,t.jsx)(n.strong,{children:"Status"})," to access diagnostics and controls for all OpenRAG services, including container health, ports, and image versions."]}),(0,t.jsxs)(n.p,{children:["To view streaming logs, click the name of a service, and then press ",(0,t.jsx)("kbd",{children:"l"}),"."]}),(0,t.jsxs)(n.p,{children:["For the Docling native service, see ",(0,t.jsx)(n.a,{href:"#start-native-services",children:"Stop, start, and inspect native services"}),"."]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsxs)(n.p,{children:["For self-managed container services, you can get container logs with ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/reference/cli/docker/compose/logs/",children:(0,t.jsx)(n.code,{children:"docker compose logs"})})," or ",(0,t.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-logs.1.html",children:(0,t.jsx)(n.code,{children:"podman logs"})}),"."]}),(0,t.jsxs)(n.p,{children:["For the Docling native service, see ",(0,t.jsx)(n.a,{href:"#start-native-services",children:"Stop, start, and inspect native services"}),"."]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"stop-and-start-containers",children:"Stop and start containers"}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsxs)(n.p,{children:["On the TUI's ",(0,t.jsx)(n.strong,{children:"Status"})," page, you can stop, start, and restart OpenRAG's container-based services."]}),(0,t.jsxs)(n.p,{children:["When you click ",(0,t.jsx)(n.strong,{children:"Restart"})," or ",(0,t.jsx)(n.strong,{children:"Start Services"}),", the following processes are triggered:"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["OpenRAG automatically detects your container runtime, and then checks if your machine has compatible GPU support by checking for ",(0,t.jsx)(n.code,{children:"CUDA"}),", ",(0,t.jsx)(n.code,{children:"NVIDIA_SMI"}),", and Docker/Podman runtime support. This check determines which Docker Compose file OpenRAG uses because there are separate Docker Compose files for GPU and CPU deployments."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["OpenRAG pulls the OpenRAG container images with ",(0,t.jsx)(n.code,{children:"docker compose pull"})," if any images are missing."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["OpenRAG deploys the containers with ",(0,t.jsx)(n.code,{children:"docker compose up -d"}),"."]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/reference/cli/docker/compose/down/",children:(0,t.jsx)(n.code,{children:"docker compose down"})})," and ",(0,t.jsx)(n.a,{href:"https://docs.docker.com/reference/cli/docker/compose/up/",children:(0,t.jsx)(n.code,{children:"docker compose up -d"})}),"."]}),(0,t.jsxs)(n.p,{children:["To stop or start individual containers, use targeted commands like ",(0,t.jsx)(n.code,{children:"docker stop CONTAINER_ID"})," and ",(0,t.jsx)(n.code,{children:"docker start CONTAINER_ID"}),"."]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"start-native-services",children:"Stop, start, and inspect native services (Docling)"}),"\n",(0,t.jsxs)(n.p,{children:["A ",(0,t.jsx)(n.em,{children:"native service"})," in OpenRAG is a service that runs locally on your machine, not within a container. For example, the ",(0,t.jsx)(n.code,{children:"docling serve"})," process is an OpenRAG native service because this document processing service runs on your local machine, separate from the OpenRAG containers."]}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsxs)(n.p,{children:["On the TUI's ",(0,t.jsx)(n.strong,{children:"Status"})," page, you can stop, start, restart, and inspect OpenRAG's native services."]}),(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.strong,{children:"Native Services"})," section lists the status, port, and process ID (PID) for each native service."]}),(0,t.jsxs)(n.p,{children:["To manage a native service, click the service's name, and then click ",(0,t.jsx)(n.strong,{children:"Stop"}),", ",(0,t.jsx)(n.strong,{children:"Start"})," or ",(0,t.jsx)(n.strong,{children:"Restart"}),"."]}),(0,t.jsxs)(n.p,{children:["To view the logs for a native service, click the service's name, and then press ",(0,t.jsx)("kbd",{children:"l"}),"."]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsx)(n.p,{children:"Because the Docling service doesn't run in a container, you must start and stop it manually on the host machine:"}),(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Stop ",(0,t.jsx)(n.code,{children:"docling serve"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start ",(0,t.jsx)(n.code,{children:"docling serve"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py start --port 5001\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Check that ",(0,t.jsx)(n.code,{children:"docling serve"})," is running:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py status\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"docling serve"})," is running, the output includes the status, address, and process ID (PID):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-text",children:"Status: running\nEndpoint: http://127.0.0.1:5001\nDocs: http://127.0.0.1:5001/docs\nPID: 27746\n"})}),"\n"]}),"\n"]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-services",children:"Upgrade services"}),"\n",(0,t.jsxs)(n.p,{children:["See ",(0,t.jsx)(n.a,{href:"/upgrade",children:"Upgrade OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"reset-containers",children:"Reset containers (destructive)"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsxs)(n.p,{children:["Use these steps to reset your OpenRAG deployment by recreating the containers and deleting all data in the ",(0,t.jsx)(n.code,{children:"~/.openrag"})," directory ",(0,t.jsx)(n.em,{children:"except"})," for the ",(0,t.jsx)(n.code,{children:".env"})," file and the ",(0,t.jsx)(n.code,{children:"/documents"})," subdirectory."]}),"\n",(0,t.jsxs)(n.p,{children:["This restores your OpenRAG deployment to a near-initial state while preserving your configuration (in ",(0,t.jsx)(n.code,{children:".env"}),") and uploaded documents (in ",(0,t.jsx)(n.code,{children:"/documents"}),").\nYour documents are reingested into a fresh OpenSearch index after the reset."]}),"\n",(0,t.jsxs)(n.p,{children:["To reset your OpenRAG deployment ",(0,t.jsx)(n.em,{children:"and"})," delete all OpenRAG data, see ",(0,t.jsx)(n.a,{href:"/reinstall",children:"Reinstall OpenRAG"}),"."]}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(i.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,t.jsx)(l.Ay,{}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["To destroy and recreate your OpenRAG containers, click ",(0,t.jsx)(n.strong,{children:"Status"})," in the TUI, and then click ",(0,t.jsx)(n.strong,{children:"Factory Reset"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Repeat the ",(0,t.jsx)(n.a,{href:"/install#setup",children:"setup process"})," to restart the services and launch the OpenRAG app. Your OpenRAG passwords, OAuth credentials (if previously set), and onboarding configuration are restored from the ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n"]})]}),(0,t.jsxs)(i.A,{value:"env",label:"Self-managed services",children:[(0,t.jsx)(l.Ay,{}),(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Recreate the containers:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up --build --force-recreate --remove-orphans\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up --build --force-recreate --remove-orphans\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Launch the OpenRAG app, and then repeat the ",(0,t.jsx)(n.a,{href:"/docker#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If you exported customized flows, ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"import your flows"})," into Langflow after completing the onboarding process."]}),"\n"]}),"\n"]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/uninstall",children:"Uninstall OpenRAG"})}),"\n"]})]})}function x(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(m,{...e})}):m(e)}},1381:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),a=s(7559),o=s(3104),i=s(6347),c=s(205),l=s(7485),d=s(1682),u=s(679);function h(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return h(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const s=(0,i.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function g(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,a=p(e),[o,i]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:a})),[l,d]=x({queryString:s,groupId:t}),[h,g]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,u.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),v=(()=>{const e=l??h;return m({value:e,tabValues:a})?e:null})();(0,c.A)(()=>{v&&i(v)},[v]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!m({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),g(e)},[d,g,a]),tabValues:a}}var v=s(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var f=s(4848);function b({className:e,block:n,selectedValue:s,selectValue:r,tabValues:a}){const i=[],{blockElementScrollPositionUntilNextRender:c}=(0,o.a_)(),l=e=>{const n=e.currentTarget,t=i.indexOf(n),o=a[t].value;o!==s&&(c(n),r(o))},d=e=>{let n=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const s=i.indexOf(e.currentTarget)+1;n=i[s]??i[0];break}case"ArrowLeft":{const s=i.indexOf(e.currentTarget)-1;n=i[s]??i[i.length-1];break}}n?.focus()};return(0,f.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:r})=>(0,f.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{i.push(e)},onKeyDown:d,onClick:l,...r,className:(0,t.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:s}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,f.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function A(e){const n=g(e);return(0,f.jsxs)("div",{className:(0,t.A)(a.G.tabs.container,"tabs-container",j.tabList),children:[(0,f.jsx)(b,{...n,...e}),(0,f.jsx)(y,{...n,...e})]})}function w(e){const n=(0,v.A)();return(0,f.jsx)(A,{...e,children:h(e.children)},String(n))}},8453:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>i});var r=s(6540);const t={},a=r.createContext(t);function o(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),r.createElement(a.Provider,{value:n},e.children)}},9365:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var a=s(4848);function o({children:e,hidden:n,className:s}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}},9809:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose down --volumes --remove-orphans --rmi local\npodman system prune -f\n"})})]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},9870:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>a});var r=s(4848),t=s(8453);const a=[];function o(e){const n={a:"a",li:"li",ol:"ol",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["If you modified the built-in flows or created custom flows in your ",(0,r.jsx)(n.a,{href:"/agents",children:"OpenRAG Langflow instance"}),", and you want to preserve those changes, then you must ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed."]}),"\n"]})}function i(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/assets/js/21afe7ac.7f9f70e7.js b/assets/js/21afe7ac.7f9f70e7.js new file mode 100644 index 00000000..ecb0134a --- /dev/null +++ b/assets/js/21afe7ac.7f9f70e7.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[961],{3929:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/openrag_tui_dec_2025-c7022e66cc6675f25aced7b8acd8274d.png"},6239:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"get-started/tui","title":"Use the TUI","description":"The OpenRAG Terminal User Interface (TUI) provides a simplified and guided experience for configuring, managing, and monitoring your OpenRAG deployment directly from the terminal.","source":"@site/docs/get-started/tui.mdx","sourceDirName":"get-started","slug":"/tui","permalink":"/tui","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/tui.mdx","tags":[],"version":"current","frontMatter":{"title":"Use the TUI","slug":"/tui"},"sidebar":"tutorialSidebar","previous":{"title":"Remove OpenRAG","permalink":"/uninstall"},"next":{"title":"Manage services","permalink":"/manage-services"}}');var i=t(4848),r=t(8453);const o={title:"Use the TUI",slug:"/tui"},a=void 0,c={},d=[{value:"Access the TUI",id:"access-the-tui",level:2},{value:"Navigate the TUI",id:"navigate-the-tui",level:2},{value:"Manage services with the TUI",id:"manage-services-with-the-tui",level:2},{value:"Toggle GPU/CPU mode",id:"toggle-gpucpu-mode",level:2},{value:"Exit the OpenRAG TUI",id:"exit-the-openrag-tui",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"The OpenRAG Terminal User Interface (TUI) provides a simplified and guided experience for configuring, managing, and monitoring your OpenRAG deployment directly from the terminal."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:t(3929).A+"",width:"653",height:"397"})}),"\n",(0,i.jsxs)(n.p,{children:["If you install OpenRAG with the ",(0,i.jsx)(n.a,{href:"/install",children:"automatic installer script"}),", ",(0,i.jsx)(n.a,{href:"/install-uv",children:(0,i.jsx)(n.code,{children:"uv"})}),", or ",(0,i.jsx)(n.a,{href:"/install-uvx",children:(0,i.jsx)(n.code,{children:"uvx"})}),", you use the TUI to manage your OpenRAG deployment.\nThe TUI guides you through the initial setup, automatically manages your OpenRAG ",(0,i.jsx)(n.code,{children:".env"})," and ",(0,i.jsx)(n.code,{children:"docker-compose"})," files, and provides convenient access to ",(0,i.jsx)(n.a,{href:"/manage-services",children:"service management"})," controls."]}),"\n",(0,i.jsxs)(n.p,{children:["In contrast, when you ",(0,i.jsx)(n.a,{href:"/docker",children:"deploy OpenRAG with self-managed services"}),", you must manually configure OpenRAG by preparing a ",(0,i.jsx)(n.code,{children:".env"})," file, and then use Docker or Podman commands to deploy and manage your OpenRAG services."]}),"\n",(0,i.jsx)(n.h2,{id:"access-the-tui",children:"Access the TUI"}),"\n",(0,i.jsxs)(n.p,{children:["If you installed OpenRAG with ",(0,i.jsx)(n.code,{children:"uv"}),", access the TUI with ",(0,i.jsx)(n.code,{children:"uv run openrag"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you installed OpenRAG with the automatic installer script or ",(0,i.jsx)(n.code,{children:"uvx"}),", access the TUI with ",(0,i.jsx)(n.code,{children:"uvx openrag"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"navigate-the-tui",children:"Navigate the TUI"}),"\n",(0,i.jsx)(n.p,{children:"You can navigate the TUI with your mouse or keyboard.\nKeyboard shortcuts for additional menus are printed at the bottom of the TUI screen."}),"\n",(0,i.jsx)(n.h2,{id:"manage-services-with-the-tui",children:"Manage services with the TUI"}),"\n",(0,i.jsxs)(n.p,{children:["Use the TUI's ",(0,i.jsx)(n.strong,{children:"Status"})," page to access controls and information for your OpenRAG services.\nFor more information, see ",(0,i.jsx)(n.a,{href:"/manage-services",children:"Manage OpenRAG services"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"toggle-gpucpu-mode",children:"Toggle GPU/CPU mode"}),"\n",(0,i.jsx)(n.p,{children:"You can toggle between GPU and CPU mode from within the TUI if your system has compatible GPU hardware and drivers installed."}),"\n",(0,i.jsxs)(n.p,{children:["In the TUI, click ",(0,i.jsx)(n.strong,{children:"Status"}),", and then click ",(0,i.jsx)(n.strong,{children:"Switch to GPU Mode"})," or ",(0,i.jsx)(n.strong,{children:"Switch to CPU Mode"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["This change requires restarting all OpenRAG services because each mode has its own ",(0,i.jsx)(n.code,{children:"docker-compose"})," file."]}),"\n",(0,i.jsx)(n.h2,{id:"exit-the-openrag-tui",children:"Exit the OpenRAG TUI"}),"\n",(0,i.jsxs)(n.p,{children:["To exit the OpenRAG TUI, press ",(0,i.jsx)("kbd",{children:"q"})," on the TUI main page."]}),"\n",(0,i.jsx)(n.p,{children:"Exiting the TUI doesn't stop your OpenRAG services.\nYour OpenRAG services continue to run until they are stopped from within the TUI or by another process that inadvertently stops them."}),"\n",(0,i.jsxs)(n.p,{children:["To restart the TUI, see ",(0,i.jsx)(n.a,{href:"#access-the-tui",children:"Access the TUI"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>a});var s=t(6540);const i={},r=s.createContext(i);function o(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:o(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/21afe7ac.b1bb0884.js b/assets/js/21afe7ac.b1bb0884.js deleted file mode 100644 index 895294ca..00000000 --- a/assets/js/21afe7ac.b1bb0884.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[961],{5689:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg"},6239:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>o,contentTitle:()=>c,default:()=>h,frontMatter:()=>a,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"get-started/tui","title":"Use the TUI","description":"The OpenRAG Terminal User Interface (TUI) provides a simplified and guided experience for configuring, managing, and monitoring your OpenRAG deployment directly from the terminal.","source":"@site/docs/get-started/tui.mdx","sourceDirName":"get-started","slug":"/tui","permalink":"/tui","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/tui.mdx","tags":[],"version":"current","frontMatter":{"title":"Use the TUI","slug":"/tui"},"sidebar":"tutorialSidebar","previous":{"title":"Remove OpenRAG","permalink":"/uninstall"},"next":{"title":"Manage services","permalink":"/manage-services"}}');var i=t(4848),r=t(8453);const a={title:"Use the TUI",slug:"/tui"},c=void 0,o={},d=[{value:"Access the TUI",id:"access-the-tui",level:2},{value:"Manage services with the TUI",id:"manage-services-with-the-tui",level:2},{value:"Exit the OpenRAG TUI",id:"exit-the-openrag-tui",level:2}];function l(e){const n={a:"a",code:"code",h2:"h2",img:"img",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"The OpenRAG Terminal User Interface (TUI) provides a simplified and guided experience for configuring, managing, and monitoring your OpenRAG deployment directly from the terminal."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:t(5689).A+"",width:"1995",height:"1099"})}),"\n",(0,i.jsxs)(n.p,{children:["If you install OpenRAG with the ",(0,i.jsx)(n.a,{href:"/install",children:"automatic installer script"}),", ",(0,i.jsx)(n.a,{href:"/install-uv",children:(0,i.jsx)(n.code,{children:"uv"})}),", or ",(0,i.jsx)(n.a,{href:"/install-uvx",children:(0,i.jsx)(n.code,{children:"uvx"})}),", you use the TUI to manage your OpenRAG deployment.\nThe TUI guides you through the initial setup, automatically manages your OpenRAG ",(0,i.jsx)(n.code,{children:".env"})," and ",(0,i.jsx)(n.code,{children:"docker-compose"})," files, and provides convenient access to ",(0,i.jsx)(n.a,{href:"/manage-services",children:"service management"})," controls."]}),"\n",(0,i.jsxs)(n.p,{children:["In contrast, when you ",(0,i.jsx)(n.a,{href:"/docker",children:"deploy OpenRAG with self-managed services"}),", you must manually configure OpenRAG by preparing a ",(0,i.jsx)(n.code,{children:".env"})," file, and then use Docker or Podman commands to deploy and manage your OpenRAG services."]}),"\n",(0,i.jsx)(n.h2,{id:"access-the-tui",children:"Access the TUI"}),"\n",(0,i.jsxs)(n.p,{children:["If you installed OpenRAG with ",(0,i.jsx)(n.code,{children:"uv"}),", access the TUI with ",(0,i.jsx)(n.code,{children:"uv run openrag"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you installed OpenRAG with the automatic installer script or ",(0,i.jsx)(n.code,{children:"uvx"}),", access the TUI with ",(0,i.jsx)(n.code,{children:"uvx openrag"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"manage-services-with-the-tui",children:"Manage services with the TUI"}),"\n",(0,i.jsxs)(n.p,{children:["Use the TUI's ",(0,i.jsx)(n.strong,{children:"Status"})," menu (",(0,i.jsx)("kbd",{children:"3"}),") and ",(0,i.jsx)(n.strong,{children:"Diagnostics"})," menu (",(0,i.jsx)("kbd",{children:"4"}),") to access controls and information for your OpenRAG services.\nFor more information, see ",(0,i.jsx)(n.a,{href:"/manage-services",children:"Manage OpenRAG services"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"exit-the-openrag-tui",children:"Exit the OpenRAG TUI"}),"\n",(0,i.jsxs)(n.p,{children:["To exit the OpenRAG TUI, go to the TUI main menu, and then press ",(0,i.jsx)("kbd",{children:"q"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"Your OpenRAG containers continue to run until they are stopped."}),"\n",(0,i.jsxs)(n.p,{children:["To restart the TUI, see ",(0,i.jsx)(n.a,{href:"#access-the-tui",children:"Access the TUI"}),"."]})]})}function h(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(l,{...e})}):l(e)}},8453:(e,n,t)=>{t.d(n,{R:()=>a,x:()=>c});var s=t(6540);const i={},r=s.createContext(i);function a(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:a(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/441f609b.8f0bf0a1.js b/assets/js/441f609b.8f0bf0a1.js new file mode 100644 index 00000000..8a241517 --- /dev/null +++ b/assets/js/441f609b.8f0bf0a1.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[8617],{309:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:(0,r.jsx)(n.code,{children:"podman-compose"})})," or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"}),".\nTo use Docker Compose with Podman, you must alias Docker Compose commands to Podman commands."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},887:(e,n,s)=>{s.d(n,{Ay:()=>h,RM:()=>d});var r=s(4848),t=s(8453),o=s(9179),i=s(1470),a=s(9365),l=s(3059);const d=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...l.RM];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,r.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,r.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,r.jsxs)(i.A,{groupId:"Provider",children:[(0,r.jsxs)(a.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", select the base URL for your watsonx.ai model deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter your watsonx.ai deployment's project ID and API key."}),"\n",(0,r.jsxs)(n.p,{children:["You can enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,r.jsxs)(a.A,{value:"Ollama",label:"Ollama",children:[(0,r.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(l.Ay,{})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In the OpenRAG onboarding dialog, enter your Ollama server's base URL:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,r.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select the language model that your Ollama server is running."}),"\n",(0,r.jsx)(n.p,{children:"If your server isn't running any language models, you must either deploy a language model on your Ollama server, or use another provider for the language model."}),"\n",(0,r.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,r.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},927:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[{value:"Next steps",id:"next-steps",level:2}];function i(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Learn how to ",(0,r.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),o=s(7559),i=s(3104),a=s(6347),l=s(205),d=s(7485),c=s(1682),h=s(679);function u(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function x({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const s=(0,a.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,d.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function j(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,o=p(e),[i,a]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:o})),[d,c]=m({queryString:s,groupId:t}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,h.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),g=(()=>{const e=d??u;return x({value:e,tabValues:o})?e:null})();(0,l.A)(()=>{g&&a(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!x({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);a(e),c(e),j(e)},[c,j,o]),tabValues:o}}var g=s(2303);const f={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=s(4848);function y({className:e,block:n,selectedValue:s,selectValue:r,tabValues:o}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),i=o[t].value;i!==s&&(l(n),r(i))},c=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const s=a.indexOf(e.currentTarget)+1;n=a[s]??a[0];break}case"ArrowLeft":{const s=a.indexOf(e.currentTarget)-1;n=a[s]??a[a.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{a.push(e)},onKeyDown:c,onClick:d,...r,className:(0,t.A)("tabs__item",f.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:s}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function b(e){const n=j(e);return(0,v.jsxs)("div",{className:(0,t.A)(o.G.tabs.container,"tabs-container",f.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(A,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,v.jsx)(b,{...e,children:u(e.children)},String(n))}},2061:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var r=s(4848),t=s(8453),o=s(1470),i=s(9365),a=s(7637);const l=[...a.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["You can use either ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," to configure OpenRAG.\nThis choice determines how OpenRAG authenticates with your deployment's ",(0,r.jsx)(n.a,{href:"/knowledge",children:"OpenSearch instance"}),", and it controls user access to documents stored in your OpenSearch knowledge base:"]}),"\n",(0,r.jsx)(a.Ay,{}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You must use ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," if you want to ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"use OAuth connectors to upload documents from cloud storage"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["If OpenRAG detects OAuth credentials during setup, it recommends ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the TUI."]}),"\n",(0,r.jsxs)(o.A,{groupId:"Setup method",children:[(0,r.jsx)(i.A,{value:"Basic setup",label:"Basic setup",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, select ",(0,r.jsx)(n.strong,{children:"Basic Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter administrator passwords for the OpenRAG OpenSearch and Langflow services."}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow password and username automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"API Keys"}),", enter your model provider credentials, or leave these fields empty if you want to configure model provider credentials during the application onboarding process."]}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing these values now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a credential now, it can be populated automatically during the application onboarding process if you enable the ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," option."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"Others"}),", edit the ",(0,r.jsx)(n.a,{href:"/knowledge",children:"knowledge base"})," paths if you don't want to use the default paths:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documents Paths"}),": One or more paths to directories are where OpenRAG looks for documents to ingest."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OpenSearch Data PAth"}),": Specify the path where you want OpenRAG to create your OpenSearch index."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords and API keys, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," or navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"})," in your browser."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})}),(0,r.jsx)(i.A,{value:"Advanced setup",label:"Advanced setup",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter administrator passwords for the OpenRAG OpenSearch and Langflow services."}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow password and username automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"API Keys"}),", enter your model provider credentials, or leave the ",(0,r.jsx)(n.strong,{children:"OpenAI"}),", ",(0,r.jsx)(n.strong,{children:"Anthropic"}),", ",(0,r.jsx)(n.strong,{children:"Ollama"}),", and ",(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"})," fields empty if you want to configure model provider credentials during the application onboarding process."]}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing these values now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a credential now, it can be populated automatically during the application onboarding process if you enable the ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," option."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Recommended: To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use under ",(0,r.jsx)(n.strong,{children:"API Keys"}),". These settings can be populated automatically if OpenRAG detects these credentials in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,r.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,r.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Register the redirect URIs shown in the TUI in your OAuth provider.\nThese are the URLs your OAuth provider will use to redirect users back to OpenRAG after they sign in."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"Others"}),", you can edit the following settings if needed:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documents Paths"}),": Use the default path or provide one or more paths to directories are where OpenRAG looks for documents to ingest in to your ",(0,r.jsx)(n.a,{href:"/knowledge",children:"knowledge base"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OpenSearch Data Path"}),": Specify the path where you want OpenRAG to create your OpenSearch index."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Langflow Public URL (",(0,r.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"}),")"]})," : Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Webhook Base URL (",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL"}),")"]}),": If applicable, set the base address for your OAuth connector endpoints. If set, the OAuth connector webhook URLs are constructed as ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/${provider}/webhook"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords, API key, and OAuth credentials, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," or navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"})," in your browser."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})})]})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},2068:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>x,default:()=>f,frontMatter:()=>p,metadata:()=>r,toc:()=>j});const r=JSON.parse('{"id":"get-started/install-uv","title":"Install OpenRAG in a Python project with uv","description":"Use uv to install OpenRAG as a managed or unmanaged dependency in a new or existing Python project.","source":"@site/docs/get-started/install-uv.mdx","sourceDirName":"get-started","slug":"/install-uv","permalink":"/install-uv","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/install-uv.mdx","tags":[],"version":"current","frontMatter":{"title":"Install OpenRAG in a Python project with uv","slug":"/install-uv"},"sidebar":"tutorialSidebar","previous":{"title":"Run the installer script","permalink":"/install"},"next":{"title":"Invoke OpenRAG with uvx","permalink":"/install-uvx"}}');var t=s(4848),o=s(8453),i=(s(1470),s(9365),s(887)),a=s(2061),l=s(3351),d=s(309),c=s(6149),h=s(4042),u=s(927);s(7637),s(3059);const p={title:"Install OpenRAG in a Python project with uv",slug:"/install-uv"},x=void 0,m={},j=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...h.RM,...d.RM,...l.RM,{value:"Install and start OpenRAG with uv",id:"install-and-start-openrag-with-uv",level:2},{value:"Use uv add",id:"uv-add",level:3},{value:"Use uv pip install",id:"uv-pip-install",level:3},{value:"Set up OpenRAG with the TUI",id:"setup",level:2},...a.RM,...i.RM,...u.RM];function g(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:(0,t.jsx)(n.code,{children:"uv"})})," to install OpenRAG as a managed or unmanaged dependency in a new or existing Python project."]}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uv"}),", you will use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to configure and manage your OpenRAG deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["For other installation methods, see ",(0,t.jsx)(n.a,{href:"/install-options",children:"Select an installation method"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(h.Ay,{}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"install-and-start-openrag-with-uv",children:"Install and start OpenRAG with uv"}),"\n",(0,t.jsxs)(n.p,{children:["There are two ways to install OpenRAG with ",(0,t.jsx)(n.code,{children:"uv"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.a,{href:"#uv-add",children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"uv add"})})," (Recommended)"]}),": Install OpenRAG as a managed dependency in a new or existing ",(0,t.jsx)(n.code,{children:"uv"})," Python project.\nThis is recommended because it adds OpenRAG to your ",(0,t.jsx)(n.code,{children:"pyproject.toml"})," and lockfile for better management of dependencies and the virtual environment."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"#uv-pip-install",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"uv pip install"})})}),": Use the ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/pip/",children:[(0,t.jsx)(n.code,{children:"uv pip"})," interface"]})," to install OpenRAG into an existing Python project that uses ",(0,t.jsx)(n.code,{children:"pip"}),", ",(0,t.jsx)(n.code,{children:"pip-tools"}),", and ",(0,t.jsx)(n.code,{children:"virtualenv"})," commands."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you encounter errors during installation, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"uv-add",children:"Use uv add"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Create a new ",(0,t.jsx)(n.code,{children:"uv"}),"-managed Python project:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv init PROJECT_NAME\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Change into your new project directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd PROJECT_NAME\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Because ",(0,t.jsx)(n.code,{children:"uv"})," manages the virtual environment for you, you won't see a ",(0,t.jsx)(n.code,{children:"(venv)"})," prompt.\n",(0,t.jsx)(n.code,{children:"uv"})," commands automatically use the project's virtual environment."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add OpenRAG to your project:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add the latest version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add a specific version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add openrag==0.1.30\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add a local wheel:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add path/to/openrag-VERSION-py3-none-any.whl\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For more options, see ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/concepts/projects/dependencies/",children:["Managing dependencies with ",(0,t.jsx)(n.code,{children:"uv"})]}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Optional: If you want to use a pre-populated ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),", create one at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"})," before starting OpenRAG."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"uv-pip-install",children:"Use uv pip install"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Activate your virtual environment."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install the OpenRAG Python package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv pip install openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Optional: If you want to use a pre-populated ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),", create one at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"})," before starting OpenRAG."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Set up OpenRAG with the TUI"}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uv"}),", you manage the OpenRAG services with the TUI.\nThe TUI guides you through the initial configuration process before you start the OpenRAG services."]}),"\n",(0,t.jsxs)(n.p,{children:["Your configuration values are stored in an ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]})," that is created automatically at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf OpenRAG detects an existing ",(0,t.jsx)(n.code,{children:".env"})," file in this directory, then the TUI can populate those values automatically during setup and onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Container definitions are stored in the ",(0,t.jsx)(n.code,{children:"docker-compose"})," files in the same directory as the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsx)(u.Ay,{})]})}function f(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(g,{...e})}):g(e)}},3059:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,r.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Language models"}),": ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,r.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you choose ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Embedding models"}),": ",(0,r.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,r.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,r.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,r.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,r.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},3351:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453),o=s(3059);const i=[...o.RM];function a(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,r.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(o.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,r.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4042:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},6149:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,r.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},7637:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No-auth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," doesn't include OAuth credentials, then the OpenRAG OpenSearch instance runs in no-auth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses one anonymous JWT token for OpenSearch authentication.\nThere is no differentiation between users; all users that access your OpenRAG instance can access all documents uploaded to your knowledge base."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OAuth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," includes OAuth credentials, then the OpenRAG OpenSearch instance runs in OAuth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses a unique JWT token for each OpenRAG user, and each document is tagged with user ownership.\nDocuments are filtered by user owner; users see only the documents that they uploaded or have access to through their cloud storage accounts."}),"\n",(0,r.jsxs)(n.p,{children:["To enable OAuth mode after initial setup, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(7856),t=s(4848);function o({name:e,...n}){const s=r[e];return s?(0,t.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var o=s(4848);function i({children:e,hidden:n,className:s}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/441f609b.ae58055a.js b/assets/js/441f609b.ae58055a.js deleted file mode 100644 index 75656eb2..00000000 --- a/assets/js/441f609b.ae58055a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[8617],{309:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:(0,r.jsx)(n.code,{children:"podman-compose"})})," or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"}),".\nTo use Docker Compose with Podman, you must alias Docker Compose commands to Podman commands."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},887:(e,n,s)=>{s.d(n,{Ay:()=>h,RM:()=>c});var r=s(4848),t=s(8453),i=s(9179),o=s(1470),l=s(9365),a=s(3059);const c=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...a.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,r.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,r.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,r.jsxs)(o.A,{groupId:"Provider",children:[(0,r.jsxs)(l.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})," in your OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(l.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Use the values from your IBM watsonx deployment for the ",(0,r.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", ",(0,r.jsx)(n.strong,{children:"IBM Project ID"}),", and ",(0,r.jsx)(n.strong,{children:"IBM API key"})," fields."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"WATSONX_API_KEY"}),", ",(0,r.jsx)(n.code,{children:"WATSONX_API_URL"}),", or ",(0,r.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})," in your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),", these values can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,r.jsxs)(l.A,{value:"Ollama",label:"Ollama",children:[(0,r.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(a.Ay,{})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In OpenRAG onboarding, connect to your Ollama server:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,r.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If the connection succeeds, OpenRAG populates the model lists with the server's available models."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select the model that your Ollama server is running."}),"\n",(0,r.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,r.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses the address and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(l.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"OPENAI_API_KEY"})," in your OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},927:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[{value:"Next steps",id:"next-steps",level:2}];function o(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Learn how to ",(0,r.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),i=s(7559),o=s(3104),l=s(6347),a=s(205),c=s(7485),d=s(1682),h=s(679);function u(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function x({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const s=(0,l.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function j(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,i=p(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:i})),[c,d]=m({queryString:s,groupId:t}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,h.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),f=(()=>{const e=c??u;return x({value:e,tabValues:i})?e:null})();(0,a.A)(()=>{f&&l(f)},[f]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!x({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),j(e)},[d,j,i]),tabValues:i}}var f=s(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=s(4848);function y({className:e,block:n,selectedValue:s,selectValue:r,tabValues:i}){const l=[],{blockElementScrollPositionUntilNextRender:a}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),o=i[t].value;o!==s&&(a(n),r(o))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;n=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;n=l[s]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...r,className:(0,t.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:s}){const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:i.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function b(e){const n=j(e);return(0,v.jsxs)("div",{className:(0,t.A)(i.G.tabs.container,"tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(A,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,v.jsx)(b,{...e,children:u(e.children)},String(n))}},2061:(e,n,s)=>{s.d(n,{Ay:()=>d,RM:()=>a});var r=s(4848),t=s(8453),i=s(1470),o=s(9365),l=s(7637);const a=[...l.RM];function c(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["You can use either ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," to configure OpenRAG.\nThis choice determines how OpenRAG authenticates with your deployment's ",(0,r.jsx)(n.a,{href:"/knowledge",children:"OpenSearch instance"}),", and it controls user access to documents stored in your OpenSearch knowledge base:"]}),"\n",(0,r.jsx)(l.Ay,{}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You must use ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," if you want to ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"use OAuth connectors to upload documents from cloud storage"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["If OpenRAG detects OAuth credentials during setup, it recommends ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the TUI."]}),"\n",(0,r.jsxs)(i.A,{groupId:"Setup method",children:[(0,r.jsx)(o.A,{value:"Basic setup",label:"Basic setup",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or press ",(0,r.jsx)("kbd",{children:"1"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to generate passwords automatically."]}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process."}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing the key now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration.\nIf you want to use a different model provider, you can leave this field empty."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords and API key, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start All Services"})," to start the OpenRAG services that run in containers."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Launch the OpenRAG application:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In your browser, navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})}),(0,r.jsx)(o.A,{value:"Advanced setup",label:"Advanced setup",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," or press ",(0,r.jsx)("kbd",{children:"2"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to generate passwords automatically."]}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process."}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing the key now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration.\nIf you want to use a different model provider, you can leave this field empty."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use. These settings can be populated automatically if OpenRAG detects these credentials in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,r.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,r.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"The OpenRAG TUI presents redirect URIs for your OAuth app.\nThese are the URLs your OAuth provider will redirect back to after user sign-in.\nRegister these redirect values with your OAuth provider as they are presented in the TUI."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords, API key, and OAuth credentials, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start All Services"})," to start the OpenRAG services that run in containers."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Launch the OpenRAG application:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In your browser, navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If required, you can edit the following additional environment variables.\nOnly change these variables if your OpenRAG deployment has a non-default network configuration, such as a reverse proxy or custom domain."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"}),": Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL"}),": Sets the base address for the following OpenRAG OAuth connector endpoints:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Amazon S3: Not applicable."}),"\n",(0,r.jsxs)(n.li,{children:["Google Drive: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/google_drive/webhook"})]}),"\n",(0,r.jsxs)(n.li,{children:["OneDrive: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/onedrive/webhook"})]}),"\n",(0,r.jsxs)(n.li,{children:["SharePoint: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/sharepoint/webhook"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})})]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},2068:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>x,default:()=>g,frontMatter:()=>p,metadata:()=>r,toc:()=>j});const r=JSON.parse('{"id":"get-started/install-uv","title":"Install OpenRAG in a Python project with uv","description":"Use uv to install OpenRAG as a managed or unmanaged dependency in a new or existing Python project.","source":"@site/docs/get-started/install-uv.mdx","sourceDirName":"get-started","slug":"/install-uv","permalink":"/install-uv","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/install-uv.mdx","tags":[],"version":"current","frontMatter":{"title":"Install OpenRAG in a Python project with uv","slug":"/install-uv"},"sidebar":"tutorialSidebar","previous":{"title":"Run the installer script","permalink":"/install"},"next":{"title":"Invoke OpenRAG with uvx","permalink":"/install-uvx"}}');var t=s(4848),i=s(8453),o=(s(1470),s(9365),s(887)),l=s(2061),a=s(3351),c=s(309),d=s(6149),h=s(4042),u=s(927);s(7637),s(3059);const p={title:"Install OpenRAG in a Python project with uv",slug:"/install-uv"},x=void 0,m={},j=[{value:"Prerequisites",id:"prerequisites",level:2},...d.RM,...h.RM,...c.RM,...a.RM,{value:"Install and start OpenRAG with uv",id:"install-and-start-openrag-with-uv",level:2},{value:"Use uv add",id:"uv-add",level:3},{value:"Use uv pip install",id:"uv-pip-install",level:3},{value:"Set up OpenRAG with the TUI",id:"setup",level:2},...l.RM,...o.RM,...u.RM];function f(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:(0,t.jsx)(n.code,{children:"uv"})})," to install OpenRAG as a managed or unmanaged dependency in a new or existing Python project."]}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uv"}),", you will use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to configure and manage your OpenRAG deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["For other installation methods, see ",(0,t.jsx)(n.a,{href:"/install-options",children:"Select an installation method"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(h.Ay,{}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"install-and-start-openrag-with-uv",children:"Install and start OpenRAG with uv"}),"\n",(0,t.jsxs)(n.p,{children:["There are two ways to install OpenRAG with ",(0,t.jsx)(n.code,{children:"uv"}),":"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.a,{href:"#uv-add",children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"uv add"})})," (Recommended)"]}),": Install OpenRAG as a managed dependency in a new or existing ",(0,t.jsx)(n.code,{children:"uv"})," Python project.\nThis is recommended because it adds OpenRAG to your ",(0,t.jsx)(n.code,{children:"pyproject.toml"})," and lockfile for better management of dependencies and the virtual environment."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"#uv-pip-install",children:(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"uv pip install"})})}),": Use the ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/pip/",children:[(0,t.jsx)(n.code,{children:"uv pip"})," interface"]})," to install OpenRAG into an existing Python project that uses ",(0,t.jsx)(n.code,{children:"pip"}),", ",(0,t.jsx)(n.code,{children:"pip-tools"}),", and ",(0,t.jsx)(n.code,{children:"virtualenv"})," commands."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you encounter errors during installation, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h3,{id:"uv-add",children:"Use uv add"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Create a new ",(0,t.jsx)(n.code,{children:"uv"}),"-managed Python project:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv init PROJECT_NAME\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Change into your new project directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd PROJECT_NAME\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Because ",(0,t.jsx)(n.code,{children:"uv"})," manages the virtual environment for you, you won't see a ",(0,t.jsx)(n.code,{children:"(venv)"})," prompt.\n",(0,t.jsx)(n.code,{children:"uv"})," commands automatically use the project's virtual environment."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add OpenRAG to your project:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add the latest version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add a specific version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add openrag==0.1.30\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Add a local wheel:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add path/to/openrag-VERSION-py3-none-any.whl\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For more options, see ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/concepts/projects/dependencies/",children:["Managing dependencies with ",(0,t.jsx)(n.code,{children:"uv"})]}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Optional: If you want to use a pre-populated ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),", create one at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"})," before starting OpenRAG."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h3,{id:"uv-pip-install",children:"Use uv pip install"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Activate your virtual environment."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install the OpenRAG Python package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv pip install openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Optional: If you want to use a pre-populated ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),", create one at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"})," before starting OpenRAG."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Set up OpenRAG with the TUI"}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uv"}),", you manage the OpenRAG services with the TUI.\nThe TUI guides you through the initial configuration process before you start the OpenRAG services."]}),"\n",(0,t.jsxs)(n.p,{children:["Your configuration values are stored in an ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]})," that is created automatically at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf OpenRAG detects an existing ",(0,t.jsx)(n.code,{children:".env"})," file in this directory, then the TUI can populate those values automatically during setup and onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Container definitions are stored in the ",(0,t.jsx)(n.code,{children:"docker-compose"})," files in the same directory as the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(o.Ay,{}),"\n",(0,t.jsx)(u.Ay,{})]})}function g(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(f,{...e})}):f(e)}},3059:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,r.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Language models"}),": ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,r.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you choose ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Embedding models"}),": ",(0,r.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,r.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,r.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,r.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,r.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},3351:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453),i=s(3059);const o=[...i.RM];function l(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,r.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(i.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,r.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(l,{...e})}):l(e)}},4042:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},6149:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,r.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},7637:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No-auth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," doesn't include OAuth credentials, then the OpenRAG OpenSearch instance runs in no-auth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses one anonymous JWT token for OpenSearch authentication.\nThere is no differentiation between users; all users that access your OpenRAG instance can access all documents uploaded to your knowledge base."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OAuth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," includes OAuth credentials, then the OpenRAG OpenSearch instance runs in OAuth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses a unique JWT token for each OpenRAG user, and each document is tagged with user ownership.\nDocuments are filtered by user owner; users see only the documents that they uploaded or have access to through their cloud storage accounts."}),"\n",(0,r.jsxs)(n.p,{children:["To enable OAuth mode after initial setup, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var r=s(7856),t=s(4848);function i({name:e,...n}){const s=r[e];return s?(0,t.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var i=s(4848);function o({children:e,hidden:n,className:s}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/4ba45368.1fce6090.js b/assets/js/4ba45368.1fce6090.js deleted file mode 100644 index dbae5de5..00000000 --- a/assets/js/4ba45368.1fce6090.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6976],{309:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:(0,r.jsx)(n.code,{children:"podman-compose"})})," or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"}),".\nTo use Docker Compose with Podman, you must alias Docker Compose commands to Podman commands."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},887:(e,n,s)=>{s.d(n,{Ay:()=>h,RM:()=>c});var r=s(4848),t=s(8453),o=s(9179),i=s(1470),a=s(9365),l=s(3059);const c=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...l.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,r.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,r.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,r.jsxs)(i.A,{groupId:"Provider",children:[(0,r.jsxs)(a.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})," in your OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Use the values from your IBM watsonx deployment for the ",(0,r.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", ",(0,r.jsx)(n.strong,{children:"IBM Project ID"}),", and ",(0,r.jsx)(n.strong,{children:"IBM API key"})," fields."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"WATSONX_API_KEY"}),", ",(0,r.jsx)(n.code,{children:"WATSONX_API_URL"}),", or ",(0,r.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})," in your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),", these values can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,r.jsxs)(a.A,{value:"Ollama",label:"Ollama",children:[(0,r.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(l.Ay,{})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In OpenRAG onboarding, connect to your Ollama server:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,r.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If the connection succeeds, OpenRAG populates the model lists with the server's available models."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select the model that your Ollama server is running."}),"\n",(0,r.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,r.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses the address and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"OPENAI_API_KEY"})," in your OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},927:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[{value:"Next steps",id:"next-steps",level:2}];function i(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Learn how to ",(0,r.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),o=s(7559),i=s(3104),a=s(6347),l=s(205),c=s(7485),d=s(1682),h=s(679);function u(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function x({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const s=(0,a.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function j(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,o=p(e),[i,a]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:o})),[c,d]=m({queryString:s,groupId:t}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,h.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),f=(()=>{const e=c??u;return x({value:e,tabValues:o})?e:null})();(0,l.A)(()=>{f&&a(f)},[f]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!x({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);a(e),d(e),j(e)},[d,j,o]),tabValues:o}}var f=s(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=s(4848);function y({className:e,block:n,selectedValue:s,selectValue:r,tabValues:o}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),c=e=>{const n=e.currentTarget,t=a.indexOf(n),i=o[t].value;i!==s&&(l(n),r(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=a.indexOf(e.currentTarget)+1;n=a[s]??a[0];break}case"ArrowLeft":{const s=a.indexOf(e.currentTarget)-1;n=a[s]??a[a.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:c,...r,className:(0,t.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:s}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function b(e){const n=j(e);return(0,v.jsxs)("div",{className:(0,t.A)(o.G.tabs.container,"tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(A,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,v.jsx)(b,{...e,children:u(e.children)},String(n))}},2061:(e,n,s)=>{s.d(n,{Ay:()=>d,RM:()=>l});var r=s(4848),t=s(8453),o=s(1470),i=s(9365),a=s(7637);const l=[...a.RM];function c(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["You can use either ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," to configure OpenRAG.\nThis choice determines how OpenRAG authenticates with your deployment's ",(0,r.jsx)(n.a,{href:"/knowledge",children:"OpenSearch instance"}),", and it controls user access to documents stored in your OpenSearch knowledge base:"]}),"\n",(0,r.jsx)(a.Ay,{}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You must use ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," if you want to ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"use OAuth connectors to upload documents from cloud storage"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["If OpenRAG detects OAuth credentials during setup, it recommends ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the TUI."]}),"\n",(0,r.jsxs)(o.A,{groupId:"Setup method",children:[(0,r.jsx)(i.A,{value:"Basic setup",label:"Basic setup",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or press ",(0,r.jsx)("kbd",{children:"1"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to generate passwords automatically."]}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process."}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing the key now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration.\nIf you want to use a different model provider, you can leave this field empty."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords and API key, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start All Services"})," to start the OpenRAG services that run in containers."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Launch the OpenRAG application:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In your browser, navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})}),(0,r.jsx)(i.A,{value:"Advanced setup",label:"Advanced setup",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," or press ",(0,r.jsx)("kbd",{children:"2"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to generate passwords automatically."]}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process."}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing the key now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration.\nIf you want to use a different model provider, you can leave this field empty."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use. These settings can be populated automatically if OpenRAG detects these credentials in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,r.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,r.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"The OpenRAG TUI presents redirect URIs for your OAuth app.\nThese are the URLs your OAuth provider will redirect back to after user sign-in.\nRegister these redirect values with your OAuth provider as they are presented in the TUI."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords, API key, and OAuth credentials, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start All Services"})," to start the OpenRAG services that run in containers."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Launch the OpenRAG application:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In your browser, navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If required, you can edit the following additional environment variables.\nOnly change these variables if your OpenRAG deployment has a non-default network configuration, such as a reverse proxy or custom domain."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"}),": Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL"}),": Sets the base address for the following OpenRAG OAuth connector endpoints:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Amazon S3: Not applicable."}),"\n",(0,r.jsxs)(n.li,{children:["Google Drive: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/google_drive/webhook"})]}),"\n",(0,r.jsxs)(n.li,{children:["OneDrive: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/onedrive/webhook"})]}),"\n",(0,r.jsxs)(n.li,{children:["SharePoint: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/sharepoint/webhook"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})})]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3059:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,r.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Language models"}),": ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,r.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you choose ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Embedding models"}),": ",(0,r.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,r.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,r.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,r.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,r.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},3351:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453),o=s(3059);const i=[...o.RM];function a(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,r.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(o.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,r.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4042:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},6149:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,r.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},7637:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No-auth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," doesn't include OAuth credentials, then the OpenRAG OpenSearch instance runs in no-auth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses one anonymous JWT token for OpenSearch authentication.\nThere is no differentiation between users; all users that access your OpenRAG instance can access all documents uploaded to your knowledge base."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OAuth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," includes OAuth credentials, then the OpenRAG OpenSearch instance runs in OAuth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses a unique JWT token for each OpenRAG user, and each document is tagged with user ownership.\nDocuments are filtered by user owner; users see only the documents that they uploaded or have access to through their cloud storage accounts."}),"\n",(0,r.jsxs)(n.p,{children:["To enable OAuth mode after initial setup, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},9081:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>x,default:()=>g,frontMatter:()=>p,metadata:()=>r,toc:()=>j});const r=JSON.parse('{"id":"get-started/install-uvx","title":"Invoke OpenRAG with uvx","description":"Use uvx to invoke OpenRAG outside of a Python project or without modifying your project\'s dependencies.","source":"@site/docs/get-started/install-uvx.mdx","sourceDirName":"get-started","slug":"/install-uvx","permalink":"/install-uvx","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/install-uvx.mdx","tags":[],"version":"current","frontMatter":{"title":"Invoke OpenRAG with uvx","slug":"/install-uvx"},"sidebar":"tutorialSidebar","previous":{"title":"Install OpenRAG with uv","permalink":"/install-uv"},"next":{"title":"Install OpenRAG on Windows","permalink":"/install-windows"}}');var t=s(4848),o=s(8453),i=(s(1470),s(9365),s(887)),a=s(2061),l=s(3351),c=s(309),d=s(6149),h=s(4042),u=s(927);s(7637),s(3059);const p={title:"Invoke OpenRAG with uvx",slug:"/install-uvx"},x=void 0,m={},j=[{value:"Prerequisites",id:"prerequisites",level:2},...d.RM,...h.RM,...c.RM,...l.RM,{value:"Install and run OpenRAG with uvx",id:"install-and-run-openrag-with-uvx",level:2},{value:"Set up OpenRAG with the TUI",id:"setup",level:2},...a.RM,...i.RM,...u.RM];function f(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#running-tools",children:(0,t.jsx)(n.code,{children:"uvx"})})," to invoke OpenRAG outside of a Python project or without modifying your project's dependencies."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.a,{href:"/install",children:"automatic installer script"})," also uses ",(0,t.jsx)(n.code,{children:"uvx"})," to install OpenRAG."]})}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx"}),", you will use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to configure and manage your OpenRAG deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["This installation method is best for testing OpenRAG by running it outside of a Python project.\nFor other installation methods, see ",(0,t.jsx)(n.a,{href:"/install-options",children:"Select an installation method"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(h.Ay,{}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"install-and-run-openrag-with-uvx",children:"Install and run OpenRAG with uvx"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a directory to store your OpenRAG configuration files and data, and then change to that directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir openrag-workspace\ncd openrag-workspace\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Optional: If you want to use a pre-populated ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),", create one at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"})," before invoking OpenRAG."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Invoke OpenRAG:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx openrag\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can invoke a specific version using any of the ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#requesting-specific-versions",children:[(0,t.jsx)(n.code,{children:"uvx"})," version specifiers"]}),", such as ",(0,t.jsx)(n.code,{children:"--from"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx --from openrag==0.1.30 openrag\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Invoking OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx openrag"})," creates a cached, ephemeral environment for the TUI in your local ",(0,t.jsx)(n.code,{children:"uv"})," cache.\nBy invoking OpenRAG in a specific directory, your OpenRAG configuration files and data are stored separately from the ",(0,t.jsx)(n.code,{children:"uv"})," cache.\nClearing the ",(0,t.jsx)(n.code,{children:"uv"})," cache doesn't remove your entire OpenRAG installation.\nAfter clearing the cache, you can re-invoke OpenRAG (",(0,t.jsx)(n.code,{children:"uvx openrag"}),") to restart the TUI with your preserved configuration and data."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you encounter errors during installation, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Set up OpenRAG with the TUI"}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx"}),", you manage the OpenRAG services with the TUI.\nThe TUI guides you through the initial configuration process before you start the OpenRAG services."]}),"\n",(0,t.jsxs)(n.p,{children:["Your configuration values are stored in an ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]})," that is created automatically at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf OpenRAG detects an existing ",(0,t.jsx)(n.code,{children:".env"})," file in this directory, then the TUI can populate those values automatically during setup and onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Container definitions are stored in the ",(0,t.jsx)(n.code,{children:"docker-compose"})," files in the same directory as the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsx)(u.Ay,{})]})}function g(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(f,{...e})}):f(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(7856),t=s(4848);function o({name:e,...n}){const s=r[e];return s?(0,t.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var o=s(4848);function i({children:e,hidden:n,className:s}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/4ba45368.4168b16c.js b/assets/js/4ba45368.4168b16c.js new file mode 100644 index 00000000..b0d9b36b --- /dev/null +++ b/assets/js/4ba45368.4168b16c.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6976],{309:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Install ",(0,r.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:(0,r.jsx)(n.code,{children:"podman-compose"})})," or ",(0,r.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"}),".\nTo use Docker Compose with Podman, you must alias Docker Compose commands to Podman commands."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},887:(e,n,s)=>{s.d(n,{Ay:()=>h,RM:()=>d});var r=s(4848),t=s(8453),o=s(9179),i=s(1470),a=s(9365),l=s(3059);const d=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...l.RM];function c(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,r.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,r.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,r.jsxs)(i.A,{groupId:"Provider",children:[(0,r.jsxs)(a.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", select the base URL for your watsonx.ai model deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter your watsonx.ai deployment's project ID and API key."}),"\n",(0,r.jsxs)(n.p,{children:["You can enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,r.jsxs)(a.A,{value:"Ollama",label:"Ollama",children:[(0,r.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(l.Ay,{})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In the OpenRAG onboarding dialog, enter your Ollama server's base URL:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,r.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select the language model that your Ollama server is running."}),"\n",(0,r.jsx)(n.p,{children:"If your server isn't running any language models, you must either deploy a language model on your Ollama server, or use another provider for the language model."}),"\n",(0,r.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,r.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},927:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[{value:"Next steps",id:"next-steps",level:2}];function i(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Learn how to ",(0,r.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),o=s(7559),i=s(3104),a=s(6347),l=s(205),d=s(7485),c=s(1682),h=s(679);function u(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function x({value:e,tabValues:n}){return n.some(n=>n.value===e)}function m({queryString:e=!1,groupId:n}){const s=(0,a.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,d.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function j(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,o=p(e),[i,a]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!x({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:o})),[d,c]=m({queryString:s,groupId:t}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,h.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),f=(()=>{const e=d??u;return x({value:e,tabValues:o})?e:null})();(0,l.A)(()=>{f&&a(f)},[f]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!x({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);a(e),c(e),j(e)},[c,j,o]),tabValues:o}}var f=s(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=s(4848);function y({className:e,block:n,selectedValue:s,selectValue:r,tabValues:o}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),d=e=>{const n=e.currentTarget,t=a.indexOf(n),i=o[t].value;i!==s&&(l(n),r(i))},c=e=>{let n=null;switch(e.key){case"Enter":d(e);break;case"ArrowRight":{const s=a.indexOf(e.currentTarget)+1;n=a[s]??a[0];break}case"ArrowLeft":{const s=a.indexOf(e.currentTarget)-1;n=a[s]??a[a.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{a.push(e)},onKeyDown:c,onClick:d,...r,className:(0,t.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:s}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function b(e){const n=j(e);return(0,v.jsxs)("div",{className:(0,t.A)(o.G.tabs.container,"tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(A,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,v.jsx)(b,{...e,children:u(e.children)},String(n))}},2061:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var r=s(4848),t=s(8453),o=s(1470),i=s(9365),a=s(7637);const l=[...a.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["You can use either ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," to configure OpenRAG.\nThis choice determines how OpenRAG authenticates with your deployment's ",(0,r.jsx)(n.a,{href:"/knowledge",children:"OpenSearch instance"}),", and it controls user access to documents stored in your OpenSearch knowledge base:"]}),"\n",(0,r.jsx)(a.Ay,{}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You must use ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," if you want to ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"use OAuth connectors to upload documents from cloud storage"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["If OpenRAG detects OAuth credentials during setup, it recommends ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the TUI."]}),"\n",(0,r.jsxs)(o.A,{groupId:"Setup method",children:[(0,r.jsx)(i.A,{value:"Basic setup",label:"Basic setup",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, select ",(0,r.jsx)(n.strong,{children:"Basic Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter administrator passwords for the OpenRAG OpenSearch and Langflow services."}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow password and username automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"API Keys"}),", enter your model provider credentials, or leave these fields empty if you want to configure model provider credentials during the application onboarding process."]}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing these values now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a credential now, it can be populated automatically during the application onboarding process if you enable the ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," option."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"Others"}),", edit the ",(0,r.jsx)(n.a,{href:"/knowledge",children:"knowledge base"})," paths if you don't want to use the default paths:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documents Paths"}),": One or more paths to directories are where OpenRAG looks for documents to ingest."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OpenSearch Data PAth"}),": Specify the path where you want OpenRAG to create your OpenSearch index."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords and API keys, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," or navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"})," in your browser."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})}),(0,r.jsx)(i.A,{value:"Advanced setup",label:"Advanced setup",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter administrator passwords for the OpenRAG OpenSearch and Langflow services."}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow password and username automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"API Keys"}),", enter your model provider credentials, or leave the ",(0,r.jsx)(n.strong,{children:"OpenAI"}),", ",(0,r.jsx)(n.strong,{children:"Anthropic"}),", ",(0,r.jsx)(n.strong,{children:"Ollama"}),", and ",(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"})," fields empty if you want to configure model provider credentials during the application onboarding process."]}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing these values now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a credential now, it can be populated automatically during the application onboarding process if you enable the ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," option."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Recommended: To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use under ",(0,r.jsx)(n.strong,{children:"API Keys"}),". These settings can be populated automatically if OpenRAG detects these credentials in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,r.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,r.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Register the redirect URIs shown in the TUI in your OAuth provider.\nThese are the URLs your OAuth provider will use to redirect users back to OpenRAG after they sign in."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"Others"}),", you can edit the following settings if needed:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documents Paths"}),": Use the default path or provide one or more paths to directories are where OpenRAG looks for documents to ingest in to your ",(0,r.jsx)(n.a,{href:"/knowledge",children:"knowledge base"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OpenSearch Data Path"}),": Specify the path where you want OpenRAG to create your OpenSearch index."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Langflow Public URL (",(0,r.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"}),")"]})," : Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Webhook Base URL (",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL"}),")"]}),": If applicable, set the base address for your OAuth connector endpoints. If set, the OAuth connector webhook URLs are constructed as ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/${provider}/webhook"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords, API key, and OAuth credentials, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," or navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"})," in your browser."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})})]})]})}function c(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},3059:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,r.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Language models"}),": ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,r.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you choose ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Embedding models"}),": ",(0,r.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,r.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,r.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,r.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,r.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},3351:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453),o=s(3059);const i=[...o.RM];function a(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,r.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(o.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,r.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4042:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},6149:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,r.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},7637:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No-auth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," doesn't include OAuth credentials, then the OpenRAG OpenSearch instance runs in no-auth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses one anonymous JWT token for OpenSearch authentication.\nThere is no differentiation between users; all users that access your OpenRAG instance can access all documents uploaded to your knowledge base."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OAuth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," includes OAuth credentials, then the OpenRAG OpenSearch instance runs in OAuth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses a unique JWT token for each OpenRAG user, and each document is tagged with user ownership.\nDocuments are filtered by user owner; users see only the documents that they uploaded or have access to through their cloud storage accounts."}),"\n",(0,r.jsxs)(n.p,{children:["To enable OAuth mode after initial setup, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},9081:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>x,default:()=>g,frontMatter:()=>p,metadata:()=>r,toc:()=>j});const r=JSON.parse('{"id":"get-started/install-uvx","title":"Invoke OpenRAG with uvx","description":"Use uvx to invoke OpenRAG outside of a Python project or without modifying your project\'s dependencies.","source":"@site/docs/get-started/install-uvx.mdx","sourceDirName":"get-started","slug":"/install-uvx","permalink":"/install-uvx","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/install-uvx.mdx","tags":[],"version":"current","frontMatter":{"title":"Invoke OpenRAG with uvx","slug":"/install-uvx"},"sidebar":"tutorialSidebar","previous":{"title":"Install OpenRAG with uv","permalink":"/install-uv"},"next":{"title":"Install OpenRAG on Windows","permalink":"/install-windows"}}');var t=s(4848),o=s(8453),i=(s(1470),s(9365),s(887)),a=s(2061),l=s(3351),d=s(309),c=s(6149),h=s(4042),u=s(927);s(7637),s(3059);const p={title:"Invoke OpenRAG with uvx",slug:"/install-uvx"},x=void 0,m={},j=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...h.RM,...d.RM,...l.RM,{value:"Install and run OpenRAG with uvx",id:"install-and-run-openrag-with-uvx",level:2},{value:"Set up OpenRAG with the TUI",id:"setup",level:2},...a.RM,...i.RM,...u.RM];function f(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["Use ",(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#running-tools",children:(0,t.jsx)(n.code,{children:"uvx"})})," to invoke OpenRAG outside of a Python project or without modifying your project's dependencies."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.a,{href:"/install",children:"automatic installer script"})," also uses ",(0,t.jsx)(n.code,{children:"uvx"})," to install OpenRAG."]})}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx"}),", you will use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to configure and manage your OpenRAG deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["This installation method is best for testing OpenRAG by running it outside of a Python project.\nFor other installation methods, see ",(0,t.jsx)(n.a,{href:"/install-options",children:"Select an installation method"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(h.Ay,{}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"install-and-run-openrag-with-uvx",children:"Install and run OpenRAG with uvx"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a directory to store your OpenRAG configuration files and data, and then change to that directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir openrag-workspace\ncd openrag-workspace\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Optional: If you want to use a pre-populated ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),", create one at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"})," before invoking OpenRAG."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Invoke OpenRAG:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx openrag\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can invoke a specific version using any of the ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#requesting-specific-versions",children:[(0,t.jsx)(n.code,{children:"uvx"})," version specifiers"]}),", such as ",(0,t.jsx)(n.code,{children:"--from"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx --from openrag==0.1.30 openrag\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Invoking OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx openrag"})," creates a cached, ephemeral environment for the TUI in your local ",(0,t.jsx)(n.code,{children:"uv"})," cache.\nBy invoking OpenRAG in a specific directory, your OpenRAG configuration files and data are stored separately from the ",(0,t.jsx)(n.code,{children:"uv"})," cache.\nClearing the ",(0,t.jsx)(n.code,{children:"uv"})," cache doesn't remove your entire OpenRAG installation.\nAfter clearing the cache, you can re-invoke OpenRAG (",(0,t.jsx)(n.code,{children:"uvx openrag"}),") to restart the TUI with your preserved configuration and data."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you encounter errors during installation, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Set up OpenRAG with the TUI"}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx"}),", you manage the OpenRAG services with the TUI.\nThe TUI guides you through the initial configuration process before you start the OpenRAG services."]}),"\n",(0,t.jsxs)(n.p,{children:["Your configuration values are stored in an ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]})," that is created automatically at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf OpenRAG detects an existing ",(0,t.jsx)(n.code,{children:".env"})," file in this directory, then the TUI can populate those values automatically during setup and onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Container definitions are stored in the ",(0,t.jsx)(n.code,{children:"docker-compose"})," files in the same directory as the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsx)(u.Ay,{})]})}function g(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(f,{...e})}):f(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(7856),t=s(4848);function o({name:e,...n}){const s=r[e];return s?(0,t.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var o=s(4848);function i({children:e,hidden:n,className:s}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/52896773.66bfb2f3.js b/assets/js/52896773.66bfb2f3.js new file mode 100644 index 00000000..9d2866c0 --- /dev/null +++ b/assets/js/52896773.66bfb2f3.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6152],{937:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={admonition:"admonition",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsx)(n.p,{children:"This is a destructive operation that does the following:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Destroys all OpenRAG containers, volumes, and local images."}),"\n",(0,r.jsx)(n.li,{children:"Prunes any additional container objects."}),"\n",(0,r.jsxs)(n.li,{children:["Deletes the contents of the ",(0,r.jsx)(n.code,{children:"~/.openrag"})," directory ",(0,r.jsx)(n.em,{children:"except"})," for OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"/documents"})," subdirectory."]}),"\n"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)("p",{}),"Destroyed containers and deleted data are lost and cannot be recovered after running this operation."]})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1381:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},2046:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all containers, including stopped containers:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rm --force $(docker ps -aq)\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rm --all --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all images:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rmi --force $(docker images -q)\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rmi --all --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all volumes:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker volume prune --force\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman volume prune --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all networks except the default network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker network prune --force\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman network prune --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Clean up any leftover data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker system prune --all --force --volumes\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman system prune --all --force --volumes\n"})}),"\n"]}),"\n"]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4577:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop $(docker ps -q)\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop --all\n"})})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const o={},t=r.createContext(o);function a(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(t.Provider,{value:n},e.children)}},8500:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>m,default:()=>g,frontMatter:()=>p,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"get-started/reinstall","title":"Reinstall OpenRAG","description":"You can reset your OpenRAG deployment to its initial state by recreating the containers and deleting accessory data, such as the .env file and ingested documents.","source":"@site/docs/get-started/reinstall.mdx","sourceDirName":"get-started","slug":"/reinstall","permalink":"/reinstall","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/reinstall.mdx","tags":[],"version":"current","frontMatter":{"title":"Reinstall OpenRAG","slug":"/reinstall"},"sidebar":"tutorialSidebar","previous":{"title":"Upgrade OpenRAG","permalink":"/upgrade"},"next":{"title":"Remove OpenRAG","permalink":"/uninstall"}}');var o=s(4848),t=s(8453),a=s(1381),i=s(9809),c=s(4577),l=s(2046),d=s(937),h=s(9870);const p={title:"Reinstall OpenRAG",slug:"/reinstall"},m=void 0,u={},x=[{value:"Reinstall TUI-managed containers",id:"reinstall-tui-managed-containers",level:2},...h.RM,...d.RM,{value:"Reinstall self-managed containers with docker compose or podman compose",id:"reinstall-self-managed-containers-with-docker-compose-or-podman-compose",level:2},...h.RM,...d.RM,...i.RM,...a.RM,{value:"Reinstall self-managed containers with discrete docker or podman commands",id:"reinstall-self-managed-containers-with-discrete-docker-or-podman-commands",level:2},...h.RM,...c.RM,...l.RM];function j(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["You can reset your OpenRAG deployment to its initial state by recreating the containers and deleting accessory data, such as the ",(0,o.jsx)(n.code,{children:".env"})," file and ingested documents."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"These are destructive operations that reset your OpenRAG deployment to an initial state.\nDestroyed containers and deleted data are lost and cannot be recovered after running these operations."})}),"\n",(0,o.jsx)(n.h2,{id:"reinstall-tui-managed-containers",children:"Reinstall TUI-managed containers"}),"\n",(0,o.jsx)(h.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the TUI, click ",(0,o.jsx)(n.strong,{children:"Status"}),", and then click ",(0,o.jsx)(n.strong,{children:"Factory Reset"})," to ",(0,o.jsx)(n.a,{href:"/manage-services#reset-containers",children:"reset your OpenRAG containers"}),"."]}),"\n",(0,o.jsx)(d.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Press ",(0,o.jsx)("kbd",{children:"Esc"})," to close the ",(0,o.jsx)(n.strong,{children:"Status"})," page, and then press ",(0,o.jsx)("kbd",{children:"q"})," to exit the TUI."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Delete or edit ",(0,o.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG's ",(0,o.jsx)(n.code,{children:".env"})," file"]}),", which is stored at ",(0,o.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This file contains your OpenRAG configuration, including OpenRAG passwords, API keys, OAuth settings, and other environment variables. If you delete this file, the TUI automatically generates a new one after you repeat the setup and onboarding process. If you preserve this file, the TUI can read values from the existing ",(0,o.jsx)(n.code,{children:".env"})," file during setup and onboarding."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Remove any files from the ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"})," subdirectory that you don't want to reingest after redeploying the containers.\nIt is recommended that you preserve OpenRAG's ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/tree/main/openrag-documents",children:"default documents"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Restart the TUI with ",(0,o.jsx)(n.code,{children:"uv run openrag"})," or ",(0,o.jsx)(n.code,{children:"uvx openrag"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Repeat the ",(0,o.jsx)(n.a,{href:"/install#setup",children:"setup process"})," to configure OpenRAG and restart all services.\nThen, launch the OpenRAG app and repeat the ",(0,o.jsx)(n.a,{href:"/install#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.h2,{id:"reinstall-self-managed-containers-with-docker-compose-or-podman-compose",children:["Reinstall self-managed containers with ",(0,o.jsx)(n.code,{children:"docker compose"})," or ",(0,o.jsx)(n.code,{children:"podman compose"})]}),"\n",(0,o.jsxs)(n.p,{children:["Use these steps to reinstall OpenRAG containers with streamlined ",(0,o.jsx)(n.code,{children:"docker compose"})," or ",(0,o.jsx)(n.code,{children:"podman compose"})," commands:"]}),"\n",(0,o.jsx)(h.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Destroy the containers, volumes, and local images, and then remove (prune) any additional container objects."}),"\n",(0,o.jsx)(d.Ay,{}),"\n",(0,o.jsx)(i.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Edit OpenRAG's ",(0,o.jsx)(n.code,{children:".env"})," file if needed."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Remove any files from the ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"})," subdirectory that you don't want to reingest after redeploying the containers.\nIt is recommended that you preserve OpenRAG's ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/tree/main/openrag-documents",children:"default documents"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Redeploy OpenRAG:"}),"\n",(0,o.jsx)(a.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Launch the OpenRAG app, and then repeat the ",(0,o.jsx)(n.a,{href:"/docker#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.h2,{id:"reinstall-self-managed-containers-with-discrete-docker-or-podman-commands",children:["Reinstall self-managed containers with discrete ",(0,o.jsx)(n.code,{children:"docker"})," or ",(0,o.jsx)(n.code,{children:"podman"})," commands"]}),"\n",(0,o.jsxs)(n.p,{children:["Use these commands to remove and clean up OpenRAG containers with discrete ",(0,o.jsx)(n.code,{children:"docker"})," or ",(0,o.jsx)(n.code,{children:"podman"})," commands."]}),"\n",(0,o.jsx)(n.p,{children:"If you want to reinstall one container, specify the container name in the commands instead of running the commands on all containers."}),"\n",(0,o.jsx)(h.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Stop all running containers:"}),"\n",(0,o.jsx)(c.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove and clean up containers:"}),"\n",(0,o.jsx)(l.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Edit OpenRAG's ",(0,o.jsx)(n.code,{children:".env"})," file if needed."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: If you removed all containers or specifically the OpenSearch container, then you can remove any files from the ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"})," subdirectory that you don't want to reingest after redeploying the containers.\nIt is recommended that you preserve OpenRAG's ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/tree/main/openrag-documents",children:"default documents"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If you removed all OpenRAG containers, ",(0,o.jsx)(n.a,{href:"/docker",children:"redeploy OpenRAG"}),".\nIf you removed only one container, redeploy that container with the appropriate ",(0,o.jsx)(n.code,{children:"docker run"})," or ",(0,o.jsx)(n.code,{children:"podman run"})," command."]}),"\n"]}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(j,{...e})}):j(e)}},9809:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose down --volumes --remove-orphans --rmi local\npodman system prune -f\n"})})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},9870:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={a:"a",li:"li",ol:"ol",...(0,o.R)(),...e.components};return(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["If you modified the built-in flows or created custom flows in your ",(0,r.jsx)(n.a,{href:"/agents",children:"OpenRAG Langflow instance"}),", and you want to preserve those changes, then you must ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed."]}),"\n"]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/52896773.a3757d4b.js b/assets/js/52896773.a3757d4b.js deleted file mode 100644 index 56818406..00000000 --- a/assets/js/52896773.a3757d4b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6152],{937:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={admonition:"admonition",code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,o.R)(),...e.components};return(0,r.jsxs)(n.admonition,{type:"warning",children:[(0,r.jsx)(n.p,{children:"This is a destructive operation that does the following:"}),(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Destroys all OpenRAG containers, volumes, and local images."}),"\n",(0,r.jsx)(n.li,{children:"Prunes any additional container objects."}),"\n",(0,r.jsxs)(n.li,{children:["Deletes the contents of the ",(0,r.jsx)(n.code,{children:"~/.openrag"})," directory ",(0,r.jsx)(n.em,{children:"except"})," for OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"/documents"})," subdirectory."]}),"\n"]}),(0,r.jsxs)(n.p,{children:[(0,r.jsx)("p",{}),"Destroyed containers and deleted data are lost and cannot be recovered after running this operation."]})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},1381:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},2046:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(n.ol,{start:"2",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all containers, including stopped containers:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rm --force $(docker ps -aq)\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rm --all --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all images:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rmi --force $(docker images -q)\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rmi --all --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all volumes:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker volume prune --force\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman volume prune --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove all networks except the default network:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker network prune --force\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman network prune --force\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Clean up any leftover data:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker system prune --all --force --volumes\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman system prune --all --force --volumes\n"})}),"\n"]}),"\n"]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4577:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop $(docker ps -q)\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop --all\n"})})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>a,x:()=>i});var r=s(6540);const o={},t=r.createContext(o);function a(e){const n=r.useContext(t);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),r.createElement(t.Provider,{value:n},e.children)}},8500:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>m,default:()=>g,frontMatter:()=>p,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"get-started/reinstall","title":"Reinstall OpenRAG","description":"You can reset your OpenRAG deployment to its initial state by recreating the containers and deleting accessory data, such as the .env file and ingested documents.","source":"@site/docs/get-started/reinstall.mdx","sourceDirName":"get-started","slug":"/reinstall","permalink":"/reinstall","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/reinstall.mdx","tags":[],"version":"current","frontMatter":{"title":"Reinstall OpenRAG","slug":"/reinstall"},"sidebar":"tutorialSidebar","previous":{"title":"Upgrade OpenRAG","permalink":"/upgrade"},"next":{"title":"Remove OpenRAG","permalink":"/uninstall"}}');var o=s(4848),t=s(8453),a=s(1381),i=s(9809),c=s(4577),l=s(2046),d=s(937),h=s(9870);const p={title:"Reinstall OpenRAG",slug:"/reinstall"},m=void 0,u={},x=[{value:"Reinstall TUI-managed containers",id:"reinstall-tui-managed-containers",level:2},...h.RM,...d.RM,{value:"Reinstall self-managed containers with docker compose or podman compose",id:"reinstall-self-managed-containers-with-docker-compose-or-podman-compose",level:2},...h.RM,...d.RM,...i.RM,...a.RM,{value:"Reinstall self-managed containers with discrete docker or podman commands",id:"reinstall-self-managed-containers-with-discrete-docker-or-podman-commands",level:2},...h.RM,...c.RM,...l.RM];function j(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["You can reset your OpenRAG deployment to its initial state by recreating the containers and deleting accessory data, such as the ",(0,o.jsx)(n.code,{children:".env"})," file and ingested documents."]}),"\n",(0,o.jsx)(n.admonition,{type:"warning",children:(0,o.jsx)(n.p,{children:"These are destructive operations that reset your OpenRAG deployment to an initial state.\nDestroyed containers and deleted data are lost and cannot be recovered after running these operations."})}),"\n",(0,o.jsx)(n.h2,{id:"reinstall-tui-managed-containers",children:"Reinstall TUI-managed containers"}),"\n",(0,o.jsx)(h.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["In the TUI's ",(0,o.jsx)(n.strong,{children:"Status"})," menu (",(0,o.jsx)("kbd",{children:"3"}),"), click ",(0,o.jsx)(n.strong,{children:"Factory Reset"})," to ",(0,o.jsx)(n.a,{href:"/manage-services#reset-containers",children:"reset your OpenRAG containers"}),"."]}),"\n",(0,o.jsx)(d.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Exit the TUI with ",(0,o.jsx)("kbd",{children:"q"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Delete or edit ",(0,o.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG's ",(0,o.jsx)(n.code,{children:".env"})," file"]}),", which is stored at ",(0,o.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["This file contains your OpenRAG configuration, including OpenRAG passwords, API keys, OAuth settings, and other environment variables. If you delete this file, the TUI automatically generates a new one after you repeat the setup and onboarding process. If you preserve this file, the TUI can read values from the existing ",(0,o.jsx)(n.code,{children:".env"})," file during setup and onboarding."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Remove any files from the ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"})," subdirectory that you don't want to reingest after redeploying the containers.\nIt is recommended that you preserve OpenRAG's ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/tree/main/openrag-documents",children:"default documents"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Restart the TUI with ",(0,o.jsx)(n.code,{children:"uv run openrag"})," or ",(0,o.jsx)(n.code,{children:"uvx openrag"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Repeat the ",(0,o.jsx)(n.a,{href:"/install#setup",children:"setup process"})," to configure OpenRAG and restart all services.\nThen, launch the OpenRAG app and repeat the ",(0,o.jsx)(n.a,{href:"/install#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.h2,{id:"reinstall-self-managed-containers-with-docker-compose-or-podman-compose",children:["Reinstall self-managed containers with ",(0,o.jsx)(n.code,{children:"docker compose"})," or ",(0,o.jsx)(n.code,{children:"podman compose"})]}),"\n",(0,o.jsxs)(n.p,{children:["Use these steps to reinstall OpenRAG containers with streamlined ",(0,o.jsx)(n.code,{children:"docker compose"})," or ",(0,o.jsx)(n.code,{children:"podman compose"})," commands:"]}),"\n",(0,o.jsx)(h.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Destroy the containers, volumes, and local images, and then remove (prune) any additional container objects."}),"\n",(0,o.jsx)(d.Ay,{}),"\n",(0,o.jsx)(i.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Edit OpenRAG's ",(0,o.jsx)(n.code,{children:".env"})," file if needed."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Remove any files from the ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"})," subdirectory that you don't want to reingest after redeploying the containers.\nIt is recommended that you preserve OpenRAG's ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/tree/main/openrag-documents",children:"default documents"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Redeploy OpenRAG:"}),"\n",(0,o.jsx)(a.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Launch the OpenRAG app, and then repeat the ",(0,o.jsx)(n.a,{href:"/docker#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.h2,{id:"reinstall-self-managed-containers-with-discrete-docker-or-podman-commands",children:["Reinstall self-managed containers with discrete ",(0,o.jsx)(n.code,{children:"docker"})," or ",(0,o.jsx)(n.code,{children:"podman"})," commands"]}),"\n",(0,o.jsxs)(n.p,{children:["Use these commands to remove and clean up OpenRAG containers with discrete ",(0,o.jsx)(n.code,{children:"docker"})," or ",(0,o.jsx)(n.code,{children:"podman"})," commands."]}),"\n",(0,o.jsx)(n.p,{children:"If you want to reinstall one container, specify the container name in the commands instead of running the commands on all containers."}),"\n",(0,o.jsx)(h.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Stop all running containers:"}),"\n",(0,o.jsx)(c.Ay,{}),"\n"]}),"\n"]}),"\n",(0,o.jsx)(l.Ay,{}),"\n",(0,o.jsxs)(n.ol,{start:"8",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: Edit OpenRAG's ",(0,o.jsx)(n.code,{children:".env"})," file if needed."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Optional: If you removed all containers or specifically the OpenSearch container, then you can remove any files from the ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"})," subdirectory that you don't want to reingest after redeploying the containers.\nIt is recommended that you preserve OpenRAG's ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/tree/main/openrag-documents",children:"default documents"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If you removed all OpenRAG containers, ",(0,o.jsx)(n.a,{href:"/docker",children:"redeploy OpenRAG"}),".\nIf you removed only one container, redeploy that container with the appropriate ",(0,o.jsx)(n.code,{children:"docker run"})," or ",(0,o.jsx)(n.code,{children:"podman run"})," command."]}),"\n"]}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(j,{...e})}):j(e)}},9809:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose down --volumes --remove-orphans --rmi local\npodman system prune -f\n"})})]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},9870:(e,n,s)=>{s.d(n,{Ay:()=>i,RM:()=>t});var r=s(4848),o=s(8453);const t=[];function a(e){const n={a:"a",li:"li",ol:"ol",...(0,o.R)(),...e.components};return(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["If you modified the built-in flows or created custom flows in your ",(0,r.jsx)(n.a,{href:"/agents",children:"OpenRAG Langflow instance"}),", and you want to preserve those changes, then you must ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed."]}),"\n"]})}function i(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/749371cc.676ec1ad.js b/assets/js/749371cc.676ec1ad.js new file mode 100644 index 00000000..891a3de9 --- /dev/null +++ b/assets/js/749371cc.676ec1ad.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[2272],{309:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:(0,s.jsx)(n.code,{children:"podman-compose"})})," or ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"}),".\nTo use Docker Compose with Podman, you must alias Docker Compose commands to Podman commands."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},887:(e,n,r)=>{r.d(n,{Ay:()=>h,RM:()=>c});var s=r(4848),t=r(8453),o=r(9179),i=r(1470),l=r(9365),a=r(3059);const c=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...a.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,s.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,s.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,s.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,s.jsxs)(i.A,{groupId:"Provider",children:[(0,s.jsxs)(l.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,s.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,s.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,s.jsx)(l.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["For ",(0,s.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", select the base URL for your watsonx.ai model deployment."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Enter your watsonx.ai deployment's project ID and API key."}),"\n",(0,s.jsxs)(n.p,{children:["You can enable ",(0,s.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,s.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,s.jsxs)(l.A,{value:"Ollama",label:"Ollama",children:[(0,s.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(a.Ay,{})}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,s.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"In the OpenRAG onboarding dialog, enter your Ollama server's base URL:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,s.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,s.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,s.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select the language model that your Ollama server is running."}),"\n",(0,s.jsx)(n.p,{children:"If your server isn't running any language models, you must either deploy a language model on your Ollama server, or use another provider for the language model."}),"\n",(0,s.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,s.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,s.jsx)(l.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,s.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,s.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},927:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[{value:"Next steps",id:"next-steps",level:2}];function i(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Learn how to ",(0,s.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},1470:(e,n,r)=>{r.d(n,{A:()=>w});var s=r(6540),t=r(4164),o=r(7559),i=r(3104),l=r(6347),a=r(205),c=r(7485),d=r(1682),h=r(679);function u(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,s.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function j(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,o=p(e),[i,l]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o})),[c,d]=x({queryString:r,groupId:t}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,h.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),f=(()=>{const e=c??u;return m({value:e,tabValues:o})?e:null})();(0,a.A)(()=>{f&&l(f)},[f]);return{selectedValue:i,selectValue:(0,s.useCallback)(e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),j(e)},[d,j,o]),tabValues:o}}var f=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=r(4848);function v({className:e,block:n,selectedValue:r,selectValue:s,tabValues:o}){const l=[],{blockElementScrollPositionUntilNextRender:a}=(0,i.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),i=o[t].value;i!==r&&(a(n),s(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;n=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;n=l[r]??l[l.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:s})=>(0,y.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...s,className:(0,t.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function b({lazy:e,children:n,selectedValue:r}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function A(e){const n=j(e);return(0,y.jsxs)("div",{className:(0,t.A)(o.G.tabs.container,"tabs-container",g.tabList),children:[(0,y.jsx)(v,{...n,...e}),(0,y.jsx)(b,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,y.jsx)(A,{...e,children:u(e.children)},String(n))}},3059:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,s.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Language models"}),": ",(0,s.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,s.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you choose ",(0,s.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Embedding models"}),": ",(0,s.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,s.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,s.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,s.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},3351:(e,n,r)=>{r.d(n,{Ay:()=>a,RM:()=>i});var s=r(4848),t=r(8453),o=r(3059);const i=[...o.RM];function l(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,s.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,s.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,s.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(o.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,s.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},4042:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},5788:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>f,frontMatter:()=>u,metadata:()=>s,toc:()=>x});const s=JSON.parse('{"id":"get-started/docker","title":"Deploy OpenRAG with self-managed services","description":"To manage your own OpenRAG services, deploy OpenRAG with Docker or Podman.","source":"@site/docs/get-started/docker.mdx","sourceDirName":"get-started","slug":"/docker","permalink":"/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/docker.mdx","tags":[],"version":"current","frontMatter":{"title":"Deploy OpenRAG with self-managed services","slug":"/docker"},"sidebar":"tutorialSidebar","previous":{"title":"Install OpenRAG on Windows","permalink":"/install-windows"},"next":{"title":"Upgrade OpenRAG","permalink":"/upgrade"}}');var t=r(4848),o=r(8453),i=(r(1470),r(9365),r(887)),l=r(3351),a=r(309),c=r(6149),d=r(4042),h=r(927);r(3059);const u={title:"Deploy OpenRAG with self-managed services",slug:"/docker"},p=void 0,m={},x=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...d.RM,...a.RM,...l.RM,{value:"Prepare your deployment",id:"setup",level:2},{value:"Start services",id:"start-services",level:2},...i.RM,...h.RM];function j(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"To manage your own OpenRAG services, deploy OpenRAG with Docker or Podman."}),"\n",(0,t.jsxs)(n.p,{children:["Use this installation method if you don't want to ",(0,t.jsx)(n.a,{href:"/tui",children:"use the Terminal User Interface (TUI)"}),", or you need to run OpenRAG in an environment where using the TUI is unfeasible."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Prepare your deployment"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Clone the OpenRAG repository:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/langflow-ai/openrag.git\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Change to the root of the cloned repository:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv sync\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:".env"})," file at the root of the cloned repository."]}),"\n",(0,t.jsxs)(n.p,{children:["You can create an empty file or copy the repository's ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/.env.example",children:(0,t.jsx)(n.code,{children:".env.example"})})," file.\nThe example file contains some of the ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables"})," to get you started with configuring your deployment."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp .env.example .env\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Edit the ",(0,t.jsx)(n.code,{children:".env"})," file to configure your deployment using ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables"}),".\nThe OpenRAG Docker Compose files pull values from your ",(0,t.jsx)(n.code,{children:".env"})," file to configure the OpenRAG containers.\nThe following variables are required or recommended:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})," (Required)"]}),": Sets the OpenSearch administrator password. It must adhere to the ",(0,t.jsx)(n.a,{href:"https://docs.opensearch.org/latest/security/configuration/demo-configuration/#setting-up-a-custom-admin-password",children:"OpenSearch password complexity requirements"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})}),": The username for the Langflow administrator user. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," isn't set, then the default value is ",(0,t.jsx)(n.code,{children:"admin"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," (Strongly recommended)"]}),": Sets the Langflow administrator password, and determines the Langflow server's default authentication mode. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then the Langflow server starts without authentication enabled. For more information, see ",(0,t.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})," (Strongly recommended)"]}),": A secret encryption key for internal Langflow operations. It is recommended to ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-secret-key",children:"generate your own Langflow secret key"}),". If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})," isn't set, then Langflow generates a secret key automatically."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Model provider credentials"}),": Provide credentials for your preferred model providers. If none of these are set in the ",(0,t.jsx)(n.code,{children:".env"})," file, you must configure at least one provider during the ",(0,t.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"OPENAI_API_KEY"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"OLLAMA_ENDPOINT"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"WATSONX_API_KEY"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"WATSONX_ENDPOINT"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"OAuth provider credentials"}),": To upload documents from external storage, such as Google Drive, set the required OAuth credentials for the connectors that you want to use. You can ",(0,t.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up so you don't have to rebuild the containers."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,t.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,t.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For more information and variables, see ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"start-services",children:"Start services"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start ",(0,t.jsx)(n.code,{children:"docling serve"})," on port 5001 on the host machine:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py start --port 5001\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Docling cannot run inside a Docker container due to system-level dependencies, so you must manage it as a separate service on the host machine.\nFor more information, see ",(0,t.jsx)(n.a,{href:"/manage-services#start-native-services",children:"Stop, start, and inspect native services"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This port is required to deploy OpenRAG successfully; don't use a different port.\nAdditionally, this enables the ",(0,t.jsx)(n.a,{href:"https://opensource.apple.com/projects/mlx/",children:"MLX framework"})," for accelerated performance on Apple Silicon Mac machines."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Confirm ",(0,t.jsx)(n.code,{children:"docling serve"})," is running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py status\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"docling serve"})," is running, the output includes the status, address, and process ID (PID):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"Status: running\nEndpoint: http://127.0.0.1:5001\nDocs: http://127.0.0.1:5001/docs\nPID: 27746\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Deploy the OpenRAG containers locally using the appropriate Docker Compose file for your environment.\nBoth files deploy the same services."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose.yml",children:(0,t.jsx)(n.code,{children:"docker-compose.yml"})}),": If your host machine has an NVIDIA GPU with CUDA support and compatible NVIDIA drivers, you can use this file to deploy OpenRAG with accelerated processing."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose build\ndocker compose up -d\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose build\npodman compose up -d\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml",children:(0,t.jsx)(n.code,{children:"docker-compose-cpu.yml"})}),": If your host machine doesn't have NVIDIA GPU support, use this file for a CPU-only OpenRAG deployment."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose -f docker-compose-cpu.yml up -d\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose -f docker-compose-cpu.yml up -d\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Wait for the OpenRAG containers to start, and then confirm that all containers are running:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose ps\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose ps\n"})}),"\n",(0,t.jsx)(n.p,{children:"The OpenRAG Docker Compose files deploy the following containers:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Container Name"}),(0,t.jsx)(n.th,{children:"Default address"}),(0,t.jsx)(n.th,{children:"Purpose"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenRAG Backend"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:8000",children:"http://localhost:8000"})}),(0,t.jsx)(n.td,{children:"FastAPI server and core functionality."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenRAG Frontend"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:3000",children:"http://localhost:3000"})}),(0,t.jsx)(n.td,{children:"React web interface for user interaction."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Langflow"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:7860",children:"http://localhost:7860"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.a,{href:"/agents",children:"AI workflow engine"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenSearch"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:9200",children:"http://localhost:9200"})}),(0,t.jsxs)(n.td,{children:["Datastore for ",(0,t.jsx)(n.a,{href:"/knowledge",children:"knowledge"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenSearch Dashboards"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:5601",children:"http://localhost:5601"})}),(0,t.jsx)(n.td,{children:"OpenSearch database administration interface."})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"When the containers are running, you can access your OpenRAG services at their addresses."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Access the OpenRAG frontend at ",(0,t.jsx)(n.code,{children:"http://localhost:3000"}),", and then continue with the ",(0,t.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsx)(h.Ay,{})]})}function f(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(j,{...e})}):j(e)}},6149:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,s.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},9179:(e,n,r)=>{r.d(n,{A:()=>o});r(6540);var s=r(7856),t=r(4848);function o({name:e,...n}){const r=s[e];return r?(0,t.jsx)(r,{...n}):null}},9365:(e,n,r)=>{r.d(n,{A:()=>i});r(6540);var s=r(4164);const t={tabItem:"tabItem_Ymn6"};var o=r(4848);function i({children:e,hidden:n,className:r}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/749371cc.774b6a0c.js b/assets/js/749371cc.774b6a0c.js deleted file mode 100644 index b919cc21..00000000 --- a/assets/js/749371cc.774b6a0c.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[2272],{309:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.astral.sh/uv/getting-started/installation/",children:"uv"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://podman.io/docs/installation",children:"Podman"})," (recommended) or ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/get-docker/",children:"Docker"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Install ",(0,s.jsx)(n.a,{href:"https://docs.podman.io/en/latest/markdown/podman-compose.1.html",children:(0,s.jsx)(n.code,{children:"podman-compose"})})," or ",(0,s.jsx)(n.a,{href:"https://docs.docker.com/compose/install/",children:"Docker Compose"}),".\nTo use Docker Compose with Podman, you must alias Docker Compose commands to Podman commands."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},887:(e,n,r)=>{r.d(n,{Ay:()=>h,RM:()=>c});var s=r(4848),t=r(8453),o=r(9179),i=r(1470),l=r(9365),a=r(3059);const c=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...a.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,s.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,s.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,s.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,s.jsxs)(i.A,{groupId:"Provider",children:[(0,s.jsxs)(l.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,s.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,s.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you set ",(0,s.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})," in your OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,s.jsx)(l.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Use the values from your IBM watsonx deployment for the ",(0,s.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", ",(0,s.jsx)(n.strong,{children:"IBM Project ID"}),", and ",(0,s.jsx)(n.strong,{children:"IBM API key"})," fields."]}),"\n",(0,s.jsxs)(n.p,{children:["If you set ",(0,s.jsx)(n.code,{children:"WATSONX_API_KEY"}),", ",(0,s.jsx)(n.code,{children:"WATSONX_API_URL"}),", or ",(0,s.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})," in your ",(0,s.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file"]}),", these values can be populated automatically."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,s.jsxs)(l.A,{value:"Ollama",label:"Ollama",children:[(0,s.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(a.Ay,{})}),(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,s.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,s.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"In OpenRAG onboarding, connect to your Ollama server:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,s.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,s.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,s.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If the connection succeeds, OpenRAG populates the model lists with the server's available models."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select the model that your Ollama server is running."}),"\n",(0,s.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,s.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses the address and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,s.jsx)(l.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,s.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,s.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you set ",(0,s.jsx)(n.code,{children:"OPENAI_API_KEY"})," in your OpenRAG ",(0,s.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Under ",(0,s.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,s.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,s.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,s.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},927:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[{value:"Next steps",id:"next-steps",level:2}];function i(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,s.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Learn how to ",(0,s.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,s.jsx)(n.a,{href:"/chat",children:(0,s.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},1470:(e,n,r)=>{r.d(n,{A:()=>w});var s=r(6540),t=r(4164),o=r(7559),i=r(3104),l=r(6347),a=r(205),c=r(7485),d=r(1682),h=r(679);function u(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,s.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function j(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,o=p(e),[i,l]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:o})),[c,d]=x({queryString:r,groupId:t}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,h.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),f=(()=>{const e=c??u;return m({value:e,tabValues:o})?e:null})();(0,a.A)(()=>{f&&l(f)},[f]);return{selectedValue:i,selectValue:(0,s.useCallback)(e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),j(e)},[d,j,o]),tabValues:o}}var f=r(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function y({className:e,block:n,selectedValue:r,selectValue:s,tabValues:o}){const l=[],{blockElementScrollPositionUntilNextRender:a}=(0,i.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),i=o[t].value;i!==r&&(a(n),s(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;n=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;n=l[r]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:s})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...s,className:(0,t.A)("tabs__item",g.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function b({lazy:e,children:n,selectedValue:r}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function A(e){const n=j(e);return(0,v.jsxs)("div",{className:(0,t.A)(o.G.tabs.container,"tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(b,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,v.jsx)(A,{...e,children:u(e.children)},String(n))}},3059:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,s.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Language models"}),": ",(0,s.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,s.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["If you choose ",(0,s.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Embedding models"}),": ",(0,s.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,s.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,s.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,s.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,s.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},3351:(e,n,r)=>{r.d(n,{Ay:()=>a,RM:()=>i});var s=r(4848),t=r(8453),o=r(3059);const i=[...o.RM];function l(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,s.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,s.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,s.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsx)(o.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,s.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}},4042:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},5788:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>f,frontMatter:()=>u,metadata:()=>s,toc:()=>x});const s=JSON.parse('{"id":"get-started/docker","title":"Deploy OpenRAG with self-managed services","description":"To manage your own OpenRAG services, deploy OpenRAG with Docker or Podman.","source":"@site/docs/get-started/docker.mdx","sourceDirName":"get-started","slug":"/docker","permalink":"/docker","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/docker.mdx","tags":[],"version":"current","frontMatter":{"title":"Deploy OpenRAG with self-managed services","slug":"/docker"},"sidebar":"tutorialSidebar","previous":{"title":"Install OpenRAG on Windows","permalink":"/install-windows"},"next":{"title":"Upgrade OpenRAG","permalink":"/upgrade"}}');var t=r(4848),o=r(8453),i=(r(1470),r(9365),r(887)),l=r(3351),a=r(309),c=r(6149),d=r(4042),h=r(927);r(3059);const u={title:"Deploy OpenRAG with self-managed services",slug:"/docker"},p=void 0,m={},x=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...d.RM,...a.RM,...l.RM,{value:"Prepare your deployment",id:"setup",level:2},{value:"Start services",id:"start-services",level:2},...i.RM,...h.RM];function j(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"To manage your own OpenRAG services, deploy OpenRAG with Docker or Podman."}),"\n",(0,t.jsxs)(n.p,{children:["Use this installation method if you don't want to ",(0,t.jsx)(n.a,{href:"/tui",children:"use the Terminal User Interface (TUI)"}),", or you need to run OpenRAG in an environment where using the TUI is unfeasible."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Prepare your deployment"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Clone the OpenRAG repository:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"git clone https://github.com/langflow-ai/openrag.git\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Change to the root of the cloned repository:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd openrag\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Install dependencies:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv sync\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Create a ",(0,t.jsx)(n.code,{children:".env"})," file at the root of the cloned repository."]}),"\n",(0,t.jsxs)(n.p,{children:["You can create an empty file or copy the repository's ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/.env.example",children:(0,t.jsx)(n.code,{children:".env.example"})})," file.\nThe example file contains some of the ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables"})," to get you started with configuring your deployment."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cp .env.example .env\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Edit the ",(0,t.jsx)(n.code,{children:".env"})," file to configure your deployment using ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables"}),".\nThe OpenRAG Docker Compose files pull values from your ",(0,t.jsx)(n.code,{children:".env"})," file to configure the OpenRAG containers.\nThe following variables are required or recommended:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})," (Required)"]}),": Sets the OpenSearch administrator password. It must adhere to the ",(0,t.jsx)(n.a,{href:"https://docs.opensearch.org/latest/security/configuration/demo-configuration/#setting-up-a-custom-admin-password",children:"OpenSearch password complexity requirements"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})}),": The username for the Langflow administrator user. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," isn't set, then the default value is ",(0,t.jsx)(n.code,{children:"admin"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," (Strongly recommended)"]}),": Sets the Langflow administrator password, and determines the Langflow server's default authentication mode. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then the Langflow server starts without authentication enabled. For more information, see ",(0,t.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsxs)(n.strong,{children:[(0,t.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})," (Strongly recommended)"]}),": A secret encryption key for internal Langflow operations. It is recommended to ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-secret-key",children:"generate your own Langflow secret key"}),". If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})," isn't set, then Langflow generates a secret key automatically."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Model provider credentials"}),": Provide credentials for your preferred model providers. If none of these are set in the ",(0,t.jsx)(n.code,{children:".env"})," file, you must configure at least one provider during the ",(0,t.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"OPENAI_API_KEY"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"OLLAMA_ENDPOINT"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"WATSONX_API_KEY"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"WATSONX_ENDPOINT"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"OAuth provider credentials"}),": To upload documents from external storage, such as Google Drive, set the required OAuth credentials for the connectors that you want to use. You can ",(0,t.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up so you don't have to rebuild the containers."]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,t.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,t.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["For more information and variables, see ",(0,t.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"start-services",children:"Start services"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Start ",(0,t.jsx)(n.code,{children:"docling serve"})," on port 5001 on the host machine:"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py start --port 5001\n"})}),"\n",(0,t.jsxs)(n.p,{children:["Docling cannot run inside a Docker container due to system-level dependencies, so you must manage it as a separate service on the host machine.\nFor more information, see ",(0,t.jsx)(n.a,{href:"/manage-services#start-native-services",children:"Stop, start, and inspect native services"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This port is required to deploy OpenRAG successfully; don't use a different port.\nAdditionally, this enables the ",(0,t.jsx)(n.a,{href:"https://opensource.apple.com/projects/mlx/",children:"MLX framework"})," for accelerated performance on Apple Silicon Mac machines."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Confirm ",(0,t.jsx)(n.code,{children:"docling serve"})," is running."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py status\n"})}),"\n",(0,t.jsxs)(n.p,{children:["If ",(0,t.jsx)(n.code,{children:"docling serve"})," is running, the output includes the status, address, and process ID (PID):"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"Status: running\nEndpoint: http://127.0.0.1:5001\nDocs: http://127.0.0.1:5001/docs\nPID: 27746\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Deploy the OpenRAG containers locally using the appropriate Docker Compose file for your environment.\nBoth files deploy the same services."}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose.yml",children:(0,t.jsx)(n.code,{children:"docker-compose.yml"})}),": If your host machine has an NVIDIA GPU with CUDA support and compatible NVIDIA drivers, you can use this file to deploy OpenRAG with accelerated processing."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose build\ndocker compose up -d\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose build\npodman compose up -d\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml",children:(0,t.jsx)(n.code,{children:"docker-compose-cpu.yml"})}),": If your host machine doesn't have NVIDIA GPU support, use this file for a CPU-only OpenRAG deployment."]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose -f docker-compose-cpu.yml up -d\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose -f docker-compose-cpu.yml up -d\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Wait for the OpenRAG containers to start, and then confirm that all containers are running:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose ps\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose ps\n"})}),"\n",(0,t.jsx)(n.p,{children:"The OpenRAG Docker Compose files deploy the following containers:"}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Container Name"}),(0,t.jsx)(n.th,{children:"Default address"}),(0,t.jsx)(n.th,{children:"Purpose"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenRAG Backend"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:8000",children:"http://localhost:8000"})}),(0,t.jsx)(n.td,{children:"FastAPI server and core functionality."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenRAG Frontend"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:3000",children:"http://localhost:3000"})}),(0,t.jsx)(n.td,{children:"React web interface for user interaction."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"Langflow"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:7860",children:"http://localhost:7860"})}),(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.a,{href:"/agents",children:"AI workflow engine"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenSearch"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:9200",children:"http://localhost:9200"})}),(0,t.jsxs)(n.td,{children:["Datastore for ",(0,t.jsx)(n.a,{href:"/knowledge",children:"knowledge"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:"OpenSearch Dashboards"}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.a,{href:"http://localhost:5601",children:"http://localhost:5601"})}),(0,t.jsx)(n.td,{children:"OpenSearch database administration interface."})]})]})]}),"\n",(0,t.jsx)(n.p,{children:"When the containers are running, you can access your OpenRAG services at their addresses."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Access the OpenRAG frontend at ",(0,t.jsx)(n.code,{children:"http://localhost:3000"}),", and then continue with the ",(0,t.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsx)(h.Ay,{})]})}function f(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(j,{...e})}):j(e)}},6149:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>o});var s=r(4848),t=r(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,s.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}},9179:(e,n,r)=>{r.d(n,{A:()=>o});r(6540);var s=r(7856),t=r(4848);function o({name:e,...n}){const r=s[e];return r?(0,t.jsx)(r,{...n}):null}},9365:(e,n,r)=>{r.d(n,{A:()=>i});r(6540);var s=r(4164);const t={tabItem:"tabItem_Ymn6"};var o=r(4848);function i({children:e,hidden:n,className:r}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/915a24fd.df85b0ea.js b/assets/js/915a24fd.df85b0ea.js new file mode 100644 index 00000000..9772b66a --- /dev/null +++ b/assets/js/915a24fd.df85b0ea.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6235],{1470:(e,n,r)=>{r.d(n,{A:()=>A});var s=r(6540),t=r(4164),a=r(7559),o=r(3104),l=r(6347),i=r(205),c=r(7485),d=r(1682),u=r(679);function p(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return p(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,s.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function f(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,a=h(e),[o,l]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:a})),[c,d]=x({queryString:r,groupId:t}),[p,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,u.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),j=(()=>{const e=c??p;return g({value:e,tabValues:a})?e:null})();(0,i.A)(()=>{j&&l(j)},[j]);return{selectedValue:o,selectValue:(0,s.useCallback)(e=>{if(!g({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),f(e)},[d,f,a]),tabValues:a}}var j=r(2303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function b({className:e,block:n,selectedValue:r,selectValue:s,tabValues:a}){const l=[],{blockElementScrollPositionUntilNextRender:i}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=l.indexOf(n),o=a[t].value;o!==r&&(i(n),s(o))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=l.indexOf(e.currentTarget)+1;n=l[r]??l[0];break}case"ArrowLeft":{const r=l.indexOf(e.currentTarget)-1;n=l[r]??l[l.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:s})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...s,className:(0,t.A)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:r}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function w(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,t.A)(a.G.tabs.container,"tabs-container",m.tabList),children:[(0,v.jsx)(b,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function A(e){const n=(0,j.A)();return(0,v.jsx)(w,{...e,children:p(e.children)},String(n))}},2134:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>g,frontMatter:()=>c,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"get-started/upgrade","title":"Upgrade OpenRAG","description":"Use these steps to upgrade your OpenRAG deployment to the latest version or a specific version.","source":"@site/docs/get-started/upgrade.mdx","sourceDirName":"get-started","slug":"/upgrade","permalink":"/upgrade","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/upgrade.mdx","tags":[],"version":"current","frontMatter":{"title":"Upgrade OpenRAG","slug":"/upgrade"},"sidebar":"tutorialSidebar","previous":{"title":"Deploy self-managed services","permalink":"/docker"},"next":{"title":"Reinstall OpenRAG","permalink":"/reinstall"}}');var t=r(4848),a=r(8453),o=r(1470),l=r(9365),i=r(9870);const c={title:"Upgrade OpenRAG",slug:"/upgrade"},d=void 0,u={},p=[{value:"Export customized flows before upgrading",id:"export-customized-flows-before-upgrading",level:2},{value:"Upgrade TUI-managed deployments",id:"upgrade-tui-managed-deployments",level:2},...i.RM,{value:"Upgrade self-managed deployments",id:"upgrade-self-managed-deployments",level:2},...i.RM,{value:"See also",id:"see-also",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Use these steps to upgrade your OpenRAG deployment to the latest version or a specific version."}),"\n",(0,t.jsx)(n.h2,{id:"export-customized-flows-before-upgrading",children:"Export customized flows before upgrading"}),"\n",(0,t.jsxs)(n.p,{children:["If you modified the built-in flows or created custom flows in your OpenRAG Langflow instance, ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before upgrading.\nThis ensure that you won't lose your flows after upgrading, and you can reference the exported flows if there are any breaking changes in the new version."]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-tui-managed-deployments",children:"Upgrade TUI-managed deployments"}),"\n",(0,t.jsx)(n.p,{children:"To upgrade OpenRAG, you need to upgrade the OpenRAG Python package, and then upgrade the OpenRAG containers."}),"\n",(0,t.jsxs)(n.p,{children:["Upgrading the Python package also upgrades Docling by bumping the dependency in ",(0,t.jsx)(n.code,{children:"pyproject.toml"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This is a two-part process because upgrading the OpenRAG Python package updates the Terminal User Interface (TUI) and Python code, but the container versions are controlled by environment variables in your ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["To check for updates, click ",(0,t.jsx)(n.strong,{children:"Status"})," in the TUI, and then click ",(0,t.jsx)(n.strong,{children:"Upgrade"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If there is an update available, press ",(0,t.jsx)("kbd",{children:"Esc"})," to close the ",(0,t.jsx)(n.strong,{children:"Status"})," page, then then click ",(0,t.jsx)(n.strong,{children:"Stop All Services"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Press ",(0,t.jsx)("kbd",{children:"q"})," to exit the TUI."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Upgrade the OpenRAG Python package to the latest version from ",(0,t.jsx)(n.a,{href:"https://pypi.org/project/openrag/",children:"PyPI"}),".\nThe commands to upgrade the package depend on how you installed OpenRAG."]}),"\n",(0,t.jsxs)(o.A,{children:[(0,t.jsxs)(l.A,{value:"installer",label:"Script or uvx",default:!0,children:[(0,t.jsxs)(n.p,{children:["Use these steps to upgrade the Python package if you installed OpenRAG using the ",(0,t.jsx)(n.a,{href:"/install",children:"installer script"})," or ",(0,t.jsx)(n.a,{href:"/install-uvx",children:(0,t.jsx)(n.code,{children:"uvx"})}),":"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Navigate to your OpenRAG workspace directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd openrag-workspace\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Upgrade the OpenRAG package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx --from openrag openrag\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can invoke a specific version using any of the ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#requesting-specific-versions",children:[(0,t.jsx)(n.code,{children:"uvx"})," version specifiers"]}),", such as ",(0,t.jsx)(n.code,{children:"--from"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx --from openrag==0.1.30 openrag\n"})}),"\n"]}),"\n"]})]}),(0,t.jsxs)(l.A,{value:"uv-add",label:"uv add",children:[(0,t.jsxs)(n.p,{children:["Use these steps to upgrade the Python package if you installed OpenRAG with ",(0,t.jsx)(n.a,{href:"/install-uv",children:(0,t.jsx)(n.code,{children:"uv add"})}),":"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Navigate to your project directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd YOUR_PROJECT_NAME\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Update OpenRAG to the latest version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add --upgrade openrag\n"})}),"\n",(0,t.jsx)(n.p,{children:"To upgrade to a specific version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add --upgrade openrag==0.1.33\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]})]}),(0,t.jsxs)(l.A,{value:"uv-pip",label:"uv pip install",children:[(0,t.jsxs)(n.p,{children:["Use these steps to upgrade the Python package if you installed OpenRAG with ",(0,t.jsx)(n.a,{href:"/install-uv",children:(0,t.jsx)(n.code,{children:"uv pip install"})}),":"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Activate your virtual environment."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Upgrade OpenRAG:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv pip install --upgrade openrag\n"})}),"\n",(0,t.jsx)(n.p,{children:"To upgrade to a specific version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv pip install --upgrade openrag==0.1.33\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]})]})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the OpenRAG TUI, click ",(0,t.jsx)(n.strong,{children:"Start Services"}),", and then wait while the services start."]}),"\n",(0,t.jsxs)(n.p,{children:["When you start services after upgrading the Python package, OpenRAG runs ",(0,t.jsx)(n.code,{children:"docker compose pull"})," to get the appropriate container images matching the version specified in your OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file. Then, it recreates the containers with the new images using ",(0,t.jsx)(n.code,{children:"docker compose up -d --force-recreate"}),"."]}),"\n",(0,t.jsxs)(n.admonition,{title:"Pin container versions",type:"tip",children:[(0,t.jsxs)(n.p,{children:["In the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file, the ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," ",(0,t.jsx)(n.a,{href:"/reference/configuration#system-settings",children:"environment variable"})," is set to ",(0,t.jsx)(n.code,{children:"latest"})," by default, which pulls the ",(0,t.jsx)(n.code,{children:"latest"})," available container images.\nTo pin a specific container image version, you can set ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," to the desired container image version, such as ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION=0.1.33"}),"."]}),(0,t.jsxs)(n.p,{children:["However, when you upgrade the Python package, OpenRAG automatically attempts to keep the ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," synchronized with the Python package version.\nYou might need to edit the ",(0,t.jsx)(n.code,{children:".env"})," file after upgrading the Python package to enforce a different container version.\nThe TUI warns you if it detects a version mismatch."]})]}),"\n",(0,t.jsxs)(n.p,{children:["If you get an error that ",(0,t.jsx)(n.code,{children:"langflow container already exists"})," error during upgrade, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot#langflow-container-already-exists-during-upgrade",children:"Langflow container already exists during upgrade"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["After the containers start, click ",(0,t.jsx)(n.strong,{children:"Close"}),", and then click ",(0,t.jsx)(n.strong,{children:"Launch OpenRAG"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-self-managed-deployments",children:"Upgrade self-managed deployments"}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Fetch and apply the latest container images while preserving your OpenRAG data:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose pull\ndocker compose up -d --force-recreate\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose pull\npodman compose up -d --force-recreate\n"})}),"\n",(0,t.jsxs)(n.p,{children:["By default, OpenRAG's ",(0,t.jsx)(n.code,{children:"docker-compose"})," files pull the latest container images."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["After the containers start, access the OpenRAG application at ",(0,t.jsx)(n.code,{children:"http://localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/manage-services",children:"Manage OpenRAG services"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"})}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>l});var s=r(6540);const t={},a=s.createContext(t);function o(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),s.createElement(a.Provider,{value:n},e.children)}},9365:(e,n,r)=>{r.d(n,{A:()=>o});r(6540);var s=r(4164);const t={tabItem:"tabItem_Ymn6"};var a=r(4848);function o({children:e,hidden:n,className:r}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:n,children:e})}},9870:(e,n,r)=>{r.d(n,{Ay:()=>l,RM:()=>a});var s=r(4848),t=r(8453);const a=[];function o(e){const n={a:"a",li:"li",ol:"ol",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["If you modified the built-in flows or created custom flows in your ",(0,s.jsx)(n.a,{href:"/agents",children:"OpenRAG Langflow instance"}),", and you want to preserve those changes, then you must ",(0,s.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed."]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/assets/js/915a24fd.fd7e64ec.js b/assets/js/915a24fd.fd7e64ec.js deleted file mode 100644 index 3cd4cf4c..00000000 --- a/assets/js/915a24fd.fd7e64ec.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6235],{1470:(e,n,r)=>{r.d(n,{A:()=>A});var s=r(6540),t=r(4164),a=r(7559),i=r(3104),o=r(6347),l=r(205),c=r(7485),d=r(1682),u=r(679);function p(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return p(e).map(({props:{value:e,label:n,attributes:r,default:s}})=>({value:e,label:n,attributes:r,default:s}))}(r);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const r=(0,o.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,s.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(r.location.search);n.set(t,e),r.replace({...r.location,search:n.toString()})},[t,r])]}function f(e){const{defaultValue:n,queryString:r=!1,groupId:t}=e,a=h(e),[i,o]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:a})),[c,d]=x({queryString:r,groupId:t}),[p,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,t]=(0,u.Dv)(n);return[r,(0,s.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),j=(()=>{const e=c??p;return g({value:e,tabValues:a})?e:null})();(0,l.A)(()=>{j&&o(j)},[j]);return{selectedValue:i,selectValue:(0,s.useCallback)(e=>{if(!g({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),f(e)},[d,f,a]),tabValues:a}}var j=r(2303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=r(4848);function b({className:e,block:n,selectedValue:r,selectValue:s,tabValues:a}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),c=e=>{const n=e.currentTarget,t=o.indexOf(n),i=a[t].value;i!==r&&(l(n),s(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:a.map(({value:e,label:n,attributes:s})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:c,...s,className:(0,t.A)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:r}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===r);return e?(0,s.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function w(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,t.A)(a.G.tabs.container,"tabs-container",m.tabList),children:[(0,v.jsx)(b,{...n,...e}),(0,v.jsx)(y,{...n,...e})]})}function A(e){const n=(0,j.A)();return(0,v.jsx)(w,{...e,children:p(e.children)},String(n))}},2134:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>d,default:()=>g,frontMatter:()=>c,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"get-started/upgrade","title":"Upgrade OpenRAG","description":"Use these steps to upgrade your OpenRAG deployment to the latest version or a specific version.","source":"@site/docs/get-started/upgrade.mdx","sourceDirName":"get-started","slug":"/upgrade","permalink":"/upgrade","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/upgrade.mdx","tags":[],"version":"current","frontMatter":{"title":"Upgrade OpenRAG","slug":"/upgrade"},"sidebar":"tutorialSidebar","previous":{"title":"Deploy self-managed services","permalink":"/docker"},"next":{"title":"Reinstall OpenRAG","permalink":"/reinstall"}}');var t=r(4848),a=r(8453),i=r(1470),o=r(9365),l=r(9870);const c={title:"Upgrade OpenRAG",slug:"/upgrade"},d=void 0,u={},p=[{value:"Export customized flows before upgrading",id:"export-customized-flows-before-upgrading",level:2},{value:"Upgrade TUI-managed installations",id:"upgrade-tui-managed-installations",level:2},...l.RM,{value:"Upgrade self-managed containers",id:"upgrade-self-managed-containers",level:2},...l.RM,{value:"See also",id:"see-also",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,a.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Use these steps to upgrade your OpenRAG deployment to the latest version or a specific version."}),"\n",(0,t.jsx)(n.h2,{id:"export-customized-flows-before-upgrading",children:"Export customized flows before upgrading"}),"\n",(0,t.jsxs)(n.p,{children:["If you modified the built-in flows or created custom flows in your OpenRAG Langflow instance, ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before upgrading.\nThis ensure that you won't lose your flows after upgrading, and you can reference the exported flows if there are any breaking changes in the new version."]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-tui-managed-installations",children:"Upgrade TUI-managed installations"}),"\n",(0,t.jsx)(n.p,{children:"To upgrade OpenRAG, you need to upgrade the OpenRAG Python package, and then upgrade the OpenRAG containers."}),"\n",(0,t.jsxs)(n.p,{children:["Upgrading the Python package also upgrades Docling by bumping the dependency in ",(0,t.jsx)(n.code,{children:"pyproject.toml"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["This is a two-part process because upgrading the OpenRAG Python package updates the Terminal User Interface (TUI) and Python code, but the container versions are controlled by environment variables in your ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["To check for updates, open the TUI's ",(0,t.jsx)(n.strong,{children:"Status"})," menu (",(0,t.jsx)("kbd",{children:"3"}),"), and then click ",(0,t.jsx)(n.strong,{children:"Upgrade"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["If there is an update, stop all OpenRAG services.\nIn the ",(0,t.jsx)(n.strong,{children:"Status"})," menu, click ",(0,t.jsx)(n.strong,{children:"Stop Services"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Upgrade the OpenRAG Python package to the latest version from ",(0,t.jsx)(n.a,{href:"https://pypi.org/project/openrag/",children:"PyPI"}),".\nThe commands to upgrade the package depend on how you installed OpenRAG."]}),"\n",(0,t.jsxs)(i.A,{children:[(0,t.jsxs)(o.A,{value:"installer",label:"Script or uvx",default:!0,children:[(0,t.jsxs)(n.p,{children:["Use these steps to upgrade the Python package if you installed OpenRAG using the ",(0,t.jsx)(n.a,{href:"/install",children:"installer script"})," or ",(0,t.jsx)(n.a,{href:"/install-uvx",children:(0,t.jsx)(n.code,{children:"uvx"})}),":"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Navigate to your OpenRAG workspace directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd openrag-workspace\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Upgrade the OpenRAG package:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx --from openrag openrag\n"})}),"\n",(0,t.jsxs)(n.p,{children:["You can invoke a specific version using any of the ",(0,t.jsxs)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#requesting-specific-versions",children:[(0,t.jsx)(n.code,{children:"uvx"})," version specifiers"]}),", such as ",(0,t.jsx)(n.code,{children:"--from"}),":"]}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uvx --from openrag==0.1.30 openrag\n"})}),"\n"]}),"\n"]})]}),(0,t.jsxs)(o.A,{value:"uv-add",label:"uv add",children:[(0,t.jsxs)(n.p,{children:["Use these steps to upgrade the Python package if you installed OpenRAG with ",(0,t.jsx)(n.a,{href:"/install-uv",children:(0,t.jsx)(n.code,{children:"uv add"})}),":"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Navigate to your project directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"cd YOUR_PROJECT_NAME\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Update OpenRAG to the latest version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add --upgrade openrag\n"})}),"\n",(0,t.jsx)(n.p,{children:"To upgrade to a specific version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv add --upgrade openrag==0.1.33\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]})]}),(0,t.jsxs)(o.A,{value:"uv-pip",label:"uv pip install",children:[(0,t.jsxs)(n.p,{children:["Use these steps to upgrade the Python package if you installed OpenRAG with ",(0,t.jsx)(n.a,{href:"/install-uv",children:(0,t.jsx)(n.code,{children:"uv pip install"})}),":"]}),(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Activate your virtual environment."}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Upgrade OpenRAG:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv pip install --upgrade openrag\n"})}),"\n",(0,t.jsx)(n.p,{children:"To upgrade to a specific version:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv pip install --upgrade openrag==0.1.33\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Start the OpenRAG TUI:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"uv run openrag\n"})}),"\n"]}),"\n"]})]})]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["In the OpenRAG TUI, click ",(0,t.jsx)(n.strong,{children:"Start All Services"}),", and then wait while the upgraded containers start."]}),"\n",(0,t.jsxs)(n.p,{children:["When you start services after upgrading the Python package, OpenRAG runs ",(0,t.jsx)(n.code,{children:"docker compose pull"})," to get the appropriate container images matching the version specified in your OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file. Then, it recreates the containers with the new images using ",(0,t.jsx)(n.code,{children:"docker compose up -d --force-recreate"}),"."]}),"\n",(0,t.jsxs)(n.admonition,{title:"Pin container versions",type:"tip",children:[(0,t.jsxs)(n.p,{children:["In the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file, the ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," ",(0,t.jsx)(n.a,{href:"/reference/configuration#system-settings",children:"environment variable"})," is set to ",(0,t.jsx)(n.code,{children:"latest"})," by default, which pulls the ",(0,t.jsx)(n.code,{children:"latest"})," available container images.\nTo pin a specific container image version, you can set ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," to the desired container image version, such as ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION=0.1.33"}),"."]}),(0,t.jsxs)(n.p,{children:["However, when you upgrade the Python package, OpenRAG automatically attempts to keep the ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," synchronized with the Python package version.\nYou might need to edit the ",(0,t.jsx)(n.code,{children:".env"})," file after upgrading the Python package to enforce a different container version.\nThe TUI warns you if it detects a version mismatch."]})]}),"\n",(0,t.jsxs)(n.p,{children:["If you get an error that ",(0,t.jsx)(n.code,{children:"langflow container already exists"})," error during upgrade, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot#langflow-container-already-exists-during-upgrade",children:"Langflow container already exists during upgrade"}),"."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["Under ",(0,t.jsx)(n.a,{href:"/manage-services",children:(0,t.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,t.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:["When the upgrade process is complete, you can close the ",(0,t.jsx)(n.strong,{children:"Status"})," window and continue using OpenRAG."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"upgrade-self-managed-containers",children:"Upgrade self-managed containers"}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsxs)(n.ol,{start:"2",children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Fetch and apply the latest container images while preserving your OpenRAG data:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose pull\ndocker compose up -d --force-recreate\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose pull\npodman compose up -d --force-recreate\n"})}),"\n",(0,t.jsxs)(n.p,{children:["By default, OpenRAG's ",(0,t.jsx)(n.code,{children:"docker-compose"})," files pull the latest container images."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/manage-services",children:"Manage OpenRAG services"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"})}),"\n"]})]})}function g(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},8453:(e,n,r)=>{r.d(n,{R:()=>i,x:()=>o});var s=r(6540);const t={},a=s.createContext(t);function i(e){const n=s.useContext(a);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),s.createElement(a.Provider,{value:n},e.children)}},9365:(e,n,r)=>{r.d(n,{A:()=>i});r(6540);var s=r(4164);const t={tabItem:"tabItem_Ymn6"};var a=r(4848);function i({children:e,hidden:n,className:r}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,s.A)(t.tabItem,r),hidden:n,children:e})}},9870:(e,n,r)=>{r.d(n,{Ay:()=>o,RM:()=>a});var s=r(4848),t=r(8453);const a=[];function i(e){const n={a:"a",li:"li",ol:"ol",...(0,t.R)(),...e.components};return(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["If you modified the built-in flows or created custom flows in your ",(0,s.jsx)(n.a,{href:"/agents",children:"OpenRAG Langflow instance"}),", and you want to preserve those changes, then you must ",(0,s.jsx)(n.a,{href:"https://docs.langflow.org/concepts-flows-import",children:"export your flows"})," before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed."]}),"\n"]})}function o(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(i,{...e})}):i(e)}}}]); \ No newline at end of file diff --git a/assets/js/af920ffe.5a239774.js b/assets/js/af920ffe.5a239774.js deleted file mode 100644 index f7b2adfa..00000000 --- a/assets/js/af920ffe.5a239774.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[98],{1260:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>h,default:()=>x,frontMatter:()=>d,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"get-started/quickstart","title":"Quickstart","description":"Use this quickstart to install OpenRAG, and then try some of OpenRAG\'s core features.","source":"@site/docs/get-started/quickstart.mdx","sourceDirName":"get-started","slug":"/quickstart","permalink":"/quickstart","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/quickstart.mdx","tags":[],"version":"current","frontMatter":{"title":"Quickstart","slug":"/quickstart"},"sidebar":"tutorialSidebar","previous":{"title":"About OpenRAG","permalink":"/"},"next":{"title":"Select an installation method","permalink":"/install-options"}}');var r=t(4848),i=t(8453),a=t(9179),o=(t(1470),t(9365),t(7224)),l=t(6149),c=t(4042);const d={title:"Quickstart",slug:"/quickstart"},h=void 0,u={},p=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...l.RM,{value:"Install OpenRAG",id:"install-openrag",level:2},{value:"Load and chat with documents",id:"chat-with-documents",level:2},{value:"Change the language model and chat settings",id:"change-components",level:2},{value:"Integrate OpenRAG into an application",id:"integrate-openrag-into-an-application",level:2},...o.RM,{value:"Next steps",id:"next-steps",level:2}];function g(e){const n={a:"a",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Use this quickstart to install OpenRAG, and then try some of OpenRAG's core features."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(c.Ay,{}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Get an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),".\nThis quickstart uses OpenAI for simplicity.\nFor other providers, see the other ",(0,r.jsx)(n.a,{href:"/install-options",children:"installation methods"}),"."]}),"\n"]}),"\n",(0,r.jsx)(l.Ay,{}),"\n",(0,r.jsx)(n.h2,{id:"install-openrag",children:"Install OpenRAG"}),"\n",(0,r.jsxs)(n.p,{children:["For this quickstart, install OpenRAG with the automatic installer script and basic setup.\nThe script installs OpenRAG dependencies, including Docker or Podman, and then it installs and runs OpenRAG with ",(0,r.jsx)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#running-tools",children:(0,r.jsx)(n.code,{children:"uvx"})}),"."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Create a directory for your OpenRAG installation, and then change to that directory:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir openrag-workspace\ncd openrag-workspace\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.openr.ag/files/run_openrag_with_prereqs.sh",children:"Download the OpenRAG install script"}),", move it to your OpenRAG directory, and then run it:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"bash run_openrag_with_prereqs.sh\n"})}),"\n",(0,r.jsx)(n.p,{children:"Wait while the installer script prepares your environment and installs OpenRAG.\nYou might be prompted to install certain dependencies if they aren't already present in your environment."}),"\n",(0,r.jsxs)(n.p,{children:["The entire process can take a few minutes.\nOnce the environment is ready, the OpenRAG ",(0,r.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," starts."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:t(5689).A+"",width:"1995",height:"1099"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Basic Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to create administrator passwords for your OpenRAG OpenSearch and Langflow services."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Leave the ",(0,r.jsx)(n.strong,{children:"OpenAI API key"})," field empty."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),", and then click ",(0,r.jsx)(n.strong,{children:"Start All Services"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n",(0,r.jsxs)(n.p,{children:["Your OpenRAG configuration and passwords are stored in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," file that is created automatically at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nContainer definitions are stored in the ",(0,r.jsx)(n.code,{children:"docker-compose"})," files in the same directory."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"})," to launch the OpenRAG application and start the application onboarding process."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For this quickstart, select the ",(0,r.jsx)(n.strong,{children:"OpenAI"})," model provider, enter your OpenAI API key, and then click ",(0,r.jsx)(n.strong,{children:"Complete"}),". Use the default settings for all other model options."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(a.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nYou can complete this quickstart without going through the overview.\nThe overview demonstrates some basic functionality that is covered in the next section and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"chat-with-documents",children:"Load and chat with documents"}),"\n",(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsxs)(n.a,{href:"/chat",children:["OpenRAG ",(0,r.jsx)(n.strong,{children:"Chat"})]})," to explore the documents in your OpenRAG database using natural language queries.\nSome documents are included by default to get you started, and you can load your own documents."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In OpenRAG, click ",(0,r.jsx)(a.A,{name:"MessageSquare","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Chat"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For this quickstart, ask the agent what documents are available.\nFor example: ",(0,r.jsx)(n.code,{children:"What documents are available to you?"})]}),"\n",(0,r.jsx)(n.p,{children:"The agent responds with a summary of OpenRAG's default documents."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To verify the agent's response, click ",(0,r.jsx)(a.A,{name:"Library","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Knowledge"})," to view the documents stored in the OpenRAG OpenSearch database.\nYou can click a document to view the chunks of the document as they are stored in the database."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Add Knowledge"})," to add your own documents to your OpenRAG knowledge base."]}),"\n",(0,r.jsxs)(n.p,{children:["For this quickstart, use either the ",(0,r.jsx)(a.A,{name:"File","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"File"})," or ",(0,r.jsx)(a.A,{name:"Folder","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Folder"})," upload options to load documents from your local machine.\n",(0,r.jsx)(n.strong,{children:"Folder"})," uploads an entire directory.\nThe default directory is ",(0,r.jsx)(n.code,{children:"~/.openrag/documents"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["For information about the cloud storage provider options, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Return to the ",(0,r.jsx)(n.strong,{children:"Chat"})," window, and then ask a question related to the documents that you just uploaded."]}),"\n",(0,r.jsx)(n.p,{children:"If the agent's response doesn't seem to reference your documents correctly, try the following:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(a.A,{name:"Gear","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Function Call: search_documents (tool_call)"})," to view the log of tool calls made by the agent. This is helpful for troubleshooting because it shows you how the agent used particular tools."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(a.A,{name:"Library","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Knowledge"})," to confirm that the documents are present in the OpenRAG OpenSearch database, and then click each document to see how the document was chunked.\nIf a document was chunked improperly, you might need to tweak the ingestion or modify and reupload the document."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(a.A,{name:"Settings2","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Settings"})," to modify the knowledge ingestion settings."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["For more information, see ",(0,r.jsx)(n.a,{href:"/knowledge",children:"Configure knowledge"})," and ",(0,r.jsx)(n.a,{href:"/ingestion",children:"Ingest knowledge"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"change-components",children:"Change the language model and chat settings"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To change the knowledge ingestion settings, agent behavior, or language model, click ",(0,r.jsx)(a.A,{name:"Settings2","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Settings"})," page provides quick access to commonly used parameters like the ",(0,r.jsx)(n.strong,{children:"Language model"})," and ",(0,r.jsx)(n.strong,{children:"Agent Instructions"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For greater insight into the underlying ",(0,r.jsx)(n.a,{href:"/agents",children:"Langflow flow"})," that drives the OpenRAG chat, click ",(0,r.jsx)(n.strong,{children:"Edit in Langflow"})," and then click ",(0,r.jsx)(n.strong,{children:"Proceed"})," to launch the Langflow visual editor in a new browser window."]}),"\n",(0,r.jsxs)(n.p,{children:["If Langflow requests login information, enter the ",(0,r.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,r.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," from the ",(0,r.jsx)(n.code,{children:".env"})," file at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"OpenRAG OpenSearch Agent"})," flow opens in a new browser window."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"OpenRAG OpenSearch Agent flow",src:t(3982).A+"",width:"4084",height:"2176"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For this quickstart, try changing the model.\nClick the ",(0,r.jsx)(n.strong,{children:"Language Model"})," component, and then change the ",(0,r.jsx)(n.strong,{children:"Model Name"})," to a different OpenAI model."]}),"\n",(0,r.jsxs)(n.p,{children:["After you edit a built-in flow, you can click ",(0,r.jsx)(n.strong,{children:"Restore flow"})," on the ",(0,r.jsx)(n.strong,{children:"Settings"})," page to revert the flow to its original state when you first installed OpenRAG."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Press ",(0,r.jsx)("kbd",{children:"Command"}),"+",(0,r.jsx)("kbd",{children:"S"})," (",(0,r.jsx)("kbd",{children:"Ctrl"}),"+",(0,r.jsx)("kbd",{children:"S"}),") to save your changes."]}),"\n",(0,r.jsx)(n.p,{children:"You can close the Langflow browser window, or leave it open if you want to continue experimenting with the flow editor."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Switch to your OpenRAG browser window, and then click ",(0,r.jsx)(a.A,{name:"Plus","aria-hidden":"true"})," in the ",(0,r.jsx)(n.strong,{children:"Conversations"})," tab to start a new conversation.\nThis ensures that the chat doesn't persist any context from the previous conversation with the original model."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Ask the same question you asked in ",(0,r.jsx)(n.a,{href:"#chat-with-documents",children:"Load and chat with documents"})," to see how the response differs from the original model."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"integrate-openrag-into-an-application",children:"Integrate OpenRAG into an application"}),"\n",(0,r.jsxs)(n.p,{children:["Langflow in OpenRAG includes pre-built flows that you can integrate into your applications using the ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/api-reference-api-examples",children:"Langflow API"}),".\nYou can use these flows as-is or modify them to better suit your needs, as demonstrated in ",(0,r.jsx)(n.a,{href:"#change-components",children:"Change the language model and chat settings"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can send and receive requests with the Langflow API using Python, TypeScript, or curl."}),"\n",(0,r.jsx)(o.Ay,{}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Reinstall OpenRAG with your preferred settings"}),": This quickstart used ",(0,r.jsx)(n.code,{children:"uvx"})," and a minimal setup to demonstrate OpenRAG's core functionality.\nIt is recommended that you ",(0,r.jsx)(n.a,{href:"/reinstall",children:"reinstall OpenRAG"})," with your preferred configuration and ",(0,r.jsx)(n.a,{href:"/install-options",children:"installation method"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Learn more about OpenRAG"}),": Explore OpenRAG and the OpenRAG documentation to learn more about its features and functionality."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Learn more about Langflow"}),": For a deep dive on the Langflow API and visual editor, see the ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/",children:"Langflow documentation"}),"."]}),"\n"]}),"\n"]})]})}function x(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(g,{...e})}):g(e)}},1470:(e,n,t)=>{t.d(n,{A:()=>b});var s=t(6540),r=t(4164),i=t(7559),a=t(3104),o=t(6347),l=t(205),c=t(7485),d=t(1682),h=t(679);function u(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:t,default:s}})=>({value:e,label:n,attributes:t,default:s}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,o.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(r),(0,s.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function j(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=p(e),[a,o]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i})),[c,d]=x({queryString:t,groupId:r}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,h.Dv)(n);return[t,(0,s.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),f=(()=>{const e=c??u;return g({value:e,tabValues:i})?e:null})();(0,l.A)(()=>{f&&o(f)},[f]);return{selectedValue:a,selectValue:(0,s.useCallback)(e=>{if(!g({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),j(e)},[d,j,i]),tabValues:i}}var f=t(2303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=t(4848);function w({className:e,block:n,selectedValue:t,selectValue:s,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),c=e=>{const n=e.currentTarget,r=o.indexOf(n),a=i[r].value;a!==t&&(l(n),s(a))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:s})=>(0,y.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:c,...s,className:(0,r.A)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:t}){const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===t);return e?(0,s.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:i.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function v(e){const n=j(e);return(0,y.jsxs)("div",{className:(0,r.A)(i.G.tabs.container,"tabs-container",m.tabList),children:[(0,y.jsx)(w,{...n,...e}),(0,y.jsx)(A,{...n,...e})]})}function b(e){const n=(0,f.A)();return(0,y.jsx)(v,{...e,children:u(e.children)},String(n))}},3982:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/opensearch-agent-flow-f3b279e02425cd043002eb7749067108.png"},4042:(e,n,t)=>{t.d(n,{Ay:()=>o,RM:()=>i});var s=t(4848),r=t(8453);const i=[];function a(e){const n={a:"a",li:"li",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},5689:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg"},6149:(e,n,t)=>{t.d(n,{Ay:()=>o,RM:()=>i});var s=t(4848),r=t(8453);const i=[];function a(e){const n={a:"a",li:"li",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,s.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},7224:(e,n,t)=>{t.d(n,{Ay:()=>d,RM:()=>l});var s=t(4848),r=t(8453),i=t(9179),a=t(1470),o=t(9365);const l=[];function c(e){const n={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Open the ",(0,s.jsx)(n.strong,{children:"OpenRAG OpenSearch Agent"})," flow in the Langflow visual editor: From the ",(0,s.jsx)(n.strong,{children:"Chat"})," window, click ",(0,s.jsx)(i.A,{name:"Settings2","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Settings"}),", click ",(0,s.jsx)(n.strong,{children:"Edit in Langflow"}),", and then click ",(0,s.jsx)(n.strong,{children:"Proceed"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Optional: If you don't want to use the Langflow API key that is generated automatically when you install OpenRAG, you can create a ",(0,s.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication",children:"Langflow API key"}),".\nThis key doesn't grant access to OpenRAG; it is only for authenticating with the Langflow API."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Langflow visual editor, click your user icon in the header, and then select ",(0,s.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Langflow API Keys"}),", and then click ",(0,s.jsx)(i.A,{name:"Plus","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Add New"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Name your key, and then click ",(0,s.jsx)(n.strong,{children:"Create API Key"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Copy the API key and store it securely."}),"\n",(0,s.jsxs)(n.li,{children:["Exit the Langflow ",(0,s.jsx)(n.strong,{children:"Settings"})," page to return to the visual editor."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Share"}),", and then select ",(0,s.jsx)(n.strong,{children:"API access"})," to get pregenerated code snippets that call the Langflow API and run the flow."]}),"\n",(0,s.jsxs)(n.p,{children:["These code snippets construct API requests with your Langflow server URL (",(0,s.jsx)(n.code,{children:"LANGFLOW_SERVER_ADDRESS"}),"), the flow to run (",(0,s.jsx)(n.code,{children:"FLOW_ID"}),"), required headers (",(0,s.jsx)(n.code,{children:"LANGFLOW_API_KEY"}),", ",(0,s.jsx)(n.code,{children:"Content-Type"}),"), and a payload containing the required inputs to run the flow, including a default chat input message."]}),"\n",(0,s.jsx)(n.p,{children:"In production, you would modify the inputs to suit your application logic. For example, you could replace the default chat input message with dynamic user input."}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(o.A,{value:"python",label:"Python",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'import requests\nimport os\nimport uuid\n\napi_key = \'LANGFLOW_API_KEY\'\nurl = "http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID" # The complete API endpoint URL for this flow\n\n# Request payload configuration\npayload = {\n "output_type": "chat",\n "input_type": "chat",\n "input_value": "hello world!"\n}\npayload["session_id"] = str(uuid.uuid4())\n\nheaders = {"x-api-key": api_key}\n\ntry:\n # Send API request\n response = requests.request("POST", url, json=payload, headers=headers)\n response.raise_for_status() # Raise exception for bad status codes\n\n # Print response\n print(response.text)\n\nexcept requests.exceptions.RequestException as e:\n print(f"Error making API request: {e}")\nexcept ValueError as e:\n print(f"Error parsing response: {e}")\n'})})}),(0,s.jsx)(o.A,{value:"typescript",label:"TypeScript",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'const crypto = require(\'crypto\');\nconst apiKey = \'LANGFLOW_API_KEY\';\nconst payload = {\n "output_type": "chat",\n "input_type": "chat",\n "input_value": "hello world!"\n};\npayload.session_id = crypto.randomUUID();\n\nconst options = {\n method: \'POST\',\n headers: {\n \'Content-Type\': \'application/json\',\n "x-api-key": apiKey\n },\n body: JSON.stringify(payload)\n};\n\nfetch(\'http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID\', options)\n .then(response => response.json())\n .then(response => console.warn(response))\n .catch(err => console.error(err));\n'})})}),(0,s.jsx)(o.A,{value:"curl",label:"curl",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'curl --request POST \\\n --url \'http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID?stream=false\' \\\n --header \'Content-Type: application/json\' \\\n --header "x-api-key: LANGFLOW_API_KEY" \\\n --data \'{\n "output_type": "chat",\n "input_type": "chat",\n "input_value": "hello world!"\n }\'\n'})})})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Copy your preferred snippet, and then run it:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Python"}),": Paste the snippet into a ",(0,s.jsx)(n.code,{children:".py"})," file, save it, and then run it with ",(0,s.jsx)(n.code,{children:"python filename.py"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"TypeScript"}),": Paste the snippet into a ",(0,s.jsx)(n.code,{children:".ts"})," file, save it, and then run it with ",(0,s.jsx)(n.code,{children:"ts-node filename.ts"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"curl"}),": Paste and run snippet directly in your terminal."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If the request is successful, the response includes many details about the flow run, including the session ID, inputs, outputs, components, durations, and more."}),"\n",(0,s.jsxs)(n.p,{children:["In production, you won't pass the raw response to the user in its entirety.\nInstead, you extract and reformat relevant fields for different use cases, as demonstrated in the ",(0,s.jsx)(n.a,{href:"https://docs.langflow.org/get-started-quickstart#extract-data-from-the-response",children:"Langflow quickstart"}),".\nFor example, you could pass the chat output text to a front-end user-facing application, and store specific fields in logs and backend data stores for monitoring, chat history, or analytics.\nYou could also pass the output from one flow as input to another flow."]})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},9179:(e,n,t)=>{t.d(n,{A:()=>i});t(6540);var s=t(7856),r=t(4848);function i({name:e,...n}){const t=s[e];return t?(0,r.jsx)(t,{...n}):null}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var s=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function a({children:e,hidden:n,className:t}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,s.A)(r.tabItem,t),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/af920ffe.fae170b0.js b/assets/js/af920ffe.fae170b0.js new file mode 100644 index 00000000..1bbfdd22 --- /dev/null +++ b/assets/js/af920ffe.fae170b0.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[98],{1260:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>u,contentTitle:()=>h,default:()=>x,frontMatter:()=>d,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"get-started/quickstart","title":"Quickstart","description":"Use this quickstart to install OpenRAG, and then try some of OpenRAG\'s core features.","source":"@site/docs/get-started/quickstart.mdx","sourceDirName":"get-started","slug":"/quickstart","permalink":"/quickstart","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/quickstart.mdx","tags":[],"version":"current","frontMatter":{"title":"Quickstart","slug":"/quickstart"},"sidebar":"tutorialSidebar","previous":{"title":"About OpenRAG","permalink":"/"},"next":{"title":"Select an installation method","permalink":"/install-options"}}');var r=t(4848),i=t(8453),a=t(9179),o=(t(1470),t(9365),t(7224)),l=t(6149),c=t(4042);const d={title:"Quickstart",slug:"/quickstart"},h=void 0,u={},p=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...l.RM,{value:"Install OpenRAG",id:"install-openrag",level:2},{value:"Load and chat with documents",id:"chat-with-documents",level:2},{value:"Change the language model and chat settings",id:"change-components",level:2},{value:"Integrate OpenRAG into an application",id:"integrate-openrag-into-an-application",level:2},...o.RM,{value:"Next steps",id:"next-steps",level:2}];function g(e){const n={a:"a",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"Use this quickstart to install OpenRAG, and then try some of OpenRAG's core features."}),"\n",(0,r.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,r.jsx)(c.Ay,{}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Get an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),".\nThis quickstart uses OpenAI for simplicity.\nFor other providers, see the other ",(0,r.jsx)(n.a,{href:"/install-options",children:"installation methods"}),"."]}),"\n"]}),"\n",(0,r.jsx)(l.Ay,{}),"\n",(0,r.jsx)(n.h2,{id:"install-openrag",children:"Install OpenRAG"}),"\n",(0,r.jsxs)(n.p,{children:["For this quickstart, install OpenRAG with the automatic installer script and basic setup.\nThe script installs OpenRAG dependencies, including Docker or Podman, and then it installs and runs OpenRAG with ",(0,r.jsx)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#running-tools",children:(0,r.jsx)(n.code,{children:"uvx"})}),"."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Create a directory for your OpenRAG installation, and then change to that directory:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"mkdir openrag-workspace\ncd openrag-workspace\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.openr.ag/files/run_openrag_with_prereqs.sh",children:"Download the OpenRAG install script"}),", move it to your OpenRAG directory, and then run it:"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"bash run_openrag_with_prereqs.sh\n"})}),"\n",(0,r.jsx)(n.p,{children:"Wait while the installer script prepares your environment and installs OpenRAG.\nYou might be prompted to install certain dependencies if they aren't already present in your environment."}),"\n",(0,r.jsxs)(n.p,{children:["The entire process can take a few minutes.\nOnce the environment is ready, the OpenRAG ",(0,r.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," starts."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:t(3929).A+"",width:"653",height:"397"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Basic Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"Langflow Admin Password"}),", click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow administrator password and username."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Use the default values for all other fields."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your OpenRAG configuration and passwords are stored in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," file that is created automatically at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nOpenRAG container definitions are stored in the ",(0,r.jsx)(n.code,{children:"docker-compose"})," files in the same directory."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," to access the OpenRAG application and start the application onboarding process."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For this quickstart, select the ",(0,r.jsx)(n.strong,{children:"OpenAI"})," model provider, enter your OpenAI API key, and then click ",(0,r.jsx)(n.strong,{children:"Complete"}),". Use the default settings for all other model options."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(a.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nYou can complete this quickstart without going through the overview.\nThe overview demonstrates some basic functionality that is covered in the next section and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"chat-with-documents",children:"Load and chat with documents"}),"\n",(0,r.jsxs)(n.p,{children:["Use the ",(0,r.jsxs)(n.a,{href:"/chat",children:["OpenRAG ",(0,r.jsx)(n.strong,{children:"Chat"})]})," to explore the documents in your OpenRAG database using natural language queries.\nSome documents are included by default to get you started, and you can load your own documents."]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In OpenRAG, click ",(0,r.jsx)(a.A,{name:"MessageSquare","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Chat"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For this quickstart, ask the agent what documents are available.\nFor example: ",(0,r.jsx)(n.code,{children:"What documents are available to you?"})]}),"\n",(0,r.jsx)(n.p,{children:"The agent responds with a summary of OpenRAG's default documents."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To verify the agent's response, click ",(0,r.jsx)(a.A,{name:"Library","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Knowledge"})," to view the documents stored in the OpenRAG OpenSearch database.\nYou can click a document to view the chunks of the document as they are stored in the database."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Add Knowledge"})," to add your own documents to your OpenRAG knowledge base."]}),"\n",(0,r.jsxs)(n.p,{children:["For this quickstart, use either the ",(0,r.jsx)(a.A,{name:"File","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"File"})," or ",(0,r.jsx)(a.A,{name:"Folder","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Folder"})," upload options to load documents from your local machine.\n",(0,r.jsx)(n.strong,{children:"Folder"})," uploads an entire directory.\nThe default directory is ",(0,r.jsx)(n.code,{children:"~/.openrag/documents"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["For information about the cloud storage provider options, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Return to the ",(0,r.jsx)(n.strong,{children:"Chat"})," window, and then ask a question related to the documents that you just uploaded."]}),"\n",(0,r.jsx)(n.p,{children:"If the agent's response doesn't seem to reference your documents correctly, try the following:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(a.A,{name:"Gear","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Function Call: search_documents (tool_call)"})," to view the log of tool calls made by the agent. This is helpful for troubleshooting because it shows you how the agent used particular tools."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(a.A,{name:"Library","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Knowledge"})," to confirm that the documents are present in the OpenRAG OpenSearch database, and then click each document to see how the document was chunked.\nIf a document was chunked improperly, you might need to tweak the ingestion or modify and reupload the document."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(a.A,{name:"Settings2","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Settings"})," to modify the knowledge ingestion settings."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["For more information, see ",(0,r.jsx)(n.a,{href:"/knowledge",children:"Configure knowledge"})," and ",(0,r.jsx)(n.a,{href:"/ingestion",children:"Ingest knowledge"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"change-components",children:"Change the language model and chat settings"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To change the knowledge ingestion settings, agent behavior, or language model, click ",(0,r.jsx)(a.A,{name:"Settings2","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"Settings"})," page provides quick access to commonly used parameters like the ",(0,r.jsx)(n.strong,{children:"Language model"})," and ",(0,r.jsx)(n.strong,{children:"Agent Instructions"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For greater insight into the underlying ",(0,r.jsx)(n.a,{href:"/agents",children:"Langflow flow"})," that drives the OpenRAG chat, click ",(0,r.jsx)(n.strong,{children:"Edit in Langflow"})," and then click ",(0,r.jsx)(n.strong,{children:"Proceed"})," to launch the Langflow visual editor in a new browser window."]}),"\n",(0,r.jsxs)(n.p,{children:["If Langflow requests login information, enter the ",(0,r.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," and ",(0,r.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," from the ",(0,r.jsx)(n.code,{children:".env"})," file at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["The ",(0,r.jsx)(n.strong,{children:"OpenRAG OpenSearch Agent"})," flow opens in a new browser window."]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.img,{alt:"OpenRAG OpenSearch Agent flow",src:t(3982).A+"",width:"4084",height:"2176"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For this quickstart, try changing the model.\nClick the ",(0,r.jsx)(n.strong,{children:"Language Model"})," component, and then change the ",(0,r.jsx)(n.strong,{children:"Model Name"})," to a different OpenAI model."]}),"\n",(0,r.jsxs)(n.p,{children:["After you edit a built-in flow, you can click ",(0,r.jsx)(n.strong,{children:"Restore flow"})," on the ",(0,r.jsx)(n.strong,{children:"Settings"})," page to revert the flow to its original state when you first installed OpenRAG."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Press ",(0,r.jsx)("kbd",{children:"Command"}),"+",(0,r.jsx)("kbd",{children:"S"})," (",(0,r.jsx)("kbd",{children:"Ctrl"}),"+",(0,r.jsx)("kbd",{children:"S"}),") to save your changes."]}),"\n",(0,r.jsx)(n.p,{children:"You can close the Langflow browser window, or leave it open if you want to continue experimenting with the flow editor."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Switch to your OpenRAG browser window, and then click ",(0,r.jsx)(a.A,{name:"Plus","aria-hidden":"true"})," in the ",(0,r.jsx)(n.strong,{children:"Conversations"})," tab to start a new conversation.\nThis ensures that the chat doesn't persist any context from the previous conversation with the original model."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Ask the same question you asked in ",(0,r.jsx)(n.a,{href:"#chat-with-documents",children:"Load and chat with documents"})," to see how the response differs from the original model."]}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(n.h2,{id:"integrate-openrag-into-an-application",children:"Integrate OpenRAG into an application"}),"\n",(0,r.jsxs)(n.p,{children:["Langflow in OpenRAG includes pre-built flows that you can integrate into your applications using the ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/api-reference-api-examples",children:"Langflow API"}),".\nYou can use these flows as-is or modify them to better suit your needs, as demonstrated in ",(0,r.jsx)(n.a,{href:"#change-components",children:"Change the language model and chat settings"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can send and receive requests with the Langflow API using Python, TypeScript, or curl."}),"\n",(0,r.jsx)(o.Ay,{}),"\n",(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Reinstall OpenRAG with your preferred settings"}),": This quickstart used ",(0,r.jsx)(n.code,{children:"uvx"})," and a minimal setup to demonstrate OpenRAG's core functionality.\nIt is recommended that you ",(0,r.jsx)(n.a,{href:"/reinstall",children:"reinstall OpenRAG"})," with your preferred configuration and ",(0,r.jsx)(n.a,{href:"/install-options",children:"installation method"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Learn more about OpenRAG"}),": Explore OpenRAG and the OpenRAG documentation to learn more about its features and functionality."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Learn more about Langflow"}),": For a deep dive on the Langflow API and visual editor, see the ",(0,r.jsx)(n.a,{href:"https://docs.langflow.org/",children:"Langflow documentation"}),"."]}),"\n"]}),"\n"]})]})}function x(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(g,{...e})}):g(e)}},1470:(e,n,t)=>{t.d(n,{A:()=>b});var s=t(6540),r=t(4164),i=t(7559),a=t(3104),o=t(6347),l=t(205),c=t(7485),d=t(1682),h=t(679);function u(e){return s.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,s.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,s.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:t,default:s}})=>({value:e,label:n,attributes:t,default:s}))}(t);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const t=(0,o.W6)(),r=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(r),(0,s.useCallback)(e=>{if(!r)return;const n=new URLSearchParams(t.location.search);n.set(r,e),t.replace({...t.location,search:n.toString()})},[r,t])]}function j(e){const{defaultValue:n,queryString:t=!1,groupId:r}=e,i=p(e),[a,o]=(0,s.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:i})),[c,d]=x({queryString:t,groupId:r}),[u,j]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,r]=(0,h.Dv)(n);return[t,(0,s.useCallback)(e=>{n&&r.set(e)},[n,r])]}({groupId:r}),f=(()=>{const e=c??u;return g({value:e,tabValues:i})?e:null})();(0,l.A)(()=>{f&&o(f)},[f]);return{selectedValue:a,selectValue:(0,s.useCallback)(e=>{if(!g({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);o(e),d(e),j(e)},[d,j,i]),tabValues:i}}var f=t(2303);const m={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=t(4848);function w({className:e,block:n,selectedValue:t,selectValue:s,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),c=e=>{const n=e.currentTarget,r=o.indexOf(n),a=i[r].value;a!==t&&(l(n),s(a))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:s})=>(0,y.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:d,onClick:c,...s,className:(0,r.A)("tabs__item",m.tabItem,s?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:t}){const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===t);return e?(0,s.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:i.map((e,n)=>(0,s.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function v(e){const n=j(e);return(0,y.jsxs)("div",{className:(0,r.A)(i.G.tabs.container,"tabs-container",m.tabList),children:[(0,y.jsx)(w,{...n,...e}),(0,y.jsx)(A,{...n,...e})]})}function b(e){const n=(0,f.A)();return(0,y.jsx)(v,{...e,children:u(e.children)},String(n))}},3929:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/openrag_tui_dec_2025-c7022e66cc6675f25aced7b8acd8274d.png"},3982:(e,n,t)=>{t.d(n,{A:()=>s});const s=t.p+"assets/images/opensearch-agent-flow-f3b279e02425cd043002eb7749067108.png"},4042:(e,n,t)=>{t.d(n,{Ay:()=>o,RM:()=>i});var s=t(4848),r=t(8453);const i=[];function a(e){const n={a:"a",li:"li",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["Install ",(0,s.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},6149:(e,n,t)=>{t.d(n,{Ay:()=>o,RM:()=>i});var s=t(4848),r=t(8453);const i=[];function a(e){const n={a:"a",li:"li",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,s.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function o(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(a,{...e})}):a(e)}},7224:(e,n,t)=>{t.d(n,{Ay:()=>d,RM:()=>l});var s=t(4848),r=t(8453),i=t(9179),a=t(1470),o=t(9365);const l=[];function c(e){const n={a:"a",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Open the ",(0,s.jsx)(n.strong,{children:"OpenRAG OpenSearch Agent"})," flow in the Langflow visual editor: From the ",(0,s.jsx)(n.strong,{children:"Chat"})," window, click ",(0,s.jsx)(i.A,{name:"Settings2","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Settings"}),", click ",(0,s.jsx)(n.strong,{children:"Edit in Langflow"}),", and then click ",(0,s.jsx)(n.strong,{children:"Proceed"}),"."]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Optional: If you don't want to use the Langflow API key that is generated automatically when you install OpenRAG, you can create a ",(0,s.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication",children:"Langflow API key"}),".\nThis key doesn't grant access to OpenRAG; it is only for authenticating with the Langflow API."]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:["In the Langflow visual editor, click your user icon in the header, and then select ",(0,s.jsx)(n.strong,{children:"Settings"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Click ",(0,s.jsx)(n.strong,{children:"Langflow API Keys"}),", and then click ",(0,s.jsx)(i.A,{name:"Plus","aria-hidden":"true"})," ",(0,s.jsx)(n.strong,{children:"Add New"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:["Name your key, and then click ",(0,s.jsx)(n.strong,{children:"Create API Key"}),"."]}),"\n",(0,s.jsx)(n.li,{children:"Copy the API key and store it securely."}),"\n",(0,s.jsxs)(n.li,{children:["Exit the Langflow ",(0,s.jsx)(n.strong,{children:"Settings"})," page to return to the visual editor."]}),"\n"]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsxs)(n.p,{children:["Click ",(0,s.jsx)(n.strong,{children:"Share"}),", and then select ",(0,s.jsx)(n.strong,{children:"API access"})," to get pregenerated code snippets that call the Langflow API and run the flow."]}),"\n",(0,s.jsxs)(n.p,{children:["These code snippets construct API requests with your Langflow server URL (",(0,s.jsx)(n.code,{children:"LANGFLOW_SERVER_ADDRESS"}),"), the flow to run (",(0,s.jsx)(n.code,{children:"FLOW_ID"}),"), required headers (",(0,s.jsx)(n.code,{children:"LANGFLOW_API_KEY"}),", ",(0,s.jsx)(n.code,{children:"Content-Type"}),"), and a payload containing the required inputs to run the flow, including a default chat input message."]}),"\n",(0,s.jsx)(n.p,{children:"In production, you would modify the inputs to suit your application logic. For example, you could replace the default chat input message with dynamic user input."}),"\n",(0,s.jsxs)(a.A,{children:[(0,s.jsx)(o.A,{value:"python",label:"Python",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-python",children:'import requests\nimport os\nimport uuid\n\napi_key = \'LANGFLOW_API_KEY\'\nurl = "http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID" # The complete API endpoint URL for this flow\n\n# Request payload configuration\npayload = {\n "output_type": "chat",\n "input_type": "chat",\n "input_value": "hello world!"\n}\npayload["session_id"] = str(uuid.uuid4())\n\nheaders = {"x-api-key": api_key}\n\ntry:\n # Send API request\n response = requests.request("POST", url, json=payload, headers=headers)\n response.raise_for_status() # Raise exception for bad status codes\n\n # Print response\n print(response.text)\n\nexcept requests.exceptions.RequestException as e:\n print(f"Error making API request: {e}")\nexcept ValueError as e:\n print(f"Error parsing response: {e}")\n'})})}),(0,s.jsx)(o.A,{value:"typescript",label:"TypeScript",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-typescript",children:'const crypto = require(\'crypto\');\nconst apiKey = \'LANGFLOW_API_KEY\';\nconst payload = {\n "output_type": "chat",\n "input_type": "chat",\n "input_value": "hello world!"\n};\npayload.session_id = crypto.randomUUID();\n\nconst options = {\n method: \'POST\',\n headers: {\n \'Content-Type\': \'application/json\',\n "x-api-key": apiKey\n },\n body: JSON.stringify(payload)\n};\n\nfetch(\'http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID\', options)\n .then(response => response.json())\n .then(response => console.warn(response))\n .catch(err => console.error(err));\n'})})}),(0,s.jsx)(o.A,{value:"curl",label:"curl",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-bash",children:'curl --request POST \\\n --url \'http://LANGFLOW_SERVER_ADDRESS/api/v1/run/FLOW_ID?stream=false\' \\\n --header \'Content-Type: application/json\' \\\n --header "x-api-key: LANGFLOW_API_KEY" \\\n --data \'{\n "output_type": "chat",\n "input_type": "chat",\n "input_value": "hello world!"\n }\'\n'})})})]}),"\n"]}),"\n",(0,s.jsxs)(n.li,{children:["\n",(0,s.jsx)(n.p,{children:"Copy your preferred snippet, and then run it:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Python"}),": Paste the snippet into a ",(0,s.jsx)(n.code,{children:".py"})," file, save it, and then run it with ",(0,s.jsx)(n.code,{children:"python filename.py"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"TypeScript"}),": Paste the snippet into a ",(0,s.jsx)(n.code,{children:".ts"})," file, save it, and then run it with ",(0,s.jsx)(n.code,{children:"ts-node filename.ts"}),"."]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"curl"}),": Paste and run snippet directly in your terminal."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(n.p,{children:"If the request is successful, the response includes many details about the flow run, including the session ID, inputs, outputs, components, durations, and more."}),"\n",(0,s.jsxs)(n.p,{children:["In production, you won't pass the raw response to the user in its entirety.\nInstead, you extract and reformat relevant fields for different use cases, as demonstrated in the ",(0,s.jsx)(n.a,{href:"https://docs.langflow.org/get-started-quickstart#extract-data-from-the-response",children:"Langflow quickstart"}),".\nFor example, you could pass the chat output text to a front-end user-facing application, and store specific fields in logs and backend data stores for monitoring, chat history, or analytics.\nYou could also pass the output from one flow as input to another flow."]})]})}function d(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},9179:(e,n,t)=>{t.d(n,{A:()=>i});t(6540);var s=t(7856),r=t(4848);function i({name:e,...n}){const t=s[e];return t?(0,r.jsx)(t,{...n}):null}},9365:(e,n,t)=>{t.d(n,{A:()=>a});t(6540);var s=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function a({children:e,hidden:n,className:t}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,s.A)(r.tabItem,t),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/c5b64a02.52bf4eef.js b/assets/js/c5b64a02.52bf4eef.js deleted file mode 100644 index fcc4f866..00000000 --- a/assets/js/c5b64a02.52bf4eef.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[5668],{2046:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),r=s(8453);const l=[];function t(e){const n={code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(n.ol,{start:"2",children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all containers, including stopped containers:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rm --force $(docker ps -aq)\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rm --all --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all images:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rmi --force $(docker images -q)\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rmi --all --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all volumes:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker volume prune --force\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman volume prune --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all networks except the default network:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker network prune --force\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman network prune --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clean up any leftover data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker system prune --all --force --volumes\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman system prune --all --force --volumes\n"})}),"\n"]}),"\n"]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}},4577:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),r=s(8453);const l=[];function t(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop $(docker ps -q)\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop --all\n"})})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}},5126:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>p,contentTitle:()=>d,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"get-started/uninstall","title":"Remove OpenRAG","description":"If you want to reset your OpenRAG containers without removing OpenRAG entirely, see Reset OpenRAG containers and Reinstall OpenRAG.","source":"@site/docs/get-started/uninstall.mdx","sourceDirName":"get-started","slug":"/uninstall","permalink":"/uninstall","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/uninstall.mdx","tags":[],"version":"current","frontMatter":{"title":"Remove OpenRAG","slug":"/uninstall"},"sidebar":"tutorialSidebar","previous":{"title":"Reinstall OpenRAG","permalink":"/reinstall"},"next":{"title":"Use the TUI","permalink":"/tui"}}');var r=s(4848),l=s(8453),t=s(9809),c=s(4577),a=s(2046);const i={title:"Remove OpenRAG",slug:"/uninstall"},d=void 0,p={},h=[{value:"Uninstall TUI-managed deployments",id:"uninstall-tui-managed-deployments",level:2},{value:"Uninstall self-managed deployments",id:"uninstall-self-managed-deployments",level:2},{value:"Uninstall with docker compose or podman compose",id:"uninstall-with-docker-compose-or-podman-compose",level:3},...t.RM,{value:"Uninstall with discrete docker or podman commands",id:"uninstall-with-discrete-docker-or-podman-commands",level:3},...c.RM,...a.RM];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you want to reset your OpenRAG containers without removing OpenRAG entirely, see ",(0,r.jsx)(n.a,{href:"/manage-services",children:"Reset OpenRAG containers"})," and ",(0,r.jsx)(n.a,{href:"/reinstall",children:"Reinstall OpenRAG"}),"."]})}),"\n",(0,r.jsx)(n.h2,{id:"uninstall-tui-managed-deployments",children:"Uninstall TUI-managed deployments"}),"\n",(0,r.jsxs)(n.p,{children:["If you used the ",(0,r.jsx)(n.a,{href:"/install",children:"automated installer script"})," or ",(0,r.jsx)(n.a,{href:"/install-uvx",children:(0,r.jsx)(n.code,{children:"uvx"})})," to install OpenRAG, clear your ",(0,r.jsx)(n.code,{children:"uv"})," cache (",(0,r.jsx)(n.code,{children:"uv cache clean"}),") to remove the TUI environment, and then delete the directory containing your OpenRAG configuration files and data (where you would invoke OpenRAG)."]}),"\n",(0,r.jsxs)(n.p,{children:["If you used ",(0,r.jsx)(n.a,{href:"/install-uv",children:(0,r.jsx)(n.code,{children:"uv"})})," to install OpenRAG, run ",(0,r.jsx)(n.code,{children:"uv remove openrag"})," in your Python project."]}),"\n",(0,r.jsx)(n.h2,{id:"uninstall-self-managed-deployments",children:"Uninstall self-managed deployments"}),"\n",(0,r.jsx)(n.p,{children:"For self-managed services, destroy the containers, prune any additional container objects, delete any remaining OpenRAG files, and then shut down the Docling service."}),"\n",(0,r.jsxs)(n.h3,{id:"uninstall-with-docker-compose-or-podman-compose",children:["Uninstall with ",(0,r.jsx)(n.code,{children:"docker compose"})," or ",(0,r.jsx)(n.code,{children:"podman compose"})]}),"\n",(0,r.jsxs)(n.p,{children:["Use these steps to uninstall a self-managed OpenRAG deployment with streamlined ",(0,r.jsx)(n.code,{children:"docker compose"})," or ",(0,r.jsx)(n.code,{children:"podman compose"})," commands:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Destroy the containers, volumes, and local images, and then remove (prune) any additional container objects:"}),"\n",(0,r.jsx)(t.Ay,{}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Remove OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"~/.openrag/documents"})," directory, which aren't deleted by the previous commands."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Stop ",(0,r.jsx)(n.code,{children:"docling-serve"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.h3,{id:"uninstall-with-discrete-docker-or-podman-commands",children:["Uninstall with discrete ",(0,r.jsx)(n.code,{children:"docker"})," or ",(0,r.jsx)(n.code,{children:"podman"})," commands"]}),"\n",(0,r.jsxs)(n.p,{children:["Use these commands to uninstall a self-managed OpenRAG deployment with discrete ",(0,r.jsx)(n.code,{children:"docker"})," or ",(0,r.jsx)(n.code,{children:"podman"})," commands:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Stop all running containers:"}),"\n",(0,r.jsx)(c.Ay,{}),"\n"]}),"\n"]}),"\n",(0,r.jsx)(a.Ay,{}),"\n",(0,r.jsxs)(n.ol,{start:"7",children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Remove OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"~/.openrag/documents"})," directory, which aren't deleted by the previous commands."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Stop ",(0,r.jsx)(n.code,{children:"docling-serve"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>c});var o=s(6540);const r={},l=o.createContext(r);function t(e){const n=o.useContext(l);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),o.createElement(l.Provider,{value:n},e.children)}},9809:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),r=s(8453);const l=[];function t(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose down --volumes --remove-orphans --rmi local\npodman system prune -f\n"})})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}}}]); \ No newline at end of file diff --git a/assets/js/c5b64a02.8aade99d.js b/assets/js/c5b64a02.8aade99d.js new file mode 100644 index 00000000..50ebc19f --- /dev/null +++ b/assets/js/c5b64a02.8aade99d.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[5668],{2046:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),r=s(8453);const l=[];function t(e){const n={code:"code",li:"li",ol:"ol",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all containers, including stopped containers:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rm --force $(docker ps -aq)\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rm --all --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all images:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rmi --force $(docker images -q)\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rmi --all --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all volumes:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker volume prune --force\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman volume prune --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Remove all networks except the default network:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker network prune --force\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman network prune --force\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Clean up any leftover data:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker system prune --all --force --volumes\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman system prune --all --force --volumes\n"})}),"\n"]}),"\n"]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}},4577:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),r=s(8453);const l=[];function t(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop $(docker ps -q)\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop --all\n"})})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}},5126:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>p,contentTitle:()=>i,default:()=>u,frontMatter:()=>d,metadata:()=>o,toc:()=>h});const o=JSON.parse('{"id":"get-started/uninstall","title":"Remove OpenRAG","description":"If you want to reset your OpenRAG containers without removing OpenRAG entirely, see Reset OpenRAG containers and Reinstall OpenRAG.","source":"@site/docs/get-started/uninstall.mdx","sourceDirName":"get-started","slug":"/uninstall","permalink":"/uninstall","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/uninstall.mdx","tags":[],"version":"current","frontMatter":{"title":"Remove OpenRAG","slug":"/uninstall"},"sidebar":"tutorialSidebar","previous":{"title":"Reinstall OpenRAG","permalink":"/reinstall"},"next":{"title":"Use the TUI","permalink":"/tui"}}');var r=s(4848),l=s(8453),t=s(9809),c=s(4577),a=s(2046);const d={title:"Remove OpenRAG",slug:"/uninstall"},i=void 0,p={},h=[{value:"Uninstall TUI-managed deployments",id:"uninstall-tui-managed-deployments",level:2},{value:"Uninstall self-managed deployments",id:"uninstall-self-managed-deployments",level:2},{value:"Uninstall with docker compose or podman compose",id:"uninstall-with-docker-compose-or-podman-compose",level:3},...t.RM,{value:"Uninstall with discrete docker or podman commands",id:"uninstall-with-discrete-docker-or-podman-commands",level:3},...c.RM,...a.RM];function m(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.admonition,{type:"tip",children:(0,r.jsxs)(n.p,{children:["If you want to reset your OpenRAG containers without removing OpenRAG entirely, see ",(0,r.jsx)(n.a,{href:"/manage-services",children:"Reset OpenRAG containers"})," and ",(0,r.jsx)(n.a,{href:"/reinstall",children:"Reinstall OpenRAG"}),"."]})}),"\n",(0,r.jsx)(n.h2,{id:"uninstall-tui-managed-deployments",children:"Uninstall TUI-managed deployments"}),"\n",(0,r.jsxs)(n.p,{children:["If you used the ",(0,r.jsx)(n.a,{href:"/install",children:"automated installer script"})," or ",(0,r.jsx)(n.a,{href:"/install-uvx",children:(0,r.jsx)(n.code,{children:"uvx"})})," to install OpenRAG, clear your ",(0,r.jsx)(n.code,{children:"uv"})," cache (",(0,r.jsx)(n.code,{children:"uv cache clean"}),") to remove the TUI environment, and then delete the ",(0,r.jsx)(n.code,{children:"~/.openrag"})," directory."]}),"\n",(0,r.jsxs)(n.p,{children:["If you used ",(0,r.jsx)(n.a,{href:"/install-uv",children:(0,r.jsx)(n.code,{children:"uv"})})," to install OpenRAG, run ",(0,r.jsx)(n.code,{children:"uv remove openrag"})," in your Python project, and then delete the ",(0,r.jsx)(n.code,{children:"~/.openrag"})," directory."]}),"\n",(0,r.jsx)(n.h2,{id:"uninstall-self-managed-deployments",children:"Uninstall self-managed deployments"}),"\n",(0,r.jsx)(n.p,{children:"For self-managed services, destroy the containers, prune any additional container objects, delete any remaining OpenRAG files, and then shut down the Docling service."}),"\n",(0,r.jsxs)(n.h3,{id:"uninstall-with-docker-compose-or-podman-compose",children:["Uninstall with ",(0,r.jsx)(n.code,{children:"docker compose"})," or ",(0,r.jsx)(n.code,{children:"podman compose"})]}),"\n",(0,r.jsxs)(n.p,{children:["Use these steps to uninstall a self-managed OpenRAG deployment with streamlined ",(0,r.jsx)(n.code,{children:"docker compose"})," or ",(0,r.jsx)(n.code,{children:"podman compose"})," commands:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Destroy the containers, volumes, and local images, and then remove (prune) any additional container objects:"}),"\n",(0,r.jsx)(t.Ay,{}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Remove OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"~/.openrag/documents"})," directory, which aren't deleted by the previous commands."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Stop ",(0,r.jsx)(n.code,{children:"docling-serve"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.h3,{id:"uninstall-with-discrete-docker-or-podman-commands",children:["Uninstall with discrete ",(0,r.jsx)(n.code,{children:"docker"})," or ",(0,r.jsx)(n.code,{children:"podman"})," commands"]}),"\n",(0,r.jsxs)(n.p,{children:["Use these commands to uninstall a self-managed OpenRAG deployment with discrete ",(0,r.jsx)(n.code,{children:"docker"})," or ",(0,r.jsx)(n.code,{children:"podman"})," commands:"]}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Stop all running containers:"}),"\n",(0,r.jsx)(c.Ay,{}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Remove and clean up containers:"}),"\n",(0,r.jsx)(a.Ay,{}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Remove OpenRAG's ",(0,r.jsx)(n.code,{children:".env"})," file and the ",(0,r.jsx)(n.code,{children:"~/.openrag/documents"})," directory, which aren't deleted by the previous commands."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Stop ",(0,r.jsx)(n.code,{children:"docling-serve"}),":"]}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",children:"uv run python scripts/docling_ctl.py stop\n"})}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(m,{...e})}):m(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>c});var o=s(6540);const r={},l=o.createContext(r);function t(e){const n=o.useContext(l);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:t(e.components),o.createElement(l.Provider,{value:n},e.children)}},9809:(e,n,s)=>{s.d(n,{Ay:()=>c,RM:()=>l});var o=s(4848),r=s(8453);const l=[];function t(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose down --volumes --remove-orphans --rmi local\ndocker system prune -f\n"})}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose down --volumes --remove-orphans --rmi local\npodman system prune -f\n"})})]})}function c(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}}}]); \ No newline at end of file diff --git a/assets/js/c8078f0a.1db22c20.js b/assets/js/c8078f0a.1db22c20.js new file mode 100644 index 00000000..4a431452 --- /dev/null +++ b/assets/js/c8078f0a.1db22c20.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[9026],{1381:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function d(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>l});var r=s(6540);const t={},i=r.createContext(t);function d(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:n},e.children)}},9196:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"reference/configuration","title":"Environment variables","description":"OpenRAG\'s .env file is the primary configuration file for OpenRAG.","source":"@site/docs/reference/configuration.mdx","sourceDirName":"reference","slug":"/reference/configuration","permalink":"/reference/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/reference/configuration.mdx","tags":[],"version":"current","frontMatter":{"title":"Environment variables","slug":"/reference/configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Chat","permalink":"/chat"},"next":{"title":"Troubleshoot OpenRAG","permalink":"/support/troubleshoot"}}');var t=s(4848),i=s(8453);s(1381);const d={title:"Environment variables",slug:"/reference/configuration"},l=void 0,c={},o=[{value:"Edit the .env file",id:"set-environment-variables",level:2},{value:"Model provider settings",id:"model-provider-settings",level:2},{value:"Document processing settings",id:"document-processing-settings",level:2},{value:"Langflow settings",id:"langflow-settings",level:2},{value:"OAuth provider settings",id:"oauth-provider-settings",level:2},{value:"OpenSearch settings",id:"opensearch-settings",level:2},{value:"System settings",id:"system-settings",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["OpenRAG's ",(0,t.jsx)(n.code,{children:".env"})," file is the primary configuration file for OpenRAG.\nEnvironment variables in ",(0,t.jsx)(n.code,{children:".env"})," always take precedence over other sources."]}),"\n",(0,t.jsxs)(n.p,{children:["For deployments managed with the Terminal User Interface (TUI), this file is located at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),", and it can be created automatically during ",(0,t.jsx)(n.a,{href:"/install-options",children:"installation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.a,{href:"/docker",children:"self-managed deployments"}),", this file can be located at the root of your OpenRAG project directory or referenced from another location."]}),"\n",(0,t.jsxs)(n.p,{children:["For an example, see ",(0,t.jsxs)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/.env.example",children:[(0,t.jsx)(n.code,{children:".env.example"})," in the OpenRAG repository"]}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["OpenRAG's Docker Compose files are populated automatically using values from the ",(0,t.jsx)(n.code,{children:".env"})," file, so you don't need to edit the Docker Compose files manually."]})}),"\n",(0,t.jsxs)(n.p,{children:["If a variable isn't set, OpenRAG uses default or fallback values where available.\nNot all variables have default values, and errors can occur if required variables aren't set.\nDefault values can be found in the reference tables on this page and in ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/config/config_manager.py",children:(0,t.jsx)(n.code,{children:"config_manager.py"})}),", ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/config/settings.py",children:(0,t.jsx)(n.code,{children:"settings.py"})}),", and ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/utils/logging_config.py",children:(0,t.jsx)(n.code,{children:"logging_config.py"})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["You can ",(0,t.jsx)(n.a,{href:"/agents#modify-a-flow-at-runtime",children:"temporarily set Langflow variables at runtime"}),".\nHowever, these temporary overrides don't overlap with most OpenRAG environment variables.\nThe only exceptions are flow-level Langflow settings, such as the language model used in a flow."]}),"\n",(0,t.jsxs)(n.h2,{id:"set-environment-variables",children:["Edit the ",(0,t.jsx)(n.code,{children:".env"})," file"]}),"\n",(0,t.jsxs)(n.p,{children:["During ",(0,t.jsx)(n.a,{href:"/install-options",children:"installation"}),", an initial ",(0,t.jsx)(n.code,{children:".env"})," file is created automatically or manually.\nYou can edit this file to change OpenRAG configuration settings after installation."]}),"\n",(0,t.jsxs)(n.p,{children:["Each OpenRAG environment variable is either mutable or immutable.\nThis determines the actions you must take to apply changes after editing the ",(0,t.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Mutable environment variables"}),": You can apply changes to mutable environment variables by ",(0,t.jsx)(n.a,{href:"/manage-services",children:"stopping and restarting the OpenRAG services"})," after editing the ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Immutable environment variables"}),": You must ",(0,t.jsx)(n.a,{href:"/reinstall",children:"redeploy OpenRAG"})," with your modified ",(0,t.jsx)(n.code,{children:".env"})," file if you change immutable environment variables."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"model-provider-settings",children:"Model provider settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure which models and providers OpenRAG uses to generate text and embeddings.\nYou only need to provide credentials for the providers you are using in OpenRAG."}),"\n",(0,t.jsxs)(n.p,{children:["These variables are initially set during the ",(0,t.jsx)(n.a,{href:"/install#application-onboarding",children:"application onboarding process"}),".\nSome of these variables are immutable and can only be changed by redeploying OpenRAG, as explained in ",(0,t.jsx)(n.a,{href:"#set-environment-variables",children:"Set environment variables"}),"."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"EMBEDDING_MODEL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"text-embedding-3-small"})}),(0,t.jsx)(n.td,{children:"Embedding model for generating vector embeddings for documents in the knowledge base and similarity search queries. Can be changed after the application onboarding process. Accepts one or more models."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LLM_MODEL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"gpt-4o-mini"})}),(0,t.jsxs)(n.td,{children:["Language model for language processing and text generation in the ",(0,t.jsx)(n.strong,{children:"Chat"})," feature."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"MODEL_PROVIDER"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openai"})}),(0,t.jsxs)(n.td,{children:["Model provider, as one of ",(0,t.jsx)(n.code,{children:"openai"}),", ",(0,t.jsx)(n.code,{children:"watsonx"}),", ",(0,t.jsx)(n.code,{children:"ollama"}),", or ",(0,t.jsx)(n.code,{children:"anthropic"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"API key for the Anthropic language model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENAI_API_KEY"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"API key for the OpenAI model provider, which is also the default model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OLLAMA_ENDPOINT"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Custom provider endpoint for the Ollama model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WATSONX_API_KEY"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"API key for the IBM watsonx.ai model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WATSONX_ENDPOINT"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Custom provider endpoint for the IBM watsonx.ai model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Project ID for the IBM watsonx.ai model provider."})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"document-processing-settings",children:"Document processing settings"}),"\n",(0,t.jsxs)(n.p,{children:["Control how OpenRAG ",(0,t.jsx)(n.a,{href:"/ingestion",children:"processes and ingests documents"})," into your knowledge base."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CHUNK_OVERLAP"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"200"})}),(0,t.jsx)(n.td,{children:"Overlap between chunks."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CHUNK_SIZE"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"1000"})}),(0,t.jsx)(n.td,{children:"Text chunk size for document processing."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"DISABLE_INGEST_WITH_LANGFLOW"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"false"})}),(0,t.jsx)(n.td,{children:"Disable Langflow ingestion pipeline."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"DOCLING_OCR_ENGINE"})}),(0,t.jsx)(n.td,{children:"Set by OS"}),(0,t.jsxs)(n.td,{children:["OCR engine for document processing. For macOS, ",(0,t.jsx)(n.code,{children:"ocrmac"}),". For any other OS, ",(0,t.jsx)(n.code,{children:"easyocr"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OCR_ENABLED"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"false"})}),(0,t.jsx)(n.td,{children:"Enable OCR for image processing."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENRAG_DOCUMENTS_PATHS"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"~/.openrag/documents"})}),(0,t.jsx)(n.td,{children:"Document paths for ingestion."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"PICTURE_DESCRIPTIONS_ENABLED"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"false"})}),(0,t.jsx)(n.td,{children:"Enable picture descriptions."})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"langflow-settings",children:"Langflow settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure the OpenRAG Langflow server's authentication, contact point, and built-in flow definitions."}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set in your ",(0,t.jsx)(n.code,{children:".env"})," file, and this value determines the default values for several other Langflow authentication variables."]}),(0,t.jsxs)(n.p,{children:["If the ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," variable isn't set, then the Langflow server starts ",(0,t.jsx)(n.em,{children:"without"})," authentication enabled."]}),(0,t.jsxs)(n.p,{children:["For better security, it is recommended to set ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," so the ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#start-a-langflow-server-with-authentication-enabled",children:"Langflow server starts with authentication enabled"}),"."]})]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})}),(0,t.jsxs)(n.td,{children:["Determined by ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),(0,t.jsxs)(n.td,{children:["Whether to enable ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-auto-login",children:"auto-login mode"})," for the Langflow visual editor and CLI. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," is ",(0,t.jsx)(n.code,{children:"True"})," and auto-login mode is enabled. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," is ",(0,t.jsx)(n.code,{children:"False"})," and auto-login mode is disabled. Langflow API calls always require authentication with a Langflow API key regardless of the auto-login setting."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})}),(0,t.jsxs)(n.td,{children:["Determined by ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),(0,t.jsxs)(n.td,{children:["Whether to enable the ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-enable-superuser-cli",children:["Langflow CLI ",(0,t.jsx)(n.code,{children:"langflow superuser"})," command"]}),". If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})," is ",(0,t.jsx)(n.code,{children:"True"})," and superuser accounts can be created with the Langflow CLI. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})," is ",(0,t.jsx)(n.code,{children:"False"})," and the ",(0,t.jsx)(n.code,{children:"langflow superuser"})," command is disabled."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})}),(0,t.jsxs)(n.td,{children:["Determined by ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),(0,t.jsxs)(n.td,{children:["Whether new ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-new-user-is-active",children:"Langflow user accounts are active by default"}),". If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})," is ",(0,t.jsx)(n.code,{children:"True"})," and new user accounts are active by default. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})," is ",(0,t.jsx)(n.code,{children:"False"})," and new user accounts are inactive by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:7860"})}),(0,t.jsx)(n.td,{children:"Public URL for the Langflow instance. Forms the base URL for Langflow API calls and other interfaces with your OpenRAG Langflow instance."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_KEY"})}),(0,t.jsx)(n.td,{children:"Automatically generated"}),(0,t.jsx)(n.td,{children:"A Langflow API key to run flows with Langflow API calls. Because Langflow API keys are server-specific, allow OpenRAG to generate this key initially. You can create additional Langflow API keys after deploying OpenRAG."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})}),(0,t.jsx)(n.td,{children:"Automatically generated"}),(0,t.jsxs)(n.td,{children:["Secret encryption key for Langflow internal operations. It is recommended to ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-secret-key",children:"generate your own Langflow secret key"})," for this variable. If this variable isn't set, then Langflow generates a secret key automatically."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"admin"})}),(0,t.jsx)(n.td,{children:"Username for the Langflow administrator user."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Langflow administrator password. If this variable isn't set, then the Langflow server starts ",(0,t.jsx)(n.em,{children:"without"})," authentication enabled. It is recommended to set ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," so the ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#start-a-langflow-server-with-authentication-enabled",children:"Langflow server starts with authentication enabled"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_URL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:7860"})}),(0,t.jsx)(n.td,{children:"URL for the Langflow instance."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"LANGFLOW_CHAT_FLOW_ID"}),", ",(0,t.jsx)(n.code,{children:"LANGFLOW_INGEST_FLOW_ID"}),", ",(0,t.jsx)(n.code,{children:"NUDGES_FLOW_ID"})]}),(0,t.jsx)(n.td,{children:"Built-in flow IDs"}),(0,t.jsxs)(n.td,{children:["These variables are set automatically to the IDs of the chat, ingestion, and nudges ",(0,t.jsx)(n.a,{href:"/agents",children:"flows"}),". The default values are found in ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/.env.example",children:(0,t.jsx)(n.code,{children:".env.example"})}),". Only change these values if you want to replace a built-in flow with your own custom flow. The flow JSON must be present in your version of the OpenRAG codebase. For example, if you ",(0,t.jsx)(n.a,{href:"/docker",children:"deploy self-managed services"}),", you can add the flow JSON to your local clone of the OpenRAG repository before deploying OpenRAG."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SYSTEM_PROMPT"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"You are a helpful AI assistant with access to a knowledge base. Answer questions based on the provided context."})}),(0,t.jsxs)(n.td,{children:["System prompt instructions for the agent driving the ",(0,t.jsx)(n.strong,{children:"Chat"})," flow."]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"oauth-provider-settings",children:"OAuth provider settings"}),"\n",(0,t.jsxs)(n.p,{children:["Configure ",(0,t.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"OAuth providers"})," and external service integrations."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"AWS_ACCESS_KEY_ID"}),(0,t.jsx)("br",{}),(0,t.jsx)(n.code,{children:"AWS_SECRET_ACCESS_KEY"})]}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Enable access to AWS S3 with an ",(0,t.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"AWS OAuth app"})," integration."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"GOOGLE_OAUTH_CLIENT_ID"}),(0,t.jsx)("br",{}),(0,t.jsx)(n.code,{children:"GOOGLE_OAUTH_CLIENT_SECRET"})]}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Enable the ",(0,t.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client"})," integration. You can generate these values in the ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"MICROSOFT_GRAPH_OAUTH_CLIENT_ID"}),(0,t.jsx)("br",{}),(0,t.jsx)(n.code,{children:"MICROSOFT_GRAPH_OAUTH_CLIENT_SECRET"})]}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Enable the ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client"})," integration by providing ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WEBHOOK_BASE_URL"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Base URL for OAuth connector webhook endpoints. If this variable isn't set, a default base URL is used."})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"opensearch-settings",children:"OpenSearch settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure OpenSearch database authentication."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_HOST"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"localhost"})}),(0,t.jsx)(n.td,{children:"OpenSearch instance host."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_PORT"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"9200"})}),(0,t.jsx)(n.td,{children:"OpenSearch instance port."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_USERNAME"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"admin"})}),(0,t.jsx)(n.td,{children:"OpenSearch administrator username."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})}),(0,t.jsx)(n.td,{children:"Must be set at start up"}),(0,t.jsxs)(n.td,{children:["Required. OpenSearch administrator password. Must adhere to the ",(0,t.jsx)(n.a,{href:"https://docs.opensearch.org/latest/security/configuration/demo-configuration/#setting-up-a-custom-admin-password",children:"OpenSearch password complexity requirements"}),". You must set this directly in the ",(0,t.jsx)(n.code,{children:".env"})," or in the TUI's ",(0,t.jsx)(n.a,{href:"/install#setup",children:(0,t.jsx)(n.strong,{children:"Basic/Advanced Setup"})}),"."]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"system-settings",children:"System settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure general system components, session management, and logging."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_KEY_RETRIES"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"15"})}),(0,t.jsx)(n.td,{children:"Number of retries for Langflow key generation."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_KEY_RETRY_DELAY"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"2.0"})}),(0,t.jsx)(n.td,{children:"Delay between retries in seconds."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_VERSION"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})}),(0,t.jsxs)(n.td,{children:["Langflow Docker image version. By default, OpenRAG uses the ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," for the Langflow Docker image version."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LOG_FORMAT"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Set to ",(0,t.jsx)(n.code,{children:"json"})," to enabled JSON-formatted log output. If this variable isn't set, then the default logging format is used."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LOG_LEVEL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"INFO"})}),(0,t.jsxs)(n.td,{children:["Logging level. Can be one of ",(0,t.jsx)(n.code,{children:"DEBUG"}),", ",(0,t.jsx)(n.code,{children:"INFO"}),", ",(0,t.jsx)(n.code,{children:"WARNING"}),", or ",(0,t.jsx)(n.code,{children:"ERROR"}),". ",(0,t.jsx)(n.code,{children:"DEBUG"})," provides the most detailed logs but can impact performance."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"MAX_WORKERS"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"1"})}),(0,t.jsx)(n.td,{children:"Maximum number of workers for document processing."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"latest"})}),(0,t.jsxs)(n.td,{children:["The version of the OpenRAG Docker images to run. For more information, see ",(0,t.jsx)(n.a,{href:"/upgrade",children:"Upgrade OpenRAG"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SERVICE_NAME"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openrag"})}),(0,t.jsx)(n.td,{children:"Service name for logging."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SESSION_SECRET"})}),(0,t.jsx)(n.td,{children:"Automatically generated"}),(0,t.jsx)(n.td,{children:"Session management."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/c8078f0a.4baa8196.js b/assets/js/c8078f0a.4baa8196.js deleted file mode 100644 index eb4b825a..00000000 --- a/assets/js/c8078f0a.4baa8196.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[9026],{1381:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function d(e){const n={code:"code",pre:"pre",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>l});var r=s(6540);const t={},i=r.createContext(t);function d(e){const n=r.useContext(i);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),r.createElement(i.Provider,{value:n},e.children)}},9196:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>d,metadata:()=>r,toc:()=>o});const r=JSON.parse('{"id":"reference/configuration","title":"Environment variables","description":"OpenRAG\'s .env file is the primary configuration file for OpenRAG.","source":"@site/docs/reference/configuration.mdx","sourceDirName":"reference","slug":"/reference/configuration","permalink":"/reference/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/reference/configuration.mdx","tags":[],"version":"current","frontMatter":{"title":"Environment variables","slug":"/reference/configuration"},"sidebar":"tutorialSidebar","previous":{"title":"Chat","permalink":"/chat"},"next":{"title":"Troubleshoot OpenRAG","permalink":"/support/troubleshoot"}}');var t=s(4848),i=s(8453);s(1381);const d={title:"Environment variables",slug:"/reference/configuration"},l=void 0,c={},o=[{value:"Edit the .env file",id:"set-environment-variables",level:2},{value:"Model provider settings",id:"model-provider-settings",level:2},{value:"Document processing settings",id:"document-processing-settings",level:2},{value:"Langflow settings",id:"langflow-settings",level:2},{value:"OAuth provider settings",id:"oauth-provider-settings",level:2},{value:"OpenSearch settings",id:"opensearch-settings",level:2},{value:"System settings",id:"system-settings",level:2}];function a(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(n.p,{children:["OpenRAG's ",(0,t.jsx)(n.code,{children:".env"})," file is the primary configuration file for OpenRAG.\nEnvironment variables in ",(0,t.jsx)(n.code,{children:".env"})," always take precedence over other sources."]}),"\n",(0,t.jsxs)(n.p,{children:["For deployments managed with the Terminal User Interface (TUI), this file is located at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),", and it can be created automatically during ",(0,t.jsx)(n.a,{href:"/install-options",children:"installation"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["For ",(0,t.jsx)(n.a,{href:"/docker",children:"self-managed deployments"}),", this file can be located at the root of your OpenRAG project directory or referenced from another location."]}),"\n",(0,t.jsxs)(n.p,{children:["For an example, see ",(0,t.jsxs)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/.env.example",children:[(0,t.jsx)(n.code,{children:".env.example"})," in the OpenRAG repository"]}),"."]}),"\n",(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["OpenRAG's Docker Compose files are populated automatically using values from the ",(0,t.jsx)(n.code,{children:".env"})," file, so you don't need to edit the Docker Compose files manually."]})}),"\n",(0,t.jsxs)(n.p,{children:["If a variable isn't set, OpenRAG uses default or fallback values where available.\nNot all variables have default values, and errors can occur if required variables aren't set.\nDefault values can be found in the reference tables on this page and in ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/config/config_manager.py",children:(0,t.jsx)(n.code,{children:"config_manager.py"})}),", ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/config/settings.py",children:(0,t.jsx)(n.code,{children:"settings.py"})}),", and ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/src/utils/logging_config.py",children:(0,t.jsx)(n.code,{children:"logging_config.py"})}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["You can ",(0,t.jsx)(n.a,{href:"#modify-a-flow-at-runtime",children:"temporarily set Langflow variables at runtime"}),".\nHowever, these temporary overrides don't overlap with most OpenRAG environment variables.\nThe only exceptions are flow-level Langflow settings, such as the language model used in a flow."]}),"\n",(0,t.jsxs)(n.h2,{id:"set-environment-variables",children:["Edit the ",(0,t.jsx)(n.code,{children:".env"})," file"]}),"\n",(0,t.jsxs)(n.p,{children:["During ",(0,t.jsx)(n.a,{href:"/install-options",children:"installation"}),", an initial ",(0,t.jsx)(n.code,{children:".env"})," file is created automatically or manually.\nYou can edit this file to change OpenRAG configuration settings after installation."]}),"\n",(0,t.jsxs)(n.p,{children:["Each OpenRAG environment variable is either mutable or immutable.\nThis determines the actions you must take to apply changes after editing the ",(0,t.jsx)(n.code,{children:".env"})," file:"]}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Mutable environment variables"}),": You can apply changes to mutable environment variables by ",(0,t.jsx)(n.a,{href:"/manage-services",children:"stopping and restarting the OpenRAG services"})," after editing the ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Immutable environment variables"}),": You must ",(0,t.jsx)(n.a,{href:"/reinstall",children:"redeploy OpenRAG"})," with your modified ",(0,t.jsx)(n.code,{children:".env"})," file if you change immutable environment variables."]}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.h2,{id:"model-provider-settings",children:"Model provider settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure which models and providers OpenRAG uses to generate text and embeddings.\nYou only need to provide credentials for the providers you are using in OpenRAG."}),"\n",(0,t.jsxs)(n.p,{children:["These variables are initially set during the ",(0,t.jsx)(n.a,{href:"/install#application-onboarding",children:"application onboarding process"}),".\nSome of these variables are immutable and can only be changed by redeploying OpenRAG, as explained in ",(0,t.jsx)(n.a,{href:"#set-environment-variables",children:"Set environment variables"}),"."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"EMBEDDING_MODEL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"text-embedding-3-small"})}),(0,t.jsx)(n.td,{children:"Embedding model for generating vector embeddings for documents in the knowledge base and similarity search queries. Can be changed after the application onboarding process. Accepts one or more models."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LLM_MODEL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"gpt-4o-mini"})}),(0,t.jsxs)(n.td,{children:["Language model for language processing and text generation in the ",(0,t.jsx)(n.strong,{children:"Chat"})," feature."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"MODEL_PROVIDER"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openai"})}),(0,t.jsxs)(n.td,{children:["Model provider, as one of ",(0,t.jsx)(n.code,{children:"openai"}),", ",(0,t.jsx)(n.code,{children:"watsonx"}),", ",(0,t.jsx)(n.code,{children:"ollama"}),", or ",(0,t.jsx)(n.code,{children:"anthropic"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"API key for the Anthropic language model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENAI_API_KEY"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"API key for the OpenAI model provider, which is also the default model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OLLAMA_ENDPOINT"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Custom provider endpoint for the Ollama model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WATSONX_API_KEY"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"API key for the IBM watsonx.ai model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WATSONX_ENDPOINT"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Custom provider endpoint for the IBM watsonx.ai model provider."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Project ID for the IBM watsonx.ai model provider."})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"document-processing-settings",children:"Document processing settings"}),"\n",(0,t.jsxs)(n.p,{children:["Control how OpenRAG ",(0,t.jsx)(n.a,{href:"/ingestion",children:"processes and ingests documents"})," into your knowledge base."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CHUNK_OVERLAP"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"200"})}),(0,t.jsx)(n.td,{children:"Overlap between chunks."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"CHUNK_SIZE"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"1000"})}),(0,t.jsx)(n.td,{children:"Text chunk size for document processing."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"DISABLE_INGEST_WITH_LANGFLOW"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"false"})}),(0,t.jsx)(n.td,{children:"Disable Langflow ingestion pipeline."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"DOCLING_OCR_ENGINE"})}),(0,t.jsx)(n.td,{children:"Set by OS"}),(0,t.jsxs)(n.td,{children:["OCR engine for document processing. For macOS, ",(0,t.jsx)(n.code,{children:"ocrmac"}),". For any other OS, ",(0,t.jsx)(n.code,{children:"easyocr"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OCR_ENABLED"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"false"})}),(0,t.jsx)(n.td,{children:"Enable OCR for image processing."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENRAG_DOCUMENTS_PATHS"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"~/.openrag/documents"})}),(0,t.jsx)(n.td,{children:"Document paths for ingestion."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"PICTURE_DESCRIPTIONS_ENABLED"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"false"})}),(0,t.jsx)(n.td,{children:"Enable picture descriptions."})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"langflow-settings",children:"Langflow settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure the OpenRAG Langflow server's authentication, contact point, and built-in flow definitions."}),"\n",(0,t.jsxs)(n.admonition,{type:"info",children:[(0,t.jsxs)(n.p,{children:["The ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set in your ",(0,t.jsx)(n.code,{children:".env"})," file, and this value determines the default values for several other Langflow authentication variables."]}),(0,t.jsxs)(n.p,{children:["If the ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," variable isn't set, then the Langflow server starts ",(0,t.jsx)(n.em,{children:"without"})," authentication enabled."]}),(0,t.jsxs)(n.p,{children:["For better security, it is recommended to set ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," so the ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#start-a-langflow-server-with-authentication-enabled",children:"Langflow server starts with authentication enabled"}),"."]})]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})}),(0,t.jsxs)(n.td,{children:["Determined by ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),(0,t.jsxs)(n.td,{children:["Whether to enable ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-auto-login",children:"auto-login mode"})," for the Langflow visual editor and CLI. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," is ",(0,t.jsx)(n.code,{children:"True"})," and auto-login mode is enabled. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_AUTO_LOGIN"})," is ",(0,t.jsx)(n.code,{children:"False"})," and auto-login mode is disabled. Langflow API calls always require authentication with a Langflow API key regardless of the auto-login setting."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})}),(0,t.jsxs)(n.td,{children:["Determined by ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),(0,t.jsxs)(n.td,{children:["Whether to enable the ",(0,t.jsxs)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-enable-superuser-cli",children:["Langflow CLI ",(0,t.jsx)(n.code,{children:"langflow superuser"})," command"]}),". If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})," is ",(0,t.jsx)(n.code,{children:"True"})," and superuser accounts can be created with the Langflow CLI. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_ENABLE_SUPERUSER_CLI"})," is ",(0,t.jsx)(n.code,{children:"False"})," and the ",(0,t.jsx)(n.code,{children:"langflow superuser"})," command is disabled."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})}),(0,t.jsxs)(n.td,{children:["Determined by ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})]}),(0,t.jsxs)(n.td,{children:["Whether new ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-new-user-is-active",children:"Langflow user accounts are active by default"}),". If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," isn't set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})," is ",(0,t.jsx)(n.code,{children:"True"})," and new user accounts are active by default. If ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," is set, then ",(0,t.jsx)(n.code,{children:"LANGFLOW_NEW_USER_IS_ACTIVE"})," is ",(0,t.jsx)(n.code,{children:"False"})," and new user accounts are inactive by default."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:7860"})}),(0,t.jsx)(n.td,{children:"Public URL for the Langflow instance. Forms the base URL for Langflow API calls and other interfaces with your OpenRAG Langflow instance."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_KEY"})}),(0,t.jsx)(n.td,{children:"Automatically generated"}),(0,t.jsx)(n.td,{children:"A Langflow API key to run flows with Langflow API calls. Because Langflow API keys are server-specific, allow OpenRAG to generate this key initially. You can create additional Langflow API keys after deploying OpenRAG."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SECRET_KEY"})}),(0,t.jsx)(n.td,{children:"Automatically generated"}),(0,t.jsxs)(n.td,{children:["Secret encryption key for Langflow internal operations. It is recommended to ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#langflow-secret-key",children:"generate your own Langflow secret key"})," for this variable. If this variable isn't set, then Langflow generates a secret key automatically."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"admin"})}),(0,t.jsx)(n.td,{children:"Username for the Langflow administrator user."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Langflow administrator password. If this variable isn't set, then the Langflow server starts ",(0,t.jsx)(n.em,{children:"without"})," authentication enabled. It is recommended to set ",(0,t.jsx)(n.code,{children:"LANGFLOW_SUPERUSER_PASSWORD"})," so the ",(0,t.jsx)(n.a,{href:"https://docs.langflow.org/api-keys-and-authentication#start-a-langflow-server-with-authentication-enabled",children:"Langflow server starts with authentication enabled"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_URL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"http://localhost:7860"})}),(0,t.jsx)(n.td,{children:"URL for the Langflow instance."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"LANGFLOW_CHAT_FLOW_ID"}),", ",(0,t.jsx)(n.code,{children:"LANGFLOW_INGEST_FLOW_ID"}),", ",(0,t.jsx)(n.code,{children:"NUDGES_FLOW_ID"})]}),(0,t.jsx)(n.td,{children:"Built-in flow IDs"}),(0,t.jsxs)(n.td,{children:["These variables are set automatically to the IDs of the chat, ingestion, and nudges ",(0,t.jsx)(n.a,{href:"/agents",children:"flows"}),". The default values are found in ",(0,t.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/.env.example",children:(0,t.jsx)(n.code,{children:".env.example"})}),". Only change these values if you want to replace a built-in flow with your own custom flow. The flow JSON must be present in your version of the OpenRAG codebase. For example, if you ",(0,t.jsx)(n.a,{href:"/docker",children:"deploy self-managed services"}),", you can add the flow JSON to your local clone of the OpenRAG repository before deploying OpenRAG."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SYSTEM_PROMPT"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"You are a helpful AI assistant with access to a knowledge base. Answer questions based on the provided context."})}),(0,t.jsxs)(n.td,{children:["System prompt instructions for the agent driving the ",(0,t.jsx)(n.strong,{children:"Chat"})," flow."]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"oauth-provider-settings",children:"OAuth provider settings"}),"\n",(0,t.jsxs)(n.p,{children:["Configure ",(0,t.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"OAuth providers"})," and external service integrations."]}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"AWS_ACCESS_KEY_ID"}),(0,t.jsx)("br",{}),(0,t.jsx)(n.code,{children:"AWS_SECRET_ACCESS_KEY"})]}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Enable access to AWS S3 with an ",(0,t.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"AWS OAuth app"})," integration."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"GOOGLE_OAUTH_CLIENT_ID"}),(0,t.jsx)("br",{}),(0,t.jsx)(n.code,{children:"GOOGLE_OAUTH_CLIENT_SECRET"})]}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Enable the ",(0,t.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client"})," integration. You can generate these values in the ",(0,t.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsxs)(n.td,{children:[(0,t.jsx)(n.code,{children:"MICROSOFT_GRAPH_OAUTH_CLIENT_ID"}),(0,t.jsx)("br",{}),(0,t.jsx)(n.code,{children:"MICROSOFT_GRAPH_OAUTH_CLIENT_SECRET"})]}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Enable the ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client"})," integration by providing ",(0,t.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),"."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"WEBHOOK_BASE_URL"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsx)(n.td,{children:"Base URL for OAuth connector webhook endpoints. If this variable isn't set, a default base URL is used."})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"opensearch-settings",children:"OpenSearch settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure OpenSearch database authentication."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_HOST"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"localhost"})}),(0,t.jsx)(n.td,{children:"OpenSearch instance host."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_PORT"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"9200"})}),(0,t.jsx)(n.td,{children:"OpenSearch instance port."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_USERNAME"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"admin"})}),(0,t.jsx)(n.td,{children:"OpenSearch administrator username."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})}),(0,t.jsx)(n.td,{children:"Must be set at start up"}),(0,t.jsxs)(n.td,{children:["Required. OpenSearch administrator password. Must adhere to the ",(0,t.jsx)(n.a,{href:"https://docs.opensearch.org/latest/security/configuration/demo-configuration/#setting-up-a-custom-admin-password",children:"OpenSearch password complexity requirements"}),". You must set this directly in the ",(0,t.jsx)(n.code,{children:".env"})," or in the TUI's ",(0,t.jsx)(n.a,{href:"/install#setup",children:(0,t.jsx)(n.strong,{children:"Basic/Advanced Setup"})}),"."]})]})]})]}),"\n",(0,t.jsx)(n.h2,{id:"system-settings",children:"System settings"}),"\n",(0,t.jsx)(n.p,{children:"Configure general system components, session management, and logging."}),"\n",(0,t.jsxs)(n.table,{children:[(0,t.jsx)(n.thead,{children:(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.th,{children:"Variable"}),(0,t.jsx)(n.th,{children:"Default"}),(0,t.jsx)(n.th,{children:"Description"})]})}),(0,t.jsxs)(n.tbody,{children:[(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_KEY_RETRIES"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"15"})}),(0,t.jsx)(n.td,{children:"Number of retries for Langflow key generation."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_KEY_RETRY_DELAY"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"2.0"})}),(0,t.jsx)(n.td,{children:"Delay between retries in seconds."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LANGFLOW_VERSION"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})}),(0,t.jsxs)(n.td,{children:["Langflow Docker image version. By default, OpenRAG uses the ",(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})," for the Langflow Docker image version."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LOG_FORMAT"})}),(0,t.jsx)(n.td,{children:"Not set"}),(0,t.jsxs)(n.td,{children:["Set to ",(0,t.jsx)(n.code,{children:"json"})," to enabled JSON-formatted log output. If this variable isn't set, then the default logging format is used."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"LOG_LEVEL"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"INFO"})}),(0,t.jsxs)(n.td,{children:["Logging level. Can be one of ",(0,t.jsx)(n.code,{children:"DEBUG"}),", ",(0,t.jsx)(n.code,{children:"INFO"}),", ",(0,t.jsx)(n.code,{children:"WARNING"}),", or ",(0,t.jsx)(n.code,{children:"ERROR"}),". ",(0,t.jsx)(n.code,{children:"DEBUG"})," provides the most detailed logs but can impact performance."]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"MAX_WORKERS"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"1"})}),(0,t.jsx)(n.td,{children:"Maximum number of workers for document processing."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"OPENRAG_VERSION"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"latest"})}),(0,t.jsxs)(n.td,{children:["The version of the OpenRAG Docker images to run. For more information, see ",(0,t.jsx)(n.a,{href:"/upgrade",children:"Upgrade OpenRAG"})]})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SERVICE_NAME"})}),(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"openrag"})}),(0,t.jsx)(n.td,{children:"Service name for logging."})]}),(0,t.jsxs)(n.tr,{children:[(0,t.jsx)(n.td,{children:(0,t.jsx)(n.code,{children:"SESSION_SECRET"})}),(0,t.jsx)(n.td,{children:"Automatically generated"}),(0,t.jsx)(n.td,{children:"Session management."})]})]})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/ca2c3c0c.039bf965.js b/assets/js/ca2c3c0c.0943a68e.js similarity index 51% rename from assets/js/ca2c3c0c.039bf965.js rename to assets/js/ca2c3c0c.0943a68e.js index 093103f1..75cd0761 100644 --- a/assets/js/ca2c3c0c.039bf965.js +++ b/assets/js/ca2c3c0c.0943a68e.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6919],{1381:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var t=s(4848),o=s(8453);const r=[];function i(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>A});var t=s(6540),o=s(4164),r=s(7559),i=s(3104),l=s(6347),a=s(205),c=s(7485),d=s(1682),h=s(679);function u(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:t}})=>({value:e,label:n,attributes:s,default:t}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const s=(0,l.W6)(),o=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(o),(0,t.useCallback)(e=>{if(!o)return;const n=new URLSearchParams(s.location.search);n.set(o,e),s.replace({...s.location,search:n.toString()})},[o,s])]}function f(e){const{defaultValue:n,queryString:s=!1,groupId:o}=e,r=p(e),[i,l]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:r})),[c,d]=x({queryString:s,groupId:o}),[u,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,o]=(0,h.Dv)(n);return[s,(0,t.useCallback)(e=>{n&&o.set(e)},[n,o])]}({groupId:o}),m=(()=>{const e=c??u;return g({value:e,tabValues:r})?e:null})();(0,a.A)(()=>{m&&l(m)},[m]);return{selectedValue:i,selectValue:(0,t.useCallback)(e=>{if(!g({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),f(e)},[d,f,r]),tabValues:r}}var m=s(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=s(4848);function b({className:e,block:n,selectedValue:s,selectValue:t,tabValues:r}){const l=[],{blockElementScrollPositionUntilNextRender:a}=(0,i.a_)(),c=e=>{const n=e.currentTarget,o=l.indexOf(n),i=r[o].value;i!==s&&(a(n),t(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;n=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;n=l[s]??l[l.length-1];break}}n?.focus()};return(0,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":n},e),children:r.map(({value:e,label:n,attributes:t})=>(0,w.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...t,className:(0,o.A)("tabs__item",j.tabItem,t?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:s}){const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===s);return e?(0,t.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:r.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function v(e){const n=f(e);return(0,w.jsxs)("div",{className:(0,o.A)(r.G.tabs.container,"tabs-container",j.tabList),children:[(0,w.jsx)(b,{...n,...e}),(0,w.jsx)(y,{...n,...e})]})}function A(e){const n=(0,m.A)();return(0,w.jsx)(v,{...e,children:u(e.children)},String(n))}},4577:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var t=s(4848),o=s(8453);const r=[];function i(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop $(docker ps -q)\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop --all\n"})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},5421:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>f,default:()=>b,frontMatter:()=>x,metadata:()=>t,toc:()=>j});const t=JSON.parse('{"id":"core-components/ingestion","title":"Ingest knowledge","description":"Upload documents to your OpenRAG OpenSearch instance to populate your knowledge base with unique content, such as your own company documents, research papers, or websites.","source":"@site/docs/core-components/ingestion.mdx","sourceDirName":"core-components","slug":"/ingestion","permalink":"/ingestion","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/core-components/ingestion.mdx","tags":[],"version":"current","frontMatter":{"title":"Ingest knowledge","slug":"/ingestion"},"sidebar":"tutorialSidebar","previous":{"title":"Configure knowledge","permalink":"/knowledge"},"next":{"title":"Filter knowledge","permalink":"/knowledge-filters"}}');var o=s(4848),r=s(8453),i=s(9179),l=s(1470),a=s(9365),c=s(8401);const d=[];function h(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"About the OpenSearch Ingestion flow"}),(0,o.jsxs)(n.p,{children:["When you upload documents locally or with OAuth connectors, the ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow runs in the background.\nBy default, this flow uses Docling Serve to import and process documents."]}),(0,o.jsxs)(n.p,{children:["Like all ",(0,o.jsx)(n.a,{href:"/agents",children:"OpenRAG flows"}),", you can ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"inspect the flow in Langflow"}),", and you can customize it if you want to change the knowledge ingestion settings."]}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow is comprised of several components that work together to process and store documents in your knowledge base:"]}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-docling#docling-serve",children:[(0,o.jsx)(n.strong,{children:"Docling Serve"})," component"]}),": Ingests files and processes them by connecting to OpenRAG's local Docling Serve service. The output is ",(0,o.jsx)(n.code,{children:"DoclingDocument"})," data that contains the extracted text and metadata from the documents."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-docling#export-doclingdocument",children:[(0,o.jsx)(n.strong,{children:"Export DoclingDocument"})," component"]}),": Exports processed ",(0,o.jsx)(n.code,{children:"DoclingDocument"})," data to Markdown format with image placeholders. This conversion standardizes the document data in preparation for further processing."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/dataframe-operations",children:[(0,o.jsx)(n.strong,{children:"DataFrame Operations"})," component"]}),": Three of these components run sequentially to add metadata to the document data: ",(0,o.jsx)(n.code,{children:"filename"}),", ",(0,o.jsx)(n.code,{children:"file_size"}),", and ",(0,o.jsx)(n.code,{children:"mimetype"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/split-text",children:[(0,o.jsx)(n.strong,{children:"Split Text"})," component"]}),": Splits the processed text into chunks, based on the configured ",(0,o.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"chunk size and overlap settings"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Secret Input"})," component: If needed, four of these components securely fetch the ",(0,o.jsx)(n.a,{href:"/knowledge#auth",children:"OAuth authentication"})," configuration variables: ",(0,o.jsx)(n.code,{children:"CONNECTOR_TYPE"}),", ",(0,o.jsx)(n.code,{children:"OWNER"}),", ",(0,o.jsx)(n.code,{children:"OWNER_EMAIL"}),", and ",(0,o.jsx)(n.code,{children:"OWNER_NAME"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Create Data"})," component: Combines the authentication credentials from the ",(0,o.jsx)(n.strong,{children:"Secret Input"})," components into a structured data object that is associated with the document embeddings."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/components-embedding-models",children:[(0,o.jsx)(n.strong,{children:"Embedding Model"})," component"]}),": Generates vector embeddings using your selected ",(0,o.jsx)(n.a,{href:"/knowledge#set-the-embedding-model-and-dimensions",children:"embedding model"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-elastic#opensearch",children:[(0,o.jsx)(n.strong,{children:"OpenSearch"})," component"]}),": Stores the processed documents and their embeddings in a ",(0,o.jsx)(n.code,{children:"documents"})," index of your OpenRAG ",(0,o.jsx)(n.a,{href:"/knowledge",children:"OpenSearch knowledge base"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The default address for the OpenSearch instance is ",(0,o.jsx)(n.code,{children:"https://opensearch:9200"}),". To change this address, edit the ",(0,o.jsx)(n.code,{children:"OPENSEARCH_PORT"})," ",(0,o.jsx)(n.a,{href:"/reference/configuration#opensearch-settings",children:"environment variable"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The default authentication method is JSON Web Token (JWT) authentication. If you ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"edit the flow"}),", you can select ",(0,o.jsx)(n.code,{children:"basic"})," auth mode, which uses the ",(0,o.jsx)(n.code,{children:"OPENSEARCH_USERNAME"})," and ",(0,o.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})," ",(0,o.jsx)(n.a,{href:"/reference/configuration#opensearch-settings",children:"environment variables"})," for authentication instead of JWT."]}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}var p=s(1381),g=s(4577);const x={title:"Ingest knowledge",slug:"/ingestion"},f=void 0,m={},j=[{value:"Ingest local files and folders",id:"ingest-local-files-and-folders",level:2},...d,{value:"Ingest local files temporarily",id:"ingest-local-files-temporarily",level:2},...c.RM,{value:"Ingest files with OAuth connectors",id:"oauth-ingestion",level:2},{value:"Enable OAuth connectors",id:"enable-oauth-connectors",level:3},...g.RM,...p.RM,{value:"Authenticate and ingest files from cloud storage",id:"authenticate-and-ingest-files-from-cloud-storage",level:3},...d,{value:"Ingest knowledge from URLs",id:"url-flow",level:2},{value:"Monitor ingestion",id:"monitor-ingestion",level:2},{value:"Ingestion performance expectations",id:"ingestion-performance-expectations",level:3},{value:"Troubleshoot ingestion",id:"troubleshoot-ingestion",level:2},{value:"See also",id:"see-also",level:2}];function w(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Upload documents to your ",(0,o.jsx)(n.a,{href:"/knowledge",children:"OpenRAG OpenSearch instance"})," to populate your knowledge base with unique content, such as your own company documents, research papers, or websites.\nDocuments are processed through OpenRAG's knowledge ingestion flows with Docling."]}),"\n",(0,o.jsx)(n.p,{children:"OpenRAG can ingest knowledge from direct file uploads, URLs, and OAuth authenticated connectors."}),"\n",(0,o.jsxs)(n.p,{children:["Knowledge ingestion is powered by OpenRAG's built-in knowledge ingestion flows that use Docling to process documents before storing the documents in your OpenSearch database.\nDuring ingestion, documents are broken into smaller chunks of content that are then embedded using your selected ",(0,o.jsx)(n.a,{href:"/knowledge#set-the-embedding-model-and-dimensions",children:"embedding model"}),".\nThen, the chunks, embeddings, and associated metadata (which connects chunks of the same document) are stored in your OpenSearch database."]}),"\n",(0,o.jsxs)(n.p,{children:["To modify chunking behavior and other ingestion settings, see ",(0,o.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"Knowledge ingestion settings"})," and ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"Inspect and modify flows"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"ingest-local-files-and-folders",children:"Ingest local files and folders"}),"\n",(0,o.jsx)(n.p,{children:"You can upload files and folders from your local machine to your knowledge base:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(i.A,{name:"Library","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Knowledge"})," to view your OpenSearch knowledge base."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Add Knowledge"})," to add your own documents to your OpenRAG knowledge base."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["To upload one file, click ",(0,o.jsx)(i.A,{name:"File","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"File"}),". To upload all documents in a folder, click ",(0,o.jsx)(i.A,{name:"Folder","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Folder"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The default path is ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"}),".\nTo change this path, see ",(0,o.jsx)(n.a,{href:"/knowledge#set-the-local-documents-path",children:"Set the local documents path"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The selected files are processed in the background through the ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow."]}),"\n",(0,o.jsx)(u,{}),"\n",(0,o.jsxs)(n.p,{children:["You can ",(0,o.jsx)(n.a,{href:"#monitor-ingestion",children:"monitor ingestion"})," to see the progress of the uploads and check for failed uploads."]}),"\n",(0,o.jsx)(n.h2,{id:"ingest-local-files-temporarily",children:"Ingest local files temporarily"}),"\n",(0,o.jsx)(c.Ay,{}),"\n",(0,o.jsx)(n.h2,{id:"oauth-ingestion",children:"Ingest files with OAuth connectors"}),"\n",(0,o.jsx)(n.p,{children:"OpenRAG can use OAuth authenticated connectors to ingest documents from the following external services:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"AWS S3"}),"\n",(0,o.jsx)(n.li,{children:"Google Drive"}),"\n",(0,o.jsx)(n.li,{children:"Microsoft OneDrive"}),"\n",(0,o.jsx)(n.li,{children:"Microsoft Sharepoint"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"These connectors enable seamless ingestion of files from cloud storage to your OpenRAG knowledge base."}),"\n",(0,o.jsx)(n.p,{children:"Individual users can connect their personal cloud storage accounts to OpenRAG. Each user must separately authorize OpenRAG to access their own cloud storage. When a user connects a cloud storage service, they are redirected to authenticate with that service provider and grant OpenRAG permission to sync documents from their personal cloud storage."}),"\n",(0,o.jsx)(n.h3,{id:"enable-oauth-connectors",children:"Enable OAuth connectors"}),"\n",(0,o.jsx)(n.p,{children:"Before users can connect their own cloud storage accounts, you must configure the provider's OAuth credentials in OpenRAG. Typically, this requires that you register OpenRAG as an OAuth application in your cloud provider, and then obtain the app's OAuth credentials, such as a client ID and secret key.\nTo enable multiple connectors, you must register an app and generate credentials for each provider."}),"\n",(0,o.jsxs)(l.A,{children:[(0,o.jsxs)(a.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,o.jsxs)(n.p,{children:["If you use the ",(0,o.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to manage your OpenRAG services, enter OAuth credentials in the ",(0,o.jsx)(n.strong,{children:"Advanced Setup"})," menu.\nYou can do this during ",(0,o.jsx)(n.a,{href:"/install#setup",children:"installation"}),", or you can add the credentials afterwards:"]}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If OpenRAG is running, open the TUI's ",(0,o.jsx)(n.strong,{children:"Status"})," menu (",(0,o.jsx)("kbd",{children:"3"}),"), and then click ",(0,o.jsx)(n.strong,{children:"Stop Services"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Open the ",(0,o.jsx)(n.strong,{children:"Advanced Setup"})," menu (",(0,o.jsx)("kbd",{children:"2"}),"), and then add the OAuth credentials for the cloud storage providers that you want to use:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,o.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"The TUI presents redirect URIs for your OAuth app that you must register with your OAuth provider.\nThese are the URLs your OAuth provider will redirect back to after users authenticate and grant access to their cloud storage."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Save Configuration"})," to add the OAuth credentials to your ",(0,o.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,o.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Start All Services"})," to restart the OpenRAG containers with OAuth enabled."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Launch the OpenRAG app.\nYou should be prompted to sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n"]})]}),(0,o.jsxs)(a.A,{value:"env",label:"Self-managed services",children:[(0,o.jsxs)(n.p,{children:["If you ",(0,o.jsx)(n.a,{href:"/docker",children:"installed OpenRAG with self-managed services"}),", set OAuth credentials in your ",(0,o.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,o.jsx)(n.code,{children:".env"})," file"]}),"."]}),(0,o.jsxs)(n.p,{children:["You can do this during ",(0,o.jsx)(n.a,{href:"/docker#setup",children:"initial set up"}),", or you can add the credentials afterwards:"]}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Stop all OpenRAG containers:"}),"\n",(0,o.jsx)(g.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Edit your OpenRAG ",(0,o.jsx)(n.code,{children:".env"})," file to add the OAuth credentials for the cloud storage providers that you want to use:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-env",children:"AWS_ACCESS_KEY_ID=\nAWS_SECRET_ACCESS_KEY=\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,o.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-env",children:"GOOGLE_OAUTH_CLIENT_ID=\nGOOGLE_OAUTH_CLIENT_SECRET=\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-env",children:"MICROSOFT_GRAPH_OAUTH_CLIENT_ID=\nMICROSOFT_GRAPH_OAUTH_CLIENT_SECRET=\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Save the ",(0,o.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Restart your OpenRAG containers:"}),"\n",(0,o.jsx)(p.Ay,{}),"\n"]}),"\n"]})]})]}),"\n",(0,o.jsx)(n.h3,{id:"authenticate-and-ingest-files-from-cloud-storage",children:"Authenticate and ingest files from cloud storage"}),"\n",(0,o.jsxs)(n.p,{children:["After you start OpenRAG with OAuth connectors enabled, each user is prompted to authenticate with the OAuth provider upon accessing your OpenRAG instance.\nIndividual authentication is required to access a user's cloud storage from your OpenRAG instance.\nFor example, if a user navigates to the default OpenRAG URL at ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),", they are redirected to the OAuth provider's sign-in page.\nAfter authenticating and granting the required permissions for OpenRAG, the user is redirected back to OpenRAG."]}),"\n",(0,o.jsx)(n.p,{children:"To ingest knowledge with an OAuth connector, do the following:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(i.A,{name:"Library","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Knowledge"})," to view your OpenSearch knowledge base."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Add Knowledge"}),", and then select a storage provider."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["On the ",(0,o.jsx)(n.strong,{children:"Add Cloud Knowledge"})," page, click ",(0,o.jsx)(n.strong,{children:"Add Files"}),", and then select the files and folders to ingest from the connected storage."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Ingest Files"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The selected files are processed in the background through the ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow."]}),"\n",(0,o.jsx)(u,{}),"\n",(0,o.jsxs)(n.p,{children:["You can ",(0,o.jsx)(n.a,{href:"#monitor-ingestion",children:"monitor ingestion"})," to see the progress of the uploads and check for failed uploads."]}),"\n",(0,o.jsx)(n.h2,{id:"url-flow",children:"Ingest knowledge from URLs"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"OpenSearch URL Ingestion"})," flow is used to ingest web content from URLs.\nThis flow isn't directly accessible from the OpenRAG user interface.\nInstead, this flow is called by the ",(0,o.jsxs)(n.a,{href:"/chat#flow",children:[(0,o.jsx)(n.strong,{children:"OpenRAG OpenSearch Agent"})," flow"]})," as a Model Context Protocol (MCP) tool.\nThe agent can call this component to fetch web content from a given URL, and then ingest that content into your OpenSearch knowledge base."]}),"\n",(0,o.jsxs)(n.p,{children:["Like all OpenRAG flows, you can ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"inspect the flow in Langflow"}),", and you can customize it."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about MCP in Langflow, see the Langflow documentation on ",(0,o.jsx)(n.a,{href:"https://docs.langflow.org/mcp-client",children:"MCP clients"})," and ",(0,o.jsx)(n.a,{href:"https://docs.langflow.org/mcp-tutorial",children:"MCP servers"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"monitor-ingestion",children:"Monitor ingestion"}),"\n",(0,o.jsx)(n.p,{children:"Document ingestion tasks run in the background."}),"\n",(0,o.jsxs)(n.p,{children:["In the OpenRAG user interface, a badge is shown on ",(0,o.jsx)(i.A,{name:"Bell","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Tasks"})," when OpenRAG tasks are active.\nClick ",(0,o.jsx)(i.A,{name:"Bell","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Tasks"})," to inspect and cancel tasks:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Active Tasks"}),": All tasks that are ",(0,o.jsx)(n.strong,{children:"Pending"}),", ",(0,o.jsx)(n.strong,{children:"Running"}),", or ",(0,o.jsx)(n.strong,{children:"Processing"}),".\nFor each active task, depending on its state, you can find the task ID, start time, duration, number of files processed, and the total files enqueued for processing."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Pending"}),": The task is queued and waiting to start."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Running"}),": The task is actively processing files."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Processing"}),": The task is performing ingestion operations."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Failed"}),": Something went wrong during ingestion, or the task was manually canceled.\nFor troubleshooting advice, see ",(0,o.jsx)(n.a,{href:"#troubleshoot-ingestion",children:"Troubleshoot ingestion"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["To stop an active task, click ",(0,o.jsx)(i.A,{name:"X","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Cancel"}),". Canceling a task stops processing immediately and marks the task as ",(0,o.jsx)(n.strong,{children:"Failed"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"ingestion-performance-expectations",children:"Ingestion performance expectations"}),"\n",(0,o.jsx)(n.p,{children:"The following performance test was conducted with Docling Serve."}),"\n",(0,o.jsx)(n.p,{children:"On a local VM with 7 vCPUs and 8 GiB RAM, OpenRAG ingested approximately 5.03 GB across 1,083 files in about 42 minutes.\nThis equates to approximately 2.4 documents per second."}),"\n",(0,o.jsx)(n.p,{children:"You can generally expect equal or better performance on developer laptops, and significantly faster performance on servers.\nThroughput scales with CPU cores, memory, storage speed, and configuration choices, such as the embedding model, chunk size, overlap, and concurrency."}),"\n",(0,o.jsx)(n.p,{children:"This test returned 12 error, approximately 1.1 percent of the total files ingested.\nAll errors were file-specific, and they didn't stop the pipeline."}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Ingestion performance test details"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ingestion dataset:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Total files: 1,083 items mounted"}),"\n",(0,o.jsx)(n.li,{children:"Total size on disk: 5,026,474,862 bytes (approximately 5.03 GB)"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Hardware specifications:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Machine: Apple M4 Pro"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Podman VM:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Name: podman-machine-default"}),"\n",(0,o.jsx)(n.li,{children:"Type: applehv"}),"\n",(0,o.jsx)(n.li,{children:"vCPUs: 7"}),"\n",(0,o.jsx)(n.li,{children:"Memory: 8 GiB"}),"\n",(0,o.jsx)(n.li,{children:"Disk size: 100 GiB"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Test results:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-text",children:"2025-09-24T22:40:45.542190Z /app/src/main.py:231 Ingesting default documents when ready disable_langflow_ingest=False\n2025-09-24T22:40:45.546385Z /app/src/main.py:270 Using Langflow ingestion pipeline for default documents file_count=1082\n...\n2025-09-24T23:19:44.866365Z /app/src/main.py:351 Langflow ingestion completed success_count=1070 error_count=12 total_files=1082\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Elapsed time: Approximately 42 minutes 15 seconds (2,535 seconds)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Throughput: Approximately 2.4 documents per second"}),"\n"]}),"\n"]})]}),"\n",(0,o.jsx)(n.h2,{id:"troubleshoot-ingestion",children:"Troubleshoot ingestion"}),"\n",(0,o.jsx)(n.p,{children:"If an ingestion task fails, do the following:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Make sure you are uploading supported file types."}),"\n",(0,o.jsx)(n.li,{children:"Split excessively large files into smaller files before uploading."}),"\n",(0,o.jsx)(n.li,{children:"Remove unusual embedded content, such as videos or animations, before uploading. Although Docling can replace some non-text content with placeholders during ingestion, some embedded content might cause errors."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["If the OpenRAG ",(0,o.jsx)(n.strong,{children:"Chat"})," doesn't seem to use your documents correctly, ",(0,o.jsx)(n.a,{href:"/knowledge#browse-knowledge",children:"browse your knowledge base"})," to confirm that the documents are uploaded in full, and the chunks are correct."]}),"\n",(0,o.jsxs)(n.p,{children:["If the documents are present and well-formed, check your ",(0,o.jsx)(n.a,{href:"/knowledge-filters",children:"knowledge filters"}),".\nIf a global filter is applied, make sure the expected documents are included in the global filter.\nIf the global filter excludes any documents, the agent cannot access those documents unless you apply a chat-level filter or change the global filter."]}),"\n",(0,o.jsx)(n.p,{children:"If text is missing or incorrectly processed, you need to reupload the documents after modifying the ingestion parameters or the documents themselves.\nFor example:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Break combined documents into separate files for better metadata context."}),"\n",(0,o.jsxs)(n.li,{children:["Make sure scanned documents are legible enough for extraction, and enable the ",(0,o.jsx)(n.strong,{children:"OCR"})," option. Poorly scanned documents might require additional preparation or rescanning before ingestion."]}),"\n",(0,o.jsxs)(n.li,{children:["Adjust the ",(0,o.jsx)(n.strong,{children:"Chunk Size"})," and ",(0,o.jsx)(n.strong,{children:"Chunk Overlap"})," settings to better suit your documents. Larger chunks provide more context but can include irrelevant information, while smaller chunks yield more precise semantic search but can lack context."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about modifying ingestion parameters and flows, see ",(0,o.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"Knowledge ingestion settings"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/knowledge",children:"Configure knowledge"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/knowledge-filters",children:"Filter knowledge"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/chat",children:"Chat with knowledge"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"Inspect and modify flows"})}),"\n"]})]})}function b(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(w,{...e})}):w(e)}},8401:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var t=s(4848),o=s(8453),r=s(9179);const i=[];function l(e){const n={p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,t.jsxs)(n.p,{children:["When using the OpenRAG ",(0,t.jsx)(n.strong,{children:"Chat"}),", click ",(0,t.jsx)(r.A,{name:"Plus","aria-hidden":"true"})," in the chat input field to upload a file to the current chat session.\nFiles added this way are processed and made available to the agent for the current conversation only.\nThese files aren't stored in the knowledge base permanently."]})}function a(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>r});s(6540);var t=s(7856),o=s(4848);function r({name:e,...n}){const s=t[e];return s?(0,o.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var t=s(4164);const o={tabItem:"tabItem_Ymn6"};var r=s(4848);function i({children:e,hidden:n,className:s}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(o.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[6919],{1381:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var t=s(4848),o=s(8453);const r=[];function i(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker compose up -d\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman compose up -d\n"})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>A});var t=s(6540),o=s(4164),r=s(7559),i=s(3104),l=s(6347),a=s(205),c=s(7485),d=s(1682),h=s(679);function u(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:t}})=>({value:e,label:n,attributes:s,default:t}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function g({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const s=(0,l.W6)(),o=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(o),(0,t.useCallback)(e=>{if(!o)return;const n=new URLSearchParams(s.location.search);n.set(o,e),s.replace({...s.location,search:n.toString()})},[o,s])]}function f(e){const{defaultValue:n,queryString:s=!1,groupId:o}=e,r=p(e),[i,l]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!g({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:r})),[c,d]=x({queryString:s,groupId:o}),[u,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,o]=(0,h.Dv)(n);return[s,(0,t.useCallback)(e=>{n&&o.set(e)},[n,o])]}({groupId:o}),m=(()=>{const e=c??u;return g({value:e,tabValues:r})?e:null})();(0,a.A)(()=>{m&&l(m)},[m]);return{selectedValue:i,selectValue:(0,t.useCallback)(e=>{if(!g({value:e,tabValues:r}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),f(e)},[d,f,r]),tabValues:r}}var m=s(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var w=s(4848);function b({className:e,block:n,selectedValue:s,selectValue:t,tabValues:r}){const l=[],{blockElementScrollPositionUntilNextRender:a}=(0,i.a_)(),c=e=>{const n=e.currentTarget,o=l.indexOf(n),i=r[o].value;i!==s&&(a(n),t(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=l.indexOf(e.currentTarget)+1;n=l[s]??l[0];break}case"ArrowLeft":{const s=l.indexOf(e.currentTarget)-1;n=l[s]??l[l.length-1];break}}n?.focus()};return(0,w.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,o.A)("tabs",{"tabs--block":n},e),children:r.map(({value:e,label:n,attributes:t})=>(0,w.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{l.push(e)},onKeyDown:d,onClick:c,...t,className:(0,o.A)("tabs__item",j.tabItem,t?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function y({lazy:e,children:n,selectedValue:s}){const r=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=r.find(e=>e.props.value===s);return e?(0,t.cloneElement)(e,{className:(0,o.A)("margin-top--md",e.props.className)}):null}return(0,w.jsx)("div",{className:"margin-top--md",children:r.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function v(e){const n=f(e);return(0,w.jsxs)("div",{className:(0,o.A)(r.G.tabs.container,"tabs-container",j.tabList),children:[(0,w.jsx)(b,{...n,...e}),(0,w.jsx)(y,{...n,...e})]})}function A(e){const n=(0,m.A)();return(0,w.jsx)(v,{...e,children:u(e.children)},String(n))}},4577:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var t=s(4848),o=s(8453);const r=[];function i(e){const n={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop $(docker ps -q)\n"})}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop --all\n"})})]})}function l(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},5421:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>f,default:()=>b,frontMatter:()=>x,metadata:()=>t,toc:()=>j});const t=JSON.parse('{"id":"core-components/ingestion","title":"Ingest knowledge","description":"Upload documents to your OpenRAG OpenSearch instance to populate your knowledge base with unique content, such as your own company documents, research papers, or websites.","source":"@site/docs/core-components/ingestion.mdx","sourceDirName":"core-components","slug":"/ingestion","permalink":"/ingestion","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/core-components/ingestion.mdx","tags":[],"version":"current","frontMatter":{"title":"Ingest knowledge","slug":"/ingestion"},"sidebar":"tutorialSidebar","previous":{"title":"Configure knowledge","permalink":"/knowledge"},"next":{"title":"Filter knowledge","permalink":"/knowledge-filters"}}');var o=s(4848),r=s(8453),i=s(9179),l=s(1470),a=s(9365),c=s(8401);const d=[];function h(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"About the OpenSearch Ingestion flow"}),(0,o.jsxs)(n.p,{children:["When you upload documents locally or with OAuth connectors, the ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow runs in the background.\nBy default, this flow uses Docling Serve to import and process documents."]}),(0,o.jsxs)(n.p,{children:["Like all ",(0,o.jsx)(n.a,{href:"/agents",children:"OpenRAG flows"}),", you can ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"inspect the flow in Langflow"}),", and you can customize it if you want to change the knowledge ingestion settings."]}),(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow is comprised of several components that work together to process and store documents in your knowledge base:"]}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-docling#docling-serve",children:[(0,o.jsx)(n.strong,{children:"Docling Serve"})," component"]}),": Ingests files and processes them by connecting to OpenRAG's local Docling Serve service. The output is ",(0,o.jsx)(n.code,{children:"DoclingDocument"})," data that contains the extracted text and metadata from the documents."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-docling#export-doclingdocument",children:[(0,o.jsx)(n.strong,{children:"Export DoclingDocument"})," component"]}),": Exports processed ",(0,o.jsx)(n.code,{children:"DoclingDocument"})," data to Markdown format with image placeholders. This conversion standardizes the document data in preparation for further processing."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/dataframe-operations",children:[(0,o.jsx)(n.strong,{children:"DataFrame Operations"})," component"]}),": Three of these components run sequentially to add metadata to the document data: ",(0,o.jsx)(n.code,{children:"filename"}),", ",(0,o.jsx)(n.code,{children:"file_size"}),", and ",(0,o.jsx)(n.code,{children:"mimetype"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/split-text",children:[(0,o.jsx)(n.strong,{children:"Split Text"})," component"]}),": Splits the processed text into chunks, based on the configured ",(0,o.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"chunk size and overlap settings"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Secret Input"})," component: If needed, four of these components securely fetch the ",(0,o.jsx)(n.a,{href:"/knowledge#auth",children:"OAuth authentication"})," configuration variables: ",(0,o.jsx)(n.code,{children:"CONNECTOR_TYPE"}),", ",(0,o.jsx)(n.code,{children:"OWNER"}),", ",(0,o.jsx)(n.code,{children:"OWNER_EMAIL"}),", and ",(0,o.jsx)(n.code,{children:"OWNER_NAME"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Create Data"})," component: Combines the authentication credentials from the ",(0,o.jsx)(n.strong,{children:"Secret Input"})," components into a structured data object that is associated with the document embeddings."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/components-embedding-models",children:[(0,o.jsx)(n.strong,{children:"Embedding Model"})," component"]}),": Generates vector embeddings using your selected ",(0,o.jsx)(n.a,{href:"/knowledge#set-the-embedding-model-and-dimensions",children:"embedding model"}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsxs)(n.a,{href:"https://docs.langflow.org/bundles-elastic#opensearch",children:[(0,o.jsx)(n.strong,{children:"OpenSearch"})," component"]}),": Stores the processed documents and their embeddings in a ",(0,o.jsx)(n.code,{children:"documents"})," index of your OpenRAG ",(0,o.jsx)(n.a,{href:"/knowledge",children:"OpenSearch knowledge base"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The default address for the OpenSearch instance is ",(0,o.jsx)(n.code,{children:"https://opensearch:9200"}),". To change this address, edit the ",(0,o.jsx)(n.code,{children:"OPENSEARCH_PORT"})," ",(0,o.jsx)(n.a,{href:"/reference/configuration#opensearch-settings",children:"environment variable"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The default authentication method is JSON Web Token (JWT) authentication. If you ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"edit the flow"}),", you can select ",(0,o.jsx)(n.code,{children:"basic"})," auth mode, which uses the ",(0,o.jsx)(n.code,{children:"OPENSEARCH_USERNAME"})," and ",(0,o.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})," ",(0,o.jsx)(n.a,{href:"/reference/configuration#opensearch-settings",children:"environment variables"})," for authentication instead of JWT."]}),"\n"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(h,{...e})}):h(e)}var p=s(1381),g=s(4577);const x={title:"Ingest knowledge",slug:"/ingestion"},f=void 0,m={},j=[{value:"Ingest local files and folders",id:"ingest-local-files-and-folders",level:2},...d,{value:"Ingest local files temporarily",id:"ingest-local-files-temporarily",level:2},...c.RM,{value:"Ingest files with OAuth connectors",id:"oauth-ingestion",level:2},{value:"Enable OAuth connectors",id:"enable-oauth-connectors",level:3},...g.RM,...p.RM,{value:"Authenticate and ingest files from cloud storage",id:"authenticate-and-ingest-files-from-cloud-storage",level:3},...d,{value:"Ingest knowledge from URLs",id:"url-flow",level:2},{value:"Monitor ingestion",id:"monitor-ingestion",level:2},{value:"Ingestion performance expectations",id:"ingestion-performance-expectations",level:3},{value:"Troubleshoot ingestion",id:"troubleshoot-ingestion",level:2},{value:"See also",id:"see-also",level:2}];function w(e){const n={a:"a",code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components},{Details:s}=n;return s||function(e,n){throw new Error("Expected "+(n?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Details",!0),(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Upload documents to your ",(0,o.jsx)(n.a,{href:"/knowledge",children:"OpenRAG OpenSearch instance"})," to populate your knowledge base with unique content, such as your own company documents, research papers, or websites.\nDocuments are processed through OpenRAG's knowledge ingestion flows with Docling."]}),"\n",(0,o.jsx)(n.p,{children:"OpenRAG can ingest knowledge from direct file uploads, URLs, and OAuth authenticated connectors."}),"\n",(0,o.jsxs)(n.p,{children:["Knowledge ingestion is powered by OpenRAG's built-in knowledge ingestion flows that use Docling to process documents before storing the documents in your OpenSearch database.\nDuring ingestion, documents are broken into smaller chunks of content that are then embedded using your selected ",(0,o.jsx)(n.a,{href:"/knowledge#set-the-embedding-model-and-dimensions",children:"embedding model"}),".\nThen, the chunks, embeddings, and associated metadata (which connects chunks of the same document) are stored in your OpenSearch database."]}),"\n",(0,o.jsxs)(n.p,{children:["To modify chunking behavior and other ingestion settings, see ",(0,o.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"Knowledge ingestion settings"})," and ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"Inspect and modify flows"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"ingest-local-files-and-folders",children:"Ingest local files and folders"}),"\n",(0,o.jsx)(n.p,{children:"You can upload files and folders from your local machine to your knowledge base:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(i.A,{name:"Library","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Knowledge"})," to view your OpenSearch knowledge base."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Add Knowledge"})," to add your own documents to your OpenRAG knowledge base."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["To upload one file, click ",(0,o.jsx)(i.A,{name:"File","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"File"}),". To upload all documents in a folder, click ",(0,o.jsx)(i.A,{name:"Folder","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Folder"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["The default path is ",(0,o.jsx)(n.code,{children:"~/.openrag/documents"}),".\nTo change this path, see ",(0,o.jsx)(n.a,{href:"/knowledge#set-the-local-documents-path",children:"Set the local documents path"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The selected files are processed in the background through the ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow."]}),"\n",(0,o.jsx)(u,{}),"\n",(0,o.jsxs)(n.p,{children:["You can ",(0,o.jsx)(n.a,{href:"#monitor-ingestion",children:"monitor ingestion"})," to see the progress of the uploads and check for failed uploads."]}),"\n",(0,o.jsx)(n.h2,{id:"ingest-local-files-temporarily",children:"Ingest local files temporarily"}),"\n",(0,o.jsx)(c.Ay,{}),"\n",(0,o.jsx)(n.h2,{id:"oauth-ingestion",children:"Ingest files with OAuth connectors"}),"\n",(0,o.jsx)(n.p,{children:"OpenRAG can use OAuth authenticated connectors to ingest documents from the following external services:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"AWS S3"}),"\n",(0,o.jsx)(n.li,{children:"Google Drive"}),"\n",(0,o.jsx)(n.li,{children:"Microsoft OneDrive"}),"\n",(0,o.jsx)(n.li,{children:"Microsoft Sharepoint"}),"\n"]}),"\n",(0,o.jsx)(n.p,{children:"These connectors enable seamless ingestion of files from cloud storage to your OpenRAG knowledge base."}),"\n",(0,o.jsx)(n.p,{children:"Individual users can connect their personal cloud storage accounts to OpenRAG. Each user must separately authorize OpenRAG to access their own cloud storage. When a user connects a cloud storage service, they are redirected to authenticate with that service provider and grant OpenRAG permission to sync documents from their personal cloud storage."}),"\n",(0,o.jsx)(n.h3,{id:"enable-oauth-connectors",children:"Enable OAuth connectors"}),"\n",(0,o.jsx)(n.p,{children:"Before users can connect their own cloud storage accounts, you must configure the provider's OAuth credentials in OpenRAG. Typically, this requires that you register OpenRAG as an OAuth application in your cloud provider, and then obtain the app's OAuth credentials, such as a client ID and secret key.\nTo enable multiple connectors, you must register an app and generate credentials for each provider."}),"\n",(0,o.jsxs)(l.A,{children:[(0,o.jsxs)(a.A,{value:"TUI",label:"TUI-managed services",default:!0,children:[(0,o.jsxs)(n.p,{children:["If you use the ",(0,o.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to manage your OpenRAG services, enter OAuth credentials on the ",(0,o.jsx)(n.strong,{children:"Advanced Setup"})," page.\nYou can do this during ",(0,o.jsx)(n.a,{href:"/install#setup",children:"installation"}),", or you can add the credentials afterwards:"]}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["If OpenRAG is running, click ",(0,o.jsx)(n.strong,{children:"Stop All Services"})," in the TUI."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Open the ",(0,o.jsx)(n.strong,{children:"Advanced Setup"})," page, and then add the OAuth credentials for the cloud storage providers that you want to use under ",(0,o.jsx)(n.strong,{children:"API Keys"}),":"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,o.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,o.jsxs)(n.li,{children:[(0,o.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Register the redirect URIs shown in the TUI in your OAuth provider.\nThese are the URLs your OAuth provider will use to redirect users back to OpenRAG after they sign in."}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Save Configuration"})," to add the OAuth credentials to your ",(0,o.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,o.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Start Services"})," to restart the OpenRAG containers with OAuth enabled."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Launch the OpenRAG app.\nYou should be prompted to sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n"]})]}),(0,o.jsxs)(a.A,{value:"env",label:"Self-managed services",children:[(0,o.jsxs)(n.p,{children:["If you ",(0,o.jsx)(n.a,{href:"/docker",children:"installed OpenRAG with self-managed services"}),", set OAuth credentials in your ",(0,o.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,o.jsx)(n.code,{children:".env"})," file"]}),"."]}),(0,o.jsxs)(n.p,{children:["You can do this during ",(0,o.jsx)(n.a,{href:"/docker#setup",children:"initial set up"}),", or you can add the credentials afterwards:"]}),(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Stop all OpenRAG containers:"}),"\n",(0,o.jsx)(g.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Edit your OpenRAG ",(0,o.jsx)(n.code,{children:".env"})," file to add the OAuth credentials for the cloud storage providers that you want to use:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,o.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-env",children:"GOOGLE_OAUTH_CLIENT_ID=\nGOOGLE_OAUTH_CLIENT_SECRET=\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,o.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-env",children:"MICROSOFT_GRAPH_OAUTH_CLIENT_ID=\nMICROSOFT_GRAPH_OAUTH_CLIENT_SECRET=\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,o.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-env",children:"AWS_ACCESS_KEY_ID=\nAWS_SECRET_ACCESS_KEY=\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Save the ",(0,o.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Restart your OpenRAG containers:"}),"\n",(0,o.jsx)(p.Ay,{}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Access the OpenRAG frontend at ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),".\nYou should be prompted to sign in to your OAuth provider before being redirected to your OpenRAG instance."]}),"\n"]}),"\n"]})]})]}),"\n",(0,o.jsx)(n.h3,{id:"authenticate-and-ingest-files-from-cloud-storage",children:"Authenticate and ingest files from cloud storage"}),"\n",(0,o.jsxs)(n.p,{children:["After you start OpenRAG with OAuth connectors enabled, each user is prompted to authenticate with the OAuth provider upon accessing your OpenRAG instance.\nIndividual authentication is required to access a user's cloud storage from your OpenRAG instance.\nFor example, if a user navigates to the default OpenRAG URL at ",(0,o.jsx)(n.code,{children:"http://localhost:3000"}),", they are redirected to the OAuth provider's sign-in page.\nAfter authenticating and granting the required permissions for OpenRAG, the user is redirected back to OpenRAG."]}),"\n",(0,o.jsx)(n.p,{children:"To ingest knowledge with an OAuth connector, do the following:"}),"\n",(0,o.jsxs)(n.ol,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(i.A,{name:"Library","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Knowledge"})," to view your OpenSearch knowledge base."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Add Knowledge"}),", and then select a storage provider."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["On the ",(0,o.jsx)(n.strong,{children:"Add Cloud Knowledge"})," page, click ",(0,o.jsx)(n.strong,{children:"Add Files"}),", and then select the files and folders to ingest from the connected storage."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:["Click ",(0,o.jsx)(n.strong,{children:"Ingest Files"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["The selected files are processed in the background through the ",(0,o.jsx)(n.strong,{children:"OpenSearch Ingestion"})," flow."]}),"\n",(0,o.jsx)(u,{}),"\n",(0,o.jsxs)(n.p,{children:["You can ",(0,o.jsx)(n.a,{href:"#monitor-ingestion",children:"monitor ingestion"})," to see the progress of the uploads and check for failed uploads."]}),"\n",(0,o.jsx)(n.h2,{id:"url-flow",children:"Ingest knowledge from URLs"}),"\n",(0,o.jsxs)(n.p,{children:["The ",(0,o.jsx)(n.strong,{children:"OpenSearch URL Ingestion"})," flow is used to ingest web content from URLs.\nThis flow isn't directly accessible from the OpenRAG user interface.\nInstead, this flow is called by the ",(0,o.jsxs)(n.a,{href:"/chat#flow",children:[(0,o.jsx)(n.strong,{children:"OpenRAG OpenSearch Agent"})," flow"]})," as a Model Context Protocol (MCP) tool.\nThe agent can call this component to fetch web content from a given URL, and then ingest that content into your OpenSearch knowledge base."]}),"\n",(0,o.jsxs)(n.p,{children:["Like all OpenRAG flows, you can ",(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"inspect the flow in Langflow"}),", and you can customize it."]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about MCP in Langflow, see the Langflow documentation on ",(0,o.jsx)(n.a,{href:"https://docs.langflow.org/mcp-client",children:"MCP clients"})," and ",(0,o.jsx)(n.a,{href:"https://docs.langflow.org/mcp-tutorial",children:"MCP servers"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"monitor-ingestion",children:"Monitor ingestion"}),"\n",(0,o.jsx)(n.p,{children:"Document ingestion tasks run in the background."}),"\n",(0,o.jsxs)(n.p,{children:["In the OpenRAG user interface, a badge is shown on ",(0,o.jsx)(i.A,{name:"Bell","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Tasks"})," when OpenRAG tasks are active.\nClick ",(0,o.jsx)(i.A,{name:"Bell","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Tasks"})," to inspect and cancel tasks:"]}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Active Tasks"}),": All tasks that are ",(0,o.jsx)(n.strong,{children:"Pending"}),", ",(0,o.jsx)(n.strong,{children:"Running"}),", or ",(0,o.jsx)(n.strong,{children:"Processing"}),".\nFor each active task, depending on its state, you can find the task ID, start time, duration, number of files processed, and the total files enqueued for processing."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Pending"}),": The task is queued and waiting to start."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Running"}),": The task is actively processing files."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Processing"}),": The task is performing ingestion operations."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Failed"}),": Something went wrong during ingestion, or the task was manually canceled.\nFor troubleshooting advice, see ",(0,o.jsx)(n.a,{href:"#troubleshoot-ingestion",children:"Troubleshoot ingestion"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["To stop an active task, click ",(0,o.jsx)(i.A,{name:"X","aria-hidden":"true"})," ",(0,o.jsx)(n.strong,{children:"Cancel"}),". Canceling a task stops processing immediately and marks the task as ",(0,o.jsx)(n.strong,{children:"Failed"}),"."]}),"\n",(0,o.jsx)(n.h3,{id:"ingestion-performance-expectations",children:"Ingestion performance expectations"}),"\n",(0,o.jsx)(n.p,{children:"The following performance test was conducted with Docling Serve."}),"\n",(0,o.jsx)(n.p,{children:"On a local VM with 7 vCPUs and 8 GiB RAM, OpenRAG ingested approximately 5.03 GB across 1,083 files in about 42 minutes.\nThis equates to approximately 2.4 documents per second."}),"\n",(0,o.jsx)(n.p,{children:"You can generally expect equal or better performance on developer laptops, and significantly faster performance on servers.\nThroughput scales with CPU cores, memory, storage speed, and configuration choices, such as the embedding model, chunk size, overlap, and concurrency."}),"\n",(0,o.jsx)(n.p,{children:"This test returned 12 error, approximately 1.1 percent of the total files ingested.\nAll errors were file-specific, and they didn't stop the pipeline."}),"\n",(0,o.jsxs)(s,{children:[(0,o.jsx)("summary",{children:"Ingestion performance test details"}),(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Ingestion dataset:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Total files: 1,083 items mounted"}),"\n",(0,o.jsx)(n.li,{children:"Total size on disk: 5,026,474,862 bytes (approximately 5.03 GB)"}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Hardware specifications:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Machine: Apple M4 Pro"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Podman VM:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Name: podman-machine-default"}),"\n",(0,o.jsx)(n.li,{children:"Type: applehv"}),"\n",(0,o.jsx)(n.li,{children:"vCPUs: 7"}),"\n",(0,o.jsx)(n.li,{children:"Memory: 8 GiB"}),"\n",(0,o.jsx)(n.li,{children:"Disk size: 100 GiB"}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Test results:"}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-text",children:"2025-09-24T22:40:45.542190Z /app/src/main.py:231 Ingesting default documents when ready disable_langflow_ingest=False\n2025-09-24T22:40:45.546385Z /app/src/main.py:270 Using Langflow ingestion pipeline for default documents file_count=1082\n...\n2025-09-24T23:19:44.866365Z /app/src/main.py:351 Langflow ingestion completed success_count=1070 error_count=12 total_files=1082\n"})}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Elapsed time: Approximately 42 minutes 15 seconds (2,535 seconds)"}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsx)(n.p,{children:"Throughput: Approximately 2.4 documents per second"}),"\n"]}),"\n"]})]}),"\n",(0,o.jsx)(n.h2,{id:"troubleshoot-ingestion",children:"Troubleshoot ingestion"}),"\n",(0,o.jsx)(n.p,{children:"If an ingestion task fails, do the following:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Make sure you are uploading supported file types."}),"\n",(0,o.jsx)(n.li,{children:"Split excessively large files into smaller files before uploading."}),"\n",(0,o.jsx)(n.li,{children:"Remove unusual embedded content, such as videos or animations, before uploading. Although Docling can replace some non-text content with placeholders during ingestion, some embedded content might cause errors."}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["If the OpenRAG ",(0,o.jsx)(n.strong,{children:"Chat"})," doesn't seem to use your documents correctly, ",(0,o.jsx)(n.a,{href:"/knowledge#browse-knowledge",children:"browse your knowledge base"})," to confirm that the documents are uploaded in full, and the chunks are correct."]}),"\n",(0,o.jsxs)(n.p,{children:["If the documents are present and well-formed, check your ",(0,o.jsx)(n.a,{href:"/knowledge-filters",children:"knowledge filters"}),".\nIf a global filter is applied, make sure the expected documents are included in the global filter.\nIf the global filter excludes any documents, the agent cannot access those documents unless you apply a chat-level filter or change the global filter."]}),"\n",(0,o.jsx)(n.p,{children:"If text is missing or incorrectly processed, you need to reupload the documents after modifying the ingestion parameters or the documents themselves.\nFor example:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:"Break combined documents into separate files for better metadata context."}),"\n",(0,o.jsxs)(n.li,{children:["Make sure scanned documents are legible enough for extraction, and enable the ",(0,o.jsx)(n.strong,{children:"OCR"})," option. Poorly scanned documents might require additional preparation or rescanning before ingestion."]}),"\n",(0,o.jsxs)(n.li,{children:["Adjust the ",(0,o.jsx)(n.strong,{children:"Chunk Size"})," and ",(0,o.jsx)(n.strong,{children:"Chunk Overlap"})," settings to better suit your documents. Larger chunks provide more context but can include irrelevant information, while smaller chunks yield more precise semantic search but can lack context."]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["For more information about modifying ingestion parameters and flows, see ",(0,o.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"Knowledge ingestion settings"}),"."]}),"\n",(0,o.jsx)(n.h2,{id:"see-also",children:"See also"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/knowledge",children:"Configure knowledge"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/knowledge-filters",children:"Filter knowledge"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/chat",children:"Chat with knowledge"})}),"\n",(0,o.jsx)(n.li,{children:(0,o.jsx)(n.a,{href:"/agents#inspect-and-modify-flows",children:"Inspect and modify flows"})}),"\n"]})]})}function b(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(w,{...e})}):w(e)}},8401:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var t=s(4848),o=s(8453),r=s(9179);const i=[];function l(e){const n={p:"p",strong:"strong",...(0,o.R)(),...e.components};return(0,t.jsxs)(n.p,{children:["When using the OpenRAG ",(0,t.jsx)(n.strong,{children:"Chat"}),", click ",(0,t.jsx)(r.A,{name:"Plus","aria-hidden":"true"})," in the chat input field to upload a file to the current chat session.\nFiles added this way are processed and made available to the agent for the current conversation only.\nThese files aren't stored in the knowledge base permanently."]})}function a(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>r});s(6540);var t=s(7856),o=s(4848);function r({name:e,...n}){const s=t[e];return s?(0,o.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var t=s(4164);const o={tabItem:"tabItem_Ymn6"};var r=s(4848);function i({children:e,hidden:n,className:s}){return(0,r.jsx)("div",{role:"tabpanel",className:(0,t.A)(o.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/d0314b07.0bb94724.js b/assets/js/d0314b07.0bb94724.js new file mode 100644 index 00000000..f8e5f9b2 --- /dev/null +++ b/assets/js/d0314b07.0bb94724.js @@ -0,0 +1 @@ +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[5750],{887:(e,n,s)=>{s.d(n,{Ay:()=>h,RM:()=>c});var r=s(4848),t=s(8453),o=s(9179),i=s(1470),a=s(9365),l=s(3059);const c=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...l.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,r.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,r.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,r.jsxs)(i.A,{groupId:"Provider",children:[(0,r.jsxs)(a.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["For ",(0,r.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", select the base URL for your watsonx.ai model deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter your watsonx.ai deployment's project ID and API key."}),"\n",(0,r.jsxs)(n.p,{children:["You can enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,r.jsxs)(a.A,{value:"Ollama",label:"Ollama",children:[(0,r.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(l.Ay,{})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In the OpenRAG onboarding dialog, enter your Ollama server's base URL:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,r.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select the language model that your Ollama server is running."}),"\n",(0,r.jsx)(n.p,{children:"If your server isn't running any language models, you must either deploy a language model on your Ollama server, or use another provider for the language model."}),"\n",(0,r.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,r.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(o.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},927:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[{value:"Next steps",id:"next-steps",level:2}];function i(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Learn how to ",(0,r.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),o=s(7559),i=s(3104),a=s(6347),l=s(205),c=s(7485),d=s(1682),h=s(679);function u(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const s=(0,a.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function f(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,o=p(e),[i,a]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:o})),[c,d]=x({queryString:s,groupId:t}),[u,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,h.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),g=(()=>{const e=c??u;return m({value:e,tabValues:o})?e:null})();(0,l.A)(()=>{g&&a(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!m({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);a(e),d(e),f(e)},[d,f,o]),tabValues:o}}var g=s(2303);const j={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var y=s(4848);function v({className:e,block:n,selectedValue:s,selectValue:r,tabValues:o}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,i.a_)(),c=e=>{const n=e.currentTarget,t=a.indexOf(n),i=o[t].value;i!==s&&(l(n),r(i))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=a.indexOf(e.currentTarget)+1;n=a[s]??a[0];break}case"ArrowLeft":{const s=a.indexOf(e.currentTarget)-1;n=a[s]??a[a.length-1];break}}n?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:c,...r,className:(0,t.A)("tabs__item",j.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:s}){const o=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:o.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function b(e){const n=f(e);return(0,y.jsxs)("div",{className:(0,t.A)(o.G.tabs.container,"tabs-container",j.tabList),children:[(0,y.jsx)(v,{...n,...e}),(0,y.jsx)(A,{...n,...e})]})}function w(e){const n=(0,g.A)();return(0,y.jsx)(b,{...e,children:u(e.children)},String(n))}},2061:(e,n,s)=>{s.d(n,{Ay:()=>d,RM:()=>l});var r=s(4848),t=s(8453),o=s(1470),i=s(9365),a=s(7637);const l=[...a.RM];function c(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["You can use either ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," to configure OpenRAG.\nThis choice determines how OpenRAG authenticates with your deployment's ",(0,r.jsx)(n.a,{href:"/knowledge",children:"OpenSearch instance"}),", and it controls user access to documents stored in your OpenSearch knowledge base:"]}),"\n",(0,r.jsx)(a.Ay,{}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You must use ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," if you want to ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"use OAuth connectors to upload documents from cloud storage"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["If OpenRAG detects OAuth credentials during setup, it recommends ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the TUI."]}),"\n",(0,r.jsxs)(o.A,{groupId:"Setup method",children:[(0,r.jsx)(i.A,{value:"Basic setup",label:"Basic setup",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, select ",(0,r.jsx)(n.strong,{children:"Basic Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter administrator passwords for the OpenRAG OpenSearch and Langflow services."}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow password and username automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"API Keys"}),", enter your model provider credentials, or leave these fields empty if you want to configure model provider credentials during the application onboarding process."]}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing these values now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a credential now, it can be populated automatically during the application onboarding process if you enable the ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," option."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"Others"}),", edit the ",(0,r.jsx)(n.a,{href:"/knowledge",children:"knowledge base"})," paths if you don't want to use the default paths:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documents Paths"}),": One or more paths to directories are where OpenRAG looks for documents to ingest."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OpenSearch Data PAth"}),": Specify the path where you want OpenRAG to create your OpenSearch index."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords and API keys, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," or navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"})," in your browser."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})}),(0,r.jsx)(i.A,{value:"Advanced setup",label:"Advanced setup",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Enter administrator passwords for the OpenRAG OpenSearch and Langflow services."}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required, and a secure password is automatically generated if you don't provide one manually."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["You can click ",(0,r.jsx)(n.strong,{children:"Generate Password"})," to create a Langflow password and username automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"API Keys"}),", enter your model provider credentials, or leave the ",(0,r.jsx)(n.strong,{children:"OpenAI"}),", ",(0,r.jsx)(n.strong,{children:"Anthropic"}),", ",(0,r.jsx)(n.strong,{children:"Ollama"}),", and ",(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"})," fields empty if you want to configure model provider credentials during the application onboarding process."]}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing these values now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a credential now, it can be populated automatically during the application onboarding process if you enable the ",(0,r.jsx)(n.strong,{children:"Use environment API key"})," option."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Recommended: To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use under ",(0,r.jsx)(n.strong,{children:"API Keys"}),". These settings can be populated automatically if OpenRAG detects these credentials in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,r.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,r.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Register the redirect URIs shown in the TUI in your OAuth provider.\nThese are the URLs your OAuth provider will use to redirect users back to OpenRAG after they sign in."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Under ",(0,r.jsx)(n.strong,{children:"Others"}),", you can edit the following settings if needed:"]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Documents Paths"}),": Use the default path or provide one or more paths to directories are where OpenRAG looks for documents to ingest in to your ",(0,r.jsx)(n.a,{href:"/knowledge",children:"knowledge base"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"OpenSearch Data Path"}),": Specify the path where you want OpenRAG to create your OpenSearch index."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Langflow Public URL (",(0,r.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"}),")"]})," : Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsxs)(n.strong,{children:["Webhook Base URL (",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL"}),")"]}),": If applicable, set the base address for your OAuth connector endpoints. If set, the OAuth connector webhook URLs are constructed as ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/${provider}/webhook"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords, API key, and OAuth credentials, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start OpenRAG"})," to start the OpenRAG services."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Close"}),", and then click ",(0,r.jsx)(n.strong,{children:"Launch OpenRAG"})," or navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"})," in your browser."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})})]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3059:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,r.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Language models"}),": ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,r.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you choose ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Embedding models"}),": ",(0,r.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,r.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,r.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,r.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,r.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},3351:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>i});var r=s(4848),t=s(8453),o=s(3059);const i=[...o.RM];function a(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,r.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(o.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,r.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},3929:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/openrag_tui_dec_2025-c7022e66cc6675f25aced7b8acd8274d.png"},4042:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},4398:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>g,frontMatter:()=>u,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"get-started/install","title":"Install OpenRAG with the automatic installer script","description":"To quickly install and test OpenRAG\'s core features, try the quickstart.","source":"@site/docs/get-started/install.mdx","sourceDirName":"get-started","slug":"/install","permalink":"/install","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/install.mdx","tags":[],"version":"current","frontMatter":{"title":"Install OpenRAG with the automatic installer script","slug":"/install"},"sidebar":"tutorialSidebar","previous":{"title":"Select an installation method","permalink":"/install-options"},"next":{"title":"Install OpenRAG with uv","permalink":"/install-uv"}}');var t=s(4848),o=s(8453),i=(s(1470),s(9365),s(887)),a=s(2061),l=s(3351),c=s(6149),d=s(4042),h=s(927);s(7637),s(3059);const u={title:"Install OpenRAG with the automatic installer script",slug:"/install"},p=void 0,m={},x=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...d.RM,...l.RM,{value:"Run the installer script",id:"install",level:2},{value:"Set up OpenRAG with the TUI",id:"setup",level:2},...a.RM,...i.RM,...h.RM];function f(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To quickly install and test OpenRAG's core features, try the ",(0,t.jsx)(n.a,{href:"/quickstart",children:"quickstart"}),"."]})}),"\n",(0,t.jsxs)(n.p,{children:["The installer script installs ",(0,t.jsx)(n.code,{children:"uv"}),", Docker or Podman, Docker Compose, and OpenRAG.\nThen, it installs and runs OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with the installer script, you will use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to configure and manage your OpenRAG deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["This installation method is best for testing OpenRAG by running it outside of a Python project.\nFor other installation methods, see ",(0,t.jsx)(n.a,{href:"/install-options",children:"Select an installation method"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"install",children:"Run the installer script"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a directory to store your OpenRAG configuration files and data, and then change to that directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir openrag-workspace\ncd openrag-workspace\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Get and run the installer script:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl -fsSL https://docs.openr.ag/files/run_openrag_with_prereqs.sh | bash\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installer script installs OpenRAG with ",(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#running-tools",children:(0,t.jsx)(n.code,{children:"uvx"})})," in the directory where you run the script."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Wait while the installer script prepares your environment and installs OpenRAG.\nYou might be prompted to install certain dependencies if they aren't already present in your environment."}),"\n",(0,t.jsx)(n.p,{children:"The entire process can take a few minutes.\nOnce the environment is ready, the OpenRAG TUI starts."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:s(3929).A+"",width:"653",height:"397"})}),"\n",(0,t.jsxs)(n.p,{children:["Because the installer script uses ",(0,t.jsx)(n.code,{children:"uvx"}),", it creates a cached, ephemeral environment in your local ",(0,t.jsx)(n.code,{children:"uv"})," cache, and your OpenRAG configuration files and data are stored separately from the ",(0,t.jsx)(n.code,{children:"uv"})," cache.\nClearing the cache doesn't delete your entire OpenRAG installation, only the temporary TUI environment.\nAfter clearing the cache, run ",(0,t.jsx)(n.code,{children:"uvx openrag"})," to ",(0,t.jsx)(n.a,{href:"/tui",children:"access the TUI"})," and continue with your preserved configuration and data."]}),"\n"]}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If you encounter errors during installation, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Set up OpenRAG with the TUI"}),"\n",(0,t.jsx)(n.p,{children:"When you install OpenRAG with the installer script, you manage the OpenRAG services with the TUI.\nThe TUI guides you through the initial configuration process before you start the OpenRAG services."}),"\n",(0,t.jsxs)(n.p,{children:["Your configuration values are stored in an ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]})," that is created automatically at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf OpenRAG detects an existing ",(0,t.jsx)(n.code,{children:".env"})," file in this directory, then the TUI can populate those values automatically during setup and onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Container definitions are stored in the ",(0,t.jsx)(n.code,{children:"docker-compose"})," files in the same directory as the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(i.Ay,{}),"\n",(0,t.jsx)(h.Ay,{})]})}function g(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(f,{...e})}):f(e)}},6149:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,r.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},7637:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>o});var r=s(4848),t=s(8453);const o=[];function i(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No-auth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," doesn't include OAuth credentials, then the OpenRAG OpenSearch instance runs in no-auth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses one anonymous JWT token for OpenSearch authentication.\nThere is no differentiation between users; all users that access your OpenRAG instance can access all documents uploaded to your knowledge base."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OAuth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," includes OAuth credentials, then the OpenRAG OpenSearch instance runs in OAuth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses a unique JWT token for each OpenRAG user, and each document is tagged with user ownership.\nDocuments are filtered by user owner; users see only the documents that they uploaded or have access to through their cloud storage accounts."}),"\n",(0,r.jsxs)(n.p,{children:["To enable OAuth mode after initial setup, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(7856),t=s(4848);function o({name:e,...n}){const s=r[e];return s?(0,t.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var o=s(4848);function i({children:e,hidden:n,className:s}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/d0314b07.ebf2fdd5.js b/assets/js/d0314b07.ebf2fdd5.js deleted file mode 100644 index 52e021bd..00000000 --- a/assets/js/d0314b07.ebf2fdd5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[5750],{887:(e,n,s)=>{s.d(n,{Ay:()=>h,RM:()=>c});var r=s(4848),t=s(8453),i=s(9179),o=s(1470),a=s(9365),l=s(3059);const c=[{value:"Complete the application onboarding process",id:"application-onboarding",level:2},...l.RM];function d(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"application-onboarding",children:"Complete the application onboarding process"}),"\n",(0,r.jsxs)(n.p,{children:["The first time you start the OpenRAG application, you must complete the application onboarding process to select language and embedding models that are essential for OpenRAG features like the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Some of these variables, such as the embedding models, can be changed seamlessly after onboarding.\nOthers are immutable and require you to destroy and recreate the OpenRAG containers.\nFor more information, see the ",(0,r.jsx)(n.a,{href:"/reference/configuration",children:"OpenRAG environment variables reference"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"You can use different providers for your language model and embedding model, such as Anthropic for the language model and OpenAI for the embedding model.\nAdditionally, you can set multiple embedding models."}),"\n",(0,r.jsx)(n.p,{children:"You only need to complete onboarding for your preferred providers."}),"\n",(0,r.jsxs)(o.A,{groupId:"Provider",children:[(0,r.jsxs)(a.A,{value:"Anthropic",label:"Anthropic",default:!0,children:[(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(n.p,{children:"Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model."})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your Anthropic API key, or enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"ANTHROPIC_API_KEY"})," in your OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"IBM watsonx.ai",label:"IBM watsonx.ai",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Use the values from your IBM watsonx deployment for the ",(0,r.jsx)(n.strong,{children:"watsonx.ai API Endpoint"}),", ",(0,r.jsx)(n.strong,{children:"IBM Project ID"}),", and ",(0,r.jsx)(n.strong,{children:"IBM API key"})," fields."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"WATSONX_API_KEY"}),", ",(0,r.jsx)(n.code,{children:"WATSONX_API_URL"}),", or ",(0,r.jsx)(n.code,{children:"WATSONX_PROJECT_ID"})," in your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),", these values can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credentials are valid and have access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})}),(0,r.jsxs)(a.A,{value:"Ollama",label:"Ollama",children:[(0,r.jsx)(n.p,{children:"Using Ollama as your language and embedding model provider offers greater flexibility and configuration options for hosting models.\nHowever, it requires additional setup because Ollama isn't included with OpenRAG.\nYou must deploy Ollama separately if you want to use Ollama as a model provider."}),(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(l.Ay,{})}),(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Install Ollama locally or on a remote server"}),", or ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/cloud",children:"run models in Ollama Cloud"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"If you are running a remote server, it must be accessible from your OpenRAG deployment."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"In OpenRAG onboarding, connect to your Ollama server:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Local Ollama server"}),": Enter your Ollama server's base URL and port. The default Ollama server address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Ollama Cloud"}),": Because Ollama Cloud models run at the same address as a local Ollama server and automatically offload to Ollama's cloud service, you can use the same base URL and port as you would for a local Ollama server. The default address is ",(0,r.jsx)(n.code,{children:"http://localhost:11434"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Remote server"}),": Enter your remote Ollama server's base URL and port, such as ",(0,r.jsx)(n.code,{children:"http://your-remote-server:11434"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"If the connection succeeds, OpenRAG populates the model lists with the server's available models."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select the model that your Ollama server is running."}),"\n",(0,r.jsx)(n.p,{children:"Language model and embedding model selections are independent.\nYou can use the same or different servers for each model."}),"\n",(0,r.jsx)(n.p,{children:"To use different providers for each model, you must configure both providers, and select the relevant model for each provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses the address and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the server address is valid, and that the selected model is running on the server.\nThen, click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})]}),(0,r.jsx)(a.A,{value:"OpenAI",label:"OpenAI (default)",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter your OpenAI API key, or enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"})," to pull the key from your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you set ",(0,r.jsx)(n.code,{children:"OPENAI_API_KEY"})," in your OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file, this value can be populated automatically."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.strong,{children:"Advanced settings"}),", select the language model that you want to use."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Select a provider for embeddings, provide the required information, and then select the embedding model you want to use.\nFor information about another provider's credentials and settings, see the instructions for that provider."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Complete"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["After you configure the embedding model, OpenRAG uses your credentials and models to ingest some ",(0,r.jsx)(n.a,{href:"/knowledge#default-documents",children:"initial documents"}),". This tests the connection, and it allows you to ask OpenRAG about itself in the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})}),".\nIf there is a problem with the model configuration, an error occurs and you are redirected back to the application onboarding screen.\nVerify that the credential is valid and has access to the selected model, and then click ",(0,r.jsx)(n.strong,{children:"Complete"})," to retry ingestion."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue through the overview slides for a brief introduction to OpenRAG, or click ",(0,r.jsx)(i.A,{name:"ArrowRight","aria-hidden":"true"})," ",(0,r.jsx)(n.strong,{children:"Skip overview"}),".\nThe overview demonstrates some basic functionality that is covered in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"})," and in other parts of the OpenRAG documentation."]}),"\n"]}),"\n"]})})]})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},927:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var r=s(4848),t=s(8453);const i=[{value:"Next steps",id:"next-steps",level:2}];function o(e){const n={a:"a",h2:"h2",li:"li",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.h2,{id:"next-steps",children:"Next steps"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Try some of OpenRAG's core features in the ",(0,r.jsx)(n.a,{href:"/quickstart#chat-with-documents",children:"quickstart"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Learn how to ",(0,r.jsx)(n.a,{href:"/manage-services",children:"manage OpenRAG services"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.a,{href:"/ingestion",children:"Upload documents"}),", and then use the ",(0,r.jsx)(n.a,{href:"/chat",children:(0,r.jsx)(n.strong,{children:"Chat"})})," to explore your data."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},1470:(e,n,s)=>{s.d(n,{A:()=>w});var r=s(6540),t=s(4164),i=s(7559),o=s(3104),a=s(6347),l=s(205),c=s(7485),d=s(1682),h=s(679);function u(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:s}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return u(e).map(({props:{value:e,label:n,attributes:s,default:r}})=>({value:e,label:n,attributes:s,default:r}))}(s);return function(e){const n=(0,d.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,s])}function m({value:e,tabValues:n}){return n.some(n=>n.value===e)}function x({queryString:e=!1,groupId:n}){const s=(0,a.W6)(),t=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(t),(0,r.useCallback)(e=>{if(!t)return;const n=new URLSearchParams(s.location.search);n.set(t,e),s.replace({...s.location,search:n.toString()})},[t,s])]}function f(e){const{defaultValue:n,queryString:s=!1,groupId:t}=e,i=p(e),[o,a]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!m({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const s=n.find(e=>e.default)??n[0];if(!s)throw new Error("Unexpected error: 0 tabValues");return s.value}({defaultValue:n,tabValues:i})),[c,d]=x({queryString:s,groupId:t}),[u,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[s,t]=(0,h.Dv)(n);return[s,(0,r.useCallback)(e=>{n&&t.set(e)},[n,t])]}({groupId:t}),j=(()=>{const e=c??u;return m({value:e,tabValues:i})?e:null})();(0,l.A)(()=>{j&&a(j)},[j]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!m({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);a(e),d(e),f(e)},[d,f,i]),tabValues:i}}var j=s(2303);const g={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var v=s(4848);function y({className:e,block:n,selectedValue:s,selectValue:r,tabValues:i}){const a=[],{blockElementScrollPositionUntilNextRender:l}=(0,o.a_)(),c=e=>{const n=e.currentTarget,t=a.indexOf(n),o=i[t].value;o!==s&&(l(n),r(o))},d=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const s=a.indexOf(e.currentTarget)+1;n=a[s]??a[0];break}case"ArrowLeft":{const s=a.indexOf(e.currentTarget)-1;n=a[s]??a[a.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,t.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:s===e?0:-1,"aria-selected":s===e,ref:e=>{a.push(e)},onKeyDown:d,onClick:c,...r,className:(0,t.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":s===e}),children:n??e},e))})}function A({lazy:e,children:n,selectedValue:s}){const i=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=i.find(e=>e.props.value===s);return e?(0,r.cloneElement)(e,{className:(0,t.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:i.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==s}))})}function b(e){const n=f(e);return(0,v.jsxs)("div",{className:(0,t.A)(i.G.tabs.container,"tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(A,{...n,...e})]})}function w(e){const n=(0,j.A)();return(0,v.jsx)(b,{...e,children:u(e.children)},String(n))}},2061:(e,n,s)=>{s.d(n,{Ay:()=>d,RM:()=>l});var r=s(4848),t=s(8453),i=s(1470),o=s(9365),a=s(7637);const l=[...a.RM];function c(e){const n={a:"a",admonition:"admonition",code:"code",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["You can use either ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," to configure OpenRAG.\nThis choice determines how OpenRAG authenticates with your deployment's ",(0,r.jsx)(n.a,{href:"/knowledge",children:"OpenSearch instance"}),", and it controls user access to documents stored in your OpenSearch knowledge base:"]}),"\n",(0,r.jsx)(a.Ay,{}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsxs)(n.p,{children:["You must use ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," if you want to ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"use OAuth connectors to upload documents from cloud storage"}),"."]})}),"\n",(0,r.jsxs)(n.p,{children:["If OpenRAG detects OAuth credentials during setup, it recommends ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the TUI."]}),"\n",(0,r.jsxs)(i.A,{groupId:"Setup method",children:[(0,r.jsx)(o.A,{value:"Basic setup",label:"Basic setup",default:!0,children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," or press ",(0,r.jsx)("kbd",{children:"1"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to generate passwords automatically."]}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process."}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing the key now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration.\nIf you want to use a different model provider, you can leave this field empty."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords and API key, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start All Services"})," to start the OpenRAG services that run in containers."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Launch the OpenRAG application:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In your browser, navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})}),(0,r.jsx)(o.A,{value:"Advanced setup",label:"Advanced setup",children:(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In the TUI, click ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," or press ",(0,r.jsx)("kbd",{children:"2"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Enter administrator passwords for the OpenRAG OpenSearch and Langflow services, or click ",(0,r.jsx)(n.strong,{children:"Generate Passwords"})," to generate passwords automatically."]}),"\n",(0,r.jsx)(n.p,{children:"The OpenSearch password is required."}),"\n",(0,r.jsxs)(n.p,{children:["The Langflow password is recommended but optional.\nIf the Langflow password is empty, the Langflow server starts without authentication enabled. For more information, see ",(0,r.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Optional: Enter your OpenAI API key, or leave this field empty to provide model provider credentials during the application onboarding process."}),"\n",(0,r.jsxs)(n.p,{children:["There is no material difference between providing the key now or during the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),".\nIf you provide a key now, it can be populated automatically during the application onboarding process if you select the OpenAI model provider, and then enable ",(0,r.jsx)(n.strong,{children:"Get API key from environment variable"}),"."]}),"\n",(0,r.jsx)(n.p,{children:"OpenRAG's core functionality requires access to language and embedding models.\nBy default, OpenRAG uses OpenAI models.\nIf you aren't sure which models or providers to use, you must provide an OpenAI API key to use OpenRAG's default model configuration.\nIf you want to use a different model provider, you can leave this field empty."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["To upload documents from external storage, such as Google Drive, add the required OAuth credentials for the connectors that you want to use. These settings can be populated automatically if OpenRAG detects these credentials in an ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),"."]}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Amazon"}),": Provide your AWS Access Key ID and AWS Secret Access Key with access to your S3 instance. For more information, see the AWS documentation on ",(0,r.jsx)(n.a,{href:"https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-applications.html",children:"Configuring access to AWS applications"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Google"}),": Provide your Google OAuth Client ID and Google OAuth Client Secret. You can generate these in the ",(0,r.jsx)(n.a,{href:"https://console.cloud.google.com/apis/credentials",children:"Google Cloud Console"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://developers.google.com/identity/protocols/oauth2",children:"Google OAuth client documentation"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Microsoft"}),": For the Microsoft OAuth Client ID and Microsoft OAuth Client Secret, provide ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/app-registration?view=odsp-graph-online",children:"Azure application registration credentials for SharePoint and OneDrive"}),". For more information, see the ",(0,r.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/onedrive/developer/rest-api/getting-started/graph-oauth",children:"Microsoft Graph OAuth client documentation"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"manage OAuth credentials"})," later, but it is recommended to configure them during initial set up."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"The OpenRAG TUI presents redirect URIs for your OAuth app.\nThese are the URLs your OAuth provider will redirect back to after user sign-in.\nRegister these redirect values with your OAuth provider as they are presented in the TUI."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Save Configuration"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["Your passwords, API key, and OAuth credentials, if provided, are stored in the ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," at ",(0,r.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf you modified any credentials that were pulled from an existing ",(0,r.jsx)(n.code,{children:".env"})," file, those values are updated in the ",(0,r.jsx)(n.code,{children:".env"})," file."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Click ",(0,r.jsx)(n.strong,{children:"Start All Services"})," to start the OpenRAG services that run in containers."]}),"\n",(0,r.jsx)(n.p,{children:"This process can take some time while OpenRAG pulls and runs the container images.\nIf all services start successfully, the TUI prints a confirmation message:"}),"\n",(0,r.jsx)(n.pre,{children:(0,r.jsx)(n.code,{className:"language-text",children:"Services started successfully\nCommand completed successfully\n"})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Under ",(0,r.jsx)(n.a,{href:"/manage-services",children:(0,r.jsx)(n.strong,{children:"Native Services"})}),", click ",(0,r.jsx)(n.strong,{children:"Start"})," to start the Docling service."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Launch the OpenRAG application:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["From the TUI main menu, click ",(0,r.jsx)(n.strong,{children:"Open App"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["In your browser, navigate to ",(0,r.jsx)(n.code,{children:"localhost:3000"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If you enabled OAuth connectors, you must sign in to your OAuth provider before being redirected to your OpenRAG instance."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"If required, you can edit the following additional environment variables.\nOnly change these variables if your OpenRAG deployment has a non-default network configuration, such as a reverse proxy or custom domain."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"LANGFLOW_PUBLIC_URL"}),": Sets the base address to access the Langflow web interface. This is where users interact with flows in a browser."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL"}),": Sets the base address for the following OpenRAG OAuth connector endpoints:","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Amazon S3: Not applicable."}),"\n",(0,r.jsxs)(n.li,{children:["Google Drive: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/google_drive/webhook"})]}),"\n",(0,r.jsxs)(n.li,{children:["OneDrive: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/onedrive/webhook"})]}),"\n",(0,r.jsxs)(n.li,{children:["SharePoint: ",(0,r.jsx)(n.code,{children:"WEBHOOK_BASE_URL/connectors/sharepoint/webhook"})]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Continue with the ",(0,r.jsx)(n.a,{href:"#application-onboarding",children:"application onboarding process"}),"."]}),"\n"]}),"\n"]})})]})]})}function d(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(c,{...e})}):c(e)}},3059:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,r.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Language models"}),": ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,r.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["If you choose ",(0,r.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Embedding models"}),": ",(0,r.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,r.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,r.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,r.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,r.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},3351:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>o});var r=s(4848),t=s(8453),i=s(3059);const o=[...i.RM];function a(e){const n={a:"a",admonition:"admonition",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsx)(n.p,{children:"Gather the credentials and connection details for your preferred model providers.\nYou must have access to at least one language model and one embedding model.\nIf a provider offers both types, you can use the same provider for both models.\nIf a provider offers only one type, you must select two providers."}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OpenAI"}),": Create an ",(0,r.jsx)(n.a,{href:"https://platform.openai.com/api-keys",children:"OpenAI API key"}),"."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Anthropic"}),": Create an ",(0,r.jsx)(n.a,{href:"https://www.anthropic.com/docs/api/reference",children:"Anthropic API key"}),".\nAnthropic provides language models only; you must select an additional provider for embeddings."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"IBM watsonx.ai"}),": Get your watsonx.ai API endpoint, IBM project ID, and IBM API key from your watsonx deployment."]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Ollama"}),": Deploy an ",(0,r.jsx)(n.a,{href:"https://docs.ollama.com/",children:"Ollama instance and models"})," locally, in the cloud, or on a remote server. Then, get your Ollama server's base URL and the names of the models that you want to use."]}),"\n",(0,r.jsx)(n.admonition,{type:"info",children:(0,r.jsx)(i.Ay,{})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Optional: Install GPU support with an NVIDIA GPU, ",(0,r.jsx)(n.a,{href:"https://docs.nvidia.com/cuda/",children:"CUDA"})," support, and compatible NVIDIA drivers on the OpenRAG host machine. If you don't have GPU capabilities, OpenRAG provides an alternate CPU-only deployment."]}),"\n"]}),"\n"]})}function l(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(a,{...e})}):a(e)}},4042:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["Install ",(0,r.jsx)(n.a,{href:"https://www.python.org/downloads/release/python-3100/",children:"Python"})," version 3.13 or later."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},4398:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>m,contentTitle:()=>p,default:()=>j,frontMatter:()=>u,metadata:()=>r,toc:()=>x});const r=JSON.parse('{"id":"get-started/install","title":"Install OpenRAG with the automatic installer script","description":"To quickly install and test OpenRAG\'s core features, try the quickstart.","source":"@site/docs/get-started/install.mdx","sourceDirName":"get-started","slug":"/install","permalink":"/install","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/get-started/install.mdx","tags":[],"version":"current","frontMatter":{"title":"Install OpenRAG with the automatic installer script","slug":"/install"},"sidebar":"tutorialSidebar","previous":{"title":"Select an installation method","permalink":"/install-options"},"next":{"title":"Install OpenRAG with uv","permalink":"/install-uv"}}');var t=s(4848),i=s(8453),o=(s(1470),s(9365),s(887)),a=s(2061),l=s(3351),c=s(6149),d=s(4042),h=s(927);s(7637),s(3059);const u={title:"Install OpenRAG with the automatic installer script",slug:"/install"},p=void 0,m={},x=[{value:"Prerequisites",id:"prerequisites",level:2},...c.RM,...d.RM,...l.RM,{value:"Run the installer script",id:"install",level:2},{value:"Set up OpenRAG with the TUI",id:"setup",level:2},...a.RM,...o.RM,...h.RM];function f(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.admonition,{type:"tip",children:(0,t.jsxs)(n.p,{children:["To quickly install and test OpenRAG's core features, try the ",(0,t.jsx)(n.a,{href:"/quickstart",children:"quickstart"}),"."]})}),"\n",(0,t.jsxs)(n.p,{children:["The installer script installs ",(0,t.jsx)(n.code,{children:"uv"}),", Docker or Podman, Docker Compose, and OpenRAG.\nThen, it installs and runs OpenRAG with ",(0,t.jsx)(n.code,{children:"uvx"}),"."]}),"\n",(0,t.jsxs)(n.p,{children:["When you install OpenRAG with the installer script, you will use the ",(0,t.jsx)(n.a,{href:"/tui",children:"Terminal User Interface (TUI)"})," to configure and manage your OpenRAG deployment."]}),"\n",(0,t.jsxs)(n.p,{children:["This installation method is best for testing OpenRAG by running it outside of a Python project.\nFor other installation methods, see ",(0,t.jsx)(n.a,{href:"/install-options",children:"Select an installation method"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"prerequisites",children:"Prerequisites"}),"\n",(0,t.jsx)(c.Ay,{}),"\n",(0,t.jsx)(d.Ay,{}),"\n",(0,t.jsx)(l.Ay,{}),"\n",(0,t.jsx)(n.h2,{id:"install",children:"Run the installer script"}),"\n",(0,t.jsxs)(n.ol,{children:["\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Create a directory to store your OpenRAG configuration files and data, and then change to that directory:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"mkdir openrag-workspace\ncd openrag-workspace\n"})}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Get and run the installer script:"}),"\n",(0,t.jsx)(n.pre,{children:(0,t.jsx)(n.code,{className:"language-bash",children:"curl -fsSL https://docs.openr.ag/files/run_openrag_with_prereqs.sh | bash\n"})}),"\n",(0,t.jsxs)(n.p,{children:["The installer script installs OpenRAG with ",(0,t.jsx)(n.a,{href:"https://docs.astral.sh/uv/guides/tools/#running-tools",children:(0,t.jsx)(n.code,{children:"uvx"})})," in the directory where you run the script."]}),"\n"]}),"\n",(0,t.jsxs)(n.li,{children:["\n",(0,t.jsx)(n.p,{children:"Wait while the installer script prepares your environment and installs OpenRAG.\nYou might be prompted to install certain dependencies if they aren't already present in your environment."}),"\n"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The entire process can take a few minutes.\nOnce the environment is ready, the OpenRAG TUI starts."}),"\n",(0,t.jsx)(n.p,{children:(0,t.jsx)(n.img,{alt:"OpenRAG TUI Interface",src:s(5689).A+"",width:"1995",height:"1099"})}),"\n",(0,t.jsxs)(n.p,{children:["Because the installer script uses ",(0,t.jsx)(n.code,{children:"uvx"}),", it creates a cached, ephemeral environment in your local ",(0,t.jsx)(n.code,{children:"uv"})," cache, and your OpenRAG configuration files and data are stored separately from the ",(0,t.jsx)(n.code,{children:"uv"})," cache.\nClearing the cache doesn't delete your entire OpenRAG installation, only the temporary TUI environment.\nAfter clearing the cache, run ",(0,t.jsx)(n.code,{children:"uvx openrag"})," to ",(0,t.jsx)(n.a,{href:"/tui",children:"access the TUI"})," and continue with your preserved configuration and data."]}),"\n",(0,t.jsxs)(n.p,{children:["If you encounter errors during installation, see ",(0,t.jsx)(n.a,{href:"/support/troubleshoot",children:"Troubleshoot OpenRAG"}),"."]}),"\n",(0,t.jsx)(n.h2,{id:"setup",children:"Set up OpenRAG with the TUI"}),"\n",(0,t.jsx)(n.p,{children:"When you install OpenRAG with the installer script, you manage the OpenRAG services with the TUI.\nThe TUI guides you through the initial configuration process before you start the OpenRAG services."}),"\n",(0,t.jsxs)(n.p,{children:["Your configuration values are stored in an ",(0,t.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file"]})," that is created automatically at ",(0,t.jsx)(n.code,{children:"~/.openrag/tui"}),".\nIf OpenRAG detects an existing ",(0,t.jsx)(n.code,{children:".env"})," file in this directory, then the TUI can populate those values automatically during setup and onboarding."]}),"\n",(0,t.jsxs)(n.p,{children:["Container definitions are stored in the ",(0,t.jsx)(n.code,{children:"docker-compose"})," files in the same directory as the OpenRAG ",(0,t.jsx)(n.code,{children:".env"})," file."]}),"\n",(0,t.jsx)(a.Ay,{}),"\n",(0,t.jsx)(o.Ay,{}),"\n",(0,t.jsx)(h.Ay,{})]})}function j(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(f,{...e})}):f(e)}},5689:(e,n,s)=>{s.d(n,{A:()=>r});const r=s.p+"assets/images/OpenRAG_TUI_2025-09-10T13_04_11_757637-9441c53ba39162a88ac6c11cbeaed0e0.svg"},6149:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",li:"li",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["For Microsoft Windows, you must use the Windows Subsystem for Linux (WSL).\nSee ",(0,r.jsx)(n.a,{href:"/install-windows",children:"Install OpenRAG on Windows"})," before proceeding."]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},7637:(e,n,s)=>{s.d(n,{Ay:()=>a,RM:()=>i});var r=s(4848),t=s(8453);const i=[];function o(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"No-auth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Basic Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," doesn't include OAuth credentials, then the OpenRAG OpenSearch instance runs in no-auth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses one anonymous JWT token for OpenSearch authentication.\nThere is no differentiation between users; all users that access your OpenRAG instance can access all documents uploaded to your knowledge base."}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"OAuth mode"}),": If you select ",(0,r.jsx)(n.strong,{children:"Advanced Setup"})," in the ",(0,r.jsx)(n.a,{href:"/tui",children:"TUI"}),", or your ",(0,r.jsxs)(n.a,{href:"/reference/configuration",children:["OpenRAG ",(0,r.jsx)(n.code,{children:".env"})," file"]})," includes OAuth credentials, then the OpenRAG OpenSearch instance runs in OAuth mode."]}),"\n",(0,r.jsx)(n.p,{children:"This mode uses a unique JWT token for each OpenRAG user, and each document is tagged with user ownership.\nDocuments are filtered by user owner; users see only the documents that they uploaded or have access to through their cloud storage accounts."}),"\n",(0,r.jsxs)(n.p,{children:["To enable OAuth mode after initial setup, see ",(0,r.jsx)(n.a,{href:"/ingestion#oauth-ingestion",children:"Ingest files with OAuth connectors"}),"."]}),"\n"]}),"\n"]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(o,{...e})}):o(e)}},9179:(e,n,s)=>{s.d(n,{A:()=>i});s(6540);var r=s(7856),t=s(4848);function i({name:e,...n}){const s=r[e];return s?(0,t.jsx)(s,{...n}):null}},9365:(e,n,s)=>{s.d(n,{A:()=>o});s(6540);var r=s(4164);const t={tabItem:"tabItem_Ymn6"};var i=s(4848);function o({children:e,hidden:n,className:s}){return(0,i.jsx)("div",{role:"tabpanel",className:(0,r.A)(t.tabItem,s),hidden:n,children:e})}}}]); \ No newline at end of file diff --git a/assets/js/eb5b356a.d35eda0a.js b/assets/js/eb5b356a.0097fd59.js similarity index 67% rename from assets/js/eb5b356a.d35eda0a.js rename to assets/js/eb5b356a.0097fd59.js index 8d9403b3..06299104 100644 --- a/assets/js/eb5b356a.d35eda0a.js +++ b/assets/js/eb5b356a.0097fd59.js @@ -1 +1 @@ -"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[2668],{3059:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var o=s(4848),i=s(8453);const r=[];function t(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,o.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Language models"}),": ",(0,o.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,o.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If you choose ",(0,o.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Embedding models"}),": ",(0,o.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,o.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,o.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,o.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}},5014:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"support/troubleshoot","title":"Troubleshoot OpenRAG","description":"This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG.","source":"@site/docs/support/troubleshoot.mdx","sourceDirName":"support","slug":"/support/troubleshoot","permalink":"/support/troubleshoot","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/support/troubleshoot.mdx","tags":[],"version":"current","frontMatter":{"title":"Troubleshoot OpenRAG","slug":"/support/troubleshoot"},"sidebar":"tutorialSidebar","previous":{"title":"Environment variables","permalink":"/reference/configuration"}}');var i=s(4848),r=s(8453),t=s(3059);const l={title:"Troubleshoot OpenRAG",slug:"/support/troubleshoot"},a=void 0,c={},d=[{value:"OpenSearch fails to start",id:"opensearch-fails-to-start",level:2},{value:"OpenRAG fails to start from the TUI with operation not supported",id:"openrag-fails-to-start-from-the-tui-with-operation-not-supported",level:2},{value:"OpenRAG installation fails with unable to get local issuer certificate",id:"openrag-installation-fails-with-unable-to-get-local-issuer-certificate",level:2},{value:"Langflow connection issues",id:"langflow-connection-issues",level:2},{value:"Container out of memory errors",id:"container-out-of-memory-errors",level:2},{value:"Memory issue with Podman on macOS",id:"memory-issue-with-podman-on-macos",level:2},{value:"Port conflicts",id:"port-conflicts",level:2},{value:"OCR ingestion fails (easyocr not installed)",id:"ocr-ingestion-fails-easyocr-not-installed",level:2},{value:"Upgrade fails due to Langflow container already exists",id:"langflow-container-already-exists-during-upgrade",level:2},{value:"Document ingestion or similarity search issues",id:"document-ingestion-or-similarity-search-issues",level:2},{value:"Ollama model issues",id:"ollama-model-issues",level:2},...t.RM];function h(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG."}),"\n",(0,i.jsx)(n.h2,{id:"opensearch-fails-to-start",children:"OpenSearch fails to start"}),"\n",(0,i.jsxs)(n.p,{children:["Check that the value of the ",(0,i.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})," ",(0,i.jsx)(n.a,{href:"/reference/configuration",children:"environment variable"})," meets the ",(0,i.jsx)(n.a,{href:"https://docs.opensearch.org/latest/security/configuration/demo-configuration/#setting-up-a-custom-admin-password",children:"OpenSearch password complexity requirements"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need to change the password, you must ",(0,i.jsx)(n.a,{href:"/manage-services",children:"reset the OpenRAG services"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"openrag-fails-to-start-from-the-tui-with-operation-not-supported",children:"OpenRAG fails to start from the TUI with operation not supported"}),"\n",(0,i.jsxs)(n.p,{children:["This error occurs when starting OpenRAG with the TUI in ",(0,i.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/windows/wsl/install",children:"WSL (Windows Subsystem for Linux)"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The error occurs because OpenRAG is running within a WSL environment, so ",(0,i.jsx)(n.code,{children:"webbrowser.open()"})," can't launch a browser automatically."]}),"\n",(0,i.jsxs)(n.p,{children:["To access the OpenRAG application, open a web browser and enter ",(0,i.jsx)(n.code,{children:"http://localhost:3000"})," in the address bar."]}),"\n",(0,i.jsx)(n.h2,{id:"openrag-installation-fails-with-unable-to-get-local-issuer-certificate",children:"OpenRAG installation fails with unable to get local issuer certificate"}),"\n",(0,i.jsxs)(n.p,{children:["If you are installing OpenRAG on macOS, and the installation fails with ",(0,i.jsx)(n.code,{children:"unable to get local issuer certificate"}),", run the following command, and then retry the installation:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'open "/Applications/Python VERSION/Install Certificates.command"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Replace ",(0,i.jsx)(n.code,{children:"VERSION"})," with your installed Python version, such as ",(0,i.jsx)(n.code,{children:"3.13"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"langflow-connection-issues",children:"Langflow connection issues"}),"\n",(0,i.jsxs)(n.p,{children:["Verify that the value of the ",(0,i.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," environment variable is correct.\nFor more information about this variable and how this variable controls Langflow access, see ",(0,i.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"container-out-of-memory-errors",children:"Container out of memory errors"}),"\n",(0,i.jsxs)(n.p,{children:["Increase Docker memory allocation or use ",(0,i.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml",children:"docker-compose-cpu.yml"})," to deploy OpenRAG."]}),"\n",(0,i.jsx)(n.h2,{id:"memory-issue-with-podman-on-macos",children:"Memory issue with Podman on macOS"}),"\n",(0,i.jsx)(n.p,{children:"If you're using Podman on macOS, you might need to increase VM memory on your Podman machine.\nThis example increases the machine size to 8 GB of RAM, which should be sufficient to run OpenRAG."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"podman machine stop\npodman machine rm\npodman machine init --memory 8192 # 8 GB example\npodman machine start\n"})}),"\n",(0,i.jsx)(n.h2,{id:"port-conflicts",children:"Port conflicts"}),"\n",(0,i.jsxs)(n.p,{children:["With the default ",(0,i.jsx)(n.a,{href:"/reference/configuration",children:"environment variable"})," values, OpenRAG requires the following ports to be available on the host machine:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"3000: Langflow application"}),"\n",(0,i.jsx)(n.li,{children:"5001: Docling local ingestion service"}),"\n",(0,i.jsx)(n.li,{children:"5601: OpenSearch Dashboards"}),"\n",(0,i.jsx)(n.li,{children:"7860: Docling UI"}),"\n",(0,i.jsx)(n.li,{children:"8000: Docling API"}),"\n",(0,i.jsx)(n.li,{children:"9200: OpenSearch service"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"ocr-ingestion-fails-easyocr-not-installed",children:"OCR ingestion fails (easyocr not installed)"}),"\n",(0,i.jsxs)(n.p,{children:["Docling ingestion can fail with an OCR-related error that mentions ",(0,i.jsx)(n.code,{children:"easyocr"})," is missing.\nThis is likely due to a stale ",(0,i.jsx)(n.code,{children:"uv"})," cache when you ",(0,i.jsxs)(n.a,{href:"/install-uvx",children:["install OpenRAG with ",(0,i.jsx)(n.code,{children:"uvx"})]}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["When you invoke OpenRAG with ",(0,i.jsx)(n.code,{children:"uvx openrag"}),", ",(0,i.jsx)(n.code,{children:"uvx"})," creates a cached, ephemeral environment that doesn't modify your project.\nThe location and path of this cache depends on your operating system.\nFor example, on macOS, this is typically a user cache directory, such as ",(0,i.jsx)(n.code,{children:"~/.cache/uv"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"This cache can become stale, producing errors like missing dependencies."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.a,{href:"/tui",children:"Exit the TUI"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Clear the ",(0,i.jsx)(n.code,{children:"uv"})," cache:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"uv cache clean\n"})}),"\n",(0,i.jsx)(n.p,{children:"To clear the OpenRAG cache only, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"uv cache clean openrag\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Invoke OpenRAG to restart the TUI:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"uvx openrag\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Open App"}),", and then retry document ingestion."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If you install OpenRAG with ",(0,i.jsx)(n.code,{children:"uv"}),", dependencies are synced directly from your ",(0,i.jsx)(n.code,{children:"pyproject.toml"})," file.\nThis should automatically install ",(0,i.jsx)(n.code,{children:"easyocr"})," because ",(0,i.jsx)(n.code,{children:"easyocr"})," is included as a dependency in OpenRAG's ",(0,i.jsx)(n.code,{children:"pyproject.toml"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you don't need OCR, you can disable OCR-based processing in your ",(0,i.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"ingestion settings"})," to avoid requiring ",(0,i.jsx)(n.code,{children:"easyocr"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"langflow-container-already-exists-during-upgrade",children:"Upgrade fails due to Langflow container already exists"}),"\n",(0,i.jsxs)(n.p,{children:["If you encounter a ",(0,i.jsx)(n.code,{children:"langflow container already exists"})," error when upgrading OpenRAG, this typically means you upgraded OpenRAG with ",(0,i.jsx)(n.code,{children:"uv"}),", but you didn't remove or upgrade containers from a previous installation."]}),"\n",(0,i.jsx)(n.p,{children:"To resolve this issue, do the following:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remove only the Langflow container:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Stop the Langflow container:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop langflow\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop langflow\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remove the Langflow container:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rm langflow --force\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rm langflow --force\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Retry the ",(0,i.jsx)(n.a,{href:"/upgrade",children:"upgrade"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If reinstalling the Langflow container doesn't resolve the issue, then you must ",(0,i.jsx)(n.a,{href:"/manage-services",children:"reset all containers"})," or ",(0,i.jsx)(n.a,{href:"/reinstall",children:"reinstall OpenRAG"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Retry the ",(0,i.jsx)(n.a,{href:"/upgrade",children:"upgrade"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"If no updates are available after reinstalling OpenRAG, then you reinstalled at the latest version, and your deployment is up to date."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"document-ingestion-or-similarity-search-issues",children:"Document ingestion or similarity search issues"}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/ingestion#troubleshoot-ingestion",children:"Troubleshoot ingestion"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"ollama-model-issues",children:"Ollama model issues"}),"\n",(0,i.jsx)(t.Ay,{})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var o=s(6540);const i={},r=o.createContext(i);function t(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file +"use strict";(globalThis.webpackChunkopenrag_docs=globalThis.webpackChunkopenrag_docs||[]).push([[2668],{3059:(e,n,s)=>{s.d(n,{Ay:()=>l,RM:()=>r});var o=s(4848),i=s(8453);const r=[];function t(e){const n={a:"a",code:"code",li:"li",p:"p",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"OpenRAG isn't guaranteed to be compatible with all models that are available through Ollama.\nFor example, some models might produce unexpected results, such as JSON-formatted output instead of natural language responses, and some models aren't appropriate for the types of tasks that OpenRAG performs, such as those that generate media."}),"\n",(0,o.jsx)(n.p,{children:"The OpenRAG team recommends the following models when using Ollama as your model provider:"}),"\n",(0,o.jsxs)(n.ul,{children:["\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Language models"}),": ",(0,o.jsx)(n.code,{children:"gpt-oss:20b"})," or ",(0,o.jsx)(n.code,{children:"mistral-nemo:12b"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["If you choose ",(0,o.jsx)(n.code,{children:"gpt-oss:20b"}),", consider using Ollama Cloud or running Ollama on a remote machine because this model requires at least 16GB of RAM."]}),"\n"]}),"\n",(0,o.jsxs)(n.li,{children:["\n",(0,o.jsxs)(n.p,{children:[(0,o.jsx)(n.strong,{children:"Embedding models"}),": ",(0,o.jsx)(n.a,{href:"https://ollama.com/library/nomic-embed-text",children:(0,o.jsx)(n.code,{children:"nomic-embed-text:latest"})}),", ",(0,o.jsx)(n.code,{children:"mxbai-embed-large:latest"}),", or ",(0,o.jsx)(n.code,{children:"embeddinggemma:latest"}),"."]}),"\n"]}),"\n"]}),"\n",(0,o.jsxs)(n.p,{children:["You can experiment with other models, but if you encounter issues that you are unable to resolve through other RAG best practices (like context filters and prompt engineering), try switching to one of the recommended models.\nYou can submit an ",(0,o.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/issues",children:"OpenRAG GitHub issue"})," to request support for specific models."]})]})}function l(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(t,{...e})}):t(e)}},5014:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>l,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"support/troubleshoot","title":"Troubleshoot OpenRAG","description":"This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG.","source":"@site/docs/support/troubleshoot.mdx","sourceDirName":"support","slug":"/support/troubleshoot","permalink":"/support/troubleshoot","draft":false,"unlisted":false,"editUrl":"https://github.com/openrag/openrag/tree/main/docs/docs/support/troubleshoot.mdx","tags":[],"version":"current","frontMatter":{"title":"Troubleshoot OpenRAG","slug":"/support/troubleshoot"},"sidebar":"tutorialSidebar","previous":{"title":"Environment variables","permalink":"/reference/configuration"}}');var i=s(4848),r=s(8453),t=s(3059);const l={title:"Troubleshoot OpenRAG",slug:"/support/troubleshoot"},a=void 0,c={},d=[{value:"OpenSearch fails to start",id:"opensearch-fails-to-start",level:2},{value:"OpenRAG fails to start from the TUI with operation not supported",id:"openrag-fails-to-start-from-the-tui-with-operation-not-supported",level:2},{value:"OpenRAG installation fails with unable to get local issuer certificate",id:"openrag-installation-fails-with-unable-to-get-local-issuer-certificate",level:2},{value:"Langflow connection issues",id:"langflow-connection-issues",level:2},{value:"Container out of memory errors",id:"container-out-of-memory-errors",level:2},{value:"Memory issue with Podman on macOS",id:"memory-issue-with-podman-on-macos",level:2},{value:"Port conflicts",id:"port-conflicts",level:2},{value:"OCR ingestion fails (easyocr not installed)",id:"ocr-ingestion-fails-easyocr-not-installed",level:2},{value:"Upgrade fails due to Langflow container already exists",id:"langflow-container-already-exists-during-upgrade",level:2},{value:"Document ingestion or similarity search issues",id:"document-ingestion-or-similarity-search-issues",level:2},{value:"Ollama model issues",id:"ollama-model-issues",level:2},...t.RM];function h(e){const n={a:"a",code:"code",h2:"h2",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.p,{children:"This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG."}),"\n",(0,i.jsx)(n.h2,{id:"opensearch-fails-to-start",children:"OpenSearch fails to start"}),"\n",(0,i.jsxs)(n.p,{children:["Check that the value of the ",(0,i.jsx)(n.code,{children:"OPENSEARCH_PASSWORD"})," ",(0,i.jsx)(n.a,{href:"/reference/configuration",children:"environment variable"})," meets the ",(0,i.jsx)(n.a,{href:"https://docs.opensearch.org/latest/security/configuration/demo-configuration/#setting-up-a-custom-admin-password",children:"OpenSearch password complexity requirements"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you need to change the password, you must ",(0,i.jsx)(n.a,{href:"/manage-services",children:"reset the OpenRAG services"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"openrag-fails-to-start-from-the-tui-with-operation-not-supported",children:"OpenRAG fails to start from the TUI with operation not supported"}),"\n",(0,i.jsxs)(n.p,{children:["This error occurs when starting OpenRAG with the TUI in ",(0,i.jsx)(n.a,{href:"https://learn.microsoft.com/en-us/windows/wsl/install",children:"WSL (Windows Subsystem for Linux)"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["The error occurs because OpenRAG is running within a WSL environment, so ",(0,i.jsx)(n.code,{children:"webbrowser.open()"})," can't launch a browser automatically."]}),"\n",(0,i.jsxs)(n.p,{children:["To access the OpenRAG application, open a web browser and enter ",(0,i.jsx)(n.code,{children:"http://localhost:3000"})," in the address bar."]}),"\n",(0,i.jsx)(n.h2,{id:"openrag-installation-fails-with-unable-to-get-local-issuer-certificate",children:"OpenRAG installation fails with unable to get local issuer certificate"}),"\n",(0,i.jsxs)(n.p,{children:["If you are installing OpenRAG on macOS, and the installation fails with ",(0,i.jsx)(n.code,{children:"unable to get local issuer certificate"}),", run the following command, and then retry the installation:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:'open "/Applications/Python VERSION/Install Certificates.command"\n'})}),"\n",(0,i.jsxs)(n.p,{children:["Replace ",(0,i.jsx)(n.code,{children:"VERSION"})," with your installed Python version, such as ",(0,i.jsx)(n.code,{children:"3.13"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"langflow-connection-issues",children:"Langflow connection issues"}),"\n",(0,i.jsxs)(n.p,{children:["Verify that the value of the ",(0,i.jsx)(n.code,{children:"LANGFLOW_SUPERUSER"})," environment variable is correct.\nFor more information about this variable and how this variable controls Langflow access, see ",(0,i.jsx)(n.a,{href:"/reference/configuration#langflow-settings",children:"Langflow settings"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"container-out-of-memory-errors",children:"Container out of memory errors"}),"\n",(0,i.jsxs)(n.p,{children:["Increase Docker memory allocation or use ",(0,i.jsx)(n.a,{href:"https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml",children:"docker-compose-cpu.yml"})," to deploy OpenRAG."]}),"\n",(0,i.jsx)(n.h2,{id:"memory-issue-with-podman-on-macos",children:"Memory issue with Podman on macOS"}),"\n",(0,i.jsx)(n.p,{children:"If you're using Podman on macOS, you might need to increase VM memory on your Podman machine.\nThis example increases the machine size to 8 GB of RAM, which should be sufficient to run OpenRAG."}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"podman machine stop\npodman machine rm\npodman machine init --memory 8192 # 8 GB example\npodman machine start\n"})}),"\n",(0,i.jsx)(n.h2,{id:"port-conflicts",children:"Port conflicts"}),"\n",(0,i.jsxs)(n.p,{children:["With the default ",(0,i.jsx)(n.a,{href:"/reference/configuration",children:"environment variable"})," values, OpenRAG requires the following ports to be available on the host machine:"]}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"3000: Langflow application"}),"\n",(0,i.jsx)(n.li,{children:"5001: Docling local ingestion service"}),"\n",(0,i.jsx)(n.li,{children:"5601: OpenSearch Dashboards"}),"\n",(0,i.jsx)(n.li,{children:"7860: Docling UI"}),"\n",(0,i.jsx)(n.li,{children:"8000: Docling API"}),"\n",(0,i.jsx)(n.li,{children:"9200: OpenSearch service"}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"ocr-ingestion-fails-easyocr-not-installed",children:"OCR ingestion fails (easyocr not installed)"}),"\n",(0,i.jsxs)(n.p,{children:["Docling ingestion can fail with an OCR-related error that mentions ",(0,i.jsx)(n.code,{children:"easyocr"})," is missing.\nThis is likely due to a stale ",(0,i.jsx)(n.code,{children:"uv"})," cache when you ",(0,i.jsxs)(n.a,{href:"/install-uvx",children:["install OpenRAG with ",(0,i.jsx)(n.code,{children:"uvx"})]}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["When you invoke OpenRAG with ",(0,i.jsx)(n.code,{children:"uvx openrag"}),", ",(0,i.jsx)(n.code,{children:"uvx"})," creates a cached, ephemeral environment that doesn't modify your project.\nThe location and path of this cache depends on your operating system.\nFor example, on macOS, this is typically a user cache directory, such as ",(0,i.jsx)(n.code,{children:"~/.cache/uv"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"This cache can become stale, producing errors like missing dependencies."}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If the TUI is open, press ",(0,i.jsx)("kbd",{children:"q"})," to exit the TUI."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Clear the ",(0,i.jsx)(n.code,{children:"uv"})," cache:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"uv cache clean\n"})}),"\n",(0,i.jsx)(n.p,{children:"To clear the OpenRAG cache only, run:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"uv cache clean openrag\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Invoke OpenRAG to restart the TUI:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"uvx openrag\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Click ",(0,i.jsx)(n.strong,{children:"Launch OpenRAG"}),", and then retry document ingestion."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["If you install OpenRAG with ",(0,i.jsx)(n.code,{children:"uv"}),", dependencies are synced directly from your ",(0,i.jsx)(n.code,{children:"pyproject.toml"})," file.\nThis should automatically install ",(0,i.jsx)(n.code,{children:"easyocr"})," because ",(0,i.jsx)(n.code,{children:"easyocr"})," is included as a dependency in OpenRAG's ",(0,i.jsx)(n.code,{children:"pyproject.toml"}),"."]}),"\n",(0,i.jsxs)(n.p,{children:["If you don't need OCR, you can disable OCR-based processing in your ",(0,i.jsx)(n.a,{href:"/knowledge#knowledge-ingestion-settings",children:"ingestion settings"})," to avoid requiring ",(0,i.jsx)(n.code,{children:"easyocr"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"langflow-container-already-exists-during-upgrade",children:"Upgrade fails due to Langflow container already exists"}),"\n",(0,i.jsxs)(n.p,{children:["If you encounter a ",(0,i.jsx)(n.code,{children:"langflow container already exists"})," error when upgrading OpenRAG, this typically means you upgraded OpenRAG with ",(0,i.jsx)(n.code,{children:"uv"}),", but you didn't remove or upgrade containers from a previous installation."]}),"\n",(0,i.jsx)(n.p,{children:"To resolve this issue, do the following:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remove only the Langflow container:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Stop the Langflow container:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker stop langflow\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman stop langflow\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Remove the Langflow container:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Docker"',children:"docker rm langflow --force\n"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",metastring:'title="Podman"',children:"podman rm langflow --force\n"})}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Retry the ",(0,i.jsx)(n.a,{href:"/upgrade",children:"upgrade"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If reinstalling the Langflow container doesn't resolve the issue, then you must ",(0,i.jsx)(n.a,{href:"/manage-services",children:"reset all containers"})," or ",(0,i.jsx)(n.a,{href:"/reinstall",children:"reinstall OpenRAG"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Retry the ",(0,i.jsx)(n.a,{href:"/upgrade",children:"upgrade"}),"."]}),"\n",(0,i.jsx)(n.p,{children:"If no updates are available after reinstalling OpenRAG, then you reinstalled at the latest version, and your deployment is up to date."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.h2,{id:"document-ingestion-or-similarity-search-issues",children:"Document ingestion or similarity search issues"}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/ingestion#troubleshoot-ingestion",children:"Troubleshoot ingestion"}),"."]}),"\n",(0,i.jsx)(n.h2,{id:"ollama-model-issues",children:"Ollama model issues"}),"\n",(0,i.jsx)(t.Ay,{})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},8453:(e,n,s)=>{s.d(n,{R:()=>t,x:()=>l});var o=s(6540);const i={},r=o.createContext(i);function t(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/runtime~main.0ec053c5.js b/assets/js/runtime~main.a299070f.js similarity index 86% rename from assets/js/runtime~main.0ec053c5.js rename to assets/js/runtime~main.a299070f.js index 28db7696..51b9c0d6 100644 --- a/assets/js/runtime~main.0ec053c5.js +++ b/assets/js/runtime~main.a299070f.js @@ -1 +1 @@ -(()=>{"use strict";var e,a,r,t,f,c={},o={};function d(e){var a=o[e];if(void 0!==a)return a.exports;var r=o[e]={exports:{}};return c[e].call(r.exports,r,r.exports,d),r.exports}d.m=c,e=[],d.O=(a,r,t,f)=>{if(!r){var c=1/0;for(i=0;i=f)&&Object.keys(d.O).every(e=>d.O[e](r[b]))?r.splice(b--,1):(o=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[r,t,f]},d.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return d.d(a,{a:a}),a},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var f=Object.create(null);d.r(f);var c={};a=a||[null,r({}),r([]),r(r)];for(var o=2&t&&e;("object"==typeof o||"function"==typeof o)&&!~a.indexOf(o);o=r(o))Object.getOwnPropertyNames(o).forEach(a=>c[a]=()=>e[a]);return c.default=()=>e,d.d(f,c),f},d.d=(e,a)=>{for(var r in a)d.o(a,r)&&!d.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce((a,r)=>(d.f[r](e,a),a),[])),d.u=e=>"assets/js/"+({98:"af920ffe",571:"0ba6a408",961:"21afe7ac",1567:"22dd74f7",2272:"749371cc",2668:"eb5b356a",3207:"27b4a875",5490:"71478a5d",5668:"c5b64a02",5742:"aba21aa0",5750:"d0314b07",6152:"52896773",6190:"7b5e550f",6235:"915a24fd",6919:"ca2c3c0c",6976:"4ba45368",7098:"a7bd4aaa",8186:"03ef5215",8401:"17896441",8615:"ae242f53",8617:"441f609b",9026:"c8078f0a",9048:"a94703ab",9172:"e633a5ea",9532:"33362219",9647:"5e95c892"}[e]||e)+"."+{98:"5a239774",165:"7b1d067d",291:"1b64972f",571:"efa6fc46",617:"e8fa27b8",961:"b1bb0884",1e3:"f9af7a41",1203:"b618bb61",1567:"7a0edff6",1741:"b927934f",1746:"1ce4b99b",2130:"09232a19",2237:"70c48bab",2272:"774b6a0c",2279:"44341cb1",2291:"2753844f",2325:"7c4239a7",2334:"6d98e48e",2492:"e6c78669",2668:"d35eda0a",2821:"7e574346",3207:"5585873a",3490:"026802f4",3624:"a9a49a51",3815:"f87fc96a",4218:"0662e556",4250:"77e8e6c6",4616:"0d0b0873",4802:"a8b2857c",4981:"61cf4b0a",5480:"23265b76",5490:"6bdf311d",5668:"52bf4eef",5742:"2f625fe1",5750:"ebf2fdd5",5901:"f6ccb00b",5955:"14464ff3",5996:"b2d1663e",6152:"a3757d4b",6190:"a397b62a",6235:"fd7e64ec",6241:"a1fa513c",6319:"9020eb44",6366:"0c77f825",6567:"08800141",6919:"039bf965",6976:"1fce6090",6992:"eb4cc2ed",7098:"9fea9356",7465:"7e0b8008",7592:"d6165eff",7873:"083fcc2e",7928:"5f633e47",8142:"5edfc34d",8186:"7da8ea5b",8249:"4f81048e",8401:"afd63cb1",8565:"6a562290",8615:"33b6f886",8617:"ae58055a",8731:"4bc22343",8756:"74d5516d",9026:"4baa8196",9032:"f4369ef2",9048:"fa9eaf65",9172:"88a60d4e",9412:"ca1dda85",9510:"81e2df6a",9532:"9fafa665",9647:"d28d5273"}[e]+".js",d.miniCssF=e=>{},d.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},f="openrag-docs:",d.l=(e,a,r,c)=>{if(t[e])t[e].push(a);else{var o,b;if(void 0!==r)for(var n=document.getElementsByTagName("script"),i=0;i{o.onerror=o.onload=null,clearTimeout(s);var f=t[e];if(delete t[e],o.parentNode&&o.parentNode.removeChild(o),f&&f.forEach(e=>e(r)),a)return a(r)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=u.bind(null,o.onerror),o.onload=u.bind(null,o.onload),b&&document.head.appendChild(o)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.p="/",d.gca=function(e){return e={17896441:"8401",33362219:"9532",52896773:"6152",af920ffe:"98","0ba6a408":"571","21afe7ac":"961","22dd74f7":"1567","749371cc":"2272",eb5b356a:"2668","27b4a875":"3207","71478a5d":"5490",c5b64a02:"5668",aba21aa0:"5742",d0314b07:"5750","7b5e550f":"6190","915a24fd":"6235",ca2c3c0c:"6919","4ba45368":"6976",a7bd4aaa:"7098","03ef5215":"8186",ae242f53:"8615","441f609b":"8617",c8078f0a:"9026",a94703ab:"9048",e633a5ea:"9172","5e95c892":"9647"}[e]||e,d.p+d.u(e)},(()=>{var e={5354:0,1869:0};d.f.j=(a,r)=>{var t=d.o(e,a)?e[a]:void 0;if(0!==t)if(t)r.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise((r,f)=>t=e[a]=[r,f]);r.push(t[2]=f);var c=d.p+d.u(a),o=new Error;d.l(c,r=>{if(d.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var f=r&&("load"===r.type?"missing":r.type),c=r&&r.target&&r.target.src;o.message="Loading chunk "+a+" failed.\n("+f+": "+c+")",o.name="ChunkLoadError",o.type=f,o.request=c,t[1](o)}},"chunk-"+a,a)}},d.O.j=a=>0===e[a];var a=(a,r)=>{var t,f,[c,o,b]=r,n=0;if(c.some(a=>0!==e[a])){for(t in o)d.o(o,t)&&(d.m[t]=o[t]);if(b)var i=b(d)}for(a&&a(r);n{"use strict";var e,a,r,t,f,c={},o={};function d(e){var a=o[e];if(void 0!==a)return a.exports;var r=o[e]={exports:{}};return c[e].call(r.exports,r,r.exports,d),r.exports}d.m=c,e=[],d.O=(a,r,t,f)=>{if(!r){var c=1/0;for(i=0;i=f)&&Object.keys(d.O).every(e=>d.O[e](r[b]))?r.splice(b--,1):(o=!1,f0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[r,t,f]},d.n=e=>{var a=e&&e.__esModule?()=>e.default:()=>e;return d.d(a,{a:a}),a},r=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,d.t=function(e,t){if(1&t&&(e=this(e)),8&t)return e;if("object"==typeof e&&e){if(4&t&&e.__esModule)return e;if(16&t&&"function"==typeof e.then)return e}var f=Object.create(null);d.r(f);var c={};a=a||[null,r({}),r([]),r(r)];for(var o=2&t&&e;("object"==typeof o||"function"==typeof o)&&!~a.indexOf(o);o=r(o))Object.getOwnPropertyNames(o).forEach(a=>c[a]=()=>e[a]);return c.default=()=>e,d.d(f,c),f},d.d=(e,a)=>{for(var r in a)d.o(a,r)&&!d.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:a[r]})},d.f={},d.e=e=>Promise.all(Object.keys(d.f).reduce((a,r)=>(d.f[r](e,a),a),[])),d.u=e=>"assets/js/"+({98:"af920ffe",571:"0ba6a408",961:"21afe7ac",1567:"22dd74f7",2272:"749371cc",2668:"eb5b356a",3207:"27b4a875",5490:"71478a5d",5668:"c5b64a02",5742:"aba21aa0",5750:"d0314b07",6152:"52896773",6190:"7b5e550f",6235:"915a24fd",6919:"ca2c3c0c",6976:"4ba45368",7098:"a7bd4aaa",8186:"03ef5215",8401:"17896441",8615:"ae242f53",8617:"441f609b",9026:"c8078f0a",9048:"a94703ab",9172:"e633a5ea",9532:"33362219",9647:"5e95c892"}[e]||e)+"."+{98:"fae170b0",165:"7b1d067d",291:"1b64972f",571:"efa6fc46",617:"e8fa27b8",961:"7f9f70e7",1e3:"f9af7a41",1203:"b618bb61",1567:"7a0edff6",1741:"b927934f",1746:"1ce4b99b",2130:"09232a19",2237:"70c48bab",2272:"676ec1ad",2279:"44341cb1",2291:"2753844f",2325:"7c4239a7",2334:"6d98e48e",2492:"e6c78669",2668:"0097fd59",2821:"7e574346",3207:"5585873a",3490:"026802f4",3624:"a9a49a51",3815:"f87fc96a",4218:"0662e556",4250:"77e8e6c6",4616:"0d0b0873",4802:"a8b2857c",4981:"61cf4b0a",5480:"23265b76",5490:"6bdf311d",5668:"8aade99d",5742:"2f625fe1",5750:"0bb94724",5901:"f6ccb00b",5955:"14464ff3",5996:"b2d1663e",6152:"66bfb2f3",6190:"a397b62a",6235:"df85b0ea",6241:"a1fa513c",6319:"9020eb44",6366:"0c77f825",6567:"08800141",6919:"0943a68e",6976:"4168b16c",6992:"eb4cc2ed",7098:"9fea9356",7465:"7e0b8008",7592:"d6165eff",7873:"083fcc2e",7928:"5f633e47",8142:"5edfc34d",8186:"c65167a4",8249:"4f81048e",8401:"afd63cb1",8565:"6a562290",8615:"33b6f886",8617:"8f0bf0a1",8731:"4bc22343",8756:"74d5516d",9026:"1db22c20",9032:"f4369ef2",9048:"fa9eaf65",9172:"88a60d4e",9412:"ca1dda85",9510:"81e2df6a",9532:"9fafa665",9647:"d28d5273"}[e]+".js",d.miniCssF=e=>{},d.o=(e,a)=>Object.prototype.hasOwnProperty.call(e,a),t={},f="openrag-docs:",d.l=(e,a,r,c)=>{if(t[e])t[e].push(a);else{var o,b;if(void 0!==r)for(var n=document.getElementsByTagName("script"),i=0;i{o.onerror=o.onload=null,clearTimeout(s);var f=t[e];if(delete t[e],o.parentNode&&o.parentNode.removeChild(o),f&&f.forEach(e=>e(r)),a)return a(r)},s=setTimeout(u.bind(null,void 0,{type:"timeout",target:o}),12e4);o.onerror=u.bind(null,o.onerror),o.onload=u.bind(null,o.onload),b&&document.head.appendChild(o)}},d.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},d.p="/",d.gca=function(e){return e={17896441:"8401",33362219:"9532",52896773:"6152",af920ffe:"98","0ba6a408":"571","21afe7ac":"961","22dd74f7":"1567","749371cc":"2272",eb5b356a:"2668","27b4a875":"3207","71478a5d":"5490",c5b64a02:"5668",aba21aa0:"5742",d0314b07:"5750","7b5e550f":"6190","915a24fd":"6235",ca2c3c0c:"6919","4ba45368":"6976",a7bd4aaa:"7098","03ef5215":"8186",ae242f53:"8615","441f609b":"8617",c8078f0a:"9026",a94703ab:"9048",e633a5ea:"9172","5e95c892":"9647"}[e]||e,d.p+d.u(e)},(()=>{var e={5354:0,1869:0};d.f.j=(a,r)=>{var t=d.o(e,a)?e[a]:void 0;if(0!==t)if(t)r.push(t[2]);else if(/^(1869|5354)$/.test(a))e[a]=0;else{var f=new Promise((r,f)=>t=e[a]=[r,f]);r.push(t[2]=f);var c=d.p+d.u(a),o=new Error;d.l(c,r=>{if(d.o(e,a)&&(0!==(t=e[a])&&(e[a]=void 0),t)){var f=r&&("load"===r.type?"missing":r.type),c=r&&r.target&&r.target.src;o.message="Loading chunk "+a+" failed.\n("+f+": "+c+")",o.name="ChunkLoadError",o.type=f,o.request=c,t[1](o)}},"chunk-"+a,a)}},d.O.j=a=>0===e[a];var a=(a,r)=>{var t,f,[c,o,b]=r,n=0;if(c.some(a=>0!==e[a])){for(t in o)d.o(o,t)&&(d.m[t]=o[t]);if(b)var i=b(d)}for(a&&a(r);n Chat in OpenRAG | OpenRAG - + diff --git a/docker/index.html b/docker/index.html index 1f69f67c..277b661d 100644 --- a/docker/index.html +++ b/docker/index.html @@ -4,7 +4,7 @@ Deploy OpenRAG with self-managed services | OpenRAG - + @@ -124,9 +124,9 @@ The following variables are required or recommended:

  • OAuth provider credentials: To upload documents from external storage, such as Google Drive, set the required OAuth credentials for the connectors that you want to use. You can manage OAuth credentials later, but it is recommended to configure them during initial set up so you don't have to rebuild the containers.

  • @@ -187,8 +187,7 @@ Additionally, you can set multiple embedding models.

    You only need to complete onboarding for your preferred providers.

    info

    Anthropic doesn't provide embedding models. If you select Anthropic for your language model, you must select a different provider for the embedding model.

    1. -

      Enter your Anthropic API key, or enable Get API key from environment variable to pull the key from your OpenRAG .env file.

      -

      If you set ANTHROPIC_API_KEY in your OpenRAG .env file, this value can be populated automatically.

      +

      Enter your Anthropic API key, or enable Use environment API key to pull the key from your OpenRAG .env file.

    2. Under Advanced settings, select the language model that you want to use.

      @@ -212,8 +211,11 @@ The overview demonstrates some basic functionality that is covered in the
    diff --git a/quickstart/index.html b/quickstart/index.html index 5ab592e5..0afd94bf 100644 --- a/quickstart/index.html +++ b/quickstart/index.html @@ -4,7 +4,7 @@ Quickstart | OpenRAG - + @@ -40,30 +40,30 @@ The script installs OpenRAG dependencies, including Docker or Podman, and then i You might be prompted to install certain dependencies if they aren't already present in your environment.

    The entire process can take a few minutes. Once the environment is ready, the OpenRAG Terminal User Interface (TUI) starts.

    -

    OpenRAG TUI Interface

    +

    OpenRAG TUI Interface

  • In the TUI, click Basic Setup.

  • -

    Click Generate Passwords to create administrator passwords for your OpenRAG OpenSearch and Langflow services.

    +

    For Langflow Admin Password, click Generate Password to create a Langflow administrator password and username.

  • -

    Leave the OpenAI API key field empty.

    +

    Use the default values for all other fields.

  • -

    Click Save Configuration, and then click Start All Services.

    +

    Click Save Configuration.

    +

    Your OpenRAG configuration and passwords are stored in an OpenRAG .env file file that is created automatically at ~/.openrag/tui. +OpenRAG container definitions are stored in the docker-compose files in the same directory.

    +
  • +
  • +

    Click Start OpenRAG to start the OpenRAG services.

    This process can take some time while OpenRAG pulls and runs the container images. If all services start successfully, the TUI prints a confirmation message:

    Services started successfully
    Command completed successfully
    -

    Your OpenRAG configuration and passwords are stored in an OpenRAG .env file file that is created automatically at ~/.openrag/tui. -Container definitions are stored in the docker-compose files in the same directory.

  • -

    Under Native Services, click Start to start the Docling service.

    -
  • -
  • -

    From the TUI main menu, click Open App to launch the OpenRAG application and start the application onboarding process.

    +

    Click Close, and then click Launch OpenRAG to access the OpenRAG application and start the application onboarding process.

  • For this quickstart, select the OpenAI model provider, enter your OpenAI API key, and then click Complete. Use the default settings for all other model options.

    diff --git a/reference/configuration/index.html b/reference/configuration/index.html index 3c1ac136..097f15d2 100644 --- a/reference/configuration/index.html +++ b/reference/configuration/index.html @@ -4,7 +4,7 @@ Environment variables | OpenRAG - + @@ -20,7 +20,7 @@ Environment variables in .env always take precedence over other sou

    If a variable isn't set, OpenRAG uses default or fallback values where available. Not all variables have default values, and errors can occur if required variables aren't set. Default values can be found in the reference tables on this page and in config_manager.py, settings.py, and logging_config.py.

    -

    You can temporarily set Langflow variables at runtime. +

    You can temporarily set Langflow variables at runtime. However, these temporary overrides don't overlap with most OpenRAG environment variables. The only exceptions are flow-level Langflow settings, such as the language model used in a flow.

    Edit the .env file

    diff --git a/reinstall/index.html b/reinstall/index.html index c23e2984..e6a9d211 100644 --- a/reinstall/index.html +++ b/reinstall/index.html @@ -4,7 +4,7 @@ Reinstall OpenRAG | OpenRAG - + @@ -20,7 +20,7 @@ Destroyed containers and deleted data are lost and cannot be recovered after run
    1. -

      In the TUI's Status menu (3), click Factory Reset to reset your OpenRAG containers.

      +

      In the TUI, click Status, and then click Factory Reset to reset your OpenRAG containers.

      warning

      This is a destructive operation that does the following:

      • Destroys all OpenRAG containers, volumes, and local images.
      • Prunes any additional container objects.
      • @@ -28,7 +28,7 @@ Destroyed containers and deleted data are lost and cannot be recovered after run

      Destroyed containers and deleted data are lost and cannot be recovered after running this operation.

    2. -

      Exit the TUI with q.

      +

      Press Esc to close the Status page, and then press q to exit the TUI.

    3. Optional: Delete or edit OpenRAG's .env file, which is stored at ~/.openrag/tui.

      @@ -90,8 +90,9 @@ It is recommended that you preserve OpenRAG's
      Docker
      docker stop $(docker ps -q)
  • Podman
    podman stop --all
    - -
      +
    1. +

      Remove and clean up containers:

      +
      1. Remove all containers, including stopped containers:

        Docker
        docker rm --force $(docker ps -aq)
        @@ -118,7 +119,7 @@ It is recommended that you preserve OpenRAG's
        Podman
        podman system prune --all --force --volumes
      -
        +
      1. Optional: Edit OpenRAG's .env file if needed.

      2. diff --git a/support/troubleshoot/index.html b/support/troubleshoot/index.html index ca152ba4..c5ad0800 100644 --- a/support/troubleshoot/index.html +++ b/support/troubleshoot/index.html @@ -4,7 +4,7 @@ Troubleshoot OpenRAG | OpenRAG - + @@ -51,7 +51,7 @@ For example, on macOS, this is typically a user cache directory, such as ~

        This cache can become stale, producing errors like missing dependencies.

        1. -

          Exit the TUI.

          +

          If the TUI is open, press q to exit the TUI.

        2. Clear the uv cache:

          @@ -64,7 +64,7 @@ For example, on macOS, this is typically a user cache directory, such as ~
          uvx openrag
        3. -

          Click Open App, and then retry document ingestion.

          +

          Click Launch OpenRAG, and then retry document ingestion.

        If you install OpenRAG with uv, dependencies are synced directly from your pyproject.toml file. diff --git a/tui/index.html b/tui/index.html index 3da56808..11aceb93 100644 --- a/tui/index.html +++ b/tui/index.html @@ -4,7 +4,7 @@ Use the TUI | OpenRAG - + @@ -12,20 +12,28 @@

        Use the TUI

        The OpenRAG Terminal User Interface (TUI) provides a simplified and guided experience for configuring, managing, and monitoring your OpenRAG deployment directly from the terminal.

        -

        OpenRAG TUI Interface

        +

        OpenRAG TUI Interface

        If you install OpenRAG with the automatic installer script, uv, or uvx, you use the TUI to manage your OpenRAG deployment. The TUI guides you through the initial setup, automatically manages your OpenRAG .env and docker-compose files, and provides convenient access to service management controls.

        In contrast, when you deploy OpenRAG with self-managed services, you must manually configure OpenRAG by preparing a .env file, and then use Docker or Podman commands to deploy and manage your OpenRAG services.

        Access the TUI

        If you installed OpenRAG with uv, access the TUI with uv run openrag.

        If you installed OpenRAG with the automatic installer script or uvx, access the TUI with uvx openrag.

        + +

        You can navigate the TUI with your mouse or keyboard. +Keyboard shortcuts for additional menus are printed at the bottom of the TUI screen.

        Manage services with the TUI

        -

        Use the TUI's Status menu (3) and Diagnostics menu (4) to access controls and information for your OpenRAG services. +

        Use the TUI's Status page to access controls and information for your OpenRAG services. For more information, see Manage OpenRAG services.

        +

        Toggle GPU/CPU mode

        +

        You can toggle between GPU and CPU mode from within the TUI if your system has compatible GPU hardware and drivers installed.

        +

        In the TUI, click Status, and then click Switch to GPU Mode or Switch to CPU Mode.

        +

        This change requires restarting all OpenRAG services because each mode has its own docker-compose file.

        Exit the OpenRAG TUI

        -

        To exit the OpenRAG TUI, go to the TUI main menu, and then press q.

        -

        Your OpenRAG containers continue to run until they are stopped.

        -

        To restart the TUI, see Access the TUI.

        diff --git a/uninstall/index.html b/uninstall/index.html index 171a8c1f..131fd4a3 100644 --- a/uninstall/index.html +++ b/uninstall/index.html @@ -4,7 +4,7 @@ Remove OpenRAG | OpenRAG - + @@ -13,8 +13,8 @@

        Remove OpenRAG

        tip

        If you want to reset your OpenRAG containers without removing OpenRAG entirely, see Reset OpenRAG containers and Reinstall OpenRAG.

        Uninstall TUI-managed deployments

        -

        If you used the automated installer script or uvx to install OpenRAG, clear your uv cache (uv cache clean) to remove the TUI environment, and then delete the directory containing your OpenRAG configuration files and data (where you would invoke OpenRAG).

        -

        If you used uv to install OpenRAG, run uv remove openrag in your Python project.

        +

        If you used the automated installer script or uvx to install OpenRAG, clear your uv cache (uv cache clean) to remove the TUI environment, and then delete the ~/.openrag directory.

        +

        If you used uv to install OpenRAG, run uv remove openrag in your Python project, and then delete the ~/.openrag directory.

        Uninstall self-managed deployments

        For self-managed services, destroy the containers, prune any additional container objects, delete any remaining OpenRAG files, and then shut down the Docling service.

        Uninstall with docker compose or podman compose

        @@ -41,8 +41,9 @@
        Docker
        docker stop $(docker ps -q)
        Podman
        podman stop --all
        -
      -
        +
      1. +

        Remove and clean up containers:

        +
        1. Remove all containers, including stopped containers:

          Docker
          docker rm --force $(docker ps -aq)
          @@ -69,7 +70,7 @@
          Podman
          podman system prune --all --force --volumes
        -
          +
        1. Remove OpenRAG's .env file and the ~/.openrag/documents directory, which aren't deleted by the previous commands.

        2. diff --git a/upgrade/index.html b/upgrade/index.html index 0128d76a..cea77cb4 100644 --- a/upgrade/index.html +++ b/upgrade/index.html @@ -4,7 +4,7 @@ Upgrade OpenRAG | OpenRAG - + @@ -15,7 +15,7 @@

          Export customized flows before upgrading

          If you modified the built-in flows or created custom flows in your OpenRAG Langflow instance, export your flows before upgrading. This ensure that you won't lose your flows after upgrading, and you can reference the exported flows if there are any breaking changes in the new version.

          -

          Upgrade TUI-managed installations

          +

          Upgrade TUI-managed deployments

          To upgrade OpenRAG, you need to upgrade the OpenRAG Python package, and then upgrade the OpenRAG containers.

          Upgrading the Python package also upgrades Docling by bumping the dependency in pyproject.toml.

          This is a two-part process because upgrading the OpenRAG Python package updates the Terminal User Interface (TUI) and Python code, but the container versions are controlled by environment variables in your OpenRAG .env file.

          @@ -24,11 +24,13 @@ This ensure that you won't lose your flows after upgrading, and you can ref
        1. -

          To check for updates, open the TUI's Status menu (3), and then click Upgrade.

          +

          To check for updates, click Status in the TUI, and then click Upgrade.

        2. -

          If there is an update, stop all OpenRAG services. -In the Status menu, click Stop Services.

          +

          If there is an update available, press Esc to close the Status page, then then click Stop All Services.

          +
        3. +
        4. +

          Press q to exit the TUI.

        5. Upgrade the OpenRAG Python package to the latest version from PyPI. @@ -76,7 +78,7 @@ The commands to upgrade the package depend on how you installed OpenRAG.

      2. -

        In the OpenRAG TUI, click Start All Services, and then wait while the upgraded containers start.

        +

        In the OpenRAG TUI, click Start Services, and then wait while the services start.

        When you start services after upgrading the Python package, OpenRAG runs docker compose pull to get the appropriate container images matching the version specified in your OpenRAG .env file. Then, it recreates the containers with the new images using docker compose up -d --force-recreate.

        Pin container versions

        In the OpenRAG .env file, the OPENRAG_VERSION environment variable is set to latest by default, which pulls the latest available container images. To pin a specific container image version, you can set OPENRAG_VERSION to the desired container image version, such as OPENRAG_VERSION=0.1.33.

        However, when you upgrade the Python package, OpenRAG automatically attempts to keep the OPENRAG_VERSION synchronized with the Python package version. @@ -85,13 +87,10 @@ The TUI warns you if it detects a version mismatch.

        If you get an error that langflow container already exists error during upgrade, see Langflow container already exists during upgrade.

      3. -

        Under Native Services, click Start to start the Docling service.

        -
      4. -
      5. -

        When the upgrade process is complete, you can close the Status window and continue using OpenRAG.

        +

        After the containers start, click Close, and then click Launch OpenRAG.

      -

      Upgrade self-managed containers

      +

      Upgrade self-managed deployments

      1. If you modified the built-in flows or created custom flows in your OpenRAG Langflow instance, and you want to preserve those changes, then you must export your flows before starting this process. Afterwards, you can import your flows or reference the exported flow JSON as needed.
      @@ -102,12 +101,15 @@ The TUI warns you if it detects a version mismatch.

      Podman
      podman compose pull
      podman compose up -d --force-recreate

      By default, OpenRAG's docker-compose files pull the latest container images.

    2. +
    3. +

      After the containers start, access the OpenRAG application at http://localhost:3000.

      +

    See also