From 02ebe8270d0d2f6bd5318349555b4d5593e6f687 Mon Sep 17 00:00:00 2001 From: Mendon Kissling <59585235+mendonk@users.noreply.github.com> Date: Tue, 23 Sep 2025 14:13:02 -0400 Subject: [PATCH 01/23] initial-content --- README.md | 2 +- docs/docs/reference/troubleshooting.mdx | 24 ------ docs/docs/support/troubleshoot.mdx | 107 ++++++++++++++++++++++++ docs/sidebars.js | 6 +- 4 files changed, 111 insertions(+), 28 deletions(-) delete mode 100644 docs/docs/reference/troubleshooting.mdx create mode 100644 docs/docs/support/troubleshoot.mdx diff --git a/README.md b/README.md index d79011a0..df1d6451 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,7 @@ podman machine start ### Common Issues -See common issues and fixes: [docs/reference/troubleshooting.mdx](docs/docs/reference/troubleshooting.mdx) +See common issues and fixes: [docs/support/troubleshoot.mdx](docs/docs/reference/troubleshoot.mdx) diff --git a/docs/docs/reference/troubleshooting.mdx b/docs/docs/reference/troubleshooting.mdx deleted file mode 100644 index c1893ef5..00000000 --- a/docs/docs/reference/troubleshooting.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: Troubleshooting -slug: /reference/troubleshooting ---- - -# Troubleshooting - -## Podman on macOS - -If using Podman on macOS, you may need to increase VM memory: - -```bash -podman machine stop -podman machine rm -podman machine init --memory 8192 # 8 GB example -podman machine start -``` - -## Common Issues - -1. OpenSearch fails to start: Check that `OPENSEARCH_PASSWORD` is set and meets requirements -2. Langflow connection issues: Verify `LANGFLOW_SUPERUSER` credentials are correct -3. Out of memory errors: Increase Docker memory allocation or use CPU-only mode -4. Port conflicts: Ensure ports 3000, 7860, 8000, 9200, 5601 are available diff --git a/docs/docs/support/troubleshoot.mdx b/docs/docs/support/troubleshoot.mdx new file mode 100644 index 00000000..bf18e2f7 --- /dev/null +++ b/docs/docs/support/troubleshoot.mdx @@ -0,0 +1,107 @@ +--- +title: Troubleshoot +slug: /reference/troubleshoot +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +This page provides troubleshooting advice for issues you might encounter when using OpenRAG or contributing to OpenRAG. + +## OpenSearch fails to start + +Check that `OPENSEARCH_PASSWORD` is set and 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. + +## Langflow connection issues + +Verify the `LANGFLOW_SUPERUSER` credentials are correct. + +## Memory errors + +### Container out of memory errors + +Increase Docker memory allocation or use [docker-compose-cpu.yml](https://github.com/langflow-ai/openrag/blob/main/docker-compose-cpu.yml) to deploy OpenRAG. + +### Podman on macOS memory issues + +If you're using Podman on macOS, you may need to increase VM memory on your Podman machine. +This example increases the machine size to 8 GB of RAM, which should be sufficient to run OpenRAG. + ```bash + podman machine stop + podman machine rm + podman machine init --memory 8192 # 8 GB example + podman machine start + ``` + +## Port conflicts + +Ensure ports 3000, 7860, 8000, 9200, 5601 are available. + +## Langflow container already exists + +If you are running other versions of Langflow containers on your machine, you may encounter an issue where Docker or Podman thinks Langflow is already up. + +Remove just the problem container, or clean up all containers and start fresh. + +To reset your local containers and pull new images, do the following: + +1. Stop your containers and completely remove them. + + + + + ```bash + # Stop all running containers + docker stop $(docker ps -q) + + # Remove all containers (including stopped ones) + docker rm --force $(docker ps -aq) + + # Remove all images + docker rmi --force $(docker images -q) + + # Remove all volumes + docker volume prune --force + + # Remove all networks (except default) + docker network prune --force + + # Clean up any leftover data + docker system prune --all --force --volumes + ``` + + + + + ```bash + # Stop all running containers + podman stop --all + + # Remove all containers (including stopped ones) + podman rm --all --force + + # Remove all images + podman rmi --all --force + + # Remove all volumes + podman volume prune --force + + # Remove all networks (except default) + podman network prune --force + + # Clean up any leftover data + podman system prune --all --force --volumes + ``` + + + + +2. Restart OpenRAG and upgrade to get the latest images for your containers. + ```bash + uv run openrag + ``` + +3. In the OpenRAG TUI, click **Status**, and then click **Upgrade**. +When the **Close** button is active, the upgrade is complete. +Close the window and open the OpenRAG appplication. diff --git a/docs/sidebars.js b/docs/sidebars.js index 51a4ddc3..02d14334 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -50,12 +50,12 @@ const sidebars = { }, { type: "category", - label: "Reference", + label: "Support", items: [ { type: "doc", - id: "reference/troubleshooting", - label: "Troubleshooting" + id: "support/troubleshoot", + label: "Troubleshoot" }, ], }, From 0257017d9bf8e7f334dc6194691a94e86abd31e5 Mon Sep 17 00:00:00 2001 From: Cole Goldsmith Date: Mon, 29 Sep 2025 10:28:32 -0500 Subject: [PATCH 02/23] update accent colors, add first pass at color and icon selector for filters --- frontend/components/filter-icon-popover.tsx | 181 +++++++++++++ frontend/components/knowledge-filter-list.tsx | 230 +++++++---------- .../components/knowledge-filter-panel.tsx | 241 ++++++++---------- frontend/components/ui/input.tsx | 19 +- frontend/src/app/globals.css | 60 ++--- frontend/src/app/knowledge/page.tsx | 25 +- .../src/contexts/knowledge-filter-context.tsx | 36 +++ frontend/tailwind.config.ts | 51 ++-- 8 files changed, 490 insertions(+), 353 deletions(-) create mode 100644 frontend/components/filter-icon-popover.tsx diff --git a/frontend/components/filter-icon-popover.tsx b/frontend/components/filter-icon-popover.tsx new file mode 100644 index 00000000..4bc181e7 --- /dev/null +++ b/frontend/components/filter-icon-popover.tsx @@ -0,0 +1,181 @@ +"use client"; + +import React, { type SVGProps } from "react"; +import { Button } from "@/components/ui/button"; +import { + Popover, + PopoverContent, + PopoverTrigger, +} from "@/components/ui/popover"; +import { + Filter as FilterIcon, + Star, + Book, + FileText, + Folder, + Globe, + Calendar, + User, + Users, + Tag, + Briefcase, + Building2, + Cog, + Database, + Cpu, + Bot, + MessageSquare, + Search, + Shield, + Lock, + Key, + Link, + Mail, + Phone, + Check, +} from "lucide-react"; +import { filterAccentClasses } from "./knowledge-filter-panel"; + +const ICON_MAP = { + Filter: FilterIcon, + Star, + Book, + FileText, + Folder, + Globe, + Calendar, + User, + Users, + Tag, + Briefcase, + Building2, + Cog, + Database, + Cpu, + Bot, + MessageSquare, + Search, + Shield, + Lock, + Key, + Link, + Mail, + Phone, +} as const; + +export type IconKey = keyof typeof ICON_MAP; + +function iconKeyToComponent( + key: string +): React.ComponentType> { + return ( + (ICON_MAP as Record>>)[ + key + ] || FilterIcon + ); +} + +const COLORS = [ + "zinc", + "pink", + "purple", + "indigo", + "emerald", + "amber", + "red", +] as const; +export type FilterColor = (typeof COLORS)[number]; + +const colorSwatchClasses = { + zinc: "bg-muted-foreground", + pink: "bg-accent-pink-foreground", + purple: "bg-accent-purple-foreground", + indigo: "bg-accent-indigo-foreground", + emerald: "bg-accent-emerald-foreground", + amber: "bg-accent-amber-foreground", + red: "bg-accent-red-foreground", + "": "bg-muted-foreground", +}; + +export interface FilterIconPopoverProps { + color: FilterColor; + iconKey: IconKey | string; + onColorChange: (c: FilterColor) => void; + onIconChange: (k: IconKey) => void; + triggerClassName?: string; +} + +export function FilterIconPopover({ + color, + iconKey, + onColorChange, + onIconChange, + triggerClassName, +}: FilterIconPopoverProps) { + const Icon = iconKeyToComponent(iconKey); + return ( + + + + + +
+
+ {COLORS.map((c) => ( + + ))} +
+
+ Icon +
+
+ {(Object.keys(ICON_MAP) as IconKey[]).map((k) => { + const OptIcon = ICON_MAP[k]; + const active = iconKey === k; + return ( + + ); + })} +
+
+
+
+ ); +} diff --git a/frontend/components/knowledge-filter-list.tsx b/frontend/components/knowledge-filter-list.tsx index 2758d17f..f277518f 100644 --- a/frontend/components/knowledge-filter-list.tsx +++ b/frontend/components/knowledge-filter-list.tsx @@ -2,24 +2,73 @@ import { useState } from "react"; import { Button } from "@/components/ui/button"; -import { Input } from "@/components/ui/input"; - -import { Label } from "@/components/ui/label"; -import { Textarea } from "@/components/ui/textarea"; -import { Filter, Loader2, Plus, Save, X } from "lucide-react"; +import { + Filter as FilterIcon, + Loader2, + Plus, + X, + Star, + Book, + FileText, + Folder, + Globe, + Calendar, + User, + Users, + Tag, + Briefcase, + Building2, + Cog, + Database, + Cpu, + Bot, + MessageSquare, + Search, + Shield, + Lock, + Key, + Link, + Mail, + Phone, +} from "lucide-react"; import { cn } from "@/lib/utils"; import { useGetFiltersSearchQuery, type KnowledgeFilter, } from "@/src/app/api/queries/useGetFiltersSearchQuery"; -import { useCreateFilter } from "@/src/app/api/mutations/useCreateFilter"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, -} from "@/components/ui/dialog"; +import { useKnowledgeFilter } from "@/src/contexts/knowledge-filter-context"; +import type { SVGProps } from "react"; + +const ICON_MAP = { + Filter: FilterIcon, + Star, + Book, + FileText, + Folder, + Globe, + Calendar, + User, + Users, + Tag, + Briefcase, + Building2, + Cog, + Database, + Cpu, + Bot, + MessageSquare, + Search, + Shield, + Lock, + Key, + Link, + Mail, + Phone, +} as const; + +function iconKeyToComponent(key: string): React.ComponentType> { + return (ICON_MAP as Record>>)[key] || FilterIcon; +} interface ParsedQueryData { query: string; @@ -30,6 +79,8 @@ interface ParsedQueryData { }; limit: number; scoreThreshold: number; + color?: "zinc" | "pink" | "purple" | "indigo" | "emerald" | "amber" | "red"; + icon?: string; } interface KnowledgeFilterListProps { @@ -42,10 +93,7 @@ export function KnowledgeFilterList({ onFilterSelect, }: KnowledgeFilterListProps) { const [searchQuery] = useState(""); - const [showCreateModal, setShowCreateModal] = useState(false); - const [createName, setCreateName] = useState(""); - const [createDescription, setCreateDescription] = useState(""); - const [creating, setCreating] = useState(false); + const { startCreateMode } = useKnowledgeFilter(); const { data, isFetching: loading } = useGetFiltersSearchQuery( searchQuery, @@ -54,57 +102,12 @@ export function KnowledgeFilterList({ const filters = data || []; - const createFilterMutation = useCreateFilter(); - const handleFilterSelect = (filter: KnowledgeFilter) => { onFilterSelect(filter); }; const handleCreateNew = () => { - setShowCreateModal(true); - }; - - const handleCreateFilter = async () => { - if (!createName.trim()) return; - - setCreating(true); - try { - // Create a basic filter with wildcards (match everything by default) - const defaultFilterData = { - query: "", - filters: { - data_sources: ["*"], - document_types: ["*"], - owners: ["*"], - }, - limit: 10, - scoreThreshold: 0, - }; - - const result = await createFilterMutation.mutateAsync({ - name: createName.trim(), - description: createDescription.trim(), - queryData: JSON.stringify(defaultFilterData), - }); - - // Select the new filter from API response - onFilterSelect(result.filter); - - // Close modal and reset form - setShowCreateModal(false); - setCreateName(""); - setCreateDescription(""); - } catch (error) { - console.error("Error creating knowledge filter:", error); - } finally { - setCreating(false); - } - }; - - const handleCancelCreate = () => { - setShowCreateModal(false); - setCreateName(""); - setCreateDescription(""); + startCreateMode(); }; const parseQueryData = (queryData: string): ParsedQueryData => { @@ -113,7 +116,7 @@ export function KnowledgeFilterList({ return ( <> -
+
Knowledge Filters @@ -136,7 +139,7 @@ export function KnowledgeFilterList({
) : filters.length === 0 ? ( -
+
{searchQuery ? "No filters found" : "No saved filters"}
) : ( @@ -152,9 +155,33 @@ export function KnowledgeFilterList({ >
-
- -
+ {(() => { + const parsed = parseQueryData(filter.query_data); + const color = (parsed.color || "zinc") as + | "zinc" + | "pink" + | "purple" + | "indigo" + | "emerald" + | "amber" + | "red"; + const Icon = iconKeyToComponent(parsed.icon || "Filter"); + const colorMap = { + zinc: "bg-zinc-500/20 text-zinc-500", + pink: "bg-pink-500/20 text-pink-500", + purple: "bg-purple-500/20 text-purple-500", + indigo: "bg-indigo-500/20 text-indigo-500", + emerald: "bg-emerald-500/20 text-emerald-500", + amber: "bg-amber-500/20 text-amber-500", + red: "bg-red-500/20 text-red-500", + } as const; + const colorClasses = colorMap[color]; + return ( +
+ +
+ ); + })()}
{filter.name}
@@ -200,72 +227,7 @@ export function KnowledgeFilterList({ )) )}
- {/* Create Filter Dialog */} - - - - Create a new knowledge filter - - Save a reusable filter to quickly scope searches across your - knowledge base. - - -
-
- - setCreateName(e.target.value)} - className="mt-1" - /> -
-
- -