PageSourceSearch

https://ragflow.io/assets/js/ea313555.95b5b395.js

js ragflow.io collected 2026-09-24 18:52:54 UTC 80,775 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkragflow_docs=globalThis.webpackChunkragflow_docs||[]).push([[1011],{86280(e,n,r){r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>l,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"faq","title":"FAQs","description":"Answers to questions about general features, troubleshooting, usage, and more.","source":"@site/docs/faq.mdx","sourceDirName":".","slug":"/faq","permalink":"/docs/faq","draft":false,"unlisted":false,"editUrl":"https://github.com/infiniflow/ragflow/tree/main/docs/faq.mdx","tags":[],"version":"current","sidebarPosition":20,"frontMatter":{"sidebar_position":20,"slug":"/faq","sidebar_custom_props":{"sidebarIcon":"LucideCircleQuestionMark"}},"sidebar":"tutorialSidebar","previous":{"title":"Python API","permalink":"/docs/python_api_reference"}}');var i=r(74848),o=r(28453),t=r(21741);const l={sidebar_position:20,slug:"/faq",sidebar_custom_props:{sidebarIcon:"LucideCircleQuestionMark"}},a="FAQs",d={},c=[{value:"General features",id:"general-features",level:2},{value:"What sets RAGFlow apart from other RAG products?",id:"what-sets-ragflow-apart-from-other-rag-products",level:3},{value:"Where to find the version of RAGFlow? How to interpret it?",id:"where-to-find-the-version-of-ragflow-how-to-interpret-it",level:3},{value:"Why does RAGFlow use Elasticsearch or Infinity as its default document engine?",id:"why-does-ragflow-use-elasticsearch-or-infinity-as-its-default-document-engine",level:3},{value:"Differences between cloud.ragflow.io and a locally deployed open-source RAGFlow service?",id:"differences-between-cloudragflowio-and-a-locally-deployed-open-source-ragflow-service",level:3},{value:"Why does RAGFlow require substantial system resources?",id:"why-does-ragflow-require-substantial-system-resources",level:3},{value:"Which architectures or devices does RAGFlow support?",id:"which-architectures-or-devices-does-ragflow-support",level:3},{value:"Do you offer an API for integration with third-party applications?",id:"do-you-offer-an-api-for-integration-with-third-party-applications",level:3},{value:"Do you support stream output?",id:"do-you-support-stream-output",level:3},{value:"Key differences between search and chat?",id:"key-differences-between-search-and-chat",level:3},{value:"Troubleshooting",id:"troubleshooting",level:2},{value:"Get a <code>Request error 404: undefined</code> when upgrading to v0.27.2",id:"get-a-request-error-404-undefined-when-upgrading-to-v0272",level:3},{value:"How to build the RAGFlow image from scratch?",id:"how-to-build-the-ragflow-image-from-scratch",level:3},{value:"PDF parsing fails because required Hugging Face models cannot be downloaded",id:"pdf-parsing-fails-because-required-hugging-face-models-cannot-be-downloaded",level:3},{value:"<code>Fail to access model(Ollama/xxxxx)</code>",id:"fail-to-access-modelollamaxxxxx",level:3},{value:"<code>MaxRetryError: HTTPSConnectionPool(host=&#39;hf-mirror.com&#39;, port=443)</code>",id:"maxretryerror-httpsconnectionpoolhosthf-mirrorcom-port443",level:3},{value:"<code>RuntimeError: Unable to start Tika server.</code>",id:"runtimeerror-unable-to-start-tika-server",level:3},{value:"<code>Cannot stat &#39;/etc/nginx/conf.d/ragflow.conf.python&#39;: No such file or directory</code>",id:"cannot-stat-etcnginxconfdragflowconfpython-no-such-file-or-directory",level:3},{value:"<code>network anomaly There is an abnormality in your network and you cannot connect to the server.</code>",id:"network-anomaly-there-is-an-abnormality-in-your-network-and-you-cannot-connect-to-the-server",level:3},{value:"<code>Realtime synonym is disabled, since no redis connection</code>",id:"realtime-synonym-is-disabled-since-no-redis-connection",level:3},{value:"<code>xxx tasks are ahead in the queue</code>",id:"xxx-tasks-are-ahead-in-the-queue",level:3},{value:"For RAGFlow versions earlier than v0.26.0",id:"for-ragflow-versions-earlier-than-v0260",level:4},{value:"For RAGFlow v0.26.0 and later",id:"for-ragflow-v0260-and-later",level:4},{value:"Why does my document parsing stall at under one percent?",id:"why-does-my-document-parsing-stall-at-under-one-percent",level:3},{value:"Why does my pdf parsing stall near completion, while the log does not show any error?",id:"why-does-my-pdf-parsing-stall-near-completion-while-the-log-does-not-show-any-error",level:3},{value:"<code>Index failure</code>
1",id:"index-failure",level:3},{value:"How to check the log of RAGFlow?",id:"how-to-check-the-log-of-ragflow",level:3},{value:"How to check the status of each component in RAGFlow?",id:"how-to-check-the-status-of-each-component-in-ragflow",level:3},{value:"<code>Exception: Can&#39;t connect to ES cluster</code>",id:"exception-cant-connect-to-es-cluster",level:3},{value:"Can&#39;t start ES container and get <code>Elasticsearch did not exit normally</code>",id:"cant-start-es-container-and-get-elasticsearch-did-not-exit-normally",level:3},{value:"How do I configure <code>vm.max_map_count</code> on macOS?",id:"how-do-i-configure-vmmax_map_count-on-macos",level:3},{value:"<code>{&quot;data&quot;:null,&quot;code&quot;:100,&quot;message&quot;:&quot;&lt;NotFound &#39;404: Not Found&#39;&gt;&quot;}</code>",id:"datanullcode100messagenotfound-404-not-found",level:3},{value:"<code>Ollama - Mistral instance running at 127.0.0.1:11434 but cannot add Ollama as model in RagFlow</code>",id:"ollama---mistral-instance-running-at-12700111434-but-cannot-add-ollama-as-model-in-ragflow",level:3},{value:"Do you offer examples of using DeepDoc to parse PDF or other files?",id:"do-you-offer-examples-of-using-deepdoc-to-parse-pdf-or-other-files",level:3},{value:"<code>FileNotFoundError: [Errno 2] No such file or directory</code>",id:"filenotfounderror-errno-2-no-such-file-or-directory",level:3},{value:"Use the system health API to verify the configured object storage and other dependencies.",id:"use-the-system-health-api-to-verify-the-configured-object-storage-and-other-dependencies",level:2},{value:"Usage",id:"usage",level:2},{value:"How to run RAGFlow with a locally deployed LLM?",id:"how-to-run-ragflow-with-a-locally-deployed-llm",level:3},{value:"How to add an LLM that is not supported?",id:"how-to-add-an-llm-that-is-not-supported",level:3},{value:"How to integrate RAGFlow with Ollama?",id:"how-to-integrate-ragflow-with-ollama",level:3},{value:"How to change the file size limit?",id:"how-to-change-the-file-size-limit",level:3},{value:"How to get an API key for integration with third-party applications?",id:"how-to-get-an-api-key-for-integration-with-third-party-applications",level:3},{value:"How to upgrade RAGFlow?",id:"how-to-upgrade-ragflow",level:3},{value:"How to switch the document engine to Infinity?",id:"how-to-switch-the-document-engine-to-infinity",level:3},{value:"Where are uploaded files stored in RAGFlow?",id:"where-are-uploaded-files-stored-in-ragflow",level:3},{value:"How to tune batch size for document parsing and embedding?",id:"how-to-tune-batch-size-for-document-parsing-and-embedding",level:3},{value:"Why can&#39;t I retrieve relevant content in Search or Chat even though the document was parsed successfully?",id:"why-cant-i-retrieve-relevant-content-in-search-or-chat-even-though-the-document-was-parsed-successfully",level:3},{value:"Why does the same query produce different results in Retrieval testing, Search, and Chat?",id:"why-does-the-same-query-produce-different-results-in-retrieval-testing-search-and-chat",level:3},{value:"How can I tell whether a problem comes from document parsing, chunking, retrieval, or answer generation?",id:"how-can-i-tell-whether-a-problem-comes-from-document-parsing-chunking-retrieval-or-answer-generation",level:3},{value:"Can the same dataset be used by Search, Chat, and Agent?",id:"can-the-same-dataset-be-used-by-search-chat-and-agent",level:3},{value:"Should I adjust chunking, retrieval settings, or models first?",id:"should-i-adjust-chunking-retrieval-settings-or-models-first",level:3},{value:"What needs to be reprocessed after changing the embedding model, reranker, or LLM?",id:"what-needs-to-be-reprocessed-after-changing-the-embedding-model-reranker-or-llm",level:3},{value:"Why can the model still hallucinate when the answer exists in the dataset?",id:"why-can-the-model-still-hallucinate-when-the-answer-exists-in-the-dataset",level:3},{value:"How to accelerate the question-answering speed of my chat assistant?",id:"how-to-accelerate-the-question-answering-speed-of-my-chat-assistant",level:3},{value:"How to accelerate the question-answering speed of my Agent?",id:"how-to-accelerate-the-question-answering-speed-of-my-agent",level:3},{value:"How to use MinerU to parse PDF documents?",id:"how-to-use-mineru-to-parse-pdf-documents",level:3},{value:"How to configure MinerU-specific settings?",id:"how-to-configure-mineru-specific-settings",level:3},{value:"How to use MinerU with a vLLM server for document parsing?",id:"how-to-use-mineru-with-a-vllm-server-for-document-parsing",level:3},{value:"How to use an external Docling Serve server for document parsing?",id:"how-to-use-an-external-docling-serve-server-for-document-parsing",level:3},{value:"How to use PaddleOCR for document parsing?",id:"how-to-use-pad
1dleocr-for-document-parsing",level:3},{value:"1. Using PaddleOCR Official API",id:"1-using-paddleocr-official-api",level:4},{value:"2. Using Self-Hosted PaddleOCR Service",id:"2-using-self-hosted-paddleocr-service",level:4},{value:"Environment Variables Summary",id:"environment-variables-summary",level:4},{value:"How do I use Ollama with RAGFlow for local LLM inference?",id:"how-do-i-use-ollama-with-ragflow-for-local-llm-inference",level:3}];function h(e){const n={a:"a",admonition:"admonition",code:"code",em:"em",h1:"h1",h2:"h2",h3:"h3",h4:"h4",header:"header",hr:"hr",img:"img",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,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(n.header,{children:(0,i.jsx)(n.h1,{id:"faqs",children:"FAQs"})}),"\n",(0,i.jsx)(n.p,{children:"Answers to questions about general features, troubleshooting, usage, and more."}),"\n",(0,i.jsx)(n.hr,{}),"\n","\n",(0,i.jsx)(t.A,{toc:c}),"\n",(0,i.jsx)(n.h2,{id:"general-features",children:"General features"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"what-sets-ragflow-apart-from-other-rag-products",children:"What sets RAGFlow apart from other RAG products?"}),"\n",(0,i.jsx)(n.p,{children:"RAGFlow provides an end-to-end RAG platform that goes beyond basic document chunking and retrieval. Its key strengths include:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Deep document understanding"})," for complex content such as text, tables, and images."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Flexible retrieval and traceable answers"})," with multiple retrieval strategies, reranking, and citations."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Agentic capabilities"})," for multi-step retrieval, reasoning, tool use, and workflows."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Knowledge compilation"})," for organizing documents into structured knowledge artifacts."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Broad model and integration support"})," for building different RAG applications."]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"where-to-find-the-version-of-ragflow-how-to-interpret-it",children:"Where to find the version of RAGFlow? How to interpret it?"}),"\n",(0,i.jsxs)(n.p,{children:["You can find the RAGFlow version number on the ",(0,i.jsx)(n.strong,{children:"System"})," page of the UI:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/user-attachments/assets/20cf7213-2537-4e18-a88c-4dadf6228c6b",alt:"Image"})}),"\n",(0,i.jsx)(n.p,{children:"If you build RAGFlow from source, the version number is also in the system log:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"        ____   ___    ______ ______ __\n       / __ \\ /   |  / ____// ____// /____  _      __\n      / /_/ // /| | / / __ / /_   / // __ \\| | /| / /\n     / _, _// ___ |/ /_/ // __/  / // /_/ /| |/ |/ /\n    /_/ |_|/_/  |_|\\____//_/    /_/ \\____/ |__/|__/\n\n2025-02-18 10:10:43,835 INFO     1445658 RAGFlow version: v0.15.0-50-g6daae7f2\n"})}),"\n",(0,i.jsx)(n.p,{children:"Where:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"v0.15.0"}),": The officially published release."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"50"}),": The number of git commits since the official release."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"g6daae7f2"}),": ",(0,i.jsx)(n.code,{children:"g"})," is the prefix, and ",(0,i.jsx)(n.code,{children:"6daae7f2"})," is the first seven characters of the current commit ID."]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-does-ragflow-use-elasticsearch-or-infinity-as-its-default-document-engine",children:"Why does RAGFlow use Elasticsearch or Infinity as its default document engine?"}),"\n",(0,i.jsxs)(n.p,{children:["Elasticsearch and ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/infinity",children:"Infinity"})," meet RAGFlow's core hybrid search requirements, including full-text search, vector search, phrase search, and advanced ranking capabilities.\nRAGFlow also supports other document engines, including OpenSearch, OceanBase, SeekDB, and GaussDB. Support levels and available features may vary between document engines.\n",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/infinity",children:"Infinity"})," is an AI-native database developed by InfiniFlow and optimized for RAG workloads."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"differences-between-cloudragflowio-and-a-locally-deployed-open-source-ragflow-service",children:"Differences between cloud.ragflow.io and a locally deployed open-source RAGFlow service?"}),"\n",(0,i.jsx)(n.p,{children:"cloud.ragflow.io demonstrates the capabilities of RAGFlow Enterprise. Its DeepDoc models are pre-trained using proprietary data and it offers much more sophisticated team permission controls. Essentially, cloud.ragflow.io serves as a preview of RAGFlow's forthcoming SaaS (Software as a Service) offering."}),"\n",(0,i.jsx)(n.p,{children:"You can deploy an open-source RAGFlow service and call it from a Python client or through RESTful APIs. However, this is not supported on cloud.ragflow.io."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-does-ragflow-require-substantial-system-resources",children:"Why does RAGFlow require substantial system resources?"}),"\n",(0,i.jsx)(n.p,{children:"RAGFlow runs multiple components for document parsing, embedding, full-text and vector indexing, retrieval, task processing, metadata storage, caching, and object storage. Some document parsers also load or download machine-learning models and may require significant memory or GPU resources."}),"\n",(0,i.jsx)(n.p,{children:"Actual resource usage depends on the selected document engine, parser, model provider, document volume, and workload. See the deployment prerequisites and configuration documentation for the current minimum requirements."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"which-architectures-or-devices-does-ragflow-support",children:"Which architectures or devices does RAGFlow support?"}),"\n",(0,i.jsxs)(n.p,{children:["We officially support x86 CPUs and NVIDIA GPUs. While we also test RAGFlow on ARM64 platforms, we do not maintain RAGFlow Docker images for ARM. If you are on an ARM platform, follow ",(0,i.jsx)(n.a,{href:"/docs/build_docker_image",children:"this guide"})," to build a RAGFlow Docker image."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"do-you-offer-an-api-for-integration-with-third-party-applications",children:"Do you offer an API for integration with third-party applications?"}),"\n",(0,i.jsxs)(n.p,{children:["The corresponding APIs are now available. See the ",(0,i.jsx)(n.a,{href:"/docs/http_api_reference",children:"RAGFlow HTTP API Reference"})," or the ",(0,i.jsx)(n.a,{href:"/docs/python_api_reference",children:"RAGFlow Python API Reference"})," for more information."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"do-you-support-stream-output",children:"Do you support stream output?"}),"\n",(0,i.jsx)(n.p,{children:"Yes, we do. Stream output is enabled by default in the chat assistant and agent. Note that you cannot disable stream output via RAGFlow's UI. To disable stream output in responses, use RAGFlow's Python or RESTful APIs:"}),"\n",(0,i.jsx)(n.p,{children:"Python:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/python_api_reference#create-chat-completion",children:"Create chat completion"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/python_api_reference#converse-with-chat-assistant",children:"Converse with chat assistant"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/python_api_reference#converse-with-agent",children:"Converse with agent"})}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"RESTful:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/http_api_reference#create-chat-completion",children:"Create chat completion"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/http_api_reference#converse-with-chat-assistant",children:"Converse with chat assistant"})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.a,{href:"/docs/http_api_reference#converse-with-agent",children:"Converse with agent"})}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"key-differences-between-search-and-chat",children:"Key differences between search and chat?"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Search"})," is designed for direct knowledge retrieval. It retrieves and ranks relevant content from one or more datasets and presents the results for users to review."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Chat"}
1)," is designed for conversational question answering. It retrieves relevant knowledge and uses an LLM to generate answers, supporting multi-turn conversations and more advanced retrieval capabilities such as Agentic Retrieval."]}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["Use ",(0,i.jsx)(n.strong,{children:"Search"})," when you want to find and inspect relevant knowledge directly, and ",(0,i.jsx)(n.strong,{children:"Chat"})," when you want generated answers based on that knowledge."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.h3,{id:"get-a-request-error-404-undefined-when-upgrading-to-v0272",children:["Get a ",(0,i.jsx)(n.code,{children:"Request error 404: undefined"})," when upgrading to v0.27.2"]}),"\n",(0,i.jsx)(n.p,{children:"To resolve this issue, do either of the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Pull the latest source code from the ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/ragflow",children:"main branch"}),", then pull and start the v0.27.2 image."]}),"\n",(0,i.jsxs)(n.li,{children:["Update ",(0,i.jsx)(n.code,{children:"RAGFLOW_IMAGE"})," from ",(0,i.jsx)(n.code,{children:"infiniflow/ragflow:latest"})," to ",(0,i.jsx)(n.code,{children:"infiniflow/ragflow:v0.27.2"})," in the ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/ragflow/blob/main/docker/.env",children:".env file"}),", then restart the service."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"how-to-build-the-ragflow-image-from-scratch",children:"How to build the RAGFlow image from scratch?"}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/docs/build_docker_image",children:"Build a RAGFlow Docker image"}),"."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"pdf-parsing-fails-because-required-hugging-face-models-cannot-be-downloaded",children:"PDF parsing fails because required Hugging Face models cannot be downloaded"}),"\n",(0,i.jsxs)(n.p,{children:["Some RAGFlow document parsers download required model files from ",(0,i.jsx)(n.a,{href:"https://huggingface.co",children:"Hugging Face"}),". If the RAGFlow container cannot access Hugging Face and the files are not already cached, model initialization or document parsing may fail."]}),"\n",(0,i.jsx)(n.p,{children:"For example:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"FileNotFoundError: [Errno 2] No such file or directory: '/root/.cache/huggingface/hub/models--InfiniFlow--deepdoc/snapshots/be0c1e50eef6047b412d1800aa89aba4d275f997/ocr.res'\n"})}),"\n",(0,i.jsxs)(n.p,{children:["To fix this issue, use ",(0,i.jsx)(n.a,{href:"https://hf-mirror.com",children:"https://hf-mirror.com"})," instead:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Stop all containers and remove all related resources:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"cd ragflow/docker/\ndocker compose down\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Uncomment the following line in ",(0,i.jsx)(n.strong,{children:"ragflow/docker/.env"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"# HF_ENDPOINT=https://hf-mirror.com\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Start up the server:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"fail-to-access-modelollamaxxxxx",children:(0,i.jsx)(n.code,{children:"Fail to access model(Ollama/xxxxx)"})}),"\n",(0,i.jsx)(n.p,{children:"This error means that RAGFlow cannot access the configured Ollama model. Check that Ollama is running, the model has been downloaded, the model name is correct, and the Ollama Base URL is reachable from the RAGFlow container."}),"\n",(0,i.jsx)(n.p,{children:"If the request times out while loading the model, check the Ollama logs and available memory. Try a smaller model or allocate more memory if necessary."}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/docs/deploy_local_llm",children:"Deploy a local LLM"})," for more information."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"maxretryerror-httpsconnectionpoolhosthf-mirrorcom-port443",children:(0,i.jsx)(n.code,{children:"MaxRetryError: HTTPSConnectionPool(host='hf-mirror.com', port=443)"})}),"\n",(0,i.jsx)(n.p,{children:"This error suggests that you do not have Internet access or are unable to connect to hf-mirror.com. Try the following:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Manually download the resource files from ",(0,i.jsx)(n.a,{href:"https://huggingface.co/InfiniFlow/deepdoc",children:"huggingface.co/InfiniFlow/deepdoc"})," to your local folder ",(0,i.jsx)(n.strong,{children:"~/deepdoc"}),"."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Add a volume mapping to ",(0,i.jsx)(n.strong,{children:"docker/docker-compose.yml"}),", for example:"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"- ~/deepdoc:/ragflow/rag/res/deepdoc\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"runtimeerror-unable-to-start-tika-server",children:(0,i.jsx)(n.code,{children:"RuntimeError: Unable to start Tika server."})}),"\n",(0,i.jsxs)(n.p,{children:["This error is almost always caused by Java not being installed or not accessible in the environment. See ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/ragflow/issues/13194",children:"here"})," for detailed instructions."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"cannot-stat-etcnginxconfdragflowconfpython-no-such-file-or-directory",children:(0,i.jsx)(n.code,{children:"Cannot stat '/etc/nginx/conf.d/ragflow.conf.python': No such file or directory"})}),"\n",(0,i.jsxs)(n.p,{children:["To resolve this, either download the missing file from the corresponding tag on ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/ragflow",children:"GitHub"})," or update ",(0,i.jsx)(n.code,{children:"~/ragflow/docker/docker-compose.yml"})," as follows:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://raw.githubusercontent.com/infiniflow/ragflow-docs/main/images/docker-compose_missing.jpg",alt:""})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"network-anomaly-there-is-an-abnormality-in-your-network-and-you-cannot-connect-to-the-server",children:(0,i.jsx)(n.code,{children:"network anomaly There is an abnormality in your network and you cannot connect to the server."})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/infiniflow/ragflow/assets/93570324/beb7ad10-92e4-4a58-8886-bfb7cbd09e5d",alt:"anomaly"})}),"\n",(0,i.jsxs)(n.p,{children:["You will not log in to RAGFlow unless the server is fully initialized. Run ",(0,i.jsx)(n.code,{children:"docker logs -f docker-ragflow-cpu-1"}),"."]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"The server is successfully initialized, if your system displays the following:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:"     ____   ___    ______ ______ __\n    / __ \\ /   |  / ____// ____// /____  _      __\n   / /_/ // /| | / / __ / /_   / // __ \\| | /| / /\n  / _, _// ___ |/ /_/ // __/  / // /_/ /| |/ |/ /\n /_/ |_|/_/  |_|\\____//_/    /_/ \\____/ |__/|__/\n\n * Running on all addresses (0.0.0.0)\n * Running on http://127.0.0.1:9380\n * Running on http://x.x.x.x:9380\n"})}),"\n",(0,i.jsxs)(n.p,{children:["Then use the ",(0,i.jsx)(n.a,{href:"/docs/http_api_reference#check-system-health",children:"system health API"})," to check the database, Redis, document engine, and object storage."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"realtime-synonym-is-disabled-since-no-redis-connection",children:(0,i.jsx)(n.code,{children:"Realtime synonym is disabled, since no redis connection"})}),"\n",(0,i.jsx)(n.p,{children:"Ignore this warning and continue. All system warnings can be ignored."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/infiniflow/ragflow/assets/93570324/ef5a6194-084a-4fe3-bdd5-1c025b40865c",alt:""})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"xxx-tasks-are-ahead-in-the-queue",children:(0,i.jsx)(n.code,{children:"xxx tasks are ahead in the queue"})}),"\n",(0,i.jsx)(n.h4,{id:"for-ragflow-versions-earlier-than-v0260",children:"For RAGFlow versions earlier than v0.26.0"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Clear the Redis task queue:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"$ docker exec -it ragflow-redis /bin/bash\n# In container\n$ redis-cli -a infini_rag_flow\n# In redis-cli\nselect 1\nXGROUP DESTROY rag_flow_svr_queue rag_flow_svr_task_broker\nXGROUP CREATE rag_flow_svr_queue rag_flow_svr_task_broker $ MKSTREAM\n# When CREATE raises and error:\nFLUSHDB\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"If the parser remains stuck at 0%, restart the RAGFlow containers using one of the following methods:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Option 1: Restart specific container\ndocker restart docker-redis-1 docker-ragflow-cpu-1\n\n# Option 2: Recreate containers via Docker Compose\ndocker compose -f docker/docker-compose.yml down\ndocker compose -f docker/docker-compose.yml up -d\n\n# Option 3: Reset all Docker 
1containers\n# WARNING: Run this ONLY if your environment contains no other non-RAGFlow containers.\ndocker stop $(docker ps -aq)\ndocker rm $(docker ps -aq)\n"})}),"\n",(0,i.jsx)(n.h4,{id:"for-ragflow-v0260-and-later",children:"For RAGFlow v0.26.0 and later"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Clear the Redis task queue:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"$ docker exec -it ragflow-redis /bin/bash\n# In container\n$ redis-cli -a infini_rag_flow\n# In redis-cli\nselect 1\nXGROUP DESTROY te.0.common rag_flow_svr_task_broker\nXGROUP CREATE te.0.common rag_flow_svr_task_broker $ MKSTREAM\n\nXGROUP DESTROY te.1.common rag_flow_svr_task_broker\nXGROUP CREATE te.1.common rag_flow_svr_task_broker $ MKSTREAM\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"2",children:["\n",(0,i.jsx)(n.li,{children:"If the parser remains stuck at 0%, restart the RAGFlow containers using one of the following methods:"}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# Option 1: Restart specific container\ndocker restart docker-redis-1 docker-ragflow-cpu-1\n\n# Option 2: Recreate containers via Docker Compose\ndocker compose -f docker/docker-compose.yml down\ndocker compose -f docker/docker-compose.yml up -d\n\n# Option 3: Reset all Docker containers\n# WARNING: Run this ONLY if your environment contains no other non-RAGFlow containers.\ndocker stop $(docker ps -aq)\ndocker rm $(docker ps -aq)\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-does-my-document-parsing-stall-at-under-one-percent",children:"Why does my document parsing stall at under one percent?"}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/infiniflow/ragflow/assets/93570324/3589cc25-c733-47d5-bbfc-fedb74a3da50",alt:"stall"})}),"\n",(0,i.jsx)(n.p,{children:"Click the red cross beside the 'parsing status' bar, then restart the parsing process to see if the issue remains. If the issue persists and your RAGFlow is deployed locally, try the following:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the log of your RAGFlow server to see if it is running properly:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker logs -f docker-ragflow-cpu-1\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Check if the ",(0,i.jsx)(n.strong,{children:"task_executor.py"})," process exists."]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check if your RAGFlow server can access hf-mirror.com or huggingface.com."}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-does-my-pdf-parsing-stall-near-completion-while-the-log-does-not-show-any-error",children:"Why does my pdf parsing stall near completion, while the log does not show any error?"}),"\n",(0,i.jsxs)(n.p,{children:["Click the red cross beside the 'parsing status' bar, then restart the parsing process to see if the issue remains. If the issue persists and your RAGFlow is deployed locally, the parsing process is likely killed due to insufficient RAM. Try increasing your memory allocation by increasing the ",(0,i.jsx)(n.code,{children:"MEM_LIMIT"})," value in ",(0,i.jsx)(n.strong,{children:"docker/.env"}),"."]}),"\n",(0,i.jsxs)(n.admonition,{type:"note",children:[(0,i.jsx)(n.p,{children:"Ensure that you restart up your RAGFlow server for your changes to take effect!"}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose stop\n"})}),(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose up -d\n"})})]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/infiniflow/ragflow/assets/93570324/563974c3-f8bb-4ec8-b241-adcda8929cbb",alt:"nearcompletion"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"index-failure",children:(0,i.jsx)(n.code,{children:"Index failure"})}),"\n",(0,i.jsx)(n.p,{children:"An index failure means that RAGFlow could not write the processed document chunks to the configured document engine."}),"\n",(0,i.jsx)(n.p,{children:"Check the task logs, embedding model, document engine connection, and system health. If you use Elasticsearch, OpenSearch, Infinity, or another supported document engine, verify that the corresponding service is running and accessible."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-check-the-log-of-ragflow",children:"How to check the log of RAGFlow?"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"tail -f ragflow/docker/ragflow-logs/*.log\n"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-check-the-status-of-each-component-in-ragflow",children:"How to check the status of each component in RAGFlow?"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the status of the RAGFlow Docker container:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"$ docker 
1compose ps\n"})}),"\n",(0,i.jsx)(n.p,{children:"Review the service logs:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker compose logs -f ragflow\n\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Use the ",(0,i.jsx)(n.a,{href:"/docs/http_api_reference#check-system-health",children:"system health API"})," to check the database, Redis, document engine, and object storage."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"A running container does not necessarily mean that the service inside it is healthy. Check the health API and logs for connection, port, DNS, and configuration errors."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"exception-cant-connect-to-es-cluster",children:(0,i.jsx)(n.code,{children:"Exception: Can't connect to ES cluster"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Check the status of the Elasticsearch Docker container:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"$ docker ps\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.em,{children:"The status of a healthy Elasticsearch component should look as follows:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{children:'91220e3285dd   docker.elastic.co/elasticsearch/elasticsearch:8.11.3   "/bin/tini -- /usr/l\u2026"   11 hours ago   Up 11 hours (healthy)     9300/tcp, 0.0.0.0:9200->9200/tcp, :::9200->9200/tcp           ragflow-es-01\n'})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Follow ",(0,i.jsx)(n.a,{href:"/docs/http_api_reference#check-system-health",children:"the system health API"})," to check the health status of the Elasticsearch service."]}),"\n",(0,i.jsx)(n.admonition,{title:"IMPORTANT",type:"danger",children:(0,i.jsx)(n.p,{children:"The status of a Docker container status does not necessarily reflect the status of the service. You may find that your services are unhealthy even when the corresponding Docker containers are up running. Possible reasons for this include network failures, incorrect port numbers, or DNS issues."})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["If your container keeps restarting, ensure ",(0,i.jsx)(n.code,{children:"vm.max_map_count"})," >= 262144. On Linux, update ",(0,i.jsx)(n.strong,{children:"/etc/sysctl.conf"})," to keep the change permanent. For macOS, see the following FAQ."]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.h3,{id:"cant-start-es-container-and-get-elasticsearch-did-not-exit-normally",children:["Can't start ES container and get ",(0,i.jsx)(n.code,{children:"Elasticsearch did not exit normally"})]}),"\n",(0,i.jsxs)(n.p,{children:["On Linux, this is because you forgot to update the ",(0,i.jsx)(n.code,{children:"vm.max_map_count"})," value in ",(0,i.jsx)(n.strong,{children:"/etc/sysctl.conf"})," and your change to this value was reset after a system reboot."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsxs)(n.h3,{id:"how-do-i-configure-vmmax_map_count-on-macos",children:["How do I configure ",(0,i.jsx)(n.code,{children:"vm.max_map_count"})," on macOS?"]}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"vm.max_map_count"})," is a Linux kernel parameter required only by Elasticsearch. It does not affect RAGFlow deployments that use Infinity as the document engine."]}),"\n",(0,i.jsx)(n.p,{children:"On Docker Desktop, set the value in its Linux virtual machine:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"docker run --rm --privileged alpine sysctl -w vm.max_map_count=262144\n"})}),"\n",(0,i.jsx)(n.p,{children:"This setting is temporary and is reset when Docker Desktop restarts."}),"\n",(0,i.jsx)(n.p,{children:"On Colima, check the current value inside its virtual machine:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"colima ssh -- sysctl vm.max_map_count\n"})}),"\n",(0,i.jsx)(n.p,{children:"To set the value temporarily:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"colima ssh -- sudo sysctl -w vm.max_map_count=262144\n"})}),"\n",(0,i.jsxs)(n.p,{children:["For a persistent setting, run ",(0,i.jsx)(n.code,{children:"colima start --edit"})," and add a provision script to ",(0,i.jsx)(n.code,{children:"colima.yaml"}),":"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-yaml",children:"provision:\n  - mode: system\
1n    script: |\n      #!/bin/bash\n      sysctl -w vm.max_map_count=262144\n"})}),"\n",(0,i.jsx)(n.p,{children:"Then restart Colima:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"colima stop\ncolima start\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsxs)(n.em,{children:["Contributed by ",(0,i.jsx)(n.a,{href:"https://github.com/helloxjade",children:"@helloxjade"}),"."]})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"datanullcode100messagenotfound-404-not-found",children:(0,i.jsx)(n.code,{children:'{"data":null,"code":100,"message":"<NotFound \'404: Not Found\'>"}'})}),"\n",(0,i.jsxs)(n.p,{children:["Your IP address or port number may be incorrect. If you are using the default configurations, enter ",(0,i.jsx)(n.code,{children:"http://<IP_OF_YOUR_MACHINE>"})," (",(0,i.jsx)(n.strong,{children:"NOT 9380, AND NO PORT NUMBER REQUIRED!"}),") in your browser. This should work."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"ollama---mistral-instance-running-at-12700111434-but-cannot-add-ollama-as-model-in-ragflow",children:(0,i.jsx)(n.code,{children:"Ollama - Mistral instance running at 127.0.0.1:11434 but cannot add Ollama as model in RagFlow"})}),"\n",(0,i.jsx)(n.p,{children:"A correct Ollama IP address and port is crucial to adding models to Ollama:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"If you are on cloud.ragflow.io, ensure that the server hosting Ollama has a publicly accessible IP address. Note that 127.0.0.1 is not a publicly accessible IP address."}),"\n",(0,i.jsx)(n.li,{children:"If you deploy RAGFlow locally, ensure that Ollama and RAGFlow are in the same LAN and can communicate with each other."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/docs/deploy_local_llm",children:"Deploy a local LLM"})," for more information."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"do-you-offer-examples-of-using-deepdoc-to-parse-pdf-or-other-files",children:"Do you offer examples of using DeepDoc to parse PDF or other files?"}),"\n",(0,i.jsxs)(n.p,{children:["Yes. See the parser entry points and examples in the ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/ragflow/tree/main/rag/app",children:(0,i.jsx)(n.code,{children:"rag/app"})})," directory."]}),"\n",(0,i.jsxs)(n.p,{children:["For example, ",(0,i.jsx)(n.code,{children:"rag/app/naive.py"})," shows how RAGFlow selects and invokes document parsers for different file types."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"filenotfounderror-errno-2-no-such-file-or-directory",children:(0,i.jsx)(n.code,{children:"FileNotFoundError: [Errno 2] No such file or directory"})}),"\n",(0,i.jsx)(n.p,{children:"This error means that RAGFlow cannot find a required file. Check the complete error message and stack trace to identify the missing path."}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"If a model file is missing, check whether the required model was downloaded successfully."}),"\n",(0,i.jsx)(n.li,{children:"If an uploaded document is missing, check the configured object storage service."}),"\n",(0,i.jsx)(n.li,{children:"If a temporary or local file is missing, check the container volume mappings and file permissions."}),"\n"]}),"\n",(0,i.jsxs)(n.h2,{id:"use-the-system-health-api-to-verify-the-configured-object-storage-and-other-dependencies",children:["Use the ",(0,i.jsx)(n.a,{href:"/docs/http_api_reference#check-system-health",children:"system health API"})," to verify the configured object storage and other dependencies."]}),"\n",(0,i.jsx)(n.h2,{id:"usage",children:"Usage"}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-run-ragflow-with-a-locally-deployed-llm",children:"How to run RAGFlow with a locally deployed LLM?"}),"\n",(0,i.jsxs)(n.p,{children:["You can use Ollama or Xinference to deploy local LLM. See ",(0,i.jsx)(n.a,{href:"/docs/deploy_local_llm",children:"here"})," for more information."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-add-an-llm-that-is-not-supported",children:"How to add an LLM that is not supported?"}),"\n",(0,i.jsxs)(n.p,{children:["If your model is not currently supported but has APIs compatible with those of OpenAI, click ",(0,i.jsx)(n.strong,{children:"OpenAI-API-Compatible"})," on the ",(0,i.jsx)(n.strong,{children:"Model providers"})," page to configure your model:"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.img,{src:"https://github.com/user-attachments/assets/b1e964f2-b86e-41af-8528-fd8a96dc5f6f",alt:"openai-api-compatible"})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-integrate-ragflow-with-ollama",children:"How to integrate RAGFlow with Ollama?"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"If RAGFlow is locally deployed, ensure that your RAGFlow and Ollama are in the same LAN."}),"\n",(0,i.jsx)(n.li,{children:"If you are using our online demo, ensure that the IP address of your Ollama server is public and accessible."}),"\n"]}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/docs/deploy_local_llm",children:"here"})," for more information."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-change-the-file-size-limit",children:"How to change the file size limit?"}),"\n",(0,i.jsx)(n.p,{children:"For a locally deployed RAGFlow: the total file size limit per upload is 1GB, with a batch upload limit of 32 files. There is no cap on the total number of files per account. To update this 1GB file size limit:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["In ",(0,i.jsx)(n.strong,{children:"docker/.env"}),", uncomment ",(0,i.jsx)(n.code,{children:"# MAX_CONTENT_LENGTH=1073741824"}),", adjust the value as needed, and note that ",(0,i.jsx)(n.code,{children:"1073741824"})," represents 1GB in bytes."]}),"\n",(0,i.jsxs)(n.li,{children:["If you update the value of ",(0,i.jsx)(n.code,{children:"MAX_CONTENT_LENGTH"})," in ",(0,i.jsx)(n.strong,{children:"docker/.env"}),", ensure that you update ",(0,i.jsx)(n.code,{children:"client_max_body_size"})," in ",(0,i.jsx)(n.strong,{children:"nginx/nginx.conf"})," accordingly."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"NOTE",type:"tip",children:(0,i.jsx)(n.p,{children:"It is not recommended to manually change the 32-file batch upload limit. However, if you use RAGFlow's HTTP API or Python SDK to upload files, the 32-file batch upload limit is automatically removed."})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-get-an-api-key-for-integration-with-third-party-applications",children:"How to get an API key for integration with third-party applications?"}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/docs/acquire_ragflow_api_key",children:"Acquire a RAGFlow API key"}),"."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-upgrade-ragflow",children:"How to upgrade RAGFlow?"}),"\n",(0,i.jsxs)(n.p,{children:["See ",(0,i.jsx)(n.a,{href:"/docs/upgrade_ragflow",children:"Upgrade RAGFlow"})," for more information."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-switch-the-document-engine-to-infinity",children:"How to switch the document engine to Infinity?"}),"\n",(0,i.jsxs)(n.p,{children:["To switch your document engine from Elasticsearch to ",(0,i.jsx)(n.a,{href:"https://github.com/infiniflow/infinity",children:"Infinity"}),":"]}),"\n",(0,i.jsx)(n.admonition,{title:"WARNING",type:"danger",children:(0,i.jsx)(n.p,{children:"Switching the document engine requires rebuilding the document indexes. The following command deletes Docker volumes and existing data. Back up any data you need before continuing."})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Stop all running containers and remove the existing volumes:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"$ docker 
1compose -f docker/docker-compose.yml down -v\n"})}),"\n",(0,i.jsx)(n.admonition,{title:"WARNING",type:"caution",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.code,{children:"-v"})," will delete all Docker container volumes, and the existing data will be cleared."]})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsxs)(n.p,{children:["Set the following value in ",(0,i.jsx)(n.strong,{children:"docker/.env"})," :"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-env",children:"   DOC_ENGINE=infinity\n"})}),"\n",(0,i.jsxs)(n.ol,{start:"3",children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:"Restart your Docker image:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"$ docker compose -f docker/docker-compose.yml up -d\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"where-are-uploaded-files-stored-in-ragflow",children:"Where are uploaded files stored in RAGFlow?"}),"\n",(0,i.jsx)(n.p,{children:"Uploaded files are stored in the configured object storage backend. MinIO is used by default, while other supported options include Amazon S3, Azure Blob Storage, Alibaba Cloud OSS, Google Cloud Storage, and OpenDAL-compatible storage."}),"\n",(0,i.jsx)(n.p,{children:"The internal bucket and object path depend on how and where the file was uploaded. Manage uploaded files through RAGFlow instead of relying on a fixed storage path."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-tune-batch-size-for-document-parsing-and-embedding",children:"How to tune batch size for document parsing and embedding?"}),"\n",(0,i.jsxs)(n.p,{children:["You can control the batch size for document parsing and embedding by setting the environment variables ",(0,i.jsx)(n.code,{children:"DOC_BULK_SIZE"})," and ",(0,i.jsx)(n.code,{children:"EMBEDDING_BATCH_SIZE"}),". Increasing these values may improve throughput for large-scale data processing, but will also increase memory usage. Adjust them according to your hardware resources."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-cant-i-retrieve-relevant-content-in-search-or-chat-even-though-the-document-was-parsed-successfully",children:"Why can't I retrieve relevant content in Search or Chat even though the document was parsed successfully?"}),"\n",(0,i.jsx)(n.p,{children:"Successful parsing only means that the document has been parsed and chunked. It does not guarantee that relevant content can be retrieved."}),"\n",(0,i.jsxs)(n.p,{children:["First, use ",(0,i.jsx)(n.strong,{children:"Retrieval testing"})," to check whether the expected chunks can be retrieved. If not, check the chunking results, embedding model, similarity threshold, and reranker settings. If the expected chunks are retrieved but Chat still gives an incorrect answer, check the Chat retrieval settings, system prompt, and LLM."]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-does-the-same-query-produce-different-results-in-retrieval-testing-search-and-chat",children:"Why does the same query produce different results in Retrieval testing, Search, and Chat?"}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Retrieval testing"})," is mainly used to evaluate whether relevant chunks can be retrieved from a dataset. ",(0,i.jsx)(n.strong,{children:"Search"})," further filters and ranks retrieved content according to its configuration, while ",(0,i.jsx)(n.strong,{children:"Chat"})," uses the retrieved content as context for an LLM to generate an answer."]}),"\n",(0,i.jsx)(n.p,{children:"Therefore, even when using the same dataset, differences in retrieval settings, reranking, and answer generation can lead to different results."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-can-i-tell-whether-a-problem-comes-from-document-parsing-chunking-retrieval-or-answer-generation",children:"How can I tell whether a problem comes from document parsing, chunking, retrieval, or answer generation?"}),"\n",(0,i.jsx)(n.p,{children:"Check the RAG pipeline step by step:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Verify that the document has been parsed correctly."}),"\n",(0,i.jsx)(n.li,{children:"Check whether the resulting chunks contain the expected content."}),"\n",(0,i.jsxs)(n.li,{children:["Use ",(0,i.jsx)(n.strong,{children:"Retrieval testing"})," to verify that the relevant chunks can be retrieved."]}),"\n",(0,i.jsx)(n.li,{children:"If retrieval works correctly but Chat or Agent produces an unexpected answer, check the application settings, system prompt, and LLM."}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"This helps identify which stage of the pipeline is causing the problem."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"can-the-same-dataset-be-used-by-search-ch
1at-and-agent",children:"Can the same dataset be used by Search, Chat, and Agent?"}),"\n",(0,i.jsx)(n.p,{children:"Yes. The same dataset can be used by different knowledge applications and Agents."}),"\n",(0,i.jsx)(n.p,{children:"The dataset manages and indexes the underlying knowledge, while Search, Chat, and Agent use that knowledge in different ways. Changing application-level settings generally does not modify the original documents or chunks in the dataset."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"should-i-adjust-chunking-retrieval-settings-or-models-first",children:"Should I adjust chunking, retrieval settings, or models first?"}),"\n",(0,i.jsxs)(n.p,{children:["Start by verifying that the document is parsed and chunked correctly. Then use ",(0,i.jsx)(n.strong,{children:"Retrieval testing"})," to evaluate retrieval quality."]}),"\n",(0,i.jsx)(n.p,{children:"If retrieval needs improvement, adjust settings such as the similarity threshold, vector similarity weight, or reranker. If retrieval results are already relevant but the generated answer is still unsatisfactory, consider adjusting the prompt or changing the LLM."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"what-needs-to-be-reprocessed-after-changing-the-embedding-model-reranker-or-llm",children:"What needs to be reprocessed after changing the embedding model, reranker, or LLM?"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Changing the ",(0,i.jsx)(n.strong,{children:"embedding model"})," requires rebuilding the document indexes. RAGFlow does not normally allow you to change the embedding model after documents in the dataset have been parsed. Create a new dataset or remove the existing parsed data before using another embedding model."]}),"\n",(0,i.jsxs)(n.li,{children:["Changing the ",(0,i.jsx)(n.strong,{children:"reranker"})," affects only the ranking of retrieved results and does not require reparsing the documents."]}),"\n",(0,i.jsxs)(n.li,{children:["Changing the ",(0,i.jsx)(n.strong,{children:"LLM"})," affects query understanding and answer generation and does not normally require reparsing the dataset."]}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"why-can-the-model-still-hallucinate-when-the-answer-exists-in-the-dataset",children:"Why can the model still hallucinate when the answer exists in the dataset?"}),"\n",(0,i.jsx)(n.p,{children:"Having the correct information in the dataset does not guarantee that it will be retrieved or that the LLM will strictly follow the retrieved context."}),"\n",(0,i.jsx)(n.p,{children:"Check whether the content has been indexed correctly, whether the relevant chunks are retrieved, and whether the model uses the retrieved context appropriately when generating its answer."}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-accelerate-the-question-answering-speed-of-my-chat-assistant",children:"How to accelerate the question-answering speed of my chat assistant?"}),"\n",(0,i.jsx)(n.p,{children:"To reduce response latency, consider the following:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use a faster LLM with lower inference latency."}),"\n",(0,i.jsxs)(n.li,{children:["Reduce the number of retrieved chunks by adjusting retrieval parameters such as ",(0,i.jsx)(n.strong,{children:"Top N"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"Keep prompts concise and avoid unnecessary context."}),"\n",(0,i.jsx)(n.li,{children:"Disable optional features that require additional model calls when they are not needed."}),"\n",(0,i.jsx)(n.li,{children:"Use a reranker only when it provides a meaningful improvement in retrieval quality."}),"\n",(0,i.jsx)(n.li,{children:"Make sure the deployed model service has sufficient computing resources and low network latency."}),"\n"]}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-accelerate-the-question-answering-speed-of-my-agent",children:"How to accelerate the question-answering speed of my Agent?"}),"\n",(0,i.jsx)(n.p,{children:"Agent response time depends on the number of components, model calls, and external services involved in the workflow.\nTo improve response speed:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:"Use faster models for components that do not require strong reasoning capabilities."}),"\n",(0,i.jsx)(n.li,{children:"Reduce unnecessary LLM, retrieval, tool, and HTTP calls."}),"\n",(0,i.jsx)(n.li,{children:"Simplify the Agent workflow and avoid excessively long execution paths."}),"\n",(0,i.jsx)(n.li,{children:"Limit the number of iterations in loops or reasoning-intensive components."}),"\n",(0,i.jsx)(n.li,{children:"Reduce the amount of context passed between components where possible."}),"\n",(0,i.jsx)(n.li,{children:"Run independent operations in parallel when the workflow supp
1orts it."}),"\n",(0,i.jsx)(n.li,{children:"Make sure external APIs and model services used by the Agent have low latency."}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"how-to-use-mineru-to-parse-pdf-documents",children:"How to use MinerU to parse PDF documents?"}),"\n",(0,i.jsxs)(n.p,{children:["From v0.22.0 onwards, RAGFlow includes MinerU (\u2265 3.3.0) as an optional PDF parser of multiple backends. Please note that RAGFlow acts only as a ",(0,i.jsx)(n.em,{children:"remote client"})," for MinerU, calling the MinerU API to parse PDFs and reading the returned files. To use this feature:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsx)(n.li,{children:"Prepare a reachable MinerU API service (FastAPI server, MinerU \u2265 3.3.0)."}),"\n",(0,i.jsxs)(n.li,{children:["In the ",(0,i.jsx)(n.strong,{children:".env"})," file or from the ",(0,i.jsx)(n.strong,{children:"Model providers"})," page in the UI, configure RAGFlow as a remote client to MinerU:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MINERU_APISERVER"}),": The MinerU API endpoint (e.g., ",(0,i.jsx)(n.code,{children:"http://mineru-host:8886"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MINERU_BACKEND"}),": The MinerU backend (matches current MinerU API / CLI ",(0,i.jsx)(n.code,{children:"-b"})," values):","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:'"pipeline"'})," (default)"]}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'"vlm-engine"'})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'"hybrid-engine"'})}),"\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:'"vlm-http-client"'})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:'"hybrid-http-client"'}),"."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MINERU_SERVER_URL"}),": Required when ",(0,i.jsx)(n.code,{children:"MINERU_BACKEND"})," is ",(0,i.jsx)(n.code,{children:'"vlm-http-client"'})," or ",(0,i.jsx)(n.code,{children:'"hybrid-http-client"'}),"; unused for other backends. The downstream OpenAI-compatible HTTP server (e.g., ",(0,i.jsx)(n.code,{children:"http://vllm-host:30000"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MINERU_OUTPUT_DIR"}),": (optional) The local directory for holding the outputs of the MinerU API service (zip/JSON) before ingestion."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"MINERU_DELETE_OUTPUT"}),": Whether to delete temporary output when a temporary directory is used:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"1"}),": Delete."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:"0"}),": Retain."]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["In the web UI, navigate to your dataset's ",(0,i.jsx)(n.strong,{children:"Configuration"})," page and find the ",(0,i.jsx)(n.strong,{children:"Ingestion pipeline"})," section:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["If you decide to use a chunking method from the ",(0,i.jsx)(n.strong,{children:"Built-in"})," dropdown, ensure it supports PDF parsing, then select ",(0,i.jsx)(n.strong,{children:"MinerU"})," from the ",(0,i.jsx)(n.strong,{children:"PDF parser"})," dropdown."]}),"\n",(0,i.jsxs)(n.li,{children:["If you use a custom ingestion pipeline instead, select ",(0,i.jsx)(n.strong,{children:"MinerU"})," in the ",(0,i.jsx)(n.strong,{children:"PDF parser"})," section of the ",(0,i.jsx)(n.strong,{children:"Parser"})," component."]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{type:"note",children:(0,i.jsxs)(n.p,{children:["All MinerU environment variables are optional. When set, these values are used to auto-provision a MinerU OCR model for the tenant on first use. To avoid auto-provisioning, skip the environment variable settings and only configure MinerU from the ",(0,i.jsx)(n.strong,{children:"Model providers"})," page in the UI."]})}),"\n",(0,i.jsx)(n.admonition,{title:"WARNING",type:"caution",children:(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Upgrade note:"})," Older backend names (",(0,i.jsx)(n.code,{children:"vlm-transformers"}),", ",(0,i.jsx)(n.code,{children:"vlm-vllm-engine"}),", ",(0,i.jsx)(n.code,{children:"vlm-mlx-engine"}),", ",(0,i.jsx)(n.code,{children:"vlm-vllm-async-engine"}),", ",(0,i.jsx)(n.code,{children:"vlm-lmdeploy-engine"}),") are no longer accepted. After upgrading, re-select a current backend in ",(0,i.jsx)(n.strong,{children:"Model providers"})," (or update ",(0,i.jsx)(n.code,{children:"MINERU_BACKEND"}),") and ensure your MinerU API service is \u2265 3.3.0."]})}),"\n",(0,i.jsx)(n.admonition,{title:"WARNING",type:"caution",children:(0,i.jsxs)(n.p,{children:["Third-party visual models are marked ",(0,i.jsx)(n.strong,{children:"Experimental"}),", because we have not fully tested these models for the aforementioned data extraction tasks."]})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-configure-mineru-specific-settings",children:"How to configure MinerU-specific settings?"}),"\n",(0,i.jsx)(n.p,{children:"The table below summarizes the most frequently used MinerU environment variables for remote MinerU:"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environment variable"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Example"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_APISERVER"})}),(0,i.jsx)(n.td,{children:"URL of the MinerU API service"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:"unset"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_APISERVER=http://your-mineru-server:8886"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_BACKEND"})}),(0,i.jsx)(n.td,{children:"MinerU parsing backend"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"pipeline"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_BACKEND=pipeline|vlm-engine|hybrid-engine|vlm-http-cl
1ient|hybrid-http-client"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_SERVER_URL"})}),(0,i.jsxs)(n.td,{children:["Required for ",(0,i.jsx)(n.code,{children:"vlm-http-client"})," / ",(0,i.jsx)(n.code,{children:"hybrid-http-client"}),"; unused otherwise"]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.em,{children:"unset"})}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_SERVER_URL=http://your-vllm-server-ip:30000"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_OUTPUT_DIR"})}),(0,i.jsx)(n.td,{children:"Directory for MinerU output files"}),(0,i.jsx)(n.td,{children:"System-defined temporary directory"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_OUTPUT_DIR=/home/ragflow/mineru/output"})})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_DELETE_OUTPUT"})}),(0,i.jsx)(n.td,{children:"Whether to delete MinerU output directory when a temp dir is used"}),(0,i.jsxs)(n.td,{children:[(0,i.jsx)(n.code,{children:"1"})," (delete temp output)"]}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"MINERU_DELETE_OUTPUT=0"})})]})]})]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Set ",(0,i.jsx)(n.code,{children:"MINERU_APISERVER"})," to point RAGFlow to your MinerU API server."]}),"\n",(0,i.jsxs)(n.li,{children:["Set ",(0,i.jsx)(n.code,{children:"MINERU_BACKEND"})," to specify a parsing backend."]}),"\n",(0,i.jsxs)(n.li,{children:["If using ",(0,i.jsx)(n.code,{children:'"vlm-http-client"'})," or ",(0,i.jsx)(n.code,{children:'"hybrid-http-client"'}),", set ",(0,i.jsx)(n.code,{children:"MINERU_SERVER_URL"})," to your OpenAI-compatible server's URL. MinerU API expects ",(0,i.jsx)(n.code,{children:"backend=<http-client-backend>"})," and ",(0,i.jsx)(n.code,{children:"server_url=http://<server>:30000"})," in the request body."]}),"\n",(0,i.jsxs)(n.li,{children:["Set ",(0,i.jsx)(n.code,{children:"MINERU_OUTPUT_DIR"})," to specify where RAGFlow stores MinerU API output; otherwise, a system temp directory is used."]}),"\n",(0,i.jsxs)(n.li,{children:["Set ",(0,i.jsx)(n.code,{children:"MINERU_DELETE_OUTPUT"})," to ",(0,i.jsx)(n.code,{children:"0"})," to keep MinerU's temp output (useful for debugging)."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"NOTE",type:"tip",children:(0,i.jsxs)(n.p,{children:["For information about other environment variables natively supported by MinerU, see ",(0,i.jsx)(n.a,{href:"https://opendatalab.github.io/MinerU/usage/cli_tools/#environment-variables-description",children:"here"}),"."]})}),"\n",(0,i.jsx)(n.hr,{}),"\n",(0,i.jsx)(n.h3,{id:"how-to-use-mineru-with-a-vllm-server-for-document-parsing",children:"How to use MinerU with a vLLM server for document parsing?"}),"\n",(0,i.jsxs)(n.p,{children:["RAGFlow supports MinerU's ",(0,i.jsx)(n.code,{children:"vlm-http-client"})," and ",(0,i.jsx)(n.code,{children:"hybrid-http-client"})," backends, enabling you to delegate document parsing tasks to a remote OpenAI-compatible server (for example vLLM) while calling MinerU via HTTP. To configure:"]}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Ensure a MinerU API service is reachable (for example ",(0,i.jsx)(n.code,{children:"http://mineru-host:8886"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:["Set up or point to an OpenAI-compatible HTTP server (for example ",(0,i.jsx)(n.code,{children:"http://vllm-host:30000"}),")."]}),"\n",(0,i.jsxs)(n.li,{children:["Configure the following in your ",(0,i.jsx)(n.strong,{children:"docker/.env"})," file (or your shell if running from source):","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsx)(n.li,{children:(0,i.jsx)(n.code,{children:"MINERU_APISERVER=http://mineru-host:8886"})}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:'MINERU_BACKEND="vlm-http-client"'})," (or ",(0,i.jsx)(n.code,{children:'"hybrid-http-client"'}),")"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.code,{children:'MINERU_SERVER_URL="http://vllm-host:30000"'}),"\nMinerU API calls expect ",(0,i.jsx)(n.code,{children:"backend=vlm-http-cl
1ient"})," (or ",(0,i.jsx)(n.code,{children:"hybrid-http-client"}),") and ",(0,i.jsx)(n.code,{children:"server_url=http://<server>:30000"})," in the request body."]}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["Configure ",(0,i.jsx)(n.code,{children:"MINERU_OUTPUT_DIR"})," / ",(0,i.jsx)(n.code,{children:"MINERU_DELETE_OUTPUT"})," as desired to manage the returned zip/JSON before ingestion."]}),"\n"]}),"\n",(0,i.jsx)(n.admonition,{title:"NOTE",type:"tip",children:(0,i.jsxs)(n.p,{children:["When using an ",(0,i.jsx)(n.code,{children:"*-http-client"})," backend, the RAGFlow server requires no GPU, only network connectivity. This enables cost-effective distributed deployment with multiple RAGFlow instances sharing one remote inference server."]})}),"\n",(0,i.jsx)(n.h3,{id:"how-to-use-an-external-docling-serve-server-for-document-parsing",children:"How to use an external Docling Serve server for document parsing?"}),"\n",(0,i.jsx)(n.p,{children:"RAGFlow supports Docling in two modes:"}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"Local Docling"})," (existing mode): install Docling in the RAGFlow runtime (",(0,i.jsx)(n.code,{children:"USE_DOCLING=true"}),") and parse in-process."]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"External Docling Serve"})," (remote mode): point RAGFlow to a Docling Serve endpoint."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:"To enable remote mode, set:"}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"DOCLING_SERVER_URL=http://your-docling-serve-host:5001\n"})}),"\n",(0,i.jsx)(n.p,{children:"Behavior:"}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["When ",(0,i.jsx)(n.code,{children:"DOCLING_SERVER_URL"})," is set, RAGFlow sends PDFs to Docling Serve using ",(0,i.jsx)(n.code,{children:"/v1/convert/source"})," (and falls back to ",(0,i.jsx)(n.code,{children:"/v1alpha/convert/source"})," for older servers)."]}),"\n",(0,i.jsxs)(n.li,{children:["When ",(0,i.jsx)(n.code,{children:"DOCLING_SERVER_URL"})," is not set, RAGFlow uses local in-process Docling."]}),"\n"]}),"\n",(0,i.jsx)(n.h3,{id:"how-to-use-paddleocr-for-document-parsing",children:"How to use PaddleOCR for document parsing?"}),"\n",(0,i.jsxs)(n.p,{children:["From v0.24.0 onwards, RAGFlow includes PaddleOCR as an optional PDF parser. Please note that RAGFlow acts only as a ",(0,i.jsx)(n.em,{children:"remote client"})," for PaddleOCR, calling the PaddleOCR API to parse PDFs and reading the returned files."]}),"\n",(0,i.jsx)(n.p,{children:"There are two main ways to configure and use PaddleOCR in RAGFlow:"}),"\n",(0,i.jsx)(n.h4,{id:"1-using-paddleocr-official-api",children:"1. Using PaddleOCR Official API"}),"\n",(0,i.jsx)(n.p,{children:"This method uses PaddleOCR's official API service with an access token."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 1: Configure RAGFlow"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Via Environment Variables:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"# In your docker/.env file:\nPADDLEOCR_API_URL=https://your-paddleocr-api-endpoint\nPADDLEOCR_ALGORITHM=PaddleOCR-VL\nPADDLEOCR_ACCESS_TOKEN=your-access-token-here\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Via UI:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Navigate to ",(0,i.jsx)(n.strong,{children:"Model providers"})," page"]}),"\n",(0,i.jsx)(n.li,{children:'Add a new OCR model with factory type "PaddleOCR"'}),"\n",(0,i.jsxs)(n.li,{children:["Configure the following fields:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PaddleOCR API URL"}),": Your PaddleOCR API endpoint"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PaddleOCR Algorithm"}),": Select the algorithm corresponding to the API endpoint"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"AI Studio Access Token"}),": Your access token for the PaddleOCR API"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 2: Usage in Dataset Configuration"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["In your dataset's ",(0,i.jsx)(n.strong,{children:"Configuration"})," page, find the ",(0,i.jsx)(n.strong,{children:"Ingestion pipeline"})," section"]}),"\n",(0,i.jsxs)(n.li,{children:["If using built-in chunking methods that support PDF parsing, select ",(0,i.jsx)(n.strong,{children:"PaddleOCR"})," from the ",(0,i.jsx)(n.strong,{children:"PDF parser"})," dropdown"]}),"\n",(0,i.jsxs)(n.li,{children:["If using custom ingestion pipeline, select ",(0,i.jsx)(n.strong,{children:"PaddleOCR"})," in the ",(0,i.jsx)(n.strong,{children:"Parser"})," component"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Notes:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["To obtain the API URL, visit the ",(0,i.jsx)(n.a,{href:"https://aistudio.baidu.com/paddleocr",children:"PaddleOCR official website"}),", click the ",(0,i.jsx)(n.strong,{children:"API"})," button, choose the example code for the specific algorithm you want to use (e.g., PaddleOCR-VL), and copy the ",(0,i.jsx)(n.code,{children:"API_URL"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Access tokens can be obtained from the ",(0,i.jsx)(n.a,{href:"https://aistudio.baidu.com/account/accessToken",children:"AI Studio platform"}),"."]}),"\n",(0,i.jsx)(n.li,{children:"This method requires internet connectivity to reach the official PaddleOCR API."}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"2-using-self-hosted-paddleocr-service",children:"2. Using Self-Hosted PaddleOCR Service"}),"\n",(0,i.jsx)(n.p,{children:"This method allows you to deploy your own PaddleOCR service and use it without an access token."}),"\n",(0,i.jsxs)(n.p,{children:[(0,i.jsx)(n.strong,{children:"Step 1: Deploy PaddleOCR Service"}),"\nFollow the ",(0,i.jsx)(n.a,{href:"https://www.paddleocr.ai/latest/en/version3.x/inference_deployment/serving/serving.html",children:"PaddleOCR serving documentation"})," to deploy your own service. For layout parsing, you can use an endpoint like:"]}
1),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"http://localhost:8080/layout-parsing\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 2: Configure RAGFlow"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Via Environment Variables:"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"PADDLEOCR_API_URL=http://localhost:8080/layout-parsing\nPADDLEOCR_ALGORITHM=PaddleOCR-VL\n# No access token required for self-hosted service\n"})}),"\n"]}),"\n",(0,i.jsxs)(n.li,{children:["\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Via UI:"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Navigate to ",(0,i.jsx)(n.strong,{children:"Model providers"})," page"]}),"\n",(0,i.jsx)(n.li,{children:'Add a new OCR model with factory type "PaddleOCR"'}),"\n",(0,i.jsxs)(n.li,{children:["Configure the following fields:","\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PaddleOCR API URL"}),": The endpoint of your deployed service"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"PaddleOCR Algorithm"}),": Select the algorithm corresponding to the deployed service"]}),"\n",(0,i.jsxs)(n.li,{children:[(0,i.jsx)(n.strong,{children:"AI Studio Access Token"}),": Leave empty"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 3: Usage in Dataset Configuration"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["In your dataset's ",(0,i.jsx)(n.strong,{children:"Configuration"})," page, find the ",(0,i.jsx)(n.strong,{children:"Ingestion pipeline"})," section"]}),"\n",(0,i.jsxs)(n.li,{children:["If using built-in chunking methods that support PDF parsing, select ",(0,i.jsx)(n.strong,{children:"PaddleOCR"})," from the ",(0,i.jsx)(n.strong,{children:"PDF parser"})," dropdown"]}),"\n",(0,i.jsxs)(n.li,{children:["If using custom ingestion pipeline, select ",(0,i.jsx)(n.strong,{children:"PaddleOCR"})," in the ",(0,i.jsx)(n.strong,{children:"Parser"})," component"]}),"\n"]}),"\n",(0,i.jsx)(n.h4,{id:"environment-variables-summary",children:"Environment Variables Summary"}),"\n",(0,i.jsxs)(n.table,{children:[(0,i.jsx)(n.thead,{children:(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.th,{children:"Environment Variable"}),(0,i.jsx)(n.th,{children:"Description"}),(0,i.jsx)(n.th,{children:"Default"}),(0,i.jsx)(n.th,{children:"Required"})]})}),(0,i.jsxs)(n.tbody,{children:[(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"PADDLEOCR_API_URL"})}),(0,i.jsx)(n.td,{children:"PaddleOCR API endpoint URL"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:'""'})}),(0,i.jsx)(n.td,{children:"Yes, when using environment variables"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"PADDLEOCR_ALGORITHM"})}),(0,i.jsx)(n.td,{children:"Algorithm to use for parsing"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:'"PaddleOCR-VL"'})}),(0,i.jsx)(n.td,{children:"No"})]}),(0,i.jsxs)(n.tr,{children:[(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"PADDLEOCR_ACCESS_TOKEN"})}),(0,i.jsx)(n.td,{children:"Access token for official API"}),(0,i.jsx)(n.td,{children:(0,i.jsx)(n.code,{children:"None"})}),(0,i.jsx)(n.td,{children:"Only when using official API"})]})]})]}),"\n",(0,i.jsx)(n.p,{children:"Environment variables can be used for auto-provisioning, but are not required if configuring via UI. When environment variables are set, these values are used to auto-provision a PaddleOCR model for the tenant on first use."}),"\n",(0,i.jsx)(n.h3,{id:"how-do-i-use-ollama-with-ragflow-for-local-llm-inference",children:"How do I use Ollama with RAGFlow for local LLM inference?"}),"\n",(0,i.jsx)(n.p,{children:"RAGFlow supports Ollama as a local model provider for private, offline inference."}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 1: Start Ollama and pull a model"})}),"\n",(0,i.jsx)(n.pre,{children:(0,i.jsx)(n.code,{className:"language-bash",children:"export OLLAMA_HOST=0.0.0.0\nollama serve\nollama pull llama3\n"})}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 2: Add Ollama in RAGFlow"})}),"\n",(0,i.jsxs)(n.ol,{children:["\n",(0,i.jsxs)(n.li,{children:["Go to ",(0,i.jsx)(n.strong,{children:"Settings"})," > ",(0,i.jsx)(n.strong,{children:"Model providers"})," > ",(0,i.jsx)(n.strong,{children:"Ollama"}),"."]}),"\n",(0,i.jsxs)(n.li,{children:["Set the Base URL to ",(0,i.jsx)(n.code,{children:"http://host.docker.internal:11434"})," (Docker) or ",(0,i.jsx)(n.code,{children:"http://localhost:11434"})," (bare-metal)."]}),"\n",(0,i.jsxs)(n.li,{children:["Enter the model name (e.g., ",(0,i.jsx)(n.code,{children:"llama3"}),") and click ",(0,i.jsx)(n.strong,{children:"Save"}),"."]}),"\n"]}),"\n",(0,i.jsx)(n.p,{children:(0,i.jsx)(n.strong,{children:"Step 3: Use Ollama in your assistant"})}),"\n",(0,i.jsxs)(n.ul,{children:["\n",(0,i.jsxs)(n.li,{children:["Open an assistant's ",(0,i.jsx)(n.strong,{children:"Configuration"})," page and select the Ollama model under ",(0,i.jsx)(n.strong,{children:"Chat model"}),"."]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(h,{...e})}):h(e)}},20366(e,n,r){r.d(n,{i:()=>a});var s=r(96540),i=r(6342);function o(e){const n=e.getBoundingClientRect();return n.top===n.bottom?o(e.parentNode):n}function t(e,{anchorTopOffset:n}){const r=e.find(e=>o(e).top>=n);if(r){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(o(r))?r:e[e.indexOf(r)-1]??null}return e[e.length-1]??null}function l(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:n}}=(0,i.p)();return(0,s.useEffect)(()=>{e.current=n?0:document.querySelector(".navbar").clientHeight},[n]),e}function a(e){const n=(0,s.useRef)(void 0),r=l();(0,s.useEffect)(()=>
1{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:i,minHeadingLevel:o,maxHeadingLevel:l}=e;function a(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),a=function({minHeadingLevel:e,maxHeadingLevel:n}){const r=[];for(let s=e;s<=n;s+=1)r.push(`h${s}.anchor`);return Array.from(document.querySelectorAll(r.join()))}({minHeadingLevel:o,maxHeadingLevel:l}),d=t(a,{anchorTopOffset:r.current}),c=e.find(e=>d&&d.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e));e.forEach(e=>{!function(e,r){r?(n.current&&n.current!==e&&n.current.classList.remove(i),e.classList.add(i),n.current=e):e.classList.remove(i)}(e,e===c)})}return document.addEventListener("scroll",a),document.addEventListener("resize",a),a(),()=>{document.removeEventListener("scroll",a),document.removeEventListener("resize",a)}},[e,r])}},37243(e,n,r){r.d(n,{h:()=>t});var s=r(96540);function i(e){const n=e.map(e=>({...e,parentIndex:-1,children:[]})),r=Array(7).fill(-1);n.forEach((e,n)=>{const s=r.slice(2,e.level);e.parentIndex=Math.max(...s),r[e.level]=n});const s=[];return n.forEach(e=>{const{parentIndex:r,...i}=e;r>=0?n[r].children.push(i):s.push(i)}),s}function o({toc:e,minHeadingLevel:n,maxHeadingLevel:r}){return e.flatMap(e=>{const s=o({toc:e.children,minHeadingLevel:n,maxHeadingLevel:r});return function(e){return e.level>=n&&e.level<=r}(e)?[{...e,children:s}]:s})}function t({toc:e,minHeadingLevel:n,maxHeadingLevel:r}){return(0,s.useMemo)(()=>o({toc:i(e),minHeadingLevel:n,maxHeadingLevel:r}),[e,n,r])}},21741(e,n,r){r.d(n,{A:()=>o});r(96540);var s=r(4908),i=r(74848);function o({toc:e,minHeadingLevel:n,maxHeadingLevel:r}){return(0,i.jsx)("div",{className:"table-of-contents-inline",children:(0,i.jsx)(s.A,{toc:e,minHeadingLevel:n,maxHeadingLevel:r,className:"table-of-contents",linkClassName:null})})}},4908(e,n,r){r.d(n,{A:()=>u});var s=r(96540),i=r(6342),o=r(37243),t=r(20366),l=r(28774),a=r(74848);function d({toc:e,className:n,linkClassName:r,isChild:s}){return e.length?(0,a.jsx)("ul",{className:s?void 0:n,children:e.map(e=>(0,a.jsxs)("li",{children:[(0,a.jsx)(l.A,{to:`#${e.id}`,className:r??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,a.jsx)(d,{isChild:!0,toc:e.children,className:n,linkClassName:r})]},e.id))}):null}const c=s.memo(d);var h=r(46125);function u({toc:e,className:n,linkClassName:r="toc-item__link",linkActiveClassName:l="text-standard",minHeadingLevel:d,maxHeadingLevel:u,...p}){const x=(0,i.p)(),m=d??x.tableOfContents.minHeadingLevel,g=u??x.tableOfContents.maxHeadingLevel,f=(0,o.h)({toc:e,minHeadingLevel:m,maxHeadingLevel:g}),j=(0,s.useMemo)(()=>{if(r&&l)return{linkClassName:r,linkActiveClassName:l,minHeadingLevel:m,maxHeadingLevel:g}},[r,l,m,g]);return(0,t.i)(j),(0,a.jsx)(c,{toc:f,className:(0,h.cn)("table-of-contents",n),linkClassName:r,...p})}},28453(e,n,r){r.d(n,{R:()=>t,x:()=>l});var s=r(96540);const i={},o=s.createContext(i);function t(e){const n=s.useContext(o);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(i):e.components||i:t(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.