diff --git a/examples/graph_visual_with_html.py b/examples/graph_visual_with_html.py
index 56642185..d082a170 100644
--- a/examples/graph_visual_with_html.py
+++ b/examples/graph_visual_with_html.py
@@ -1,4 +1,8 @@
import networkx as nx
+import pipmaster as pm
+if not pm.is_installed("pyvis"):
+ pm.install("pyvis")
+
from pyvis.network import Network
import random
diff --git a/lightrag/api/lightrag_server.py b/lightrag/api/lightrag_server.py
index 792b9435..35e4acf7 100644
--- a/lightrag/api/lightrag_server.py
+++ b/lightrag/api/lightrag_server.py
@@ -1798,12 +1798,13 @@ def create_app(args):
@app.get("/health", dependencies=[Depends(optional_api_key)])
async def get_status():
"""Get current system status"""
+ files = doc_manager.scan_directory()
return {
"status": "healthy",
"working_directory": str(args.working_dir),
"input_directory": str(args.input_dir),
- "indexed_files": doc_manager.indexed_files,
- "indexed_files_count": len(doc_manager.indexed_files),
+ "indexed_files": files,
+ "indexed_files_count": len(files),
"configuration": {
# LLM configuration binding/host address (if applicable)/model (if applicable)
"llm_binding": args.llm_binding,
diff --git a/lightrag/api/requirements.txt b/lightrag/api/requirements.txt
index fc5afd58..7b2593c0 100644
--- a/lightrag/api/requirements.txt
+++ b/lightrag/api/requirements.txt
@@ -1,10 +1,7 @@
ascii_colors
fastapi
-nano_vectordb
nest_asyncio
numpy
-ollama
-openai
pipmaster
python-dotenv
python-multipart
@@ -12,5 +9,4 @@ tenacity
tiktoken
torch
tqdm
-transformers
uvicorn
diff --git a/lightrag/api/static/index.html b/lightrag/api/static/index.html
index 56a70ad7..60900c03 100644
--- a/lightrag/api/static/index.html
+++ b/lightrag/api/static/index.html
@@ -98,358 +98,7 @@
-
- // Utility functions
- const showToast = (message, duration = 3000) => {
- const toast = document.getElementById('toast');
- toast.querySelector('div').textContent = message;
- toast.classList.remove('hidden');
- setTimeout(() => toast.classList.add('hidden'), duration);
- };
-
- const fetchWithAuth = async (url, options = {}) => {
- const headers = {
- ...(options.headers || {}),
- ...(state.apiKey ? { 'Authorization': `Bearer ${state.apiKey}` } : {})
- };
- return fetch(url, { ...options, headers });
- };
-
- // Page renderers
- const pages = {
- 'file-manager': () => `
-
-
File Manager
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `,
-
- 'query': () => `
-
-
Query Database
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- `,
-
- 'knowledge-graph': () => `
-
-
-
-
Under Construction
-
Knowledge graph visualization will be available in a future update.
-
-
- `,
-
- 'status': () => `
-
- `,
-
- 'settings': () => `
-
-
Settings
-
-
-
-
-
-
-
-
-
-
-
-
- `
- };
-
- // Page handlers
- const handlers = {
- 'file-manager': () => {
- const fileInput = document.getElementById('fileInput');
- const dropZone = fileInput.parentElement.parentElement;
- const fileList = document.querySelector('#fileList div');
- const indexedFiles = document.querySelector('#indexedFiles div');
- const uploadBtn = document.getElementById('uploadBtn');
-
- const updateFileList = () => {
- fileList.innerHTML = state.files.map(file => `
-
-
${file.name}
-
-
- `).join('');
- };
-
- const updateIndexedFiles = async () => {
- const response = await fetchWithAuth('/health');
- const data = await response.json();
- indexedFiles.innerHTML = data.indexed_files.map(file => `
-
- ${file}
-
- `).join('');
- };
-
- dropZone.addEventListener('dragover', (e) => {
- e.preventDefault();
- dropZone.classList.add('border-blue-500');
- });
-
- dropZone.addEventListener('dragleave', () => {
- dropZone.classList.remove('border-blue-500');
- });
-
- dropZone.addEventListener('drop', (e) => {
- e.preventDefault();
- dropZone.classList.remove('border-blue-500');
- const files = Array.from(e.dataTransfer.files);
- state.files.push(...files);
- updateFileList();
- });
-
- fileInput.addEventListener('change', () => {
- state.files.push(...Array.from(fileInput.files));
- updateFileList();
- });
-
- uploadBtn.addEventListener('click', async () => {
- if (state.files.length === 0) {
- showToast('Please select files to upload');
- return;
- }
- let apiKey = localStorage.getItem('apiKey') || '';
- const progress = document.getElementById('uploadProgress');
- const progressBar = progress.querySelector('div');
- const statusText = document.getElementById('uploadStatus');
- progress.classList.remove('hidden');
-
- for (let i = 0; i < state.files.length; i++) {
- const formData = new FormData();
- formData.append('file', state.files[i]);
-
- try {
- await fetch('/documents/upload', {
- method: 'POST',
- headers: apiKey ? { 'Authorization': `Bearer ${apiKey}` } : {},
- body: formData
- });
-
- const percentage = ((i + 1) / state.files.length) * 100;
- progressBar.style.width = `${percentage}%`;
- statusText.textContent = i + 1;
- } catch (error) {
- console.error('Upload error:', error);
- }
- }
- progress.classList.add('hidden');
- });
-
- updateIndexedFiles();
- },
-
- 'query': () => {
- const queryBtn = document.getElementById('queryBtn');
- const queryInput = document.getElementById('queryInput');
- const queryMode = document.getElementById('queryMode');
- const queryResult = document.getElementById('queryResult');
-
- queryBtn.addEventListener('click', async () => {
- const query = queryInput.value.trim();
- if (!query) {
- showToast('Please enter a query');
- return;
- }
-
- queryBtn.disabled = true;
- queryBtn.innerHTML = `
-
- Processing...
- `;
-
- try {
- const response = await fetchWithAuth('/query', {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- query,
- mode: queryMode.value,
- stream: false,
- only_need_context: false
- })
- });
-
- const data = await response.json();
- queryResult.innerHTML = marked.parse(data.response);
- } catch (error) {
- showToast('Error processing query');
- } finally {
- queryBtn.disabled = false;
- queryBtn.textContent = 'Send Query';
- }
- });
- },
-
- 'status': async () => {
- const healthStatus = document.getElementById('healthStatus');
- const configStatus = document.getElementById('configStatus');
-
- try {
- const response = await fetchWithAuth('/health');
- const data = await response.json();
-
- healthStatus.innerHTML = `
-
-
-
-
Working Directory: ${data.working_directory}
-
Input Directory: ${data.input_directory}
-
Indexed Files: ${data.indexed_files_count}
-
-
- `;
-
- configStatus.innerHTML = Object.entries(data.configuration)
- .map(([key, value]) => `
-
- ${key}:
- ${value}
-
- `).join('');
- } catch (error) {
- showToast('Error fetching status');
- }
- },
-
- 'settings': () => {
- const saveBtn = document.getElementById('saveSettings');
- const apiKeyInput = document.getElementById('apiKeyInput');
-
- saveBtn.addEventListener('click', () => {
- state.apiKey = apiKeyInput.value;
- localStorage.setItem('apiKey', state.apiKey);
- showToast('Settings saved successfully');
- });
- }
- };
-
- // Navigation handling
- document.querySelectorAll('.nav-item').forEach(item => {
- item.addEventListener('click', (e) => {
- e.preventDefault();
- const page = item.dataset.page;
- document.getElementById('content').innerHTML = pages[page]();
- if (handlers[page]) handlers[page]();
- state.currentPage = page;
- });
- });
-
- // Initialize with file manager
- document.getElementById('content').innerHTML = pages['file-manager']();
- handlers['file-manager']();
-
- // Global functions
- window.removeFile = (fileName) => {
- state.files = state.files.filter(file => file.name !== fileName);
- document.querySelector('#fileList div').innerHTML = state.files.map(file => `
-
-
${file.name}
-
-
- `).join('');
- };
-