Merge branch 'main' into docs-install-methods-anchor

This commit is contained in:
Mendon Kissling 2025-11-10 09:37:53 -05:00
commit bb9aa4e3ea
9 changed files with 66 additions and 17 deletions

View file

@ -39,7 +39,7 @@ This command will:
- Create a versioned sidebar file at `versioned_sidebars/version-1.0.0-sidebars.json` - Create a versioned sidebar file at `versioned_sidebars/version-1.0.0-sidebars.json`
- Append the new version to `versions.json` - Append the new version to `versions.json`
3. After creating a version, update the Docusaurus configuration to include multiple versions. 2. After creating a version, update the Docusaurus configuration to include multiple versions.
`lastVersion:'1.0.0'` makes the '1.0.0' release the `latest` version. `lastVersion:'1.0.0'` makes the '1.0.0' release the `latest` version.
`current` is the work-in-progress docset, accessible at `/docs/next`. `current` is the work-in-progress docset, accessible at `/docs/next`.
To remove a version, remove it from `onlyIncludeVersions`. To remove a version, remove it from `onlyIncludeVersions`.
@ -62,14 +62,14 @@ docs: {
}, },
``` ```
4. Test the deployment locally. 3. Test the deployment locally.
```bash ```bash
npm run build npm run build
npm run serve npm run serve
``` ```
5. To add subsequent versions, repeat the process, first running the CLI command then updating `docusaurus.config.js`. 4. To add subsequent versions, repeat the process, first running the CLI command then updating `docusaurus.config.js`.
```bash ```bash
# Create version 2.0.0 from current docs # Create version 2.0.0 from current docs

View file

@ -86,6 +86,19 @@ You can select multiple files.
The ingestion process may take some time, depending on the size of your documents. The ingestion process may take some time, depending on the size of your documents.
4. When ingestion is complete, your documents are available in the Knowledge screen. 4. When ingestion is complete, your documents are available in the Knowledge screen.
If ingestion fails, click **Status** to view the logged error.
## Monitor ingestion tasks
When you upload files, process folders, or sync documents, OpenRAG processes them as background tasks.
A badge appears on the <Icon name="Bell" aria-hidden="true"/> **Tasks** icon when there are active tasks running.
To open the Tasks menu, click <Icon name="Bell" aria-hidden="true"/> **Tasks**.
**Active Tasks** shows tasks that are currently processing.
A **Pending** task is queued and waiting to start, a **Running** task is actively processing files, and a **Processing** task is performing ingestion operations. For each active task, you can find the task ID, start time, duration, the number of files processed so far, and the total files.
You can cancel active tasks by clicking <Icon name="X" aria-hidden="true"/> **Cancel**. Canceling a task stops processing immediately and marks the task as failed.
## Explore knowledge ## Explore knowledge
The **Knowledge** page lists the documents OpenRAG has ingested into the OpenSearch vector database's `documents` index. The **Knowledge** page lists the documents OpenRAG has ingested into the OpenSearch vector database's `documents` index.

View file

@ -19,7 +19,7 @@ Once OpenRAG is running, use the TUI to monitor your application, control your c
If you prefer running Podman or Docker containers and manually editing `.env` files, see [Install OpenRAG Containers](/get-started/docker). If you prefer running Podman or Docker containers and manually editing `.env` files, see [Install OpenRAG Containers](/get-started/docker).
## Prerequisites ## Prerequisites
- Install [Python Version 3.10 to 3.13](https://www.python.org/downloads/release/python-3100/) - Install [Python Version 3.10 to 3.13](https://www.python.org/downloads/release/python-3100/)
- Install [uv](https://docs.astral.sh/uv/getting-started/installation/) - Install [uv](https://docs.astral.sh/uv/getting-started/installation/)
@ -185,7 +185,8 @@ If the TUI detects OAuth credentials, it enforces the **Advanced Setup** path.
Command completed successfully Command completed successfully
``` ```
6. To start the Docling service, under **Native Services**, click **Start**. 6. To start the Docling service, under **Native Services**, click **Start**.
7. To open the OpenRAG application, click **Open App**. 7. To open the OpenRAG application, navigate to the TUI main menu, and then click **Open App**.
Alternatively, in your browser, navigate to `localhost:3000`.
8. Continue with [Application Onboarding](#application-onboarding). 8. Continue with [Application Onboarding](#application-onboarding).
</TabItem> </TabItem>
<TabItem value="Advanced setup" label="Advanced setup"> <TabItem value="Advanced setup" label="Advanced setup">
@ -212,7 +213,8 @@ If the TUI detects OAuth credentials, it enforces the **Advanced Setup** path.
Command completed successfully Command completed successfully
``` ```
8. To start the Docling service, under **Native Services**, click **Start**. 8. To start the Docling service, under **Native Services**, click **Start**.
9. To open the OpenRAG application, click **Open App**. 9. To open the OpenRAG application, navigate to the TUI main menu, and then click **Open App**.
Alternatively, in your browser, navigate to `localhost:3000`.
You are presented with your provider's OAuth sign-in screen. You are presented with your provider's OAuth sign-in screen.
After sign-in, you are redirected to the redirect URI. After sign-in, you are redirected to the redirect URI.

View file

@ -13,6 +13,14 @@ This page provides troubleshooting advice for issues you might encounter when us
Check that `OPENSEARCH_PASSWORD` set in [Environment variables](/reference/configuration) meets requirements. Check that `OPENSEARCH_PASSWORD` set in [Environment variables](/reference/configuration) meets requirements.
The password must contain at least 8 characters, and must contain at least one uppercase letter, one lowercase letter, one digit, and one special character that is strong. The password must contain at least 8 characters, and must contain at least one uppercase letter, one lowercase letter, one digit, and one special character that is strong.
## OpenRAG fails to start from the TUI with "Operation not supported" error
This error occurs when starting OpenRAG with the TUI in [WSL (Windows Subsystem for Linux)](https://learn.microsoft.com/en-us/windows/wsl/install).
The error occurs because OpenRAG is running within a WSL environment, so `webbrowser.open()` can't launch a browser automatically.
To access the OpenRAG application, open a web browser and enter `http://localhost:3000` in the address bar.
## Langflow connection issues ## Langflow connection issues
Verify the `LANGFLOW_SUPERUSER` credentials set in [Environment variables](/reference/configuration) are correct. Verify the `LANGFLOW_SUPERUSER` credentials set in [Environment variables](/reference/configuration) are correct.

View file

@ -7,6 +7,7 @@ import { useProviderHealthQuery } from "@/src/app/api/queries/useProviderHealthQ
import { Button } from "./ui/button"; import { Button } from "./ui/button";
import { useRouter } from "next/navigation"; import { useRouter } from "next/navigation";
import { useGetSettingsQuery } from "@/app/api/queries/useGetSettingsQuery"; import { useGetSettingsQuery } from "@/app/api/queries/useGetSettingsQuery";
import { ModelProvider } from "@/app/settings/helpers/model-helpers";
interface ProviderHealthBannerProps { interface ProviderHealthBannerProps {
className?: string; className?: string;
@ -42,12 +43,22 @@ export function useProviderHealth() {
}; };
} }
const providerTitleMap: Record<ModelProvider, string> = {
openai: "OpenAI",
ollama: "Ollama",
watsonx: "IBM watsonx.ai",
};
export function ProviderHealthBanner({ className }: ProviderHealthBannerProps) { export function ProviderHealthBanner({ className }: ProviderHealthBannerProps) {
const { isLoading, isHealthy, isUnhealthy, health } = useProviderHealth(); const { isLoading, isHealthy, isUnhealthy, health } = useProviderHealth();
const router = useRouter(); const router = useRouter();
const { data: settings = {} } = useGetSettingsQuery(); const { data: settings = {} } = useGetSettingsQuery();
const providerTitle =
providerTitleMap[settings.provider?.model_provider as ModelProvider] ||
"Provider";
// Only show banner when provider is unhealthy (not when backend is unavailable) // Only show banner when provider is unhealthy (not when backend is unavailable)
if (isLoading || isHealthy) { if (isLoading || isHealthy) {
return null; return null;
@ -71,7 +82,7 @@ export function ProviderHealthBanner({ className }: ProviderHealthBannerProps) {
icon={AlertTriangle} icon={AlertTriangle}
/> />
<BannerTitle className="font-medium flex items-center gap-2"> <BannerTitle className="font-medium flex items-center gap-2">
{errorMessage} {providerTitle} error - {errorMessage}
</BannerTitle> </BannerTitle>
<Button size="sm" onClick={() => router.push(settingsUrl)}> <Button size="sm" onClick={() => router.push(settingsUrl)}>
Fix Setup Fix Setup

View file

@ -4,6 +4,7 @@ import {
useQueryClient, useQueryClient,
} from "@tanstack/react-query"; } from "@tanstack/react-query";
import type { Settings } from "../queries/useGetSettingsQuery"; import type { Settings } from "../queries/useGetSettingsQuery";
import { useGetCurrentProviderModelsQuery } from "../queries/useGetModelsQuery";
export interface UpdateSettingsRequest { export interface UpdateSettingsRequest {
// Agent settings // Agent settings
@ -37,6 +38,7 @@ export const useUpdateSettingsMutation = (
> >
) => { ) => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { refetch: refetchModels } = useGetCurrentProviderModelsQuery();
async function updateSettings( async function updateSettings(
variables: UpdateSettingsRequest variables: UpdateSettingsRequest
@ -63,6 +65,7 @@ export const useUpdateSettingsMutation = (
queryClient.invalidateQueries({ queryClient.invalidateQueries({
queryKey: ["settings"], queryKey: ["settings"],
}); });
refetchModels(); // Refetch models for the settings page
options?.onSuccess?.(...args); options?.onSuccess?.(...args);
}, },
onError: options?.onError, onError: options?.onError,

View file

@ -1,9 +1,9 @@
import { ModelProvider } from "@/app/settings/helpers/model-helpers";
import { import {
type UseQueryOptions, type UseQueryOptions,
useQuery, useQuery,
useQueryClient, useQueryClient,
} from "@tanstack/react-query"; } from "@tanstack/react-query";
import { useGetSettingsQuery } from "./useGetSettingsQuery";
export interface ProviderHealthDetails { export interface ProviderHealthDetails {
llm_model: string; llm_model: string;
@ -22,12 +22,6 @@ export interface ProviderHealthParams {
provider?: "openai" | "ollama" | "watsonx"; provider?: "openai" | "ollama" | "watsonx";
} }
const providerTitleMap: Record<ModelProvider, string> = {
openai: "OpenAI",
ollama: "Ollama",
watsonx: "IBM watsonx.ai",
};
export const useProviderHealthQuery = ( export const useProviderHealthQuery = (
params?: ProviderHealthParams, params?: ProviderHealthParams,
options?: Omit< options?: Omit<
@ -37,6 +31,8 @@ export const useProviderHealthQuery = (
) => { ) => {
const queryClient = useQueryClient(); const queryClient = useQueryClient();
const { data: settings = {} } = useGetSettingsQuery();
async function checkProviderHealth(): Promise<ProviderHealthResponse> { async function checkProviderHealth(): Promise<ProviderHealthResponse> {
try { try {
const url = new URL("/api/provider/health", window.location.origin); const url = new URL("/api/provider/health", window.location.origin);
@ -84,6 +80,7 @@ export const useProviderHealthQuery = (
queryKey: ["provider", "health"], queryKey: ["provider", "health"],
queryFn: checkProviderHealth, queryFn: checkProviderHealth,
retry: false, // Don't retry health checks automatically retry: false, // Don't retry health checks automatically
enabled: !!settings?.edited && options?.enabled !== false, // Only run after onboarding is complete
...options, ...options,
}, },
queryClient queryClient

View file

@ -57,7 +57,7 @@ export function ModelSelector({
}, [options, value, custom, onValueChange]); }, [options, value, custom, onValueChange]);
return ( return (
<Popover open={open} onOpenChange={setOpen}> <Popover open={open} onOpenChange={setOpen} modal={false}>
<PopoverTrigger asChild> <PopoverTrigger asChild>
{/** biome-ignore lint/a11y/useSemanticElements: has to be a Button */} {/** biome-ignore lint/a11y/useSemanticElements: has to be a Button */}
<Button <Button
@ -99,7 +99,8 @@ export function ModelSelector({
</PopoverTrigger> </PopoverTrigger>
<PopoverContent <PopoverContent
align="start" align="start"
className=" p-0 w-[var(--radix-popover-trigger-width)]" className="p-0 w-[var(--radix-popover-trigger-width)]"
onOpenAutoFocus={(e) => e.preventDefault()}
> >
<Command> <Command>
<CommandInput <CommandInput
@ -107,7 +108,10 @@ export function ModelSelector({
value={searchValue} value={searchValue}
onValueChange={setSearchValue} onValueChange={setSearchValue}
/> />
<CommandList> <CommandList
className="max-h-[300px] overflow-y-auto"
onWheel={(e) => e.stopPropagation()}
>
<CommandEmpty>{noOptionsPlaceholder}</CommandEmpty> <CommandEmpty>{noOptionsPlaceholder}</CommandEmpty>
<CommandGroup> <CommandGroup>
{options.map((option) => ( {options.map((option) => (

View file

@ -26,6 +26,8 @@ import { IBMOnboarding } from "./ibm-onboarding";
import { OllamaOnboarding } from "./ollama-onboarding"; import { OllamaOnboarding } from "./ollama-onboarding";
import { OpenAIOnboarding } from "./openai-onboarding"; import { OpenAIOnboarding } from "./openai-onboarding";
import { TabTrigger } from "./tab-trigger"; import { TabTrigger } from "./tab-trigger";
import { ProviderHealthResponse } from "@/app/api/queries/useProviderHealthQuery";
import { useQueryClient } from "@tanstack/react-query";
interface OnboardingCardProps { interface OnboardingCardProps {
onComplete: () => void; onComplete: () => void;
@ -57,6 +59,8 @@ const OnboardingCard = ({
const [loadingStep, setLoadingStep] = useState<number>(0); const [loadingStep, setLoadingStep] = useState<number>(0);
const queryClient = useQueryClient();
// Reset loading step when models start loading // Reset loading step when models start loading
useEffect(() => { useEffect(() => {
if (isLoadingModels) { if (isLoadingModels) {
@ -129,6 +133,13 @@ const OnboardingCard = ({
const onboardingMutation = useOnboardingMutation({ const onboardingMutation = useOnboardingMutation({
onSuccess: (data) => { onSuccess: (data) => {
console.log("Onboarding completed successfully", data); console.log("Onboarding completed successfully", data);
// Update provider health cache to healthy since backend just validated
const healthData: ProviderHealthResponse = {
status: "healthy",
message: "Provider is configured and working correctly",
provider: settings.model_provider,
};
queryClient.setQueryData(["provider", "health"], healthData);
setCurrentStep(0); setCurrentStep(0);
setError(null); setError(null);
}, },