Merge branch 'main' into feat-entity-size-caps
This commit is contained in:
commit
9f49e56a44
154 changed files with 5468 additions and 4483 deletions
|
|
@ -28,6 +28,12 @@ Makefile
|
||||||
# Exclude other projects
|
# Exclude other projects
|
||||||
/tests
|
/tests
|
||||||
/scripts
|
/scripts
|
||||||
|
/data
|
||||||
|
/dickens
|
||||||
|
/reproduce
|
||||||
|
/output_complete
|
||||||
|
/rag_storage
|
||||||
|
/inputs
|
||||||
|
|
||||||
# Python version manager file
|
# Python version manager file
|
||||||
.python-version
|
.python-version
|
||||||
|
|
|
||||||
84
.github/workflows/docker-build-lite.yml
vendored
Normal file
84
.github/workflows/docker-build-lite.yml
vendored
Normal file
|
|
@ -0,0 +1,84 @@
|
||||||
|
name: Build Lite Docker Image
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
_notes_:
|
||||||
|
description: '⚠️ Create lite Docker images only after non-trivial version releases.'
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
packages: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-push-lite:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Get latest tag
|
||||||
|
id: get_tag
|
||||||
|
run: |
|
||||||
|
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
|
||||||
|
if [ -z "$LATEST_TAG" ]; then
|
||||||
|
LATEST_TAG="sha-$(git rev-parse --short HEAD)"
|
||||||
|
echo "No tags found, using commit SHA: $LATEST_TAG"
|
||||||
|
else
|
||||||
|
echo "Latest tag found: $LATEST_TAG"
|
||||||
|
fi
|
||||||
|
echo "tag=$LATEST_TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Prepare lite tag
|
||||||
|
id: lite_tag
|
||||||
|
run: |
|
||||||
|
LITE_TAG="${{ steps.get_tag.outputs.tag }}-lite"
|
||||||
|
echo "Lite image tag: $LITE_TAG"
|
||||||
|
echo "lite_tag=$LITE_TAG" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Update version in __init__.py
|
||||||
|
run: |
|
||||||
|
sed -i "s/__version__ = \".*\"/__version__ = \"${{ steps.get_tag.outputs.tag }}\"/" lightrag/__init__.py
|
||||||
|
cat lightrag/__init__.py | grep __version__
|
||||||
|
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Extract metadata for Docker
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: ghcr.io/${{ github.repository }}
|
||||||
|
tags: |
|
||||||
|
type=raw,value=${{ steps.lite_tag.outputs.lite_tag }}
|
||||||
|
type=raw,value=lite
|
||||||
|
|
||||||
|
- name: Build and push lite Docker image
|
||||||
|
uses: docker/build-push-action@v5
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile.lite
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
push: true
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
|
cache-from: type=gha
|
||||||
|
cache-to: type=gha,mode=min
|
||||||
|
|
||||||
|
- name: Output image details
|
||||||
|
run: |
|
||||||
|
echo "Lite Docker image built and pushed successfully!"
|
||||||
|
echo "Image tag: ghcr.io/${{ github.repository }}:${{ steps.lite_tag.outputs.lite_tag }}"
|
||||||
|
echo "Base Git tag used: ${{ steps.get_tag.outputs.tag }}"
|
||||||
7
.github/workflows/docker-build-manual.yml
vendored
7
.github/workflows/docker-build-manual.yml
vendored
|
|
@ -2,6 +2,12 @@ name: Build Test Docker Image manually
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
_notes_:
|
||||||
|
description: '⚠️ Please create a new git tag before building the docker image.'
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
@ -58,6 +64,7 @@ jobs:
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
|
|
||||||
1
.github/workflows/docker-publish.yml
vendored
1
.github/workflows/docker-publish.yml
vendored
|
|
@ -66,6 +66,7 @@ jobs:
|
||||||
uses: docker/build-push-action@v5
|
uses: docker/build-push-action@v5
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
push: true
|
push: true
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
|
|
|
||||||
23
.github/workflows/pypi-publish.yml
vendored
23
.github/workflows/pypi-publish.yml
vendored
|
|
@ -17,6 +17,29 @@ jobs:
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # Fetch all history for tags
|
fetch-depth: 0 # Fetch all history for tags
|
||||||
|
|
||||||
|
# Build frontend WebUI
|
||||||
|
- name: Setup Bun
|
||||||
|
uses: oven-sh/setup-bun@v1
|
||||||
|
with:
|
||||||
|
bun-version: latest
|
||||||
|
|
||||||
|
- name: Build Frontend WebUI
|
||||||
|
run: |
|
||||||
|
cd lightrag_webui
|
||||||
|
bun install --frozen-lockfile
|
||||||
|
bun run build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
- name: Verify Frontend Build
|
||||||
|
run: |
|
||||||
|
if [ ! -f "lightrag/api/webui/index.html" ]; then
|
||||||
|
echo "❌ Error: Frontend build failed - index.html not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✅ Frontend build verified"
|
||||||
|
echo "Frontend files:"
|
||||||
|
ls -lh lightrag/api/webui/ | head -10
|
||||||
|
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: "3.x"
|
python-version: "3.x"
|
||||||
|
|
|
||||||
4
.gitignore
vendored
4
.gitignore
vendored
|
|
@ -65,9 +65,11 @@ download_models_hf.py
|
||||||
lightrag-dev/
|
lightrag-dev/
|
||||||
gui/
|
gui/
|
||||||
|
|
||||||
|
# Frontend build output (built during PyPI release)
|
||||||
|
lightrag/api/webui/
|
||||||
|
|
||||||
# unit-test files
|
# unit-test files
|
||||||
test_*
|
test_*
|
||||||
|
|
||||||
# Cline files
|
# Cline files
|
||||||
memory-bank
|
|
||||||
memory-bank/
|
memory-bank/
|
||||||
|
|
|
||||||
106
Dockerfile
106
Dockerfile
|
|
@ -1,63 +1,101 @@
|
||||||
# Build stage
|
# Frontend build stage
|
||||||
FROM python:3.12-slim AS builder
|
FROM oven/bun:1 AS frontend-builder
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Upgrade pip、setuptools and wheel to the latest version
|
# Copy frontend source code
|
||||||
RUN pip install --upgrade pip setuptools wheel
|
COPY lightrag_webui/ ./lightrag_webui/
|
||||||
|
|
||||||
# Install Rust and required build dependencies
|
# Build frontend assets for inclusion in the API package
|
||||||
RUN apt-get update && apt-get install -y \
|
RUN cd lightrag_webui \
|
||||||
curl \
|
&& bun install --frozen-lockfile \
|
||||||
build-essential \
|
&& bun run build
|
||||||
pkg-config \
|
|
||||||
|
# Python build stage - using uv for faster package installation
|
||||||
|
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV UV_SYSTEM_PYTHON=1
|
||||||
|
ENV UV_COMPILE_BYTECODE=1
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install system deps (Rust is required by some wheels)
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends \
|
||||||
|
curl \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \
|
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||||
&& . $HOME/.cargo/env
|
|
||||||
|
|
||||||
# Copy pyproject.toml and source code for dependency installation
|
ENV PATH="/root/.cargo/bin:/root/.local/bin:${PATH}"
|
||||||
|
|
||||||
|
# Ensure shared data directory exists for uv caches
|
||||||
|
RUN mkdir -p /root/.local/share/uv
|
||||||
|
|
||||||
|
# Copy project metadata and sources
|
||||||
COPY pyproject.toml .
|
COPY pyproject.toml .
|
||||||
COPY setup.py .
|
COPY setup.py .
|
||||||
|
COPY uv.lock .
|
||||||
|
|
||||||
|
# Install base, API, and offline extras without the project to improve caching
|
||||||
|
RUN uv sync --frozen --no-dev --extra api --extra offline --no-install-project --no-editable
|
||||||
|
|
||||||
|
# Copy project sources after dependency layer
|
||||||
COPY lightrag/ ./lightrag/
|
COPY lightrag/ ./lightrag/
|
||||||
|
|
||||||
# Install dependencies
|
# Include pre-built frontend assets from the previous stage
|
||||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
COPY --from=frontend-builder /app/lightrag/api/webui ./lightrag/api/webui
|
||||||
RUN pip install --user --no-cache-dir --use-pep517 .
|
|
||||||
RUN pip install --user --no-cache-dir --use-pep517 .[api]
|
|
||||||
|
|
||||||
# Install depndencies for default storage
|
# Sync project in non-editable mode and ensure pip is available for runtime installs
|
||||||
RUN pip install --user --no-cache-dir nano-vectordb networkx
|
RUN uv sync --frozen --no-dev --extra api --extra offline --no-editable \
|
||||||
# Install depndencies for default LLM
|
&& /app/.venv/bin/python -m ensurepip --upgrade
|
||||||
RUN pip install --user --no-cache-dir openai ollama tiktoken
|
|
||||||
# Install depndencies for default document loader
|
# Prepare offline cache directory and pre-populate tiktoken data
|
||||||
RUN pip install --user --no-cache-dir pypdf2 python-docx python-pptx openpyxl
|
# Use uv run to execute commands from the virtual environment
|
||||||
|
RUN mkdir -p /app/data/tiktoken \
|
||||||
|
&& uv run lightrag-download-cache --cache-dir /app/data/tiktoken || status=$?; \
|
||||||
|
if [ -n "${status:-}" ] && [ "$status" -ne 0 ] && [ "$status" -ne 2 ]; then exit "$status"; fi
|
||||||
|
|
||||||
# Final stage
|
# Final stage
|
||||||
FROM python:3.12-slim
|
FROM python:3.12-slim
|
||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
# Upgrade pip and setuptools
|
# Install uv for package management
|
||||||
RUN pip install --upgrade pip setuptools wheel
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
||||||
|
|
||||||
# Copy only necessary files from builder
|
ENV UV_SYSTEM_PYTHON=1
|
||||||
|
|
||||||
|
# Copy installed packages and application code
|
||||||
COPY --from=builder /root/.local /root/.local
|
COPY --from=builder /root/.local /root/.local
|
||||||
COPY ./lightrag ./lightrag
|
COPY --from=builder /app/.venv /app/.venv
|
||||||
|
COPY --from=builder /app/lightrag ./lightrag
|
||||||
|
COPY pyproject.toml .
|
||||||
COPY setup.py .
|
COPY setup.py .
|
||||||
|
COPY uv.lock .
|
||||||
|
|
||||||
RUN pip install --use-pep517 ".[api]"
|
# Ensure the installed scripts are on PATH
|
||||||
# Make sure scripts in .local are usable
|
ENV PATH=/app/.venv/bin:/root/.local/bin:$PATH
|
||||||
ENV PATH=/root/.local/bin:$PATH
|
|
||||||
|
|
||||||
# Create necessary directories
|
# Install dependencies with uv sync (uses locked versions from uv.lock)
|
||||||
RUN mkdir -p /app/data/rag_storage /app/data/inputs
|
# And ensure pip is available for runtime installs
|
||||||
|
RUN uv sync --frozen --no-dev --extra api --extra offline --no-editable \
|
||||||
|
&& /app/.venv/bin/python -m ensurepip --upgrade
|
||||||
|
|
||||||
# Docker data directories
|
# Create persistent data directories AFTER package installation
|
||||||
|
RUN mkdir -p /app/data/rag_storage /app/data/inputs /app/data/tiktoken
|
||||||
|
|
||||||
|
# Copy offline cache into the newly created directory
|
||||||
|
COPY --from=builder /app/data/tiktoken /app/data/tiktoken
|
||||||
|
|
||||||
|
# Point to the prepared cache
|
||||||
|
ENV TIKTOKEN_CACHE_DIR=/app/data/tiktoken
|
||||||
ENV WORKING_DIR=/app/data/rag_storage
|
ENV WORKING_DIR=/app/data/rag_storage
|
||||||
ENV INPUT_DIR=/app/data/inputs
|
ENV INPUT_DIR=/app/data/inputs
|
||||||
|
|
||||||
# Expose the default port
|
# Expose API port
|
||||||
EXPOSE 9621
|
EXPOSE 9621
|
||||||
|
|
||||||
# Set entrypoint
|
|
||||||
ENTRYPOINT ["python", "-m", "lightrag.api.lightrag_server"]
|
ENTRYPOINT ["python", "-m", "lightrag.api.lightrag_server"]
|
||||||
|
|
|
||||||
102
Dockerfile.lite
Normal file
102
Dockerfile.lite
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
# Frontend build stage
|
||||||
|
FROM oven/bun:1 AS frontend-builder
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy frontend source code
|
||||||
|
COPY lightrag_webui/ ./lightrag_webui/
|
||||||
|
|
||||||
|
# Build frontend assets for inclusion in the API package
|
||||||
|
RUN cd lightrag_webui \
|
||||||
|
&& bun install --frozen-lockfile \
|
||||||
|
&& bun run build
|
||||||
|
|
||||||
|
# Python build stage - using uv for package installation
|
||||||
|
FROM ghcr.io/astral-sh/uv:python3.12-bookworm-slim AS builder
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
ENV UV_SYSTEM_PYTHON=1
|
||||||
|
ENV UV_COMPILE_BYTECODE=1
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install system dependencies required by some wheels
|
||||||
|
RUN apt-get update \
|
||||||
|
&& apt-get install -y --no-install-recommends \
|
||||||
|
curl \
|
||||||
|
build-essential \
|
||||||
|
pkg-config \
|
||||||
|
&& rm -rf /var/lib/apt/lists/* \
|
||||||
|
&& curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
|
||||||
|
|
||||||
|
ENV PATH="/root/.cargo/bin:/root/.local/bin:${PATH}"
|
||||||
|
|
||||||
|
# Ensure shared data directory exists for uv caches
|
||||||
|
RUN mkdir -p /root/.local/share/uv
|
||||||
|
|
||||||
|
# Copy project metadata and sources
|
||||||
|
COPY pyproject.toml .
|
||||||
|
COPY setup.py .
|
||||||
|
COPY uv.lock .
|
||||||
|
|
||||||
|
# Install project dependencies (base + API extras) without the project to improve caching
|
||||||
|
RUN uv sync --frozen --no-dev --extra api --no-install-project --no-editable
|
||||||
|
|
||||||
|
# Copy project sources after dependency layer
|
||||||
|
COPY lightrag/ ./lightrag/
|
||||||
|
|
||||||
|
# Include pre-built frontend assets from the previous stage
|
||||||
|
COPY --from=frontend-builder /app/lightrag/api/webui ./lightrag/api/webui
|
||||||
|
|
||||||
|
# Sync project in non-editable mode and ensure pip is available for runtime installs
|
||||||
|
RUN uv sync --frozen --no-dev --extra api --no-editable \
|
||||||
|
&& /app/.venv/bin/python -m ensurepip --upgrade
|
||||||
|
|
||||||
|
# Prepare tiktoken cache directory and pre-populate tokenizer data
|
||||||
|
# Ignore exit code 2 which indicates assets already cached
|
||||||
|
RUN mkdir -p /app/data/tiktoken \
|
||||||
|
&& uv run lightrag-download-cache --cache-dir /app/data/tiktoken || status=$?; \
|
||||||
|
if [ -n "${status:-}" ] && [ "$status" -ne 0 ] && [ "$status" -ne 2 ]; then exit "$status"; fi
|
||||||
|
|
||||||
|
# Final stage
|
||||||
|
FROM python:3.12-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install uv for package management
|
||||||
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
||||||
|
|
||||||
|
ENV UV_SYSTEM_PYTHON=1
|
||||||
|
|
||||||
|
# Copy installed packages and application code
|
||||||
|
COPY --from=builder /root/.local /root/.local
|
||||||
|
COPY --from=builder /app/.venv /app/.venv
|
||||||
|
COPY --from=builder /app/lightrag ./lightrag
|
||||||
|
COPY pyproject.toml .
|
||||||
|
COPY setup.py .
|
||||||
|
COPY uv.lock .
|
||||||
|
|
||||||
|
# Ensure the installed scripts are on PATH
|
||||||
|
ENV PATH=/app/.venv/bin:/root/.local/bin:$PATH
|
||||||
|
|
||||||
|
# Sync dependencies inside the final image using uv
|
||||||
|
# And ensure pip is available for runtime installs
|
||||||
|
RUN uv sync --frozen --no-dev --extra api --no-editable \
|
||||||
|
&& /app/.venv/bin/python -m ensurepip --upgrade
|
||||||
|
|
||||||
|
# Create persistent data directories
|
||||||
|
RUN mkdir -p /app/data/rag_storage /app/data/inputs /app/data/tiktoken
|
||||||
|
|
||||||
|
# Copy cached tokenizer assets prepared in the builder stage
|
||||||
|
COPY --from=builder /app/data/tiktoken /app/data/tiktoken
|
||||||
|
|
||||||
|
# Docker data directories
|
||||||
|
ENV TIKTOKEN_CACHE_DIR=/app/data/tiktoken
|
||||||
|
ENV WORKING_DIR=/app/data/rag_storage
|
||||||
|
ENV INPUT_DIR=/app/data/inputs
|
||||||
|
|
||||||
|
# Expose API port
|
||||||
|
EXPOSE 9621
|
||||||
|
|
||||||
|
# Set entrypoint
|
||||||
|
ENTRYPOINT ["python", "-m", "lightrag.api.lightrag_server"]
|
||||||
77
docker-build-push.sh
Executable file
77
docker-build-push.sh
Executable file
|
|
@ -0,0 +1,77 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Configuration
|
||||||
|
IMAGE_NAME="ghcr.io/hkuds/lightrag"
|
||||||
|
DOCKERFILE="Dockerfile"
|
||||||
|
TAG="latest"
|
||||||
|
|
||||||
|
# Get version from git tags
|
||||||
|
VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "dev")
|
||||||
|
|
||||||
|
echo "=================================="
|
||||||
|
echo " Multi-Architecture Docker Build"
|
||||||
|
echo "=================================="
|
||||||
|
echo "Image: ${IMAGE_NAME}:${TAG}"
|
||||||
|
echo "Version: ${VERSION}"
|
||||||
|
echo "Platforms: linux/amd64, linux/arm64"
|
||||||
|
echo "=================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check Docker login status (skip if CR_PAT is set for CI/CD)
|
||||||
|
if [ -z "$CR_PAT" ]; then
|
||||||
|
if ! docker info 2>/dev/null | grep -q "Username"; then
|
||||||
|
echo "⚠️ Warning: Not logged in to Docker registry"
|
||||||
|
echo "Please login first: docker login ghcr.io"
|
||||||
|
echo "Or set CR_PAT environment variable for automated login"
|
||||||
|
echo ""
|
||||||
|
read -p "Continue anyway? (y/n) " -n 1 -r
|
||||||
|
echo
|
||||||
|
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Using CR_PAT environment variable for authentication"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if buildx builder exists, create if not
|
||||||
|
if ! docker buildx ls | grep -q "desktop-linux"; then
|
||||||
|
echo "Creating buildx builder..."
|
||||||
|
docker buildx create --name desktop-linux --use
|
||||||
|
docker buildx inspect --bootstrap
|
||||||
|
else
|
||||||
|
echo "Using existing buildx builder: desktop-linux"
|
||||||
|
docker buildx use desktop-linux
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "Building and pushing multi-architecture image..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Build and push
|
||||||
|
docker buildx build \
|
||||||
|
--platform linux/amd64,linux/arm64 \
|
||||||
|
--file ${DOCKERFILE} \
|
||||||
|
--tag ${IMAGE_NAME}:${TAG} \
|
||||||
|
--tag ${IMAGE_NAME}:${VERSION} \
|
||||||
|
--push \
|
||||||
|
.
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✓ Build and push complete!"
|
||||||
|
echo ""
|
||||||
|
echo "Images pushed:"
|
||||||
|
echo " - ${IMAGE_NAME}:${TAG}"
|
||||||
|
echo " - ${IMAGE_NAME}:${VERSION}"
|
||||||
|
echo ""
|
||||||
|
echo "Verifying multi-architecture manifest..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Verify
|
||||||
|
docker buildx imagetools inspect ${IMAGE_NAME}:${TAG}
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "✓ Verification complete!"
|
||||||
|
echo ""
|
||||||
|
echo "Pull with: docker pull ${IMAGE_NAME}:${TAG}"
|
||||||
|
|
@ -12,13 +12,10 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
- ./data/rag_storage:/app/data/rag_storage
|
- ./data/rag_storage:/app/data/rag_storage
|
||||||
- ./data/inputs:/app/data/inputs
|
- ./data/inputs:/app/data/inputs
|
||||||
- ./data/tiktoken:/app/data/tiktoken
|
|
||||||
- ./config.ini:/app/config.ini
|
- ./config.ini:/app/config.ini
|
||||||
- ./.env:/app/.env
|
- ./.env:/app/.env
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
environment:
|
|
||||||
- TIKTOKEN_CACHE_DIR=/app/data/tiktoken
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
extra_hosts:
|
extra_hosts:
|
||||||
- "host.docker.internal:host-gateway"
|
- "host.docker.internal:host-gateway"
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,11 @@
|
||||||
# LightRAG
|
# LightRAG Docker Deployment
|
||||||
|
|
||||||
A lightweight Knowledge Graph Retrieval-Augmented Generation system with multiple LLM backend support.
|
A lightweight Knowledge Graph Retrieval-Augmented Generation system with multiple LLM backend support.
|
||||||
|
|
||||||
## 🚀 Installation
|
## 🚀 Preparation
|
||||||
|
|
||||||
### Prerequisites
|
### Clone the repository:
|
||||||
- Python 3.10+
|
|
||||||
- Git
|
|
||||||
- Docker (optional for Docker deployment)
|
|
||||||
|
|
||||||
### Native Installation
|
|
||||||
|
|
||||||
1. Clone the repository:
|
|
||||||
```bash
|
```bash
|
||||||
# Linux/MacOS
|
# Linux/MacOS
|
||||||
git clone https://github.com/HKUDS/LightRAG.git
|
git clone https://github.com/HKUDS/LightRAG.git
|
||||||
|
|
@ -23,7 +17,8 @@ git clone https://github.com/HKUDS/LightRAG.git
|
||||||
cd LightRAG
|
cd LightRAG
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Configure your environment:
|
### Configure your environment:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Linux/MacOS
|
# Linux/MacOS
|
||||||
cp .env.example .env
|
cp .env.example .env
|
||||||
|
|
@ -35,141 +30,92 @@ Copy-Item .env.example .env
|
||||||
# Edit .env with your preferred configuration
|
# Edit .env with your preferred configuration
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Create and activate virtual environment:
|
LightRAG can be configured using environment variables in the `.env` file:
|
||||||
```bash
|
|
||||||
# Linux/MacOS
|
|
||||||
python -m venv venv
|
|
||||||
source venv/bin/activate
|
|
||||||
```
|
|
||||||
```powershell
|
|
||||||
# Windows PowerShell
|
|
||||||
python -m venv venv
|
|
||||||
.\venv\Scripts\Activate
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Install dependencies:
|
**Server Configuration**
|
||||||
```bash
|
|
||||||
# Both platforms
|
- `HOST`: Server host (default: 0.0.0.0)
|
||||||
pip install -r requirements.txt
|
- `PORT`: Server port (default: 9621)
|
||||||
```
|
|
||||||
|
**LLM Configuration**
|
||||||
|
|
||||||
|
- `LLM_BINDING`: LLM backend to use (lollms/ollama/openai)
|
||||||
|
- `LLM_BINDING_HOST`: LLM server host URL
|
||||||
|
- `LLM_MODEL`: Model name to use
|
||||||
|
|
||||||
|
**Embedding Configuration**
|
||||||
|
|
||||||
|
- `EMBEDDING_BINDING`: Embedding backend (lollms/ollama/openai)
|
||||||
|
- `EMBEDDING_BINDING_HOST`: Embedding server host URL
|
||||||
|
- `EMBEDDING_MODEL`: Embedding model name
|
||||||
|
|
||||||
|
**RAG Configuration**
|
||||||
|
|
||||||
|
- `MAX_ASYNC`: Maximum async operations
|
||||||
|
- `MAX_TOKENS`: Maximum token size
|
||||||
|
- `EMBEDDING_DIM`: Embedding dimensions
|
||||||
|
|
||||||
## 🐳 Docker Deployment
|
## 🐳 Docker Deployment
|
||||||
|
|
||||||
Docker instructions work the same on all platforms with Docker Desktop installed.
|
Docker instructions work the same on all platforms with Docker Desktop installed.
|
||||||
|
|
||||||
1. Build and start the container:
|
### Start LightRAG server:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
```
|
```
|
||||||
|
|
||||||
### Configuration Options
|
LightRAG Server uses the following paths for data storage:
|
||||||
|
|
||||||
LightRAG can be configured using environment variables in the `.env` file:
|
|
||||||
|
|
||||||
#### Server Configuration
|
|
||||||
- `HOST`: Server host (default: 0.0.0.0)
|
|
||||||
- `PORT`: Server port (default: 9621)
|
|
||||||
|
|
||||||
#### LLM Configuration
|
|
||||||
- `LLM_BINDING`: LLM backend to use (lollms/ollama/openai)
|
|
||||||
- `LLM_BINDING_HOST`: LLM server host URL
|
|
||||||
- `LLM_MODEL`: Model name to use
|
|
||||||
|
|
||||||
#### Embedding Configuration
|
|
||||||
- `EMBEDDING_BINDING`: Embedding backend (lollms/ollama/openai)
|
|
||||||
- `EMBEDDING_BINDING_HOST`: Embedding server host URL
|
|
||||||
- `EMBEDDING_MODEL`: Embedding model name
|
|
||||||
|
|
||||||
#### RAG Configuration
|
|
||||||
- `MAX_ASYNC`: Maximum async operations
|
|
||||||
- `MAX_TOKENS`: Maximum token size
|
|
||||||
- `EMBEDDING_DIM`: Embedding dimensions
|
|
||||||
|
|
||||||
#### Security
|
|
||||||
- `LIGHTRAG_API_KEY`: API key for authentication
|
|
||||||
|
|
||||||
### Data Storage Paths
|
|
||||||
|
|
||||||
The system uses the following paths for data storage:
|
|
||||||
```
|
```
|
||||||
data/
|
data/
|
||||||
├── rag_storage/ # RAG data persistence
|
├── rag_storage/ # RAG data persistence
|
||||||
└── inputs/ # Input documents
|
└── inputs/ # Input documents
|
||||||
```
|
```
|
||||||
|
|
||||||
### Example Deployments
|
### Updates
|
||||||
|
|
||||||
1. Using with Ollama:
|
|
||||||
```env
|
|
||||||
LLM_BINDING=ollama
|
|
||||||
LLM_BINDING_HOST=http://host.docker.internal:11434
|
|
||||||
LLM_MODEL=mistral
|
|
||||||
EMBEDDING_BINDING=ollama
|
|
||||||
EMBEDDING_BINDING_HOST=http://host.docker.internal:11434
|
|
||||||
EMBEDDING_MODEL=bge-m3
|
|
||||||
```
|
|
||||||
|
|
||||||
you can't just use localhost from docker, that's why you need to use host.docker.internal which is defined in the docker compose file and should allow you to access the localhost services.
|
|
||||||
|
|
||||||
2. Using with OpenAI:
|
|
||||||
```env
|
|
||||||
LLM_BINDING=openai
|
|
||||||
LLM_MODEL=gpt-3.5-turbo
|
|
||||||
EMBEDDING_BINDING=openai
|
|
||||||
EMBEDDING_MODEL=text-embedding-ada-002
|
|
||||||
OPENAI_API_KEY=your-api-key
|
|
||||||
```
|
|
||||||
|
|
||||||
### API Usage
|
|
||||||
|
|
||||||
Once deployed, you can interact with the API at `http://localhost:9621`
|
|
||||||
|
|
||||||
Example query using PowerShell:
|
|
||||||
```powershell
|
|
||||||
$headers = @{
|
|
||||||
"X-API-Key" = "your-api-key"
|
|
||||||
"Content-Type" = "application/json"
|
|
||||||
}
|
|
||||||
$body = @{
|
|
||||||
query = "your question here"
|
|
||||||
} | ConvertTo-Json
|
|
||||||
|
|
||||||
Invoke-RestMethod -Uri "http://localhost:9621/query" -Method Post -Headers $headers -Body $body
|
|
||||||
```
|
|
||||||
|
|
||||||
Example query using curl:
|
|
||||||
```bash
|
|
||||||
curl -X POST "http://localhost:9621/query" \
|
|
||||||
-H "X-API-Key: your-api-key" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"query": "your question here"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
## 🔒 Security
|
|
||||||
|
|
||||||
Remember to:
|
|
||||||
1. Set a strong API key in production
|
|
||||||
2. Use SSL in production environments
|
|
||||||
3. Configure proper network security
|
|
||||||
|
|
||||||
## 📦 Updates
|
|
||||||
|
|
||||||
To update the Docker container:
|
To update the Docker container:
|
||||||
```bash
|
```bash
|
||||||
docker-compose pull
|
docker-compose pull
|
||||||
docker-compose up -d --build
|
docker-compose down
|
||||||
|
docker-compose up
|
||||||
```
|
```
|
||||||
|
|
||||||
To update native installation:
|
### Offline deployment
|
||||||
|
|
||||||
|
Software packages requiring `transformers`, `torch`, or `cuda` will is not preinstalled in the dokcer images. Consequently, document extraction tools such as Docling, as well as local LLM models like Hugging Face and LMDeploy, can not be used in an off line enviroment. These high-compute-resource-demanding services should not be integrated into LightRAG. Docling will be decoupled and deployed as a standalone service.
|
||||||
|
|
||||||
|
## 📦 Build Docker Images
|
||||||
|
|
||||||
|
### For local development and testing
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Linux/MacOS
|
# Build and run with docker-compose
|
||||||
git pull
|
docker compose up --build
|
||||||
source venv/bin/activate
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
```
|
||||||
```powershell
|
|
||||||
# Windows PowerShell
|
### For production release
|
||||||
git pull
|
|
||||||
.\venv\Scripts\Activate
|
**multi-architecture build and push**:
|
||||||
pip install -r requirements.txt
|
|
||||||
|
```bash
|
||||||
|
# Use the provided build script
|
||||||
|
./docker-build-push.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**The build script will**:
|
||||||
|
|
||||||
|
- Check Docker registry login status
|
||||||
|
- Create/use buildx builder automatically
|
||||||
|
- Build for both AMD64 and ARM64 architectures
|
||||||
|
- Push to GitHub Container Registry (ghcr.io)
|
||||||
|
- Verify the multi-architecture manifest
|
||||||
|
|
||||||
|
**Prerequisites**:
|
||||||
|
|
||||||
|
Before building multi-architecture images, ensure you have:
|
||||||
|
|
||||||
|
- Docker 20.10+ with Buildx support
|
||||||
|
- Sufficient disk space (20GB+ recommended for offline image)
|
||||||
|
- Registry access credentials (if pushing images)
|
||||||
|
|
|
||||||
207
docs/FrontendBuildGuide.md
Normal file
207
docs/FrontendBuildGuide.md
Normal file
|
|
@ -0,0 +1,207 @@
|
||||||
|
# Frontend Build Guide
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
The LightRAG project includes a React-based WebUI frontend. This guide explains how frontend building works in different scenarios.
|
||||||
|
|
||||||
|
## Key Principle
|
||||||
|
|
||||||
|
- **Git Repository**: Frontend build results are **NOT** included (kept clean)
|
||||||
|
- **PyPI Package**: Frontend build results **ARE** included (ready to use)
|
||||||
|
- **Build Tool**: Uses **Bun** (not npm/yarn)
|
||||||
|
|
||||||
|
## Installation Scenarios
|
||||||
|
|
||||||
|
### 1. End Users (From PyPI) ✨
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
pip install lightrag-hku[api]
|
||||||
|
```
|
||||||
|
|
||||||
|
**What happens:**
|
||||||
|
- Frontend is already built and included in the package
|
||||||
|
- No additional steps needed
|
||||||
|
- Web interface works immediately
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Development Mode (Recommended for Contributors) 🔧
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
# Clone the repository
|
||||||
|
git clone https://github.com/HKUDS/LightRAG.git
|
||||||
|
cd LightRAG
|
||||||
|
|
||||||
|
# Install in editable mode (no frontend build required yet)
|
||||||
|
pip install -e ".[api]"
|
||||||
|
|
||||||
|
# Build frontend when needed (can be done anytime)
|
||||||
|
cd lightrag_webui
|
||||||
|
bun install --frozen-lockfile
|
||||||
|
bun run build
|
||||||
|
cd ..
|
||||||
|
```
|
||||||
|
|
||||||
|
**Advantages:**
|
||||||
|
- Install first, build later (flexible workflow)
|
||||||
|
- Changes take effect immediately (symlink mode)
|
||||||
|
- Frontend can be rebuilt anytime without reinstalling
|
||||||
|
|
||||||
|
**How it works:**
|
||||||
|
- Creates symlinks to source directory
|
||||||
|
- Frontend build output goes to `lightrag/api/webui/`
|
||||||
|
- Changes are immediately visible in installed package
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Normal Installation (Testing Package Build) 📦
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
# Clone the repository
|
||||||
|
git clone https://github.com/HKUDS/LightRAG.git
|
||||||
|
cd LightRAG
|
||||||
|
|
||||||
|
# ⚠️ MUST build frontend FIRST
|
||||||
|
cd lightrag_webui
|
||||||
|
bun install --frozen-lockfile
|
||||||
|
bun run build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Now install
|
||||||
|
pip install ".[api]"
|
||||||
|
```
|
||||||
|
|
||||||
|
**What happens:**
|
||||||
|
- Frontend files are **copied** to site-packages
|
||||||
|
- Post-build modifications won't affect installed package
|
||||||
|
- Requires rebuild + reinstall to update
|
||||||
|
|
||||||
|
**When to use:**
|
||||||
|
- Testing complete installation process
|
||||||
|
- Verifying package configuration
|
||||||
|
- Simulating PyPI user experience
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Creating Distribution Package 🚀
|
||||||
|
|
||||||
|
**Command:**
|
||||||
|
```bash
|
||||||
|
# Build frontend first
|
||||||
|
cd lightrag_webui
|
||||||
|
bun install --frozen-lockfile --production
|
||||||
|
bun run build
|
||||||
|
cd ..
|
||||||
|
|
||||||
|
# Create distribution packages
|
||||||
|
python -m build
|
||||||
|
|
||||||
|
# Output: dist/lightrag_hku-*.whl and dist/lightrag_hku-*.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
**What happens:**
|
||||||
|
- `setup.py` checks if frontend is built
|
||||||
|
- If missing, installation fails with helpful error message
|
||||||
|
- Generated package includes all frontend files
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## GitHub Actions (Automated Release)
|
||||||
|
|
||||||
|
When creating a release on GitHub:
|
||||||
|
|
||||||
|
1. **Automatically builds frontend** using Bun
|
||||||
|
2. **Verifies** build completed successfully
|
||||||
|
3. **Creates Python package** with frontend included
|
||||||
|
4. **Publishes to PyPI** using existing trusted publisher setup
|
||||||
|
|
||||||
|
**No manual intervention required!**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick Reference
|
||||||
|
|
||||||
|
| Scenario | Command | Frontend Required | Can Build After |
|
||||||
|
|----------|---------|-------------------|-----------------|
|
||||||
|
| From PyPI | `pip install lightrag-hku[api]` | Included | No (already installed) |
|
||||||
|
| Development | `pip install -e ".[api]"` | No | ✅ Yes (anytime) |
|
||||||
|
| Normal Install | `pip install ".[api]"` | ✅ Yes (before) | No (must reinstall) |
|
||||||
|
| Create Package | `python -m build` | ✅ Yes (before) | N/A |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bun Installation
|
||||||
|
|
||||||
|
If you don't have Bun installed:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# macOS/Linux
|
||||||
|
curl -fsSL https://bun.sh/install | bash
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
powershell -c "irm bun.sh/install.ps1 | iex"
|
||||||
|
```
|
||||||
|
|
||||||
|
Official documentation: https://bun.sh
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## File Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
LightRAG/
|
||||||
|
├── lightrag_webui/ # Frontend source code
|
||||||
|
│ ├── src/ # React components
|
||||||
|
│ ├── package.json # Dependencies
|
||||||
|
│ └── vite.config.ts # Build configuration
|
||||||
|
│ └── outDir: ../lightrag/api/webui # Build output
|
||||||
|
│
|
||||||
|
├── lightrag/
|
||||||
|
│ └── api/
|
||||||
|
│ └── webui/ # Frontend build output (gitignored)
|
||||||
|
│ ├── index.html # Built files (after running bun run build)
|
||||||
|
│ └── assets/ # Built assets
|
||||||
|
│
|
||||||
|
├── setup.py # Build checks
|
||||||
|
├── pyproject.toml # Package configuration
|
||||||
|
└── .gitignore # Excludes lightrag/api/webui/* (except .gitkeep)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Q: I installed in development mode but the web interface doesn't work
|
||||||
|
|
||||||
|
**A:** Build the frontend:
|
||||||
|
```bash
|
||||||
|
cd lightrag_webui && bun run build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Q: I built the frontend but it's not in my installed package
|
||||||
|
|
||||||
|
**A:** You probably used `pip install .` after building. Either:
|
||||||
|
- Use `pip install -e ".[api]"` for development
|
||||||
|
- Or reinstall: `pip uninstall lightrag-hku && pip install ".[api]"`
|
||||||
|
|
||||||
|
### Q: Where are the built frontend files?
|
||||||
|
|
||||||
|
**A:** In `lightrag/api/webui/` after running `bun run build`
|
||||||
|
|
||||||
|
### Q: Can I use npm or yarn instead of Bun?
|
||||||
|
|
||||||
|
**A:** The project is configured for Bun. While npm/yarn might work, Bun is recommended per project standards.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
✅ **PyPI users**: No action needed, frontend included
|
||||||
|
✅ **Developers**: Use `pip install -e ".[api]"`, build frontend when needed
|
||||||
|
✅ **CI/CD**: Automatic build in GitHub Actions
|
||||||
|
✅ **Git**: Frontend build output never committed
|
||||||
|
|
||||||
|
For questions or issues, please open a GitHub issue.
|
||||||
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
This guide provides comprehensive instructions for deploying LightRAG in offline environments where internet access is limited or unavailable.
|
This guide provides comprehensive instructions for deploying LightRAG in offline environments where internet access is limited or unavailable.
|
||||||
|
|
||||||
|
If you deploy LightRAG using Docker, there is no need to refer to this document, as the LightRAG Docker image is pre-configured for offline operation.
|
||||||
|
|
||||||
|
> Software packages requiring `transformers`, `torch`, or `cuda` will not be included in the offline dependency group. Consequently, document extraction tools such as Docling, as well as local LLM models like Hugging Face and LMDeploy, are outside the scope of offline installation support. These high-compute-resource-demanding services should not be integrated into LightRAG. Docling will be decoupled and deployed as a standalone service.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
|
|
||||||
- [Overview](#overview)
|
- [Overview](#overview)
|
||||||
|
|
@ -76,6 +80,8 @@ LightRAG provides flexible dependency groups for different use cases:
|
||||||
| `offline-llm` | LLM providers | OpenAI, Anthropic, Ollama, etc. |
|
| `offline-llm` | LLM providers | OpenAI, Anthropic, Ollama, etc. |
|
||||||
| `offline` | All of the above | Complete offline deployment |
|
| `offline` | All of the above | Complete offline deployment |
|
||||||
|
|
||||||
|
> Software packages requiring `transformers`, `torch`, or `cuda` will not be included in the offline dependency group.
|
||||||
|
|
||||||
### Installation Examples
|
### Installation Examples
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|
|
||||||
170
docs/UV_LOCK_GUIDE.md
Normal file
170
docs/UV_LOCK_GUIDE.md
Normal file
|
|
@ -0,0 +1,170 @@
|
||||||
|
# uv.lock Update Guide
|
||||||
|
|
||||||
|
## What is uv.lock?
|
||||||
|
|
||||||
|
`uv.lock` is uv's lock file. It captures the exact version of every dependency, including transitive ones, much like:
|
||||||
|
- Node.js `package-lock.json`
|
||||||
|
- Rust `Cargo.lock`
|
||||||
|
- Python Poetry `poetry.lock`
|
||||||
|
|
||||||
|
Keeping `uv.lock` in version control guarantees that everyone installs the same dependency set.
|
||||||
|
|
||||||
|
## When does uv.lock change?
|
||||||
|
|
||||||
|
### Situations where it does *not* change automatically
|
||||||
|
|
||||||
|
- Running `uv sync --frozen`
|
||||||
|
- Building Docker images that call `uv sync --frozen`
|
||||||
|
- Editing source code without touching dependency metadata
|
||||||
|
|
||||||
|
### Situations where it will change
|
||||||
|
|
||||||
|
1. **`uv lock` or `uv lock --upgrade`**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv lock # Resolve according to current constraints
|
||||||
|
uv lock --upgrade # Re-resolve and upgrade to the newest compatible releases
|
||||||
|
```
|
||||||
|
|
||||||
|
Use these commands after modifying `pyproject.toml`, when you want fresh dependency versions, or if the lock file was deleted or corrupted.
|
||||||
|
|
||||||
|
2. **`uv add`**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv add requests # Adds the dependency and updates both files
|
||||||
|
uv add --dev pytest # Adds a dev dependency
|
||||||
|
```
|
||||||
|
|
||||||
|
`uv add` edits `pyproject.toml` and refreshes `uv.lock` in one step.
|
||||||
|
|
||||||
|
3. **`uv remove`**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv remove requests
|
||||||
|
```
|
||||||
|
|
||||||
|
This removes the dependency from `pyproject.toml` and rewrites `uv.lock`.
|
||||||
|
|
||||||
|
4. **`uv sync` without `--frozen`**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv sync
|
||||||
|
```
|
||||||
|
|
||||||
|
Normally this only installs what is already locked. However, if `pyproject.toml` and `uv.lock` disagree or the lock file is missing, uv will regenerate and update `uv.lock`. In CI and production builds you should prefer `uv sync --frozen` to prevent unintended updates.
|
||||||
|
|
||||||
|
## Example workflows
|
||||||
|
|
||||||
|
### Scenario 1: Add a new dependency
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Recommended: let uv handle both files
|
||||||
|
uv add fastapi
|
||||||
|
git add pyproject.toml uv.lock
|
||||||
|
git commit -m "Add fastapi dependency"
|
||||||
|
|
||||||
|
# Manual alternative
|
||||||
|
# 1. Edit pyproject.toml
|
||||||
|
# 2. Regenerate the lock file
|
||||||
|
uv lock
|
||||||
|
git add pyproject.toml uv.lock
|
||||||
|
git commit -m "Add fastapi dependency"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scenario 2: Relax or tighten a version constraint
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 1. Edit the requirement in pyproject.toml,
|
||||||
|
# e.g. openai>=1.0.0,<2.0.0 -> openai>=1.5.0,<2.0.0
|
||||||
|
|
||||||
|
# 2. Re-resolve the lock file
|
||||||
|
uv lock
|
||||||
|
|
||||||
|
# 3. Commit both files
|
||||||
|
git add pyproject.toml uv.lock
|
||||||
|
git commit -m "Update openai to >=1.5.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scenario 3: Upgrade everything to the newest compatible versions
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv lock --upgrade
|
||||||
|
git diff uv.lock
|
||||||
|
git add uv.lock
|
||||||
|
git commit -m "Upgrade dependencies to latest compatible versions"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Scenario 4: Teammate syncing the project
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git pull # Fetch latest code and lock file
|
||||||
|
uv sync --frozen # Install exactly what uv.lock specifies
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using uv.lock in Docker
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
RUN uv sync --frozen --no-dev --extra api
|
||||||
|
```
|
||||||
|
|
||||||
|
`--frozen` guarantees reproducible builds because uv will refuse to deviate from the locked versions.
|
||||||
|
`--extra api` install API server
|
||||||
|
|
||||||
|
## Generating a lock file that includes offline dependencies
|
||||||
|
|
||||||
|
If you need `uv.lock` to capture the optional offline stacks, regenerate it with the relevant extras enabled:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv lock --extra api --extra offline
|
||||||
|
```
|
||||||
|
|
||||||
|
This command resolves the base project requirements plus both the `api` and `offline` optional dependency sets, ensuring downstream `uv sync --frozen --extra api --extra offline` installs work without further resolution.
|
||||||
|
|
||||||
|
## Frequently asked questions
|
||||||
|
|
||||||
|
- **`uv.lock` is almost 1 MB. Does that matter?**
|
||||||
|
No. The file is read only during dependency resolution.
|
||||||
|
|
||||||
|
- **Should we commit `uv.lock`?**
|
||||||
|
Yes. Commit it so collaborators and CI jobs share the same dependency graph.
|
||||||
|
|
||||||
|
- **Deleted the lock file by accident?**
|
||||||
|
Run `uv lock` to regenerate it from `pyproject.toml`.
|
||||||
|
|
||||||
|
- **Can `uv.lock` and `requirements.txt` coexist?**
|
||||||
|
They can, but maintaining both is redundant. Prefer relying on `uv.lock` alone whenever possible.
|
||||||
|
|
||||||
|
- **How do I inspect locked versions?**
|
||||||
|
```bash
|
||||||
|
uv tree
|
||||||
|
grep -A5 'name = "openai"' uv.lock
|
||||||
|
```
|
||||||
|
|
||||||
|
## Best practices
|
||||||
|
|
||||||
|
### Recommended
|
||||||
|
|
||||||
|
1. Commit `uv.lock` alongside `pyproject.toml`.
|
||||||
|
2. Use `uv sync --frozen` in CI, Docker, and other reproducible environments.
|
||||||
|
3. Use plain `uv sync` during local development if you want uv to reconcile the lock for you.
|
||||||
|
4. Run `uv lock --upgrade` periodically to pick up the latest compatible releases.
|
||||||
|
5. Regenerate the lock file immediately after changing dependency constraints.
|
||||||
|
|
||||||
|
### Avoid
|
||||||
|
|
||||||
|
1. Running `uv sync` without `--frozen` in CI or production pipelines.
|
||||||
|
2. Editing `uv.lock` by hand—uv will overwrite manual edits.
|
||||||
|
3. Ignoring lock file diffs in code reviews—unexpected dependency changes can break builds.
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
| Command | Updates `uv.lock` | Typical use |
|
||||||
|
|-----------------------|-------------------|-------------------------------------------|
|
||||||
|
| `uv lock` | ✅ Yes | After editing constraints |
|
||||||
|
| `uv lock --upgrade` | ✅ Yes | Upgrade to the newest compatible versions |
|
||||||
|
| `uv add <pkg>` | ✅ Yes | Add a dependency |
|
||||||
|
| `uv remove <pkg>` | ✅ Yes | Remove a dependency |
|
||||||
|
| `uv sync` | ⚠️ Maybe | Local development; can regenerate the lock |
|
||||||
|
| `uv sync --frozen` | ❌ No | CI/CD, Docker, reproducible builds |
|
||||||
|
|
||||||
|
Remember: `uv.lock` only changes when you run a command that tells it to. Keep it in sync with your project and commit it whenever it changes.
|
||||||
|
|
@ -23,7 +23,7 @@ WEBUI_DESCRIPTION="Simple and Fast Graph Based RAG System"
|
||||||
# WORKING_DIR=<absolute_path_for_working_dir>
|
# WORKING_DIR=<absolute_path_for_working_dir>
|
||||||
|
|
||||||
### Tiktoken cache directory (Store cached files in this folder for offline deployment)
|
### Tiktoken cache directory (Store cached files in this folder for offline deployment)
|
||||||
# TIKTOKEN_CACHE_DIR=./temp/tiktoken
|
# TIKTOKEN_CACHE_DIR=/app/data/tiktoken
|
||||||
|
|
||||||
### Ollama Emulating Model and Tag
|
### Ollama Emulating Model and Tag
|
||||||
# OLLAMA_EMULATING_MODEL_NAME=lightrag
|
# OLLAMA_EMULATING_MODEL_NAME=lightrag
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from .lightrag import LightRAG as LightRAG, QueryParam as QueryParam
|
from .lightrag import LightRAG as LightRAG, QueryParam as QueryParam
|
||||||
|
|
||||||
__version__ = "1.4.9.3"
|
__version__ = "1.4.9.4"
|
||||||
__author__ = "Zirui Guo"
|
__author__ = "Zirui Guo"
|
||||||
__url__ = "https://github.com/HKUDS/LightRAG"
|
__url__ = "https://github.com/HKUDS/LightRAG"
|
||||||
|
|
|
||||||
|
|
@ -21,15 +21,24 @@ pip install "lightrag-hku[api]"
|
||||||
* 从源代码安装
|
* 从源代码安装
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 克隆仓库
|
# Clone the repository
|
||||||
git clone https://github.com/HKUDS/lightrag.git
|
git clone https://github.com/HKUDS/lightrag.git
|
||||||
|
|
||||||
# 切换到仓库目录
|
# Change to the repository directory
|
||||||
cd lightrag
|
cd lightrag
|
||||||
|
|
||||||
# 如有必要,创建 Python 虚拟环境
|
# Create a Python virtual environment
|
||||||
# 以可编辑模式安装并支持 API
|
uv venv --seed --python 3.12
|
||||||
|
source .venv/bin/acivate
|
||||||
|
|
||||||
|
# Install in editable mode with API support
|
||||||
pip install -e ".[api]"
|
pip install -e ".[api]"
|
||||||
|
|
||||||
|
# Build front-end artifacts
|
||||||
|
cd lightrag_webui
|
||||||
|
bun install --frozen-lockfile
|
||||||
|
bun run build
|
||||||
|
cd ..
|
||||||
```
|
```
|
||||||
|
|
||||||
### 启动 LightRAG 服务器前的准备
|
### 启动 LightRAG 服务器前的准备
|
||||||
|
|
@ -109,36 +118,10 @@ lightrag-gunicorn --workers 4
|
||||||
|
|
||||||
### 使用 Docker 启动 LightRAG 服务器
|
### 使用 Docker 启动 LightRAG 服务器
|
||||||
|
|
||||||
* 配置 .env 文件:
|
使用 Docker Compose 是部署和运行 LightRAG Server 最便捷的方式。
|
||||||
通过复制示例文件 [`env.example`](env.example) 创建个性化的 .env 文件,并根据实际需求设置 LLM 及 Embedding 参数。
|
- 创建一个项目目录。
|
||||||
* 创建一个名为 docker-compose.yml 的文件:
|
- 将 LightRAG 仓库中的 `docker-compose.yml` 文件复制到您的项目目录中。
|
||||||
|
- 准备 `.env` 文件:复制示例文件 [`env.example`](https://ai.znipower.com:5013/c/env.example) 创建自定义的 `.env` 文件,并根据您的具体需求配置 LLM 和嵌入参数。
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
lightrag:
|
|
||||||
container_name: lightrag
|
|
||||||
image: ghcr.io/hkuds/lightrag:latest
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
tags:
|
|
||||||
- ghcr.io/hkuds/lightrag:latest
|
|
||||||
ports:
|
|
||||||
- "${PORT:-9621}:9621"
|
|
||||||
volumes:
|
|
||||||
- ./data/rag_storage:/app/data/rag_storage
|
|
||||||
- ./data/inputs:/app/data/inputs
|
|
||||||
- ./data/tiktoken:/app/data/tiktoken
|
|
||||||
- ./config.ini:/app/config.ini
|
|
||||||
- ./.env:/app/.env
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
environment:
|
|
||||||
- TIKTOKEN_CACHE_DIR=/app/data/tiktoken
|
|
||||||
restart: unless-stopped
|
|
||||||
extra_hosts:
|
|
||||||
- "host.docker.internal:host-gateway"
|
|
||||||
```
|
|
||||||
|
|
||||||
* 通过以下命令启动 LightRAG 服务器:
|
* 通过以下命令启动 LightRAG 服务器:
|
||||||
|
|
||||||
|
|
@ -146,11 +129,11 @@ services:
|
||||||
docker compose up
|
docker compose up
|
||||||
# 如果希望启动后让程序退到后台运行,需要在命令的最后添加 -d 参数
|
# 如果希望启动后让程序退到后台运行,需要在命令的最后添加 -d 参数
|
||||||
```
|
```
|
||||||
> 可以通过以下链接获取官方的docker compose文件:[docker-compose.yml]( https://raw.githubusercontent.com/HKUDS/LightRAG/refs/heads/main/docker-compose.yml) 。如需获取LightRAG的历史版本镜像,可以访问以下链接: [LightRAG Docker Images]( https://github.com/HKUDS/LightRAG/pkgs/container/lightrag)
|
> 可以通过以下链接获取官方的docker compose文件:[docker-compose.yml]( https://raw.githubusercontent.com/HKUDS/LightRAG/refs/heads/main/docker-compose.yml) 。如需获取LightRAG的历史版本镜像,可以访问以下链接: [LightRAG Docker Images]( https://github.com/HKUDS/LightRAG/pkgs/container/lightrag). 如需获取更多关于docker部署的信息,请参阅 [DockerDeployment.md](./../../docs/DockerDeployment.md).
|
||||||
|
|
||||||
### 离线部署
|
### 离线部署
|
||||||
|
|
||||||
对于离线或隔离环境,请参阅[离线部署指南](./../../docs/OfflineDeployment.md),了解如何预先安装所有依赖项和缓存文件。
|
官方的 LightRAG Docker 镜像完全兼容离线或隔离网络环境。如需搭建自己的离线部署环境,请参考 [离线部署指南](./../../docs/OfflineDeployment.md)。
|
||||||
|
|
||||||
### 启动多个LightRAG实例
|
### 启动多个LightRAG实例
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -27,9 +27,18 @@ git clone https://github.com/HKUDS/lightrag.git
|
||||||
# Change to the repository directory
|
# Change to the repository directory
|
||||||
cd lightrag
|
cd lightrag
|
||||||
|
|
||||||
# create a Python virtual environment if necessary
|
# Create a Python virtual environment
|
||||||
|
uv venv --seed --python 3.12
|
||||||
|
source .venv/bin/acivate
|
||||||
|
|
||||||
# Install in editable mode with API support
|
# Install in editable mode with API support
|
||||||
pip install -e ".[api]"
|
pip install -e ".[api]"
|
||||||
|
|
||||||
|
# Build front-end artifacts
|
||||||
|
cd lightrag_webui
|
||||||
|
bun install --frozen-lockfile
|
||||||
|
bun run build
|
||||||
|
cd ..
|
||||||
```
|
```
|
||||||
|
|
||||||
### Before Starting LightRAG Server
|
### Before Starting LightRAG Server
|
||||||
|
|
@ -110,37 +119,13 @@ During startup, configurations in the `.env` file can be overridden by command-l
|
||||||
|
|
||||||
### Launching LightRAG Server with Docker
|
### Launching LightRAG Server with Docker
|
||||||
|
|
||||||
* Prepare the .env file:
|
Using Docker Compose is the most convenient way to deploy and run the LightRAG Server.
|
||||||
Create a personalized .env file by copying the sample file [`env.example`](env.example). Configure the LLM and embedding parameters according to your requirements.
|
|
||||||
|
|
||||||
* Create a file named `docker-compose.yml`:
|
* Create a project directory.
|
||||||
|
|
||||||
```yaml
|
* Copy the `docker-compose.yml` file from the LightRAG repository into your project directory.
|
||||||
services:
|
|
||||||
lightrag:
|
* Prepare the `.env` file: Duplicate the sample file [`env.example`](https://ai.znipower.com:5013/c/env.example)to create a customized `.env` file, and configure the LLM and embedding parameters according to your specific requirements.
|
||||||
container_name: lightrag
|
|
||||||
image: ghcr.io/hkuds/lightrag:latest
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: Dockerfile
|
|
||||||
tags:
|
|
||||||
- ghcr.io/hkuds/lightrag:latest
|
|
||||||
ports:
|
|
||||||
- "${PORT:-9621}:9621"
|
|
||||||
volumes:
|
|
||||||
- ./data/rag_storage:/app/data/rag_storage
|
|
||||||
- ./data/inputs:/app/data/inputs
|
|
||||||
- ./data/tiktoken:/app/data/tiktoken
|
|
||||||
- ./config.ini:/app/config.ini
|
|
||||||
- ./.env:/app/.env
|
|
||||||
env_file:
|
|
||||||
- .env
|
|
||||||
environment:
|
|
||||||
- TIKTOKEN_CACHE_DIR=/app/data/tiktoken
|
|
||||||
restart: unless-stopped
|
|
||||||
extra_hosts:
|
|
||||||
- "host.docker.internal:host-gateway"
|
|
||||||
```
|
|
||||||
|
|
||||||
* Start the LightRAG Server with the following command:
|
* Start the LightRAG Server with the following command:
|
||||||
|
|
||||||
|
|
@ -149,11 +134,11 @@ docker compose up
|
||||||
# If you want the program to run in the background after startup, add the -d parameter at the end of the command.
|
# If you want the program to run in the background after startup, add the -d parameter at the end of the command.
|
||||||
```
|
```
|
||||||
|
|
||||||
> You can get the official docker compose file from here: [docker-compose.yml](https://raw.githubusercontent.com/HKUDS/LightRAG/refs/heads/main/docker-compose.yml). For historical versions of LightRAG docker images, visit this link: [LightRAG Docker Images](https://github.com/HKUDS/LightRAG/pkgs/container/lightrag)
|
You can get the official docker compose file from here: [docker-compose.yml](https://raw.githubusercontent.com/HKUDS/LightRAG/refs/heads/main/docker-compose.yml). For historical versions of LightRAG docker images, visit this link: [LightRAG Docker Images](https://github.com/HKUDS/LightRAG/pkgs/container/lightrag). For more details about docker deployment, please refer to [DockerDeployment.md](./../../docs/DockerDeployment.md).
|
||||||
|
|
||||||
### Offline Deployment
|
### Offline Deployment
|
||||||
|
|
||||||
For offline or air-gapped environments, see the [Offline Deployment Guide](./../../docs/OfflineDeployment.md) for instructions on pre-installing all dependencies and cache files.
|
Official LightRAG Docker images are fully compatible with offline or air-gapped environments. If you want to build up you own offline enviroment, please refer to [Offline Deployment Guide](./../../docs/OfflineDeployment.md).
|
||||||
|
|
||||||
### Starting Multiple LightRAG Instances
|
### Starting Multiple LightRAG Instances
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1 +1 @@
|
||||||
__api_version__ = "0238"
|
__api_version__ = "0240"
|
||||||
|
|
|
||||||
|
|
@ -145,7 +145,129 @@ class LLMConfigCache:
|
||||||
self.ollama_embedding_options = {}
|
self.ollama_embedding_options = {}
|
||||||
|
|
||||||
|
|
||||||
|
def check_frontend_build():
|
||||||
|
"""Check if frontend is built and optionally check if source is up-to-date"""
|
||||||
|
webui_dir = Path(__file__).parent / "webui"
|
||||||
|
index_html = webui_dir / "index.html"
|
||||||
|
|
||||||
|
# 1. Check if build files exist (required)
|
||||||
|
if not index_html.exists():
|
||||||
|
ASCIIColors.red("\n" + "=" * 80)
|
||||||
|
ASCIIColors.red("ERROR: Frontend Not Built")
|
||||||
|
ASCIIColors.red("=" * 80)
|
||||||
|
ASCIIColors.yellow("The WebUI frontend has not been built yet.")
|
||||||
|
ASCIIColors.yellow(
|
||||||
|
"Please build the frontend code first using the following commands:\n"
|
||||||
|
)
|
||||||
|
ASCIIColors.cyan(" cd lightrag_webui")
|
||||||
|
ASCIIColors.cyan(" bun install --frozen-lockfile")
|
||||||
|
ASCIIColors.cyan(" bun run build")
|
||||||
|
ASCIIColors.cyan(" cd ..")
|
||||||
|
ASCIIColors.yellow("\nThen restart the service.\n")
|
||||||
|
ASCIIColors.cyan(
|
||||||
|
"Note: Make sure you have Bun installed. Visit https://bun.sh for installation."
|
||||||
|
)
|
||||||
|
ASCIIColors.red("=" * 80 + "\n")
|
||||||
|
sys.exit(1) # Exit immediately
|
||||||
|
|
||||||
|
# 2. Check if this is a development environment (source directory exists)
|
||||||
|
try:
|
||||||
|
source_dir = Path(__file__).parent.parent.parent / "lightrag_webui"
|
||||||
|
src_dir = source_dir / "src"
|
||||||
|
|
||||||
|
# Determine if this is a development environment: source directory exists and contains src directory
|
||||||
|
if not source_dir.exists() or not src_dir.exists():
|
||||||
|
# Production environment, skip source code check
|
||||||
|
logger.debug(
|
||||||
|
"Production environment detected, skipping source freshness check"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Development environment, perform source code timestamp check
|
||||||
|
logger.debug("Development environment detected, checking source freshness")
|
||||||
|
|
||||||
|
# Source code file extensions (files to check)
|
||||||
|
source_extensions = {
|
||||||
|
".ts",
|
||||||
|
".tsx",
|
||||||
|
".js",
|
||||||
|
".jsx",
|
||||||
|
".mjs",
|
||||||
|
".cjs", # TypeScript/JavaScript
|
||||||
|
".css",
|
||||||
|
".scss",
|
||||||
|
".sass",
|
||||||
|
".less", # Style files
|
||||||
|
".json",
|
||||||
|
".jsonc", # Configuration/data files
|
||||||
|
".html",
|
||||||
|
".htm", # Template files
|
||||||
|
".md",
|
||||||
|
".mdx", # Markdown
|
||||||
|
}
|
||||||
|
|
||||||
|
# Key configuration files (in lightrag_webui root directory)
|
||||||
|
key_files = [
|
||||||
|
source_dir / "package.json",
|
||||||
|
source_dir / "bun.lock",
|
||||||
|
source_dir / "vite.config.ts",
|
||||||
|
source_dir / "tsconfig.json",
|
||||||
|
source_dir / "tailwind.config.js",
|
||||||
|
source_dir / "index.html",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Get the latest modification time of source code
|
||||||
|
latest_source_time = 0
|
||||||
|
|
||||||
|
# Check source code files in src directory
|
||||||
|
for file_path in src_dir.rglob("*"):
|
||||||
|
if file_path.is_file():
|
||||||
|
# Only check source code files, ignore temporary files and logs
|
||||||
|
if file_path.suffix.lower() in source_extensions:
|
||||||
|
mtime = file_path.stat().st_mtime
|
||||||
|
latest_source_time = max(latest_source_time, mtime)
|
||||||
|
|
||||||
|
# Check key configuration files
|
||||||
|
for key_file in key_files:
|
||||||
|
if key_file.exists():
|
||||||
|
mtime = key_file.stat().st_mtime
|
||||||
|
latest_source_time = max(latest_source_time, mtime)
|
||||||
|
|
||||||
|
# Get build time
|
||||||
|
build_time = index_html.stat().st_mtime
|
||||||
|
|
||||||
|
# Compare timestamps (5 second tolerance to avoid file system time precision issues)
|
||||||
|
if latest_source_time > build_time + 5:
|
||||||
|
ASCIIColors.yellow("\n" + "=" * 80)
|
||||||
|
ASCIIColors.yellow("WARNING: Frontend Source Code Has Been Updated")
|
||||||
|
ASCIIColors.yellow("=" * 80)
|
||||||
|
ASCIIColors.yellow(
|
||||||
|
"The frontend source code is newer than the current build."
|
||||||
|
)
|
||||||
|
ASCIIColors.yellow(
|
||||||
|
"This might happen after 'git pull' or manual code changes.\n"
|
||||||
|
)
|
||||||
|
ASCIIColors.cyan(
|
||||||
|
"Recommended: Rebuild the frontend to use the latest changes:"
|
||||||
|
)
|
||||||
|
ASCIIColors.cyan(" cd lightrag_webui")
|
||||||
|
ASCIIColors.cyan(" bun install --frozen-lockfile")
|
||||||
|
ASCIIColors.cyan(" bun run build")
|
||||||
|
ASCIIColors.cyan(" cd ..")
|
||||||
|
ASCIIColors.yellow("\nThe server will continue with the current build.")
|
||||||
|
ASCIIColors.yellow("=" * 80 + "\n")
|
||||||
|
else:
|
||||||
|
logger.info("Frontend build is up-to-date")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# If check fails, log warning but don't affect startup
|
||||||
|
logger.warning(f"Failed to check frontend source freshness: {e}")
|
||||||
|
|
||||||
|
|
||||||
def create_app(args):
|
def create_app(args):
|
||||||
|
# Check frontend build first
|
||||||
|
check_frontend_build()
|
||||||
|
|
||||||
# Setup logging
|
# Setup logging
|
||||||
logger.setLevel(args.log_level)
|
logger.setLevel(args.log_level)
|
||||||
set_verbose_debug(args.verbose)
|
set_verbose_debug(args.verbose)
|
||||||
|
|
@ -786,7 +908,9 @@ def create_app(args):
|
||||||
async def get_response(self, path: str, scope):
|
async def get_response(self, path: str, scope):
|
||||||
response = await super().get_response(path, scope)
|
response = await super().get_response(path, scope)
|
||||||
|
|
||||||
if path.endswith(".html"):
|
is_html = path.endswith(".html") or response.media_type == "text/html"
|
||||||
|
|
||||||
|
if is_html:
|
||||||
response.headers["Cache-Control"] = (
|
response.headers["Cache-Control"] = (
|
||||||
"no-cache, no-store, must-revalidate"
|
"no-cache, no-store, must-revalidate"
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -406,7 +406,7 @@ class DocStatusResponse(BaseModel):
|
||||||
"id": "doc_123456",
|
"id": "doc_123456",
|
||||||
"content_summary": "Research paper on machine learning",
|
"content_summary": "Research paper on machine learning",
|
||||||
"content_length": 15240,
|
"content_length": 15240,
|
||||||
"status": "PROCESSED",
|
"status": "processed",
|
||||||
"created_at": "2025-03-31T12:34:56",
|
"created_at": "2025-03-31T12:34:56",
|
||||||
"updated_at": "2025-03-31T12:35:30",
|
"updated_at": "2025-03-31T12:35:30",
|
||||||
"track_id": "upload_20250729_170612_abc123",
|
"track_id": "upload_20250729_170612_abc123",
|
||||||
|
|
@ -439,7 +439,7 @@ class DocsStatusesResponse(BaseModel):
|
||||||
"id": "doc_123",
|
"id": "doc_123",
|
||||||
"content_summary": "Pending document",
|
"content_summary": "Pending document",
|
||||||
"content_length": 5000,
|
"content_length": 5000,
|
||||||
"status": "PENDING",
|
"status": "pending",
|
||||||
"created_at": "2025-03-31T10:00:00",
|
"created_at": "2025-03-31T10:00:00",
|
||||||
"updated_at": "2025-03-31T10:00:00",
|
"updated_at": "2025-03-31T10:00:00",
|
||||||
"track_id": "upload_20250331_100000_abc123",
|
"track_id": "upload_20250331_100000_abc123",
|
||||||
|
|
@ -449,12 +449,27 @@ class DocsStatusesResponse(BaseModel):
|
||||||
"file_path": "pending_doc.pdf",
|
"file_path": "pending_doc.pdf",
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"PREPROCESSED": [
|
||||||
|
{
|
||||||
|
"id": "doc_789",
|
||||||
|
"content_summary": "Document pending final indexing",
|
||||||
|
"content_length": 7200,
|
||||||
|
"status": "multimodal_processed",
|
||||||
|
"created_at": "2025-03-31T09:30:00",
|
||||||
|
"updated_at": "2025-03-31T09:35:00",
|
||||||
|
"track_id": "upload_20250331_093000_xyz789",
|
||||||
|
"chunks_count": 10,
|
||||||
|
"error": None,
|
||||||
|
"metadata": None,
|
||||||
|
"file_path": "preprocessed_doc.pdf",
|
||||||
|
}
|
||||||
|
],
|
||||||
"PROCESSED": [
|
"PROCESSED": [
|
||||||
{
|
{
|
||||||
"id": "doc_456",
|
"id": "doc_456",
|
||||||
"content_summary": "Processed document",
|
"content_summary": "Processed document",
|
||||||
"content_length": 8000,
|
"content_length": 8000,
|
||||||
"status": "PROCESSED",
|
"status": "processed",
|
||||||
"created_at": "2025-03-31T09:00:00",
|
"created_at": "2025-03-31T09:00:00",
|
||||||
"updated_at": "2025-03-31T09:05:00",
|
"updated_at": "2025-03-31T09:05:00",
|
||||||
"track_id": "insert_20250331_090000_def456",
|
"track_id": "insert_20250331_090000_def456",
|
||||||
|
|
@ -626,6 +641,7 @@ class PaginatedDocsResponse(BaseModel):
|
||||||
"status_counts": {
|
"status_counts": {
|
||||||
"PENDING": 10,
|
"PENDING": 10,
|
||||||
"PROCESSING": 5,
|
"PROCESSING": 5,
|
||||||
|
"PREPROCESSED": 5,
|
||||||
"PROCESSED": 130,
|
"PROCESSED": 130,
|
||||||
"FAILED": 5,
|
"FAILED": 5,
|
||||||
},
|
},
|
||||||
|
|
@ -648,6 +664,7 @@ class StatusCountsResponse(BaseModel):
|
||||||
"status_counts": {
|
"status_counts": {
|
||||||
"PENDING": 10,
|
"PENDING": 10,
|
||||||
"PROCESSING": 5,
|
"PROCESSING": 5,
|
||||||
|
"PREPROCESSED": 5,
|
||||||
"PROCESSED": 130,
|
"PROCESSED": 130,
|
||||||
"FAILED": 5,
|
"FAILED": 5,
|
||||||
}
|
}
|
||||||
|
|
@ -2210,7 +2227,7 @@ def create_document_routes(
|
||||||
To prevent excessive resource consumption, a maximum of 1,000 records is returned.
|
To prevent excessive resource consumption, a maximum of 1,000 records is returned.
|
||||||
|
|
||||||
This endpoint retrieves the current status of all documents, grouped by their
|
This endpoint retrieves the current status of all documents, grouped by their
|
||||||
processing status (PENDING, PROCESSING, PROCESSED, FAILED). The results are
|
processing status (PENDING, PROCESSING, PREPROCESSED, PROCESSED, FAILED). The results are
|
||||||
limited to 1000 total documents with fair distribution across all statuses.
|
limited to 1000 total documents with fair distribution across all statuses.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
@ -2226,6 +2243,7 @@ def create_document_routes(
|
||||||
statuses = (
|
statuses = (
|
||||||
DocStatus.PENDING,
|
DocStatus.PENDING,
|
||||||
DocStatus.PROCESSING,
|
DocStatus.PROCESSING,
|
||||||
|
DocStatus.PREPROCESSED,
|
||||||
DocStatus.PROCESSED,
|
DocStatus.PROCESSED,
|
||||||
DocStatus.FAILED,
|
DocStatus.FAILED,
|
||||||
)
|
)
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
BIN
lightrag/api/webui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf
generated
BIN
lightrag/api/webui/assets/KaTeX_AMS-Regular-DRggAlZN.ttf
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lightrag/api/webui/assets/KaTeX_Main-Bold-Cx986IdX.woff2
generated
BIN
lightrag/api/webui/assets/KaTeX_Main-Bold-Cx986IdX.woff2
generated
Binary file not shown.
BIN
lightrag/api/webui/assets/KaTeX_Main-Bold-Jm3AIy58.woff
generated
BIN
lightrag/api/webui/assets/KaTeX_Main-Bold-Jm3AIy58.woff
generated
Binary file not shown.
BIN
lightrag/api/webui/assets/KaTeX_Main-Bold-waoOVXN0.ttf
generated
BIN
lightrag/api/webui/assets/KaTeX_Main-Bold-waoOVXN0.ttf
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lightrag/api/webui/assets/KaTeX_Main-Italic-3WenGoN9.ttf
generated
BIN
lightrag/api/webui/assets/KaTeX_Main-Italic-3WenGoN9.ttf
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
lightrag/api/webui/assets/KaTeX_Math-Italic-flOr_0UB.ttf
generated
BIN
lightrag/api/webui/assets/KaTeX_Math-Italic-flOr_0UB.ttf
generated
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
||||||
import{e as v,c as b,g as m,k as O,h as P,j as p,l as w,m as A,n as x,t as c,o as N}from"./_baseUniq-DknB5v3H.js";import{aQ as g,aA as E,aR as F,aS as M,aT as T,aU as I,aV as _,aW as $,aX as y,aY as B}from"./index-bjrbS6e8.js";var S=/\s/;function R(n){for(var r=n.length;r--&&S.test(n.charAt(r)););return r}var G=/^\s+/;function H(n){return n&&n.slice(0,R(n)+1).replace(G,"")}var o=NaN,L=/^[-+]0x[0-9a-f]+$/i,W=/^0b[01]+$/i,X=/^0o[0-7]+$/i,Y=parseInt;function q(n){if(typeof n=="number")return n;if(v(n))return o;if(g(n)){var r=typeof n.valueOf=="function"?n.valueOf():n;n=g(r)?r+"":r}if(typeof n!="string")return n===0?n:+n;n=H(n);var t=W.test(n);return t||X.test(n)?Y(n.slice(2),t?2:8):L.test(n)?o:+n}var z=1/0,C=17976931348623157e292;function K(n){if(!n)return n===0?n:0;if(n=q(n),n===z||n===-1/0){var r=n<0?-1:1;return r*C}return n===n?n:0}function Q(n){var r=K(n),t=r%1;return r===r?t?r-t:r:0}function fn(n){var r=n==null?0:n.length;return r?b(n):[]}var l=Object.prototype,U=l.hasOwnProperty,dn=E(function(n,r){n=Object(n);var t=-1,e=r.length,a=e>2?r[2]:void 0;for(a&&F(r[0],r[1],a)&&(e=1);++t<e;)for(var f=r[t],i=M(f),s=-1,d=i.length;++s<d;){var u=i[s],h=n[u];(h===void 0||T(h,l[u])&&!U.call(n,u))&&(n[u]=f[u])}return n});function un(n){var r=n==null?0:n.length;return r?n[r-1]:void 0}function D(n){return function(r,t,e){var a=Object(r);if(!I(r)){var f=m(t);r=O(r),t=function(s){return f(a[s],s,a)}}var i=n(r,t,e);return i>-1?a[f?r[i]:i]:void 0}}var J=Math.max;function Z(n,r,t){var e=n==null?0:n.length;if(!e)return-1;var a=t==null?0:Q(t);return a<0&&(a=J(e+a,0)),P(n,m(r),a)}var hn=D(Z);function V(n,r){var t=-1,e=I(n)?Array(n.length):[];return p(n,function(a,f,i){e[++t]=r(a,f,i)}),e}function gn(n,r){var t=_(n)?w:V;return t(n,m(r))}var j=Object.prototype,k=j.hasOwnProperty;function nn(n,r){return n!=null&&k.call(n,r)}function mn(n,r){return n!=null&&A(n,r,nn)}function rn(n,r){return n<r}function tn(n,r,t){for(var e=-1,a=n.length;++e<a;){var f=n[e],i=r(f);if(i!=null&&(s===void 0?i===i&&!v(i):t(i,s)))var s=i,d=f}return d}function on(n){return n&&n.length?tn(n,$,rn):void 0}function an(n,r,t,e){if(!g(n))return n;r=x(r,n);for(var a=-1,f=r.length,i=f-1,s=n;s!=null&&++a<f;){var d=c(r[a]),u=t;if(d==="__proto__"||d==="constructor"||d==="prototype")return n;if(a!=i){var h=s[d];u=void 0,u===void 0&&(u=g(h)?h:y(r[a+1])?[]:{})}B(s,d,u),s=s[d]}return n}function vn(n,r,t){for(var e=-1,a=r.length,f={};++e<a;){var i=r[e],s=N(n,i);t(s,i)&&an(f,x(i,n),s)}return f}export{rn as a,tn as b,V as c,vn as d,on as e,fn as f,hn as g,mn as h,dn as i,Q as j,un as l,gn as m,K as t};
|
|
||||||
1
lightrag/api/webui/assets/_baseUniq-DknB5v3H.js
generated
1
lightrag/api/webui/assets/_baseUniq-DknB5v3H.js
generated
File diff suppressed because one or more lines are too long
1
lightrag/api/webui/assets/arc-D-vjsldI.js
generated
1
lightrag/api/webui/assets/arc-D-vjsldI.js
generated
|
|
@ -1 +0,0 @@
|
||||||
import{a0 as ln,a1 as an,a2 as y,a3 as tn,a4 as H,a5 as q,a6 as _,a7 as un,a8 as B,a9 as rn,aa as L,ab as o,ac as sn,ad as on,ae as fn}from"./index-bjrbS6e8.js";function cn(l){return l.innerRadius}function yn(l){return l.outerRadius}function gn(l){return l.startAngle}function dn(l){return l.endAngle}function mn(l){return l&&l.padAngle}function pn(l,h,I,D,v,A,C,a){var O=I-l,i=D-h,n=C-v,d=a-A,u=d*O-n*i;if(!(u*u<y))return u=(n*(h-A)-d*(l-v))/u,[l+u*O,h+u*i]}function W(l,h,I,D,v,A,C){var a=l-I,O=h-D,i=(C?A:-A)/L(a*a+O*O),n=i*O,d=-i*a,u=l+n,s=h+d,f=I+n,c=D+d,F=(u+f)/2,t=(s+c)/2,m=f-u,g=c-s,R=m*m+g*g,T=v-A,P=u*c-f*s,S=(g<0?-1:1)*L(fn(0,T*T*R-P*P)),j=(P*g-m*S)/R,z=(-P*m-g*S)/R,w=(P*g+m*S)/R,p=(-P*m+g*S)/R,x=j-F,e=z-t,r=w-F,G=p-t;return x*x+e*e>r*r+G*G&&(j=w,z=p),{cx:j,cy:z,x01:-n,y01:-d,x11:j*(v/T-1),y11:z*(v/T-1)}}function hn(){var l=cn,h=yn,I=B(0),D=null,v=gn,A=dn,C=mn,a=null,O=ln(i);function i(){var n,d,u=+l.apply(this,arguments),s=+h.apply(this,arguments),f=v.apply(this,arguments)-an,c=A.apply(this,arguments)-an,F=un(c-f),t=c>f;if(a||(a=n=O()),s<u&&(d=s,s=u,u=d),!(s>y))a.moveTo(0,0);else if(F>tn-y)a.moveTo(s*H(f),s*q(f)),a.arc(0,0,s,f,c,!t),u>y&&(a.moveTo(u*H(c),u*q(c)),a.arc(0,0,u,c,f,t));else{var m=f,g=c,R=f,T=c,P=F,S=F,j=C.apply(this,arguments)/2,z=j>y&&(D?+D.apply(this,arguments):L(u*u+s*s)),w=_(un(s-u)/2,+I.apply(this,arguments)),p=w,x=w,e,r;if(z>y){var G=sn(z/u*q(j)),M=sn(z/s*q(j));(P-=G*2)>y?(G*=t?1:-1,R+=G,T-=G):(P=0,R=T=(f+c)/2),(S-=M*2)>y?(M*=t?1:-1,m+=M,g-=M):(S=0,m=g=(f+c)/2)}var J=s*H(m),K=s*q(m),N=u*H(T),Q=u*q(T);if(w>y){var U=s*H(g),V=s*q(g),X=u*H(R),Y=u*q(R),E;if(F<rn)if(E=pn(J,K,X,Y,U,V,N,Q)){var Z=J-E[0],$=K-E[1],b=U-E[0],k=V-E[1],nn=1/q(on((Z*b+$*k)/(L(Z*Z+$*$)*L(b*b+k*k)))/2),en=L(E[0]*E[0]+E[1]*E[1]);p=_(w,(u-en)/(nn-1)),x=_(w,(s-en)/(nn+1))}else p=x=0}S>y?x>y?(e=W(X,Y,J,K,s,x,t),r=W(U,V,N,Q,s,x,t),a.moveTo(e.cx+e.x01,e.cy+e.y01),x<w?a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,x,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,s,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),!t),a.arc(r.cx,r.cy,x,o(r.y11,r.x11),o(r.y01,r.x01),!t))):(a.moveTo(J,K),a.arc(0,0,s,m,g,!t)):a.moveTo(J,K),!(u>y)||!(P>y)?a.lineTo(N,Q):p>y?(e=W(N,Q,U,V,u,-p,t),r=W(J,K,X,Y,u,-p,t),a.lineTo(e.cx+e.x01,e.cy+e.y01),p<w?a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(r.y01,r.x01),!t):(a.arc(e.cx,e.cy,p,o(e.y01,e.x01),o(e.y11,e.x11),!t),a.arc(0,0,u,o(e.cy+e.y11,e.cx+e.x11),o(r.cy+r.y11,r.cx+r.x11),t),a.arc(r.cx,r.cy,p,o(r.y11,r.x11),o(r.y01,r.x01),!t))):a.arc(0,0,u,T,R,t)}if(a.closePath(),n)return a=null,n+""||null}return i.centroid=function(){var n=(+l.apply(this,arguments)+ +h.apply(this,arguments))/2,d=(+v.apply(this,arguments)+ +A.apply(this,arguments))/2-rn/2;return[H(d)*n,q(d)*n]},i.innerRadius=function(n){return arguments.length?(l=typeof n=="function"?n:B(+n),i):l},i.outerRadius=function(n){return arguments.length?(h=typeof n=="function"?n:B(+n),i):h},i.cornerRadius=function(n){return arguments.length?(I=typeof n=="function"?n:B(+n),i):I},i.padRadius=function(n){return arguments.length?(D=n==null?null:typeof n=="function"?n:B(+n),i):D},i.startAngle=function(n){return arguments.length?(v=typeof n=="function"?n:B(+n),i):v},i.endAngle=function(n){return arguments.length?(A=typeof n=="function"?n:B(+n),i):A},i.padAngle=function(n){return arguments.length?(C=typeof n=="function"?n:B(+n),i):C},i.context=function(n){return arguments.length?(a=n??null,i):a},i}export{hn as d};
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
lightrag/api/webui/assets/channel-oXqxytzI.js
generated
1
lightrag/api/webui/assets/channel-oXqxytzI.js
generated
|
|
@ -1 +0,0 @@
|
||||||
import{ap as o,aq as n}from"./index-bjrbS6e8.js";const t=(a,r)=>o.lang.round(n.parse(a)[r]);export{t as c};
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
import{_ as l}from"./index-bjrbS6e8.js";function m(e,c){var i,t,o;e.accDescr&&((i=c.setAccDescription)==null||i.call(c,e.accDescr)),e.accTitle&&((t=c.setAccTitle)==null||t.call(c,e.accTitle)),e.title&&((o=c.setDiagramTitle)==null||o.call(c,e.title))}l(m,"populateCommonDb");export{m as p};
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
import{_ as n,U as x,j as l}from"./index-bjrbS6e8.js";var c=n((s,t)=>{const e=s.append("rect");if(e.attr("x",t.x),e.attr("y",t.y),e.attr("fill",t.fill),e.attr("stroke",t.stroke),e.attr("width",t.width),e.attr("height",t.height),t.name&&e.attr("name",t.name),t.rx&&e.attr("rx",t.rx),t.ry&&e.attr("ry",t.ry),t.attrs!==void 0)for(const r in t.attrs)e.attr(r,t.attrs[r]);return t.class&&e.attr("class",t.class),e},"drawRect"),d=n((s,t)=>{const e={x:t.startx,y:t.starty,width:t.stopx-t.startx,height:t.stopy-t.starty,fill:t.fill,stroke:t.stroke,class:"rect"};c(s,e).lower()},"drawBackgroundRect"),g=n((s,t)=>{const e=t.text.replace(x," "),r=s.append("text");r.attr("x",t.x),r.attr("y",t.y),r.attr("class","legend"),r.style("text-anchor",t.anchor),t.class&&r.attr("class",t.class);const a=r.append("tspan");return a.attr("x",t.x+t.textMargin*2),a.text(e),r},"drawText"),h=n((s,t,e,r)=>{const a=s.append("image");a.attr("x",t),a.attr("y",e);const i=l.sanitizeUrl(r);a.attr("xlink:href",i)},"drawImage"),m=n((s,t,e,r)=>{const a=s.append("use");a.attr("x",t),a.attr("y",e);const i=l.sanitizeUrl(r);a.attr("xlink:href",`#${i}`)},"drawEmbeddedImage"),y=n(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),p=n(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj");export{d as a,p as b,m as c,c as d,h as e,g as f,y as g};
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
import{_ as s}from"./index-bjrbS6e8.js";var t,e=(t=class{constructor(i){this.init=i,this.records=this.init()}reset(){this.records=this.init()}},s(t,"ImperativeState"),t);export{e as I};
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
import{_ as a,d as o}from"./index-bjrbS6e8.js";var d=a((t,e)=>{let n;return e==="sandbox"&&(n=o("#i"+t)),(e==="sandbox"?o(n.nodes()[0].contentDocument.body):o("body")).select(`[id="${t}"]`)},"getDiagramElement");export{d as g};
|
|
||||||
15
lightrag/api/webui/assets/chunk-E2GYISFI-Csg-WUa_.js
generated
15
lightrag/api/webui/assets/chunk-E2GYISFI-Csg-WUa_.js
generated
|
|
@ -1,15 +0,0 @@
|
||||||
import{_ as e}from"./index-bjrbS6e8.js";var l=e(()=>`
|
|
||||||
/* Font Awesome icon styling - consolidated */
|
|
||||||
.label-icon {
|
|
||||||
display: inline-block;
|
|
||||||
height: 1em;
|
|
||||||
overflow: visible;
|
|
||||||
vertical-align: -0.125em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.node .label-icon path {
|
|
||||||
fill: currentColor;
|
|
||||||
stroke: revert;
|
|
||||||
stroke-width: revert;
|
|
||||||
}
|
|
||||||
`,"getIconStyles");export{l as g};
|
|
||||||
220
lightrag/api/webui/assets/chunk-OW32GOEJ-BuH8nVF7.js
generated
220
lightrag/api/webui/assets/chunk-OW32GOEJ-BuH8nVF7.js
generated
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
||||||
import{_ as a,e as w,l as x}from"./index-bjrbS6e8.js";var d=a((e,t,i,o)=>{e.attr("class",i);const{width:r,height:h,x:n,y:c}=u(e,t);w(e,h,r,o);const s=l(n,c,r,h,t);e.attr("viewBox",s),x.debug(`viewBox configured: ${s} with padding: ${t}`)},"setupViewPortForSVG"),u=a((e,t)=>{var o;const i=((o=e.node())==null?void 0:o.getBBox())||{width:0,height:0,x:0,y:0};return{width:i.width+t*2,height:i.height+t*2,x:i.x,y:i.y}},"calculateDimensionsWithPadding"),l=a((e,t,i,o,r)=>`${e-r} ${t-r} ${i} ${o}`,"createViewBox");export{d as s};
|
|
||||||
165
lightrag/api/webui/assets/chunk-SZ463SBG-3gzxcxJa.js
generated
165
lightrag/api/webui/assets/chunk-SZ463SBG-3gzxcxJa.js
generated
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
||||||
import{s as a,c as s,a as e,C as t}from"./chunk-SZ463SBG-3gzxcxJa.js";import{_ as i}from"./index-bjrbS6e8.js";import"./chunk-E2GYISFI-Csg-WUa_.js";import"./chunk-BFAMUDN2-DaWGHPR3.js";import"./chunk-SKB7J2MH-ty0WEC-6.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
import{s as a,c as s,a as e,C as t}from"./chunk-SZ463SBG-3gzxcxJa.js";import{_ as i}from"./index-bjrbS6e8.js";import"./chunk-E2GYISFI-Csg-WUa_.js";import"./chunk-BFAMUDN2-DaWGHPR3.js";import"./chunk-SKB7J2MH-ty0WEC-6.js";var p={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{p as diagram};
|
|
||||||
1
lightrag/api/webui/assets/clone-g5iXXiWA.js
generated
1
lightrag/api/webui/assets/clone-g5iXXiWA.js
generated
|
|
@ -1 +0,0 @@
|
||||||
import{b as r}from"./_baseUniq-DknB5v3H.js";var e=4;function a(o){return r(o,e)}export{a as c};
|
|
||||||
191
lightrag/api/webui/assets/cytoscape.esm-CfBqOv7Q.js
generated
191
lightrag/api/webui/assets/cytoscape.esm-CfBqOv7Q.js
generated
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue