Merge branch 'main' into docs-env-vars

This commit is contained in:
Mendon Kissling 2025-10-02 10:23:47 -04:00
commit 3801dd5856
13 changed files with 166 additions and 61 deletions

View file

@ -0,0 +1,4 @@
:::info
OpenRAG is is currently in public preview.
Development is ongoing, and the features and functionality are subject to change.
:::

View file

@ -7,7 +7,9 @@ import Icon from "@site/src/components/icon/icon";
import Tabs from '@theme/Tabs'; import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem'; import TabItem from '@theme/TabItem';
import PartialModifyFlows from '@site/docs/_partial-modify-flows.mdx'; import PartialModifyFlows from '@site/docs/_partial-modify-flows.mdx';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
OpenRAG leverages Langflow's Agent component to power the OpenRAG OpenSearch Agent flow. OpenRAG leverages Langflow's Agent component to power the OpenRAG OpenSearch Agent flow.

View file

@ -7,6 +7,9 @@ import Icon from "@site/src/components/icon/icon";
import Tabs from '@theme/Tabs'; import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem'; import TabItem from '@theme/TabItem';
import PartialModifyFlows from '@site/docs/_partial-modify-flows.mdx'; import PartialModifyFlows from '@site/docs/_partial-modify-flows.mdx';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
OpenRAG uses [Docling](https://docling-project.github.io/docling/) for its document ingestion pipeline. OpenRAG uses [Docling](https://docling-project.github.io/docling/) for its document ingestion pipeline.
More specifically, OpenRAG uses [Docling Serve](https://github.com/docling-project/docling-serve), which starts a `docling-serve` process on your local machine and runs Docling ingestion through an API service. More specifically, OpenRAG uses [Docling Serve](https://github.com/docling-project/docling-serve), which starts a `docling-serve` process on your local machine and runs Docling ingestion through an API service.

View file

@ -7,6 +7,9 @@ import Icon from "@site/src/components/icon/icon";
import Tabs from '@theme/Tabs'; import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem'; import TabItem from '@theme/TabItem';
import PartialModifyFlows from '@site/docs/_partial-modify-flows.mdx'; import PartialModifyFlows from '@site/docs/_partial-modify-flows.mdx';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
OpenRAG uses [OpenSearch](https://docs.opensearch.org/latest/) for its vector-backed knowledge store. OpenRAG uses [OpenSearch](https://docs.opensearch.org/latest/) for its vector-backed knowledge store.
OpenSearch provides powerful hybrid search capabilities with enterprise-grade security and multi-tenancy support. OpenSearch provides powerful hybrid search capabilities with enterprise-grade security and multi-tenancy support.

View file

@ -4,6 +4,9 @@ slug: /get-started/docker
--- ---
import PartialOnboarding from '@site/docs/_partial-onboarding.mdx'; import PartialOnboarding from '@site/docs/_partial-onboarding.mdx';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
There are two different Docker Compose files. There are two different Docker Compose files.
They deploy the same applications and containers, but to different environments. They deploy the same applications and containers, but to different environments.

View file

@ -6,6 +6,9 @@ slug: /install
import Tabs from '@theme/Tabs'; import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem'; import TabItem from '@theme/TabItem';
import PartialOnboarding from '@site/docs/_partial-onboarding.mdx'; import PartialOnboarding from '@site/docs/_partial-onboarding.mdx';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
OpenRAG can be installed in multiple ways: OpenRAG can be installed in multiple ways:

View file

@ -6,6 +6,9 @@ slug: /quickstart
import Icon from "@site/src/components/icon/icon"; import Icon from "@site/src/components/icon/icon";
import Tabs from '@theme/Tabs'; import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem'; import TabItem from '@theme/TabItem';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
Get started with OpenRAG by loading your knowledge, swapping out your language model, and then chatting with the OpenRAG API. Get started with OpenRAG by loading your knowledge, swapping out your language model, and then chatting with the OpenRAG API.

View file

@ -3,7 +3,9 @@ title: Terminal User Interface (TUI) commands
slug: /get-started/tui slug: /get-started/tui
--- ---
# OpenRAG TUI Guide import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
The OpenRAG Terminal User Interface (TUI) provides a streamlined way to set up, configure, and monitor your OpenRAG deployment directly from the terminal, on any operating system. The OpenRAG Terminal User Interface (TUI) provides a streamlined way to set up, configure, and monitor your OpenRAG deployment directly from the terminal, on any operating system.

View file

@ -3,6 +3,10 @@ title: What is OpenRAG?
slug: / slug: /
--- ---
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
OpenRAG is an open-source package for building agentic RAG systems. OpenRAG is an open-source package for building agentic RAG systems.
It supports integration with a wide range of orchestration tools, vector databases, and LLM providers. It supports integration with a wide range of orchestration tools, vector databases, and LLM providers.

View file

@ -5,6 +5,9 @@ slug: /support/troubleshoot
import Tabs from '@theme/Tabs'; import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem'; import TabItem from '@theme/TabItem';
import PartialExternalPreview from '@site/docs/_partial-external-preview.mdx';
<PartialExternalPreview />
This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG. This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG.

View file

@ -86,39 +86,28 @@ const config = {
}, },
items: [ items: [
{ {
href: 'https://github.com/openrag/openrag', position: "right",
label: 'GitHub', href: "https://github.com/langflow-ai/openrag",
position: 'right', className: "header-github-link",
target: "_blank",
rel: null,
'aria-label': 'GitHub repository',
}, },
], ],
}, },
footer: { footer: {
style: 'dark',
links: [ links: [
{ {
title: 'Documentation', title: null,
items: [ items: [
{ {
label: 'Getting Started', html: `<div class="footer-links">
to: '/', <span>© ${new Date().getFullYear()} OpenRAG</span>
}, </div>`,
],
},
{
title: 'Community',
items: [
{
label: 'GitHub',
href: 'https://github.com/openrag/openrag',
},
{
label: 'Discord',
href: 'https://discord.gg/openrag',
}, },
], ],
}, },
], ],
copyright: `Copyright © ${new Date().getFullYear()} OpenRAG. Built with Docusaurus.`,
}, },
prism: { prism: {
theme: prismThemes.github, theme: prismThemes.github,

View file

@ -28,3 +28,89 @@
--ifm-color-primary-lightest: #4fddbf; --ifm-color-primary-lightest: #4fddbf;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
} }
/* GitHub Icon Button */
.header-github-link:hover {
opacity: 0.6;
}
.header-github-link:before {
content: "";
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='currentColor'%3E%3Cpath d='M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z'/%3E%3C/svg%3E") no-repeat;
}
[data-theme="dark"] .header-github-link:before {
content: "";
width: 24px;
height: 24px;
display: flex;
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='white'%3E%3Cpath d='M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z'/%3E%3C/svg%3E") no-repeat;
}
/* Slim Footer */
.footer {
padding: 1rem 0 0;
background-color: var(--ifm-background-color);
border-top: 1px solid var(--ifm-color-emphasis-200);
}
[data-theme="light"] .footer {
border-top: 1px solid var(--ifm-color-emphasis-300);
}
.footer-content {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 var(--ifm-navbar-padding-horizontal);
max-width: var(--ifm-container-width);
margin: 0 auto;
font-size: 12px;
}
.footer__copyright {
color: var(--ifm-toc-link-color);
}
.footer-links {
display: flex;
gap: 0.5rem;
font-size: 13px;
}
.footer-links a {
color: var(--ifm-toc-link-color);
text-decoration: none;
}
.footer-links a:hover {
text-decoration: underline;
}
.footer .container {
padding: 0 1.25rem;
display: flex;
justify-content: left;
align-items: center;
flex-direction: row;
max-width: 100%;
}
.footer__title {
margin-bottom: 0;
}
/* Inline Icons */
.markdown svg,
.markdown img[src*="icon"],
.markdown .icon {
width: 16px !important;
height: 16px !important;
stroke-width: 2.5 !important;
display: inline-block;
vertical-align: middle;
}

View file

@ -1,12 +1,6 @@
"use client"; "use client";
import { import { ArrowLeft, Check, Copy, Loader2, Search } from "lucide-react";
ArrowLeft,
Copy,
File as FileIcon,
Loader2,
Search,
} from "lucide-react";
import { Suspense, useCallback, useEffect, useMemo, useState } from "react"; import { Suspense, useCallback, useEffect, useMemo, useState } from "react";
import { useRouter, useSearchParams } from "next/navigation"; import { useRouter, useSearchParams } from "next/navigation";
import { ProtectedRoute } from "@/components/protected-route"; import { ProtectedRoute } from "@/components/protected-route";
@ -41,6 +35,9 @@ function ChunksPageContent() {
ChunkResult[] ChunkResult[]
>([]); >([]);
const [selectedChunks, setSelectedChunks] = useState<Set<number>>(new Set()); const [selectedChunks, setSelectedChunks] = useState<Set<number>>(new Set());
const [activeCopiedChunkIndex, setActiveCopiedChunkIndex] = useState<
number | null
>(null);
// Calculate average chunk length // Calculate average chunk length
const averageChunkLength = useMemo( const averageChunkLength = useMemo(
@ -70,8 +67,11 @@ function ChunksPageContent() {
} }
}, [queryInputText, chunks]); }, [queryInputText, chunks]);
const handleCopy = useCallback((text: string) => { const handleCopy = useCallback((text: string, index: number) => {
navigator.clipboard.writeText(text); // Trim whitespace and remove new lines/tabs for cleaner copy
navigator.clipboard.writeText(text.trim().replace(/[\n\r\t]/gm, ""));
setActiveCopiedChunkIndex(index);
setTimeout(() => setActiveCopiedChunkIndex(null), 10 * 1000); // 10 seconds
}, []); }, []);
const fileData = (data as File[]).find( const fileData = (data as File[]).find(
@ -148,17 +148,29 @@ function ChunksPageContent() {
<div className="flex-1 flex flex-col min-h-0 px-6 py-6"> <div className="flex-1 flex flex-col min-h-0 px-6 py-6">
{/* Header */} {/* Header */}
<div className="flex flex-col mb-6"> <div className="flex flex-col mb-6">
<div className="flex items-center gap-3 mb-2"> <div className="flex flex-row items-center gap-3 mb-6">
<Button variant="ghost" onClick={handleBack}> <Button variant="ghost" onClick={handleBack} size="sm">
<ArrowLeft size={18} /> <ArrowLeft size={24} />
<FileIcon className="text-muted-foreground" size={18} />
<h1 className="text-lg font-semibold">
{filename.replace(/\.[^/.]+$/, "")}
</h1>
</Button> </Button>
<h1 className="text-lg font-semibold">
{/* Removes file extension from filename */}
{filename.replace(/\.[^/.]+$/, "")}
</h1>
</div> </div>
<div className="flex items-center gap-3 pl-4 mt-2"> <div className="flex flex-col items-start mt-2">
<div className="flex items-center gap-2"> <div className="flex-1 flex items-center gap-2 w-full max-w-[616px] mb-8">
<Input
name="search-query"
icon={!queryInputText.length ? <Search size={18} /> : null}
id="search-query"
type="text"
defaultValue={parsedFilterData?.query}
value={queryInputText}
onChange={(e) => setQueryInputText(e.target.value)}
placeholder="Search chunks..."
/>
</div>
<div className="flex items-center pl-4 gap-2">
<Checkbox <Checkbox
id="selectAllChunks" id="selectAllChunks"
checked={selectAll} checked={selectAll}
@ -173,26 +185,11 @@ function ChunksPageContent() {
Select all Select all
</Label> </Label>
</div> </div>
<div className="flex-1 flex items-center gap-2">
<Input
name="search-query"
id="search-query"
type="text"
defaultValue={parsedFilterData?.query}
value={queryInputText}
onChange={(e) => setQueryInputText(e.target.value)}
placeholder="Search chunks..."
className="flex-1 bg-muted/20 rounded-lg border border-border/50 px-4 py-3 focus-visible:ring-1 focus-visible:ring-ring"
/>
<Button variant="outline" size="sm">
<Search />
</Button>
</div>
</div> </div>
</div> </div>
{/* Content Area - matches knowledge page structure */} {/* Content Area - matches knowledge page structure */}
<div className="flex-1 overflow-auto"> <div className="flex-1 overflow-scroll pr-6">
{isFetching ? ( {isFetching ? (
<div className="flex items-center justify-center h-64"> <div className="flex items-center justify-center h-64">
<div className="text-center"> <div className="text-center">
@ -237,12 +234,15 @@ function ChunksPageContent() {
</span> </span>
<div className="py-1"> <div className="py-1">
<Button <Button
className="p-1" onClick={() => handleCopy(chunk.text, index)}
onClick={() => handleCopy(chunk.text)}
variant="ghost" variant="ghost"
size="xs" size="sm"
> >
<Copy className="text-muted-foreground" /> {activeCopiedChunkIndex === index ? (
<Check className="text-muted-foreground" />
) : (
<Copy className="text-muted-foreground" />
)}
</Button> </Button>
</div> </div>
</div> </div>