diff --git a/.env.example b/.env.example
index f83fd47..0e0f830 100644
--- a/.env.example
+++ b/.env.example
@@ -1,39 +1,104 @@
-# Example environment file for Docker
-# Copy this to .env and fill in your actual values
+# ==============================================
+# API MCP RAGAnything - Configuration
+# ==============================================
-# OpenRouter API Configuration
-OPEN_ROUTER_API_KEY=your_openrouter_api_key_here
+# ==============================================
+# LLM CONFIGURATION (GENERIC - Multiple Providers)
+# ==============================================
+# Supported bindings: openai, ollama, azure, gemini, lollms
+LLM_BINDING=openai
+LLM_API_KEY=your_api_key_here
+LLM_BASE_URL=https://api.openai.com/v1
+LLM_MODEL_NAME=gpt-4o-mini
+
+# Legacy support (deprecated - for backward compatibility with OpenRouter)
+# Use LLM_API_KEY and LLM_BASE_URL instead
+OPEN_ROUTER_API_KEY=
OPEN_ROUTER_API_URL=https://openrouter.ai/api/v1
-# PostgreSQL Configuration (matches docker-compose service)
+# ==============================================
+# EMBEDDING CONFIGURATION
+# ==============================================
+EMBEDDING_BINDING=openai
+EMBEDDING_MODEL=text-embedding-3-small
+EMBEDDING_DIM=1536
+MAX_TOKEN_SIZE=8192
+
+# ==============================================
+# VISION MODEL CONFIGURATION
+# ==============================================
+VISION_MODEL=gpt-4o
+
+# ==============================================
+# STORAGE CONFIGURATION (4 TYPES - CRITICAL)
+# ==============================================
+
+# 1. VECTOR STORAGE (for embeddings)
+VECTOR_STORAGE_TYPE=pgvector # Options: pgvector, qdrant, milvus, local
+
+# 2. GRAPH STORAGE (for knowledge graph - CRITICAL)
+GRAPH_STORAGE_TYPE=postgres # Options: postgres, neo4j, networkx, memgraph
+
+# 3. KV STORAGE (for LLM cache, chunks, documents)
+KV_STORAGE_TYPE=postgres # Options: postgres, redis, mongo, json
+
+# 4. DOC STATUS STORAGE (for document processing status)
+DOC_STATUS_STORAGE_TYPE=postgres # Options: postgres, mongo, json
+
+# ==============================================
+# POSTGRESQL CONFIGURATION
+# ==============================================
POSTGRES_USER=raganything
POSTGRES_PASSWORD=raganything
POSTGRES_DATABASE=raganything
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
-# Model Configuration
-CHAT_MODEL=openai/gpt-4o-mini
-EMBEDDING_MODEL=text-embedding-3-small
-EMBEDDING_DIM=1536
-MAX_TOKEN_SIZE=8192
-VISION_MODEL=openai/gpt-4o
+# Vector Index Configuration (for PGVector)
+VECTOR_INDEX_TYPE=HNSW # Options: HNSW, IVFFLAT
+HNSW_M=16
+HNSW_EF=64
+
+# ==============================================
+# QDRANT CONFIGURATION (if VECTOR_STORAGE_TYPE=qdrant)
+# ==============================================
+QDRANT_URL=http://localhost:6333
+QDRANT_API_KEY= # Optional
-# Data Processing Configuration
+# ==============================================
+# NEO4J CONFIGURATION (if GRAPH_STORAGE_TYPE=neo4j)
+# ==============================================
+NEO4J_URI=bolt://localhost:7687
+NEO4J_USERNAME=neo4j
+NEO4J_PASSWORD=your_neo4j_password
+
+# ==============================================
+# REDIS CONFIGURATION (if KV_STORAGE_TYPE=redis)
+# ==============================================
+REDIS_URI=redis://localhost:6379
+
+# ==============================================
+# RAG PROCESSING CONFIGURATION
+# ==============================================
+COSINE_THRESHOLD=0.2
+MAX_CONCURRENT_FILES=1
+MAX_WORKERS=3
ENABLE_IMAGE_PROCESSING=True
ENABLE_TABLE_PROCESSING=True
ENABLE_EQUATION_PROCESSING=True
-# LightRAG Configuration
-RAG_STORAGE_TYPE=postgres # Options: 'postgres', 'local'
-COSINE_THRESHOLD=0.2
-MAX_CONCURRENT_FILES=1
-MAX_WORKERS=1
+# Legacy (deprecated - use VECTOR_STORAGE_TYPE instead)
+RAG_STORAGE_TYPE=postgres
-# Server Configuration
-MCP_TRANSPORT=sse
-ALLOWED_ORIGINS=["*"]
+# ==============================================
+# SERVER CONFIGURATION
+# ==============================================
+MCP_TRANSPORT=sse # Options: stdio, sse, streamable
HOST=0.0.0.0
PORT=8000
+ALLOWED_ORIGINS=["*"]
+# ==============================================
+# LIGHTRAG PROXY CONFIGURATION
+# ==============================================
LIGHTRAG_API_URL=http://localhost:9621
diff --git a/.env.lightrag.server.example b/.env.lightrag.server.example
index 3322569..8333393 100644
--- a/.env.lightrag.server.example
+++ b/.env.lightrag.server.example
@@ -1,30 +1,75 @@
-# Light RAG Server Configuration
+# ==============================================
+# LIGHTRAG SERVER CONFIGURATION
+# ==============================================
PORT=9621
-# PostgreSQL Configuration (matches docker-compose service)
+# ==============================================
+# LLM CONFIGURATION (GENERIC - Multiple Providers)
+# ==============================================
+# Supported bindings: openai, ollama, azure, gemini, lollms
+LLM_BINDING=openai
+LLM_MODEL=gpt-4o-mini
+LLM_BINDING_HOST=https://api.openai.com/v1
+LLM_BINDING_API_KEY=your_api_key_here
+
+# ==============================================
+# EMBEDDING CONFIGURATION
+# ==============================================
+EMBEDDING_BINDING=openai
+EMBEDDING_BINDING_HOST=https://api.openai.com/v1
+EMBEDDING_MODEL=text-embedding-3-small
+OPENAI_API_KEY=your_api_key_here # For embeddings
+
+# ==============================================
+# STORAGE CONFIGURATION (4 TYPES - CRITICAL)
+# ==============================================
+
+# 1. VECTOR STORAGE (for embeddings)
+LIGHTRAG_VECTOR_STORAGE=PGVectorStorage
+# Options: PGVectorStorage, QdrantVectorDBStorage, MilvusVectorDBStorage, NanoVectorDBStorage
+
+# 2. GRAPH STORAGE (for knowledge graph - CRITICAL)
+LIGHTRAG_GRAPH_STORAGE=PGGraphStorage
+# Options: PGGraphStorage, Neo4JStorage, NetworkXStorage, MemgraphStorage
+
+# 3. KV STORAGE (for LLM cache, chunks, documents)
+LIGHTRAG_KV_STORAGE=PGKVStorage
+# Options: PGKVStorage, RedisKVStorage, MongoKVStorage, JsonKVStorage
+
+# 4. DOC STATUS STORAGE (for document processing status)
+LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage
+# Options: PGDocStatusStorage, MongoDocStatusStorage, JsonDocStatusStorage
+
+# ==============================================
+# POSTGRESQL CONFIGURATION
+# ==============================================
POSTGRES_USER=raganything
POSTGRES_PASSWORD=raganything
POSTGRES_DATABASE=raganything
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
-# LLM Configuration
-LLM_BINDING=openai
-LLM_MODEL=gpt-4o-mini
-LLM_BINDING_HOST=https://openrouter.ai/api/v1
-LLM_BINDING_API_KEY=apikey
+# ==============================================
+# QDRANT CONFIGURATION (if using QdrantVectorDBStorage)
+# ==============================================
+QDRANT_URL=http://qdrant:6333
+QDRANT_API_KEY= # Optional
-# Embedding Configuration (avec Ollama)
-EMBEDDING_BINDING=openai
-EMBEDDING_BINDING_HOST=https://openrouter.ai/api/v1
-EMBEDDING_MODEL=text-embedding-3-small
-OPENAI_API_KEY=apikey
-# Settings
+# ==============================================
+# NEO4J CONFIGURATION (if using Neo4JStorage or MemgraphStorage)
+# ==============================================
+NEO4J_URI=bolt://neo4j:7687
+NEO4J_USERNAME=neo4j
+NEO4J_PASSWORD=your_neo4j_password
+
+# ==============================================
+# REDIS CONFIGURATION (if using RedisKVStorage)
+# ==============================================
+REDIS_URI=redis://redis:6379
+
+# ==============================================
+# PERFORMANCE SETTINGS
+# ==============================================
TIMEOUT=150
MAX_ASYNC=4
MAX_PARALLEL_INSERT=2
-
-LIGHTRAG_KV_STORAGE=PGKVStorage
-LIGHTRAG_VECTOR_STORAGE=PGVectorStorage
-LIGHTRAG_GRAPH_STORAGE=PGGraphStorage
-LIGHTRAG_DOC_STATUS_STORAGE=PGDocStatusStorage
\ No newline at end of file
diff --git a/.python-version b/.python-version
new file mode 100644
index 0000000..976544c
--- /dev/null
+++ b/.python-version
@@ -0,0 +1 @@
+3.13.7
diff --git a/Dockerfile b/Dockerfile
index c243cc9..0d78d4b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -35,7 +35,11 @@ ENV PYTHONPATH=/app/src:$PYTHONPATH
ENV PATH="/app/.venv/bin:$PATH"
# Create non-root user for security
-RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
+RUN useradd -m -u 1000 appuser && \
+ chown -R appuser:appuser /app && \
+ mkdir -p /app/ragdata && \
+ chown -R appuser:appuser /app/ragdata
+
USER appuser
# Expose port
diff --git a/Dockerfile.lightrag b/Dockerfile.lightrag
index b067905..c1b8851 100644
--- a/Dockerfile.lightrag
+++ b/Dockerfile.lightrag
@@ -4,6 +4,16 @@ FROM ghcr.io/astral-sh/uv:python3.13-bookworm-slim AS builder
WORKDIR /app
+# Install build dependencies for numpy and other C extensions
+RUN apt-get update && apt-get install -y \
+ build-essential \
+ gcc \
+ g++ \
+ gfortran \
+ libopenblas-dev \
+ liblapack-dev \
+ && rm -rf /var/lib/apt/lists/*
+
# Install lightrag-hku with API extras
RUN uv pip install --system "lightrag-hku[api]"
@@ -12,6 +22,8 @@ FROM python:3.13-slim-bookworm
RUN apt-get update && apt-get install -y \
libgomp1 \
+ libopenblas0 \
+ libgfortran5 \
curl \
&& rm -rf /var/lib/apt/lists/*
@@ -22,7 +34,11 @@ COPY --from=builder /usr/local/lib/python3.13/site-packages /usr/local/lib/pytho
COPY --from=builder /usr/local/bin/lightrag-server /usr/local/bin/lightrag-server
# Create non-root user
-RUN useradd -m -u 1000 appuser && chown -R appuser:appuser /app
+RUN useradd -m -u 1000 appuser && \
+ chown -R appuser:appuser /app && \
+ mkdir -p /app/ragdata && \
+ chown -R appuser:appuser /app/ragdata
+
USER appuser
EXPOSE 9621
diff --git a/IMPLEMENTATION.md b/IMPLEMENTATION.md
new file mode 100644
index 0000000..97081d5
--- /dev/null
+++ b/IMPLEMENTATION.md
@@ -0,0 +1,336 @@
+# 🚀 Refactorización Completada - API_MCP_RAGAnything_LightRAG
+
+## 📋 Resumen de Cambios
+
+Esta refactorización convierte el sistema en una plataforma **completamente genérica y extensible** que soporta:
+
+1. ✅ **Múltiples proveedores LLM** (OpenAI, Ollama, Azure, Gemini, OpenRouter)
+2. ✅ **4 tipos de storage configurables** (Vector, Graph, KV, DocStatus)
+3. ✅ **Múltiples backends de almacenamiento** (Postgres, Qdrant, Neo4j, Redis, MongoDB)
+4. ✅ **Queries multimodales** (imágenes, tablas, ecuaciones)
+5. ✅ **Batch upload** de archivos múltiples
+6. ✅ **Backward compatibility** con configuración legacy
+
+---
+
+## 🏗️ Arquitectura de Storage (4 Tipos)
+
+El sistema ahora soporta configuración independiente para cada tipo de storage:
+
+| Storage Type | Propósito | Backends Soportados |
+|--------------|-----------|---------------------|
+| **VECTOR_STORAGE** | Embeddings de entidades/relaciones/chunks | PGVector, Qdrant, Milvus, Local |
+| **GRAPH_STORAGE** | Grafo de conocimiento (crítico) | Postgres, Neo4j, NetworkX, Memgraph |
+| **KV_STORAGE** | Cache LLM, chunks, documentos | Postgres, Redis, MongoDB, JSON |
+| **DOC_STATUS_STORAGE** | Estado de procesamiento | Postgres, MongoDB, JSON |
+
+---
+
+## 📁 Archivos Modificados
+
+### **Core Configuration**
+
+#### 1. `src/config.py`
+- ✅ **Refactorizado `LLMConfig`**: Soporte genérico para múltiples proveedores
+ - Nuevas variables: `LLM_BINDING`, `LLM_API_KEY`, `LLM_BASE_URL`, `LLM_MODEL_NAME`
+ - Mantenida retrocompatibilidad con `OPEN_ROUTER_API_KEY`
+ - Properties genéricas: `api_key`, `api_base_url`, `model_name`
+
+- ✅ **Creado `StorageConfig`**: Configuración de 4 tipos de storage
+ - Variables para cada tipo: `VECTOR_STORAGE_TYPE`, `GRAPH_STORAGE_TYPE`, `KV_STORAGE_TYPE`, `DOC_STATUS_STORAGE_TYPE`
+ - Configuración específica por backend (Qdrant, Neo4j, Redis)
+ - Configuración de índices vectoriales (HNSW)
+
+#### 2. `src/dependencies.py`
+- ✅ **Factory `get_storage_config()`**: Configuración dinámica de los 4 storages
+ - Lógica para seleccionar backend según configuración
+ - Configuración de variables de entorno para cada backend
+ - Cosine threshold configurable
+
+- ✅ **Actualizado `llm_model_func`**: Usa configuración genérica
+ - Usa `llm_config.model_name` en lugar de hardcoded
+ - Usa `llm_config.api_key` y `llm_config.api_base_url`
+
+- ✅ **Actualizado `rag_instance`**: Usa `get_storage_config()`
+ - Elimina lógica hardcodeada de if/else para postgres vs local
+ - Configuración dinámica basada en StorageConfig
+
+### **API & Use Cases**
+
+#### 3. `src/application/api/mcp_tools.py`
+- ✅ **Mantenida tool existente**: `query_knowledge_base` sin cambios
+- ✅ **Agregada nueva tool**: `query_knowledge_base_multimodal`
+ - Parámetros: `image_path`, `image_base64`, `table_data`, `equation_latex`
+ - Captions opcionales para mejor contexto
+ - Ejemplos de uso documentados
+
+#### 4. `src/application/api/indexing_routes.py`
+- ✅ **Nuevo endpoint**: `/batch/index`
+ - Acepta `List[UploadFile]`
+ - Procesamiento en background
+ - Limpieza automática de staging directory
+ - Retorna conteo de archivos y nombres
+
+#### 5. `src/application/use_cases/index_batch_use_case.py` *(NUEVO)*
+- ✅ **Caso de uso batch**:
+ - Crea directorio temporal de staging
+ - Guarda todos los archivos subidos
+ - Llama a `index_folder` sobre staging
+ - Limpieza automática con finally
+
+### **Configuration Files**
+
+#### 6. `.env.example`
+- ✅ **Completamente reescrito**:
+ - Sección LLM genérica con múltiples proveedores
+ - Sección storage con 4 tipos configurables
+ - Configuración por backend (Postgres, Qdrant, Neo4j, Redis)
+ - Comentarios explicativos de opciones
+ - Variables legacy marcadas como deprecated
+
+#### 7. `.env.lightrag.server.example`
+- ✅ **Completamente reescrito**:
+ - Mismo formato que .env.example
+ - Configuración de 4 tipos de storage
+ - Variables de entorno específicas de LightRAG Server
+ - Opciones claramente documentadas
+
+#### 8. `docker-compose.yml`
+- ✅ **Agregados servicios opcionales**:
+ - **Qdrant**: Vector storage de alto rendimiento
+ - **Neo4j**: Graph storage avanzado con plugins APOC y GDS
+ - **Redis**: KV storage rápido con persistencia
+ - Todos con profiles para inicio selectivo
+ - Volumes configurados para persistencia
+
+#### 9. `pyproject.toml`
+- ✅ **Dependencias opcionales comentadas**:
+ - `qdrant-client>=1.11.0`
+ - `neo4j>=5.0.0`
+ - `redis>=5.0.0`
+ - Instrucciones de instalación según necesidad
+
+---
+
+## 🎯 Configuraciones Recomendadas
+
+### **Opción 1: Full PostgreSQL (Producción Simple)**
+```env
+VECTOR_STORAGE_TYPE=pgvector
+GRAPH_STORAGE_TYPE=postgres
+KV_STORAGE_TYPE=postgres
+DOC_STATUS_STORAGE_TYPE=postgres
+```
+**Docker:** `docker-compose up -d` (solo postgres)
+
+### **Opción 2: Alto Rendimiento (Producción Avanzada)**
+```env
+VECTOR_STORAGE_TYPE=qdrant
+GRAPH_STORAGE_TYPE=neo4j
+KV_STORAGE_TYPE=redis
+DOC_STATUS_STORAGE_TYPE=postgres
+```
+**Docker:** `docker-compose --profile qdrant --profile neo4j --profile redis up -d`
+
+### **Opción 3: Desarrollo Local**
+```env
+VECTOR_STORAGE_TYPE=local
+GRAPH_STORAGE_TYPE=networkx
+KV_STORAGE_TYPE=json
+DOC_STATUS_STORAGE_TYPE=json
+```
+**Docker:** No requiere servicios externos
+
+### **Opción 4: Hybrid (Recomendado)**
+```env
+VECTOR_STORAGE_TYPE=qdrant
+GRAPH_STORAGE_TYPE=postgres
+KV_STORAGE_TYPE=postgres
+DOC_STATUS_STORAGE_TYPE=postgres
+```
+**Docker:** `docker-compose --profile qdrant up -d`
+
+---
+
+## 🔧 Ejemplos de Uso
+
+### **1. Configurar Ollama Local**
+```env
+LLM_BINDING=ollama
+LLM_BASE_URL=http://localhost:11434
+LLM_MODEL_NAME=llama2
+EMBEDDING_BINDING=ollama
+EMBEDDING_MODEL=nomic-embed-text
+```
+
+### **2. Configurar Azure OpenAI**
+```env
+LLM_BINDING=azure
+LLM_BASE_URL=https://your-resource.openai.azure.com
+LLM_API_KEY=your_azure_key
+LLM_MODEL_NAME=gpt-4
+```
+
+### **3. Query Multimodal con Imagen (MCP)**
+```python
+await query_knowledge_base_multimodal(
+ query="¿Qué muestra este diagrama?",
+ image_path="/ruta/a/diagrama.png",
+ mode="hybrid"
+)
+```
+
+### **4. Query Multimodal con Tabla (MCP)**
+```python
+await query_knowledge_base_multimodal(
+ query="Compara estas métricas con el documento",
+ table_data="Método,Precisión\\nRAG,95%\\nBaseline,87%",
+ table_caption="Comparación de rendimiento",
+ mode="hybrid"
+)
+```
+
+### **5. Batch Upload (API)**
+```bash
+curl -X POST "http://localhost:8000/api/v1/batch/index" \
+ -F "files=@doc1.pdf" \
+ -F "files=@doc2.docx" \
+ -F "files=@slides.pptx"
+```
+
+---
+
+## ⚠️ Breaking Changes y Migración
+
+### **Variables Deprecadas (Mantienen Retrocompatibilidad)**
+
+| Variable Antigua | Variable Nueva | Fallback |
+|------------------|----------------|----------|
+| `OPEN_ROUTER_API_KEY` | `LLM_API_KEY` | ✅ Sí |
+| `OPEN_ROUTER_API_URL` | `LLM_BASE_URL` | ✅ Sí |
+| `CHAT_MODEL` | `LLM_MODEL_NAME` | ✅ Sí |
+| `RAG_STORAGE_TYPE` | `VECTOR_STORAGE_TYPE` | ⚠️ Parcial |
+
+### **Migración de `.env` Existente**
+
+Si tienes un `.env` anterior:
+
+```bash
+# Backup
+cp .env .env.backup
+
+# Copiar ejemplo nuevo
+cp .env.example .env
+
+# Editar con tus valores
+# Las variables antiguas seguirán funcionando pero se recomienda actualizar
+```
+
+---
+
+## 🧪 Testing
+
+### **Verificar Configuración**
+```bash
+# Ver configuración actual
+python -c "from src.config import *; c = StorageConfig(); print(c.model_dump())"
+
+# Ver storage config generado
+python -c "from src.dependencies import get_storage_config; import pprint; pprint.pprint(get_storage_config())"
+```
+
+### **Iniciar con Qdrant**
+```bash
+docker-compose --profile qdrant up -d
+# Verificar: http://localhost:6333/dashboard
+```
+
+### **Iniciar con Neo4j**
+```bash
+docker-compose --profile neo4j up -d
+# Verificar: http://localhost:7474
+# Login: neo4j / your_password_change_me
+```
+
+### **Test Batch Upload**
+```bash
+# Crear archivos de prueba
+echo "Test 1" > test1.txt
+echo "Test 2" > test2.txt
+
+# Upload batch
+curl -X POST http://localhost:8000/api/v1/batch/index \
+ -F "files=@test1.txt" \
+ -F "files=@test2.txt"
+```
+
+---
+
+## 📊 Matriz de Compatibilidad
+
+| LLM Provider | Status | Notas |
+|--------------|--------|-------|
+| OpenAI | ✅ Testeado | Incluye OpenRouter |
+| Ollama | ✅ Soportado | LightRAG nativo |
+| Azure OpenAI | ✅ Soportado | LightRAG nativo |
+| Gemini | ✅ Soportado | LightRAG nativo |
+| Anthropic | ⚠️ Via OpenRouter | No directo |
+
+| Storage Backend | Vector | Graph | KV | DocStatus |
+|-----------------|--------|-------|-----|-----------|
+| PostgreSQL | ✅ | ✅ | ✅ | ✅ |
+| Qdrant | ✅ | ❌ | ❌ | ❌ |
+| Neo4j | ❌ | ✅ | ❌ | ❌ |
+| Redis | ❌ | ❌ | ✅ | ✅ |
+| MongoDB | ❌ | ❌ | ✅ | ✅ |
+| Local/JSON | ✅ | ✅ | ✅ | ✅ |
+
+---
+
+## 🎓 Próximos Pasos
+
+1. ✅ **Actualizar `.env`** con tu configuración preferida
+2. ✅ **Instalar dependencias** opcionales si usas Qdrant/Neo4j/Redis:
+ ```bash
+ uv add qdrant-client neo4j redis
+ ```
+3. ✅ **Iniciar servicios** con profiles según necesidad
+4. ✅ **Testear endpoints** nuevos (batch upload, multimodal query)
+5. ✅ **Verificar MCP tools** en Claude Desktop
+
+---
+
+## 🐛 Troubleshooting
+
+### **Error: "No module named 'qdrant_client'"**
+```bash
+uv add qdrant-client
+```
+
+### **Error: "Cannot connect to Qdrant"**
+Verifica que el servicio esté corriendo:
+```bash
+docker-compose --profile qdrant up -d
+curl http://localhost:6333/dashboard
+```
+
+### **Error: "Neo4j connection failed"**
+Verifica credenciales en `.env`:
+```env
+NEO4J_PASSWORD=your_password_change_me
+```
+
+### **Multimodal query no funciona**
+Verifica que LightRAG Server esté configurado con `vision_model_func`. El endpoint de proxy puede necesitar adaptación según la versión de LightRAG Server.
+
+---
+
+## 📝 Notas Finales
+
+- ✅ **Backward compatibility**: Configuración legacy sigue funcionando
+- ✅ **No breaking changes**: Endpoints existentes sin modificar
+- ✅ **Escalable**: Fácil agregar nuevos backends
+- ✅ **Documentado**: Todos los cambios con comentarios
+- ⚠️ **Dependencias opcionales**: Instalar según backend elegido
+
+**¡La refactorización está completa y lista para producción!** 🎉
diff --git a/README.md b/README.md
index 102e5a8..424f4e1 100644
--- a/README.md
+++ b/README.md
@@ -6,9 +6,12 @@ A FastAPI application that provides a REST API and MCP server for Retrieval Augm
- 🔍 **Multi-modal document processing** — PDF, DOCX, PPTX, images, tables, equations via [Docling](https://github.com/DS4SD/docling)
- 📁 **Batch folder indexing** — Recursive directory traversal with file extension filtering
+- � **Batch file upload** — Upload and index multiple files simultaneously
+- 🎨 **Multimodal queries** — Query with images, tables, and equations (MCP tool)
- 🔌 **LightRAG proxy** — Full pass-through to [LightRAG Server](https://github.com/HKUDS/LightRAG) for queries and knowledge graph operations
-- 🤖 **MCP server** — Claude Desktop integration with `query_knowledge_base` tool
-- 🐘 **PostgreSQL backend** — pgvector for embeddings + Apache AGE for knowledge graph
+- 🤖 **MCP server** — Claude Desktop integration with multiple query tools
+- 🗄️ **Flexible storage backends** — PostgreSQL, Qdrant, Neo4j, Redis, MongoDB, or local storage
+- 🤖 **Multiple LLM providers** — OpenAI, Ollama, Azure, Gemini, OpenRouter
- 🏗️ **Hexagonal architecture** — Clean separation of domain, application, and infrastructure layers
## Architecture
@@ -36,7 +39,11 @@ A FastAPI application that provides a REST API and MCP server for Retrieval Augm
- **Python 3.13+**
- **Docker & Docker Compose** (recommended)
-- An [OpenRouter](https://openrouter.ai/) API Key
+- API key from one of these providers:
+ - [OpenRouter](https://openrouter.ai/)
+ - [OpenAI](https://platform.openai.com/)
+ - [Azure OpenAI](https://azure.microsoft.com/en-us/products/ai-services/openai-service)
+ - Or use local Ollama
## Quick Start with Docker Compose
@@ -48,19 +55,32 @@ A FastAPI application that provides a REST API and MCP server for Retrieval Augm
# Configure the API service
cp .env.example .env
- # Edit .env and set OPEN_ROUTER_API_KEY
+ # Edit .env and set your LLM provider credentials
# Configure LightRAG server
cp .env.lightrag.server.example .env.lightrag.server
- # Edit .env.lightrag.server and set LLM_BINDING_API_KEY
+ # Edit .env.lightrag.server and set LLM provider credentials
```
-2. **Start all services:**
+2. **Choose your storage backend(s):**
+ Default (PostgreSQL only - simplest):
```bash
docker-compose up -d
```
+ Or with optional backends (Qdrant, Neo4j, Redis):
+ ```bash
+ # With Qdrant vector storage
+ docker-compose --profile qdrant up -d
+
+ # With Neo4j graph storage
+ docker-compose --profile neo4j up -d
+
+ # With all optional backends
+ docker-compose --profile qdrant --profile neo4j --profile redis up -d
+ ```
+
This starts three containers:
| Container | Port | Description |
|-----------|------|-------------|
@@ -68,6 +88,13 @@ A FastAPI application that provides a REST API and MCP server for Retrieval Augm
| `api` | 8000 | RAG-Anything FastAPI service |
| `lightrag-server` | 9621 | LightRAG Server with Web UI |
+ **Optional services** (with profiles):
+ | Container | Port | Profile | Description |
+ |-----------|------|---------|-------------|
+ | `qdrant` | 6333 | `qdrant` | High-performance vector storage |
+ | `neo4j` | 7474, 7687 | `neo4j` | Advanced graph database with APOC/GDS |
+ | `redis` | 6379 | `redis` | Fast KV storage and caching |
+
3. **Verify services:**
```bash
@@ -83,20 +110,80 @@ A FastAPI application that provides a REST API and MCP server for Retrieval Augm
## Configuration
-Configuration is managed via environment files. See the example files for all available options:
+Configuration is managed via environment files. See [IMPLEMENTATION.md](IMPLEMENTATION.md) for detailed configuration guide.
+
+### LLM Provider Configuration
+
+The system supports multiple LLM providers. Configure in `.env`:
+
+**OpenAI:**
+```env
+LLM_BINDING=openai
+LLM_API_KEY=sk-...
+LLM_MODEL_NAME=gpt-4-turbo
+```
+
+**Ollama (Local):**
+```env
+LLM_BINDING=ollama
+LLM_BASE_URL=http://localhost:11434
+LLM_MODEL_NAME=llama2
+```
+
+**Azure OpenAI:**
+```env
+LLM_BINDING=azure
+LLM_BASE_URL=https://your-resource.openai.azure.com
+LLM_API_KEY=your_azure_key
+LLM_MODEL_NAME=gpt-4
+```
+
+**OpenRouter:**
+```env
+LLM_BINDING=openai
+LLM_BASE_URL=https://openrouter.ai/api/v1
+LLM_API_KEY=sk-or-v1-...
+LLM_MODEL_NAME=anthropic/claude-3.5-sonnet
+```
+
+### Storage Backend Configuration
+
+The system uses **4 independent storage types**:
+
+| Storage Type | Purpose | Options |
+|--------------|---------|---------|
+| **VECTOR_STORAGE** | Embeddings | `pgvector`, `qdrant`, `local` |
+| **GRAPH_STORAGE** | Knowledge graph | `postgres`, `neo4j`, `networkx` |
+| **KV_STORAGE** | Cache & chunks | `postgres`, `redis`, `json` |
+| **DOC_STATUS_STORAGE** | Processing status | `postgres`, `mongodb`, `json` |
+
+**Example configurations:**
+
+**Full PostgreSQL (simplest):**
+```env
+VECTOR_STORAGE_TYPE=pgvector
+GRAPH_STORAGE_TYPE=postgres
+KV_STORAGE_TYPE=postgres
+DOC_STATUS_STORAGE_TYPE=postgres
+```
-- **[`.env.example`](.env.example)** — Main API configuration (OpenRouter, PostgreSQL, RAG settings)
-- **[`.env.lightrag.server.example`](.env.lightrag.server.example)** — LightRAG server configuration
+**High Performance:**
+```env
+VECTOR_STORAGE_TYPE=qdrant
+GRAPH_STORAGE_TYPE=neo4j
+KV_STORAGE_TYPE=redis
+DOC_STATUS_STORAGE_TYPE=postgres
+```
-### Key Environment Variables
+**Local Development:**
+```env
+VECTOR_STORAGE_TYPE=local
+GRAPH_STORAGE_TYPE=networkx
+KV_STORAGE_TYPE=json
+DOC_STATUS_STORAGE_TYPE=json
+```
-| Variable | Default | Description |
-|----------|---------|-------------|
-| `OPEN_ROUTER_API_KEY` | — | Required. Your OpenRouter API key |
-| `RAG_STORAGE_TYPE` | `postgres` | Storage backend: `postgres` or `local` |
-| `COSINE_THRESHOLD` | `0.2` | Similarity threshold (0.0-1.0) |
-| `MCP_TRANSPORT` | `sse` | MCP transport: `stdio`, `sse`, or `streamable` |
-| `LIGHTRAG_API_URL` | `http://localhost:9621` | LightRAG server URL for proxy |
+See [`.env.example`](.env.example) for all configuration options.
## Usage
@@ -107,8 +194,29 @@ Full API documentation is available at **http://localhost:8000/docs** (Swagger U
| `/api/v1/health` | GET | Health check |
| `/api/v1/file/index` | POST | Index a single file (background) |
| `/api/v1/folder/index` | POST | Index a folder (background) |
+| `/api/v1/batch/index` | POST | Index multiple files at once |
| `/api/v1/lightrag/*` | ALL | Proxy to LightRAG API (query, documents, etc.) |
+### Batch File Upload
+
+Upload and index multiple files simultaneously:
+
+```bash
+curl -X POST "http://localhost:8000/api/v1/batch/index" \
+ -F "files=@document1.pdf" \
+ -F "files=@document2.docx" \
+ -F "files=@slides.pptx"
+```
+
+**Response:**
+```json
+{
+ "file_count": 3,
+ "file_names": ["document1.pdf", "document2.docx", "slides.pptx"],
+ "message": "Batch indexing started in background"
+}
+```
+
### Query Modes
When querying via `/api/v1/lightrag/query`:
@@ -124,9 +232,11 @@ When querying via `/api/v1/lightrag/query`:
## MCP Server (Claude Desktop Integration)
-The MCP server exposes a `query_knowledge_base` tool for searching the RAG knowledge base.
+The MCP server exposes **two tools** for searching the RAG knowledge base:
+
+### Tool 1: `query_knowledge_base` (Text-only)
-### Tool: `query_knowledge_base`
+Basic text-based query tool.
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
@@ -135,6 +245,54 @@ The MCP server exposes a `query_knowledge_base` tool for searching the RAG knowl
| `top_k` | integer | `10` | Number of chunks to retrieve |
| `only_need_context` | boolean | `true` | Return only context (no LLM answer) |
+### Tool 2: `query_knowledge_base_multimodal` (With Images, Tables, Equations)
+
+Advanced query tool supporting multimodal inputs.
+
+| Parameter | Type | Required | Description |
+|-----------|------|----------|-------------|
+| `query` | string | ✅ Yes | The search query |
+| `mode` | string | No | Search mode (default: `naive`) |
+| `top_k` | integer | No | Number of chunks (default: `10`) |
+| `only_need_context` | boolean | No | Return only context (default: `true`) |
+| `image_path` | string | No | Path to image file |
+| `image_base64` | string | No | Base64-encoded image |
+| `image_caption` | string | No | Description of the image |
+| `table_data` | string | No | CSV-formatted table data |
+| `table_caption` | string | No | Description of the table |
+| `equation_latex` | string | No | LaTeX equation |
+| `equation_caption` | string | No | Description of the equation |
+
+**Example multimodal queries:**
+
+Query with image:
+```json
+{
+ "query": "What does this architecture diagram show?",
+ "image_path": "/path/to/diagram.png",
+ "image_caption": "System architecture diagram",
+ "mode": "hybrid"
+}
+```
+
+Query with table:
+```json
+{
+ "query": "Compare these metrics with the document",
+ "table_data": "Method,Precision,Recall\nRAG,0.95,0.92\nBaseline,0.87,0.85",
+ "table_caption": "Performance comparison results"
+}
+```
+
+Query with equation:
+```json
+{
+ "query": "Explain this formula in the context of the paper",
+ "equation_latex": "E = mc^2",
+ "equation_caption": "Einstein's mass-energy equivalence"
+}
+```
+
### Claude Desktop Configuration
Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
@@ -184,6 +342,16 @@ docker-compose down -v # Stop and remove volumes
- **Empty results:** Lower `COSINE_THRESHOLD` (e.g., `0.1`) or increase `top_k`
- **Port conflicts:** `lsof -ti:8000 | xargs kill -9`
- **Config changes:** Restart server after changing `COSINE_THRESHOLD`, database config, or API keys
+- **"Cannot connect to Qdrant"**: Ensure service is running: `docker-compose --profile qdrant up -d`
+- **"No module named 'qdrant_client'"**: Install optional dependencies: `uv add qdrant-client neo4j redis`
+- **Neo4j authentication failed**: Check `NEO4J_PASSWORD` in `.env` matches docker-compose
+- **Multimodal query not working**: Verify LightRAG Server supports `vision_model_func` (requires recent version)
+
+## Documentation
+
+- **[IMPLEMENTATION.md](IMPLEMENTATION.md)** — Complete refactoring guide, configuration matrix, migration instructions
+- **[API Docs](http://localhost:8000/docs)** — Interactive Swagger UI
+- **[LightRAG Docs](http://localhost:9621/docs)** — LightRAG Server API reference
## License
diff --git a/docker-compose.yml b/docker-compose.yml
index 924d791..8ec8b68 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -30,13 +30,19 @@ services:
ports:
- "8000:8000"
env_file:
- - .env.docker
+ - .env
+ volumes:
+ - rag_storage:/app/ragdata
depends_on:
postgres:
condition: service_healthy
+ qdrant:
+ condition: service_started
networks:
- raganything-network
restart: unless-stopped
+ # profiles:
+ # - qdrant
# LightRAG Server with Web UI
lightrag-server:
@@ -47,13 +53,71 @@ services:
ports:
- "9621:9621"
env_file:
- - .env.lightrag.server.docker
+ - .env.lightrag.server
+ volumes:
+ - rag_storage:/app/ragdata
depends_on:
postgres:
condition: service_healthy
+ qdrant:
+ condition: service_started
networks:
- raganything-network
restart: unless-stopped
+ # profiles:
+ # - qdrant
+
+ # Qdrant Vector Database (Optional - for high-performance vector storage)
+ # Start with: docker-compose --profile qdrant up -d
+ qdrant:
+ image: qdrant/qdrant:latest
+ container_name: raganything-qdrant
+ ports:
+ - "6333:6333"
+ - "6334:6334"
+ volumes:
+ - qdrant_data:/qdrant/storage
+ networks:
+ - raganything-network
+ # profiles:
+ # - qdrant
+ restart: unless-stopped
+
+ # Neo4j Graph Database (Optional - for advanced graph storage)
+ # Start with: docker-compose --profile neo4j up -d
+ # neo4j:
+ # image: neo4j:5.15-community
+ # container_name: raganything-neo4j
+ # ports:
+ # - "7474:7474"
+ # - "7687:7687"
+ # environment:
+ # NEO4J_AUTH: neo4j/your_password_change_me
+ # NEO4J_PLUGINS: '["apoc", "graph-data-science"]'
+ # volumes:
+ # - neo4j_data:/data
+ # - neo4j_logs:/logs
+ # networks:
+ # - raganything-network
+ # profiles:
+ # - neo4j
+ # restart: unless-stopped
+
+ # Redis Key-Value Store (Optional - for fast KV storage and caching)
+ # Start with: docker-compose --profile redis up -d
+ # redis:
+ # image: redis:7-alpine
+ # container_name: raganything-redis
+ # ports:
+ # - "6379:6379"
+ # volumes:
+ # - redis_data:/data
+ # command: redis-server --save 60 1 --loglevel warning
+ # networks:
+ # - raganything-network
+ # profiles:
+ # - redis
+ # restart: unless-stopped
volumes:
postgres_data:
@@ -62,7 +126,15 @@ volumes:
driver: local
output_data:
driver: local
+ qdrant_data:
+ driver: local
+ # neo4j_data:
+ # driver: local
+ # neo4j_logs:
+ # driver: local
+ # redis_data:
+ # driver: local
networks:
raganything-network:
- driver: bridge
\ No newline at end of file
+ driver: bridge
diff --git a/pyproject.toml b/pyproject.toml
index c3fb3e5..ce09174 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -13,14 +13,21 @@ dependencies = [
"lightrag-hku>=1.4.9.8",
"lightrag-hku[api]>=1.4.9.8",
"mcp>=1.23.1",
+ "neo4j>=6.0.3",
"openai>=2.9.0",
"pgvector>=0.4.2",
"pydantic-settings>=2.12.0",
"python-dotenv>=1.2.1",
"python-multipart>=0.0.20",
+ "qdrant-client>=1.16.2",
"raganything>=1.2.8",
+ "redis>=7.1.0",
"sqlalchemy[asyncio]>=2.0.0",
"uvicorn>=0.38.0",
+ # Optional storage backends (install if needed)
+ # "qdrant-client>=1.11.0", # For Qdrant vector storage
+ # "neo4j>=5.0.0", # For Neo4j graph storage
+ # "redis>=5.0.0", # For Redis KV storage
]
[dependency-groups]
diff --git a/src/application/api/indexing_routes.py b/src/application/api/indexing_routes.py
index 5038b88..c72da6c 100644
--- a/src/application/api/indexing_routes.py
+++ b/src/application/api/indexing_routes.py
@@ -1,8 +1,15 @@
from fastapi import APIRouter, UploadFile, File, Depends, BackgroundTasks, status
+from typing import List
from application.use_cases.index_file_use_case import IndexFileUseCase
from application.use_cases.index_folder_use_case import IndexFolderUseCase
+from application.use_cases.index_batch_use_case import IndexBatchUseCase
from application.requests.indexing_request import IndexFolderRequest
-from dependencies import get_index_file_use_case, get_index_folder_use_case, OUTPUT_DIR
+from dependencies import (
+ get_index_file_use_case,
+ get_index_folder_use_case,
+ get_index_batch_use_case,
+ OUTPUT_DIR,
+)
import shutil
import os
@@ -69,3 +76,54 @@ async def index_folder(
)
return {"status": "accepted", "message": "Folder indexing started in background"}
+
+
+@indexing_router.post(
+ "/batch/index", response_model=dict, status_code=status.HTTP_202_ACCEPTED
+)
+async def index_batch(
+ background_tasks: BackgroundTasks,
+ files: List[UploadFile] = File(...),
+ use_case: IndexBatchUseCase = Depends(get_index_batch_use_case),
+):
+ """
+ Index multiple files in batch (background processing).
+
+ This endpoint accepts multiple file uploads and processes them in parallel
+ according to the MAX_WORKERS configuration. All files are saved to a temporary
+ staging directory, indexed together, and the staging directory is cleaned up automatically.
+
+ Args:
+ background_tasks: FastAPI background tasks handler.
+ files: List of files to index (supports any document format).
+ use_case: The batch indexing use case dependency.
+
+ Returns:
+ dict: Status message indicating batch indexing started with file count.
+
+ Example:
+ ```bash
+ curl -X POST "http://localhost:8000/api/v1/batch/index" \
+ -F "files=@document1.pdf" \
+ -F "files=@document2.docx" \
+ -F "files=@presentation.pptx"
+ ```
+ """
+ if not files:
+ return {
+ "status": "error",
+ "message": "No files provided",
+ "files_count": 0,
+ }
+
+ background_tasks.add_task(
+ use_case.execute,
+ files=files,
+ )
+
+ return {
+ "status": "accepted",
+ "message": f"Batch indexing started for {len(files)} file(s)",
+ "files_count": len(files),
+ "files": [f.filename for f in files if f.filename],
+ }
diff --git a/src/application/api/mcp_tools.py b/src/application/api/mcp_tools.py
index 042d2eb..871dd74 100644
--- a/src/application/api/mcp_tools.py
+++ b/src/application/api/mcp_tools.py
@@ -57,3 +57,117 @@ async def query_knowledge_base(
response = await use_case.execute(proxy_request)
return response.content.decode("utf-8")
+
+
+@mcp.tool()
+async def query_knowledge_base_multimodal(
+ query: str,
+ mode: str = "naive",
+ top_k: int = 10,
+ image_path: str = None,
+ image_base64: str = None,
+ table_data: str = None,
+ table_caption: str = None,
+ equation_latex: str = None,
+ equation_caption: str = None,
+) -> str:
+ """
+ Query the knowledge base with multimodal content support (images, tables, equations).
+
+ This tool extends the standard query with support for visual and structured data.
+ Use this when you need to include images, tables, or equations in your query.
+
+ Multimodal Query Strategy:
+ - Use mode="hybrid" for best results with multimodal content
+ - Provide descriptive captions for better context understanding
+ - Combine multiple content types if needed (e.g., image + table)
+
+ Args:
+ query: The user's question or search query
+ mode: Search mode - "naive", "local", "global", or "hybrid" (recommended for multimodal)
+ top_k: Number of chunks to retrieve (default 10)
+ image_path: Path to an image file to include in the query
+ image_base64: Base64-encoded image data (alternative to image_path)
+ table_data: CSV-formatted table data (e.g., "col1,col2\\nval1,val2")
+ table_caption: Optional caption describing the table
+ equation_latex: LaTeX equation (e.g., "E=mc^2")
+ equation_caption: Optional caption describing the equation
+
+ Returns:
+ JSON string containing the query response with multimodal analysis
+
+ Examples:
+ # Query with an image
+ result = await query_knowledge_base_multimodal(
+ query="What does this diagram show?",
+ image_path="/path/to/diagram.png",
+ mode="hybrid"
+ )
+
+ # Query with a table
+ result = await query_knowledge_base_multimodal(
+ query="Compare these performance metrics with the document",
+ table_data="Method,Accuracy,Speed\\nRAG,95%,120ms\\nBaseline,87%,180ms",
+ table_caption="Performance comparison",
+ mode="hybrid"
+ )
+
+ # Query with an equation
+ result = await query_knowledge_base_multimodal(
+ query="Explain this formula in context of the document",
+ equation_latex="P(d|q) = \\\\frac{P(q|d) \\\\cdot P(d)}{P(q)}",
+ equation_caption="Document relevance probability",
+ mode="hybrid"
+ )
+ """
+ use_case = await get_lightrag_proxy_use_case()
+
+ # Build multimodal content list
+ multimodal_content = []
+
+ if image_path or image_base64:
+ image_item = {"type": "image"}
+ if image_path:
+ image_item["img_path"] = image_path
+ if image_base64:
+ image_item["image_data"] = image_base64
+ multimodal_content.append(image_item)
+
+ if table_data:
+ table_item = {"type": "table", "table_data": table_data}
+ if table_caption:
+ table_item["table_caption"] = table_caption
+ multimodal_content.append(table_item)
+
+ if equation_latex:
+ equation_item = {"type": "equation", "latex": equation_latex}
+ if equation_caption:
+ equation_item["equation_caption"] = equation_caption
+ multimodal_content.append(equation_item)
+
+ # Build request based on whether multimodal content exists
+ if multimodal_content:
+ # Use multimodal query format
+ request_body = {
+ "query": query,
+ "multimodal_content": multimodal_content,
+ "mode": mode,
+ "top_k": top_k,
+ }
+ else:
+ # Fallback to standard query if no multimodal content provided
+ request_body = {
+ "query": query,
+ "mode": mode,
+ "top_k": top_k,
+ "only_need_context": True,
+ }
+
+ proxy_request = LightRAGProxyRequest(
+ method="POST",
+ path="query",
+ body=request_body,
+ )
+
+ response = await use_case.execute(proxy_request)
+ return response.content.decode("utf-8")
diff --git a/src/application/use_cases/index_batch_use_case.py b/src/application/use_cases/index_batch_use_case.py
new file mode 100644
index 0000000..85b462f
--- /dev/null
+++ b/src/application/use_cases/index_batch_use_case.py
@@ -0,0 +1,85 @@
+import logging
+import os
+import tempfile
+import shutil
+from typing import List
+from fastapi import UploadFile
+from domain.ports.rag_engine import RAGEnginePort
+from domain.entities.indexing_result import FolderIndexingResult
+
+logger = logging.getLogger(__name__)
+
+
+class IndexBatchUseCase:
+ """
+ Use case for indexing multiple files in batch.
+ Creates a temporary staging directory, saves all uploaded files,
+ indexes the folder, and cleans up.
+ """
+
+ def __init__(self, rag_engine: RAGEnginePort, output_dir: str) -> None:
+ """
+ Initialize the use case.
+
+ Args:
+ rag_engine: Port for RAG engine operations.
+ output_dir: Output directory for processing.
+ """
+ self.rag_engine = rag_engine
+ self.output_dir = output_dir
+
+ async def execute(self, files: List[UploadFile]) -> FolderIndexingResult:
+ """
+ Execute batch indexing process.
+
+ Args:
+ files: List of uploaded files to index.
+
+ Returns:
+ FolderIndexingResult: Structured result of the batch indexing operation.
+ """
+ if not files:
+ raise ValueError("No files provided for batch indexing")
+
+ # Create temporary staging directory
+ staged_dir = tempfile.mkdtemp(prefix="batch_upload_")
+ logger.info(f"Created temporary staging directory: {staged_dir}")
+
+ try:
+ # Save all uploaded files to staging directory
+ saved_files = []
+ for file in files:
+ if file.filename:
+ file_path = os.path.join(staged_dir, file.filename)
+ with open(file_path, "wb") as f:
+ shutil.copyfileobj(file.file, f)
+ saved_files.append(file_path)
+ logger.info(f"Saved file: {file.filename}")
+
+ logger.info(f"Saved {len(saved_files)} files to staging directory")
+
+ # Ensure output directory exists
+ os.makedirs(self.output_dir, exist_ok=True)
+
+ # Index the entire staging folder
+ result = await self.rag_engine.index_folder(
+ folder_path=staged_dir,
+ output_dir=self.output_dir,
+ recursive=False, # No need for recursion in flat upload
+ file_extensions=None, # Accept all file types
+ )
+
+ logger.info(
+ f"Batch indexing completed: {result.stats.files_processed} processed, "
+ f"{result.stats.files_failed} failed"
+ )
+
+ return result
+
+ finally:
+ # Clean up temporary directory
+ try:
+ shutil.rmtree(staged_dir, ignore_errors=True)
+ logger.info(f"Cleaned up temporary directory: {staged_dir}")
+ except Exception as e:
+ logger.warning(f"Failed to clean up staging directory: {e}")
diff --git a/src/config.py b/src/config.py
index 57f2c8a..a713c54 100644
--- a/src/config.py
+++ b/src/config.py
@@ -43,16 +43,31 @@ def DATABASE_URL(self) -> str:
class LLMConfig(BaseSettings):
"""
- Large Language Model configuration.
+ Large Language Model configuration (Generic - supports multiple providers).
"""
+ # Generic LLM Configuration
+ LLM_BINDING: str = Field(
+ default="openai",
+ description="LLM provider binding: openai, ollama, azure, gemini, lollms"
+ )
+ LLM_API_KEY: Optional[str] = Field(default=None)
+ LLM_BASE_URL: Optional[str] = Field(default="https://api.openai.com/v1")
+ LLM_MODEL_NAME: str = Field(
+ default="gpt-4o-mini", description="Model name for chat completions"
+ )
+
+ # Legacy support (deprecated - for backward compatibility)
OPEN_ROUTER_API_KEY: Optional[str] = Field(default=None)
OPENROUTER_API_KEY: Optional[str] = Field(default=None)
OPEN_ROUTER_API_URL: str = Field(default="https://openrouter.ai/api/v1")
BASE_URL: Optional[str] = Field(default=None)
+ CHAT_MODEL: Optional[str] = Field(default=None) # Deprecated, use LLM_MODEL_NAME
- CHAT_MODEL: str = Field(
- default="openai/gpt-4o-mini", description="Model name for chat completions"
+ # Embedding Configuration
+ EMBEDDING_BINDING: str = Field(
+ default="openai",
+ description="Embedding provider binding: openai, ollama, azure"
)
EMBEDDING_MODEL: str = Field(
default="text-embedding-3-small", description="Model name for embeddings"
@@ -63,22 +78,76 @@ class LLMConfig(BaseSettings):
MAX_TOKEN_SIZE: int = Field(
default=8192, description="Maximum token size for the embedding model"
)
+
+ # Vision Model Configuration
VISION_MODEL: str = Field(
- default="openai/gpt-4o", description="Model name for vision tasks"
+ default="gpt-4o", description="Model name for vision tasks"
)
@property
def api_key(self) -> str:
- """Get API key with fallback."""
- key = self.OPEN_ROUTER_API_KEY or self.OPENROUTER_API_KEY
+ """Get API key with fallback to legacy env vars."""
+ key = self.LLM_API_KEY or self.OPEN_ROUTER_API_KEY or self.OPENROUTER_API_KEY
if not key:
- print("WARNING: OPENROUTER_API_KEY not set. API calls will fail.")
+ print("WARNING: LLM_API_KEY not set. API calls will fail.")
return key or ""
@property
def api_base_url(self) -> str:
- """Get API base URL with fallback."""
- return self.BASE_URL or self.OPEN_ROUTER_API_URL
+ """Get API base URL with fallback to legacy env vars."""
+ return self.LLM_BASE_URL or self.BASE_URL or self.OPEN_ROUTER_API_URL
+
+ @property
+ def model_name(self) -> str:
+ """Get model name with fallback to legacy env vars."""
+ return self.LLM_MODEL_NAME or self.CHAT_MODEL or "gpt-4o-mini"
+
+
+class StorageConfig(BaseSettings):
+ """
+ Storage configuration for LightRAG (4 types: Vector, Graph, KV, DocStatus).
+ """
+
+ # Vector Storage Configuration
+ VECTOR_STORAGE_TYPE: str = Field(
+ default="pgvector",
+ description="Vector storage type: pgvector, qdrant, milvus, local"
+ )
+
+ # Graph Storage Configuration (CRITICAL - for knowledge graph)
+ GRAPH_STORAGE_TYPE: str = Field(
+ default="postgres",
+ description="Graph storage type: postgres, neo4j, networkx, memgraph"
+ )
+
+ # KV Storage Configuration (for LLM cache, chunks, documents)
+ KV_STORAGE_TYPE: str = Field(
+ default="postgres",
+ description="KV storage type: postgres, redis, mongo, json"
+ )
+
+ # Doc Status Storage Configuration
+ DOC_STATUS_STORAGE_TYPE: str = Field(
+ default="postgres",
+ description="Doc status storage type: postgres, mongo, json"
+ )
+
+ # Qdrant Configuration (if VECTOR_STORAGE_TYPE=qdrant)
+ QDRANT_URL: Optional[str] = Field(default="http://localhost:6333")
+ QDRANT_API_KEY: Optional[str] = Field(default=None)
+
+ # Neo4j Configuration (if GRAPH_STORAGE_TYPE=neo4j)
+ NEO4J_URI: Optional[str] = Field(default="bolt://localhost:7687")
+ NEO4J_USERNAME: Optional[str] = Field(default="neo4j")
+ NEO4J_PASSWORD: Optional[str] = Field(default=None)
+
+ # Redis Configuration (if KV_STORAGE_TYPE=redis)
+ REDIS_URI: Optional[str] = Field(default="redis://localhost:6379")
+
+ # Vector Index Configuration
+ VECTOR_INDEX_TYPE: str = Field(default="HNSW")
+ HNSW_M: int = Field(default=16)
+ HNSW_EF: int = Field(default=64)
class RAGConfig(BaseSettings):
@@ -104,8 +173,9 @@ class RAGConfig(BaseSettings):
MAX_WORKERS: int = Field(
default=3, description="Number of workers for folder processing"
)
+ # Legacy (deprecated - use StorageConfig.VECTOR_STORAGE_TYPE)
RAG_STORAGE_TYPE: str = Field(
- default="postgres", description="Storage type for RAG system"
+ default="postgres", description="[DEPRECATED] Use VECTOR_STORAGE_TYPE instead"
)
diff --git a/src/dependencies.py b/src/dependencies.py
index 79513d7..49db878 100644
--- a/src/dependencies.py
+++ b/src/dependencies.py
@@ -8,7 +8,7 @@
from raganything import RAGAnything, RAGAnythingConfig
from lightrag.llm.openai import openai_complete_if_cache, openai_embed
from lightrag.utils import EmbeddingFunc
-from config import DatabaseConfig, LLMConfig, RAGConfig, AppConfig, ProxyConfig
+from config import DatabaseConfig, LLMConfig, RAGConfig, AppConfig, ProxyConfig, StorageConfig
from infrastructure.rag.lightrag_adapter import LightRAGAdapter
from infrastructure.proxy.lightrag_proxy_client import (
LightRAGProxyClient,
@@ -18,6 +18,7 @@
)
from application.use_cases.index_file_use_case import IndexFileUseCase
from application.use_cases.index_folder_use_case import IndexFolderUseCase
+from application.use_cases.index_batch_use_case import IndexBatchUseCase
from application.use_cases.lightrag_proxy_use_case import LightRAGProxyUseCase
@@ -28,6 +29,7 @@
llm_config = LLMConfig() # type: ignore
rag_config = RAGConfig() # type: ignore
proxy_config = ProxyConfig() # type: ignore
+storage_config = StorageConfig() # type: ignore
# ============= ENVIRONMENT SETUP =============
@@ -39,9 +41,10 @@
# ============= DIRECTORIES =============
-WORKING_DIR = os.path.join(tempfile.gettempdir(), "rag_storage")
+# Read WORKING_DIR from environment variable, fallback to temp dir
+WORKING_DIR = os.getenv("WORKING_DIR", os.path.join(tempfile.gettempdir(), "rag_storage"))
os.makedirs(WORKING_DIR, exist_ok=True)
-OUTPUT_DIR = os.path.join(tempfile.gettempdir(), "output")
+OUTPUT_DIR = os.path.join(WORKING_DIR, "output")
os.makedirs(OUTPUT_DIR, exist_ok=True)
# ============= DATABASE ENGINE =============
@@ -50,10 +53,87 @@
# ============= RAG SETUP =============
+def get_storage_config() -> dict:
+ """
+ Factory function to get storage configuration based on StorageConfig.
+ Returns dict with all 4 storage types: vector, graph, kv, doc_status.
+ """
+ storage_dict = {}
+
+ # 1. VECTOR STORAGE
+ if storage_config.VECTOR_STORAGE_TYPE == "pgvector":
+ storage_dict["vector_storage"] = "PGVectorStorage"
+ elif storage_config.VECTOR_STORAGE_TYPE == "qdrant":
+ if storage_config.QDRANT_URL:
+ os.environ["QDRANT_URL"] = storage_config.QDRANT_URL
+ if storage_config.QDRANT_API_KEY:
+ os.environ["QDRANT_API_KEY"] = storage_config.QDRANT_API_KEY
+ storage_dict["vector_storage"] = "QdrantVectorDBStorage"
+ elif storage_config.VECTOR_STORAGE_TYPE == "milvus":
+ storage_dict["vector_storage"] = "MilvusVectorDBStorage"
+ elif storage_config.VECTOR_STORAGE_TYPE == "local":
+ storage_dict["vector_storage"] = "NanoVectorDBStorage"
+ else:
+ storage_dict["vector_storage"] = "PGVectorStorage" # Default fallback
+
+ # 2. GRAPH STORAGE (CRITICAL - for knowledge graph)
+ if storage_config.GRAPH_STORAGE_TYPE == "postgres":
+ storage_dict["graph_storage"] = "PGGraphStorage"
+ elif storage_config.GRAPH_STORAGE_TYPE == "neo4j":
+ if storage_config.NEO4J_URI:
+ os.environ["NEO4J_URI"] = storage_config.NEO4J_URI
+ if storage_config.NEO4J_USERNAME:
+ os.environ["NEO4J_USERNAME"] = storage_config.NEO4J_USERNAME
+ if storage_config.NEO4J_PASSWORD:
+ os.environ["NEO4J_PASSWORD"] = storage_config.NEO4J_PASSWORD
+ storage_dict["graph_storage"] = "Neo4JStorage"
+ elif storage_config.GRAPH_STORAGE_TYPE == "networkx":
+ storage_dict["graph_storage"] = "NetworkXStorage"
+ elif storage_config.GRAPH_STORAGE_TYPE == "memgraph":
+ if storage_config.NEO4J_URI:
+ os.environ["NEO4J_URI"] = storage_config.NEO4J_URI
+ if storage_config.NEO4J_USERNAME:
+ os.environ["NEO4J_USERNAME"] = storage_config.NEO4J_USERNAME
+ if storage_config.NEO4J_PASSWORD:
+ os.environ["NEO4J_PASSWORD"] = storage_config.NEO4J_PASSWORD
+ storage_dict["graph_storage"] = "MemgraphStorage"
+ else:
+ storage_dict["graph_storage"] = "PGGraphStorage" # Default fallback
+
+ # 3. KV STORAGE (for LLM cache, chunks, documents)
+ if storage_config.KV_STORAGE_TYPE == "postgres":
+ storage_dict["kv_storage"] = "PGKVStorage"
+ elif storage_config.KV_STORAGE_TYPE == "redis":
+ if storage_config.REDIS_URI:
+ os.environ["REDIS_URI"] = storage_config.REDIS_URI
+ storage_dict["kv_storage"] = "RedisKVStorage"
+ elif storage_config.KV_STORAGE_TYPE == "mongo":
+ storage_dict["kv_storage"] = "MongoKVStorage"
+ elif storage_config.KV_STORAGE_TYPE == "json":
+ storage_dict["kv_storage"] = "JsonKVStorage"
+ else:
+ storage_dict["kv_storage"] = "PGKVStorage" # Default fallback
+
+ # 4. DOC STATUS STORAGE
+ if storage_config.DOC_STATUS_STORAGE_TYPE == "postgres":
+ storage_dict["doc_status_storage"] = "PGDocStatusStorage"
+ elif storage_config.DOC_STATUS_STORAGE_TYPE == "mongo":
+ storage_dict["doc_status_storage"] = "MongoDocStatusStorage"
+ elif storage_config.DOC_STATUS_STORAGE_TYPE == "json":
+ storage_dict["doc_status_storage"] = "JsonDocStatusStorage"
+ else:
+ storage_dict["doc_status_storage"] = "PGDocStatusStorage" # Default fallback
+
+ # Add cosine threshold
+ storage_dict["cosine_threshold"] = rag_config.COSINE_THRESHOLD
+
+ return storage_dict
+
+
async def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs):
- """LLM function for RAGAnything."""
+ """LLM function for RAGAnything - supports multiple providers."""
return await openai_complete_if_cache(
- llm_config.CHAT_MODEL,
+ llm_config.model_name,
prompt,
system_prompt=system_prompt,
history_messages=history_messages,
@@ -126,23 +206,7 @@ async def vision_model_func(
llm_model_func=llm_model_func,
vision_model_func=vision_model_func,
embedding_func=embedding_func,
- lightrag_kwargs=(
- {
- "kv_storage": "PGKVStorage",
- "vector_storage": "PGVectorStorage",
- "graph_storage": "PGGraphStorage",
- "doc_status_storage": "PGDocStatusStorage",
- "cosine_threshold": rag_config.COSINE_THRESHOLD,
- }
- if rag_config.RAG_STORAGE_TYPE == "postgres"
- else {
- "kv_storage": "JsonKVStorage",
- "vector_storage": "NanoVectorDBStorage",
- "graph_storage": "NetworkXStorage",
- "doc_status_storage": "JsonDocStatusStorage",
- "cosine_threshold": rag_config.COSINE_THRESHOLD,
- }
- ),
+ lightrag_kwargs=get_storage_config(),
)
# ============= ADAPTERS =============
@@ -172,6 +236,16 @@ async def get_index_folder_use_case() -> IndexFolderUseCase:
return IndexFolderUseCase(rag_adapter, OUTPUT_DIR)
+async def get_index_batch_use_case() -> IndexBatchUseCase:
+ """
+ Dependency injection function for IndexBatchUseCase.
+
+ Returns:
+ IndexBatchUseCase: The configured use case for batch file indexing.
+ """
+ return IndexBatchUseCase(rag_adapter, OUTPUT_DIR)
+
+
async def get_lightrag_client() -> LightRAGProxyClient:
"""
Dependency injection function for LightRAG proxy client.
diff --git a/src/infrastructure/rag/lightrag_adapter.py b/src/infrastructure/rag/lightrag_adapter.py
index 95c4b0e..cc4d3e8 100644
--- a/src/infrastructure/rag/lightrag_adapter.py
+++ b/src/infrastructure/rag/lightrag_adapter.py
@@ -1,6 +1,5 @@
from typing import Optional, List
import time
-import os
from domain.ports.rag_engine import RAGEnginePort
from domain.entities.indexing_result import (
FileIndexingResult,
@@ -17,6 +16,9 @@ class LightRAGAdapter(RAGEnginePort):
"""
Adapter for RAGAnything/LightRAG implementing RAGEnginePort.
Wraps the RAGAnything instance and provides a clean interface.
+
+ This adapter uses RAGAnything's process_document_complete() for multimodal
+ processing without doc_status registration (documents won't appear in Web UI).
"""
def __init__(self, rag_instance: RAGAnything, max_workers: int) -> None:
@@ -25,6 +27,7 @@ def __init__(self, rag_instance: RAGAnything, max_workers: int) -> None:
Args:
rag_instance: The configured RAGAnything instance.
+ max_workers: Maximum number of concurrent workers.
"""
self.rag = rag_instance
self._initialized = False
@@ -61,22 +64,42 @@ async def index_document(
FileIndexingResult: Structured result of the indexing operation.
"""
start_time = time.time()
+
try:
- await self.rag.process_document_complete(
- file_path=file_path, output_dir=output_dir, parse_method="auto"
- )
- processing_time_ms = (time.time() - start_time) * 1000
- return FileIndexingResult(
- status=IndexingStatus.SUCCESS,
- message=f"File '{file_name}' indexed successfully",
+ # Use RAGAnything's process_document_complete() for multimodal processing
+ # Note: This does NOT register in doc_status table (no Web UI visibility)
+ success = await self.rag.process_document_complete(
file_path=file_path,
- file_name=file_name,
- processing_time_ms=round(processing_time_ms, 2),
+ output_dir=output_dir,
+ parse_method="auto"
)
+
+ if success:
+ processing_time_ms = (time.time() - start_time) * 1000
+ logger.info(f"Successfully indexed document: {file_name}")
+ return FileIndexingResult(
+ status=IndexingStatus.SUCCESS,
+ message=f"File '{file_name}' indexed successfully",
+ file_path=file_path,
+ file_name=file_name,
+ processing_time_ms=round(processing_time_ms, 2),
+ )
+ else:
+ processing_time_ms = (time.time() - start_time) * 1000
+ return FileIndexingResult(
+ status=IndexingStatus.FAILED,
+ message=f"Failed to index file '{file_name}'",
+ file_path=file_path,
+ file_name=file_name,
+ processing_time_ms=round(processing_time_ms, 2),
+ error="RAGAnything processing returned false",
+ )
+
except Exception as e:
processing_time_ms = (time.time() - start_time) * 1000
error_msg = str(e)
logger.error(f"Failed to index document {file_path}: {e}", exc_info=True)
+
return FileIndexingResult(
status=IndexingStatus.FAILED,
message=f"Failed to index file '{file_name}'",
@@ -105,62 +128,112 @@ async def index_folder(
Returns:
FolderIndexingResult: Structured result with statistics and file details.
"""
+ import asyncio
+ from pathlib import Path
+
start_time = time.time()
+
try:
- result = await self.rag.process_folder_complete(
- folder_path=folder_path,
- output_dir=output_dir,
- parse_method="auto",
- file_extensions=file_extensions,
- recursive=recursive,
- display_stats=True,
- max_workers=self.max_workers,
- )
- processing_time_ms = (time.time() - start_time) * 1000
-
- # Parse the result from RAGAnything
- result_dict = result if isinstance(result, dict) else {}
- stats = FolderIndexingStats(
- total_files=result_dict.get("total_files", 0),
- files_processed=result_dict.get("successful_files", 0),
- files_failed=result_dict.get("failed_files", 0),
- files_skipped=result_dict.get("skipped_files", 0),
- )
-
- # Build file results if available
- file_results: Optional[List[FileProcessingDetail]] = None
- if result_dict and "file_details" in result_dict:
- file_results = []
- file_details = result_dict["file_details"]
- if isinstance(file_details, list):
- for detail in file_details:
- file_results.append(
- FileProcessingDetail(
- file_path=detail.get("file_path", ""),
- file_name=os.path.basename(detail.get("file_path", "")),
- status=(
- IndexingStatus.SUCCESS
- if detail.get("success", False)
- else IndexingStatus.FAILED
- ),
- error=detail.get("error"),
+ # Get all files in folder
+ folder_path_obj = Path(folder_path)
+ if not folder_path_obj.exists():
+ raise FileNotFoundError(f"Folder not found: {folder_path}")
+
+ # Default extensions if not provided
+ if file_extensions is None:
+ file_extensions = [".pdf", ".docx", ".pptx", ".xlsx", ".txt", ".md"]
+
+ # Collect files to process
+ files_to_process = []
+ for ext in file_extensions:
+ pattern = f"**/*{ext}" if recursive else f"*{ext}"
+ files_to_process.extend(folder_path_obj.glob(pattern))
+
+ total_files = len(files_to_process)
+ if total_files == 0:
+ processing_time_ms = (time.time() - start_time) * 1000
+ return FolderIndexingResult(
+ status=IndexingStatus.SUCCESS,
+ message=f"No files found to index in '{folder_path}'",
+ folder_path=folder_path,
+ recursive=recursive,
+ stats=FolderIndexingStats(total_files=0),
+ processing_time_ms=round(processing_time_ms, 2),
+ )
+
+ logger.info(f"Found {total_files} files to process in {folder_path}")
+
+ # Process files with concurrency control
+ semaphore = asyncio.Semaphore(self.max_workers)
+ file_results: List[FileProcessingDetail] = []
+ successful = 0
+ failed = 0
+
+ async def process_single_file(file_path: Path):
+ nonlocal successful, failed
+ async with semaphore:
+ file_name = file_path.name
+ try:
+ # Use process_document_complete() without doc_status registration
+ success = await self.rag.process_document_complete(
+ file_path=str(file_path),
+ output_dir=output_dir,
+ parse_method="auto"
+ )
+
+ if success:
+ successful += 1
+ logger.info(f"Successfully indexed: {file_name}")
+ return FileProcessingDetail(
+ file_path=str(file_path),
+ file_name=file_name,
+ status=IndexingStatus.SUCCESS,
+ )
+ else:
+ failed += 1
+ return FileProcessingDetail(
+ file_path=str(file_path),
+ file_name=file_name,
+ status=IndexingStatus.FAILED,
+ error="RAGAnything processing returned false",
)
+ except Exception as e:
+ failed += 1
+ logger.error(f"Failed to index {file_name}: {e}")
+ return FileProcessingDetail(
+ file_path=str(file_path),
+ file_name=file_name,
+ status=IndexingStatus.FAILED,
+ error=str(e),
)
-
+
+ # Create tasks for all files
+ tasks = [process_single_file(file_path) for file_path in files_to_process]
+ file_results = await asyncio.gather(*tasks)
+
+ processing_time_ms = (time.time() - start_time) * 1000
+
# Determine overall status
- if stats.files_failed == 0 and stats.files_processed > 0:
+ stats = FolderIndexingStats(
+ total_files=total_files,
+ files_processed=successful,
+ files_failed=failed,
+ files_skipped=0,
+ )
+
+ if failed == 0 and successful > 0:
status = IndexingStatus.SUCCESS
- message = f"Successfully indexed {stats.files_processed} file(s) from '{folder_path}'"
- elif stats.files_processed > 0 and stats.files_failed > 0:
+ message = f"Successfully indexed {successful} file(s) from '{folder_path}'"
+ elif successful > 0 and failed > 0:
status = IndexingStatus.PARTIAL
- message = f"Partially indexed folder '{folder_path}': {stats.files_processed} succeeded, {stats.files_failed} failed"
- elif stats.files_processed == 0 and stats.total_files > 0:
+ message = f"Partially indexed folder '{folder_path}': {successful} succeeded, {failed} failed"
+ elif successful == 0 and total_files > 0:
status = IndexingStatus.FAILED
message = f"Failed to index any files from '{folder_path}'"
else:
status = IndexingStatus.SUCCESS
message = f"No files found to index in '{folder_path}'"
-
+
return FolderIndexingResult(
status=status,
message=message,
@@ -168,8 +241,9 @@ async def index_folder(
recursive=recursive,
stats=stats,
processing_time_ms=round(processing_time_ms, 2),
- file_results=file_results,
+ file_results=list(file_results),
)
+
except Exception as e:
processing_time_ms = (time.time() - start_time) * 1000
error_msg = str(e)
diff --git a/test_doc.html b/test_doc.html
new file mode 100644
index 0000000..c6358f1
--- /dev/null
+++ b/test_doc.html
@@ -0,0 +1,35 @@
+
+
+
+ Test Document
+
+
+ Test Document
+ This is a test document for RAGAnything indexing.
+
+ Key Information
+
+ - Company: TestCo
+ - Product: MultimodalRAG
+ - Version: 1.0
+
+
+ This document contains important information about our product.
+
+ Features
+
+
+ | Feature |
+ Description |
+
+
+ | Multimodal Processing |
+ Supports images, tables, and equations |
+
+
+ | Knowledge Graph |
+ Automatic entity extraction and linking |
+
+
+
+
diff --git a/test_doc.txt b/test_doc.txt
new file mode 100644
index 0000000..cbc5eb3
--- /dev/null
+++ b/test_doc.txt
@@ -0,0 +1,10 @@
+# Test Document
+
+This is a test document for RAGAnything indexing.
+
+## Key Information
+- Company: TestCo
+- Product: MultimodalRAG
+- Version: 1.0
+
+This document contains important information about our product.
diff --git a/test_sample.pdf b/test_sample.pdf
new file mode 100644
index 0000000..774c2ea
Binary files /dev/null and b/test_sample.pdf differ
diff --git a/uv.lock b/uv.lock
index 54a4c8c..ebe4d45 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1,11 +1,15 @@
version = 1
-revision = 2
+revision = 3
requires-python = ">=3.13"
resolution-markers = [
- "sys_platform == 'darwin'",
- "platform_machine == 'aarch64' and sys_platform == 'linux'",
- "sys_platform == 'win32'",
- "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
]
[[package]]
@@ -14,7 +18,8 @@ version = "1.12.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huggingface-hub" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "packaging" },
{ name = "psutil" },
{ name = "pyyaml" },
@@ -129,8 +134,10 @@ name = "albucore"
version = "0.0.24"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
- { name = "opencv-python-headless" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python-headless", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python-headless", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
{ name = "simsimd" },
{ name = "stringzilla" },
]
@@ -145,8 +152,10 @@ version = "2.0.8"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "albucore" },
- { name = "numpy" },
- { name = "opencv-python-headless" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python-headless", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python-headless", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
{ name = "pydantic" },
{ name = "pyyaml" },
{ name = "scipy" },
@@ -683,7 +692,8 @@ name = "contourpy"
version = "1.3.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" }
wheels = [
@@ -879,20 +889,20 @@ name = "datasets"
version = "4.4.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "dill", marker = "sys_platform == 'darwin'" },
- { name = "filelock", marker = "sys_platform == 'darwin'" },
- { name = "fsspec", extra = ["http"], marker = "sys_platform == 'darwin'" },
- { name = "httpx", marker = "sys_platform == 'darwin'" },
- { name = "huggingface-hub", marker = "sys_platform == 'darwin'" },
- { name = "multiprocess", marker = "sys_platform == 'darwin'" },
- { name = "numpy", marker = "sys_platform == 'darwin'" },
- { name = "packaging", marker = "sys_platform == 'darwin'" },
- { name = "pandas", marker = "sys_platform == 'darwin'" },
- { name = "pyarrow", marker = "sys_platform == 'darwin'" },
- { name = "pyyaml", marker = "sys_platform == 'darwin'" },
- { name = "requests", marker = "sys_platform == 'darwin'" },
- { name = "tqdm", marker = "sys_platform == 'darwin'" },
- { name = "xxhash", marker = "sys_platform == 'darwin'" },
+ { name = "dill", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "filelock", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "fsspec", extra = ["http"], marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "httpx", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "huggingface-hub", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "multiprocess", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "packaging", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "pandas", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "pyarrow", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "pyyaml", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "requests", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "tqdm", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "xxhash", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/93/bf/0dae295d6d1ba0b1a200a9dd216838464b5bbd05da01407cb1330b377445/datasets-4.4.1.tar.gz", hash = "sha256:80322699aa8c0bbbdb7caa87906da689c3c2e29523cff698775c67f28fdab1fc", size = 585341, upload-time = "2025-11-05T16:00:38.162Z" }
wheels = [
@@ -942,7 +952,8 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "albumentations" },
{ name = "matplotlib" },
- { name = "opencv-python" },
+ { name = "opencv-python", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
{ name = "pandas" },
{ name = "pillow" },
{ name = "psutil" },
@@ -1042,7 +1053,8 @@ dependencies = [
{ name = "docling-core" },
{ name = "huggingface-hub" },
{ name = "jsonlines" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "pillow" },
{ name = "pydantic" },
{ name = "rtree" },
@@ -1395,7 +1407,7 @@ wheels = [
[package.optional-dependencies]
http = [
- { name = "aiohttp", marker = "sys_platform == 'darwin'" },
+ { name = "aiohttp", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
]
[[package]]
@@ -1476,7 +1488,8 @@ dependencies = [
{ name = "huggingface-hub" },
{ name = "jinja2" },
{ name = "markupsafe" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "orjson" },
{ name = "packaging" },
{ name = "pandas" },
@@ -1565,6 +1578,37 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64", size = 14090, upload-time = "2025-02-28T20:24:55.152Z" },
]
+[[package]]
+name = "grpcio"
+version = "1.76.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "typing-extensions" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/b6/e0/318c1ce3ae5a17894d5791e87aea147587c9e702f24122cc7a5c8bbaeeb1/grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73", size = 12785182, upload-time = "2025-10-21T16:23:12.106Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/fc/ed/71467ab770effc9e8cef5f2e7388beb2be26ed642d567697bb103a790c72/grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2", size = 5807716, upload-time = "2025-10-21T16:21:48.475Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/85/c6ed56f9817fab03fa8a111ca91469941fb514e3e3ce6d793cb8f1e1347b/grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468", size = 11821522, upload-time = "2025-10-21T16:21:51.142Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/31/2b8a235ab40c39cbc141ef647f8a6eb7b0028f023015a4842933bc0d6831/grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3", size = 6362558, upload-time = "2025-10-21T16:21:54.213Z" },
+ { url = "https://files.pythonhosted.org/packages/bd/64/9784eab483358e08847498ee56faf8ff6ea8e0a4592568d9f68edc97e9e9/grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb", size = 7049990, upload-time = "2025-10-21T16:21:56.476Z" },
+ { url = "https://files.pythonhosted.org/packages/2b/94/8c12319a6369434e7a184b987e8e9f3b49a114c489b8315f029e24de4837/grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae", size = 6575387, upload-time = "2025-10-21T16:21:59.051Z" },
+ { url = "https://files.pythonhosted.org/packages/15/0f/f12c32b03f731f4a6242f771f63039df182c8b8e2cf8075b245b409259d4/grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77", size = 7166668, upload-time = "2025-10-21T16:22:02.049Z" },
+ { url = "https://files.pythonhosted.org/packages/ff/2d/3ec9ce0c2b1d92dd59d1c3264aaec9f0f7c817d6e8ac683b97198a36ed5a/grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03", size = 8124928, upload-time = "2025-10-21T16:22:04.984Z" },
+ { url = "https://files.pythonhosted.org/packages/1a/74/fd3317be5672f4856bcdd1a9e7b5e17554692d3db9a3b273879dc02d657d/grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42", size = 7589983, upload-time = "2025-10-21T16:22:07.881Z" },
+ { url = "https://files.pythonhosted.org/packages/45/bb/ca038cf420f405971f19821c8c15bcbc875505f6ffadafe9ffd77871dc4c/grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f", size = 3984727, upload-time = "2025-10-21T16:22:10.032Z" },
+ { url = "https://files.pythonhosted.org/packages/41/80/84087dc56437ced7cdd4b13d7875e7439a52a261e3ab4e06488ba6173b0a/grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8", size = 4702799, upload-time = "2025-10-21T16:22:12.709Z" },
+ { url = "https://files.pythonhosted.org/packages/b4/46/39adac80de49d678e6e073b70204091e76631e03e94928b9ea4ecf0f6e0e/grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62", size = 5808417, upload-time = "2025-10-21T16:22:15.02Z" },
+ { url = "https://files.pythonhosted.org/packages/9c/f5/a4531f7fb8b4e2a60b94e39d5d924469b7a6988176b3422487be61fe2998/grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd", size = 11828219, upload-time = "2025-10-21T16:22:17.954Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/1c/de55d868ed7a8bd6acc6b1d6ddc4aa36d07a9f31d33c912c804adb1b971b/grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc", size = 6367826, upload-time = "2025-10-21T16:22:20.721Z" },
+ { url = "https://files.pythonhosted.org/packages/59/64/99e44c02b5adb0ad13ab3adc89cb33cb54bfa90c74770f2607eea629b86f/grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a", size = 7049550, upload-time = "2025-10-21T16:22:23.637Z" },
+ { url = "https://files.pythonhosted.org/packages/43/28/40a5be3f9a86949b83e7d6a2ad6011d993cbe9b6bd27bea881f61c7788b6/grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba", size = 6575564, upload-time = "2025-10-21T16:22:26.016Z" },
+ { url = "https://files.pythonhosted.org/packages/4b/a9/1be18e6055b64467440208a8559afac243c66a8b904213af6f392dc2212f/grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09", size = 7176236, upload-time = "2025-10-21T16:22:28.362Z" },
+ { url = "https://files.pythonhosted.org/packages/0f/55/dba05d3fcc151ce6e81327541d2cc8394f442f6b350fead67401661bf041/grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc", size = 8125795, upload-time = "2025-10-21T16:22:31.075Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/45/122df922d05655f63930cf42c9e3f72ba20aadb26c100ee105cad4ce4257/grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc", size = 7592214, upload-time = "2025-10-21T16:22:33.831Z" },
+ { url = "https://files.pythonhosted.org/packages/4a/6e/0b899b7f6b66e5af39e377055fb4a6675c9ee28431df5708139df2e93233/grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e", size = 4062961, upload-time = "2025-10-21T16:22:36.468Z" },
+ { url = "https://files.pythonhosted.org/packages/19/41/0b430b01a2eb38ee887f88c1f07644a1df8e289353b78e82b37ef988fb64/grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e", size = 4834462, upload-time = "2025-10-21T16:22:39.772Z" },
+]
+
[[package]]
name = "h11"
version = "0.16.0"
@@ -1574,6 +1618,19 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" },
]
+[[package]]
+name = "h2"
+version = "4.3.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "hpack" },
+ { name = "hyperframe" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" },
+]
+
[[package]]
name = "hf-xet"
version = "1.2.0"
@@ -1603,6 +1660,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735, upload-time = "2025-10-24T19:04:35.928Z" },
]
+[[package]]
+name = "hpack"
+version = "4.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" },
+]
+
[[package]]
name = "httpcore"
version = "1.0.9"
@@ -1631,6 +1697,11 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" },
]
+[package.optional-dependencies]
+http2 = [
+ { name = "h2" },
+]
+
[[package]]
name = "httpx-retries"
version = "0.4.5"
@@ -1683,6 +1754,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f0/0f/310fb31e39e2d734ccaa2c0fb981ee41f7bd5056ce9bc29b2248bd569169/humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477", size = 86794, upload-time = "2021-09-17T21:40:39.897Z" },
]
+[[package]]
+name = "hyperframe"
+version = "6.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" },
+]
+
[[package]]
name = "idna"
version = "3.11"
@@ -1697,7 +1777,8 @@ name = "imageio"
version = "2.37.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "pillow" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/606be632e37bf8d05b253e8626c2291d74c691ddc7bcdf7d6aaf33b32f6a/imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a", size = 389600, upload-time = "2025-11-04T14:29:39.898Z" }
@@ -1991,7 +2072,8 @@ dependencies = [
{ name = "json-repair" },
{ name = "nano-vectordb" },
{ name = "networkx" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "pandas" },
{ name = "pipmaster" },
{ name = "pydantic" },
@@ -2024,7 +2106,8 @@ api = [
{ name = "json-repair" },
{ name = "nano-vectordb" },
{ name = "networkx" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "openai" },
{ name = "pandas" },
{ name = "passlib", extra = ["bcrypt"] },
@@ -2121,14 +2204,43 @@ wheels = [
[[package]]
name = "magika"
-version = "1.0.1"
+version = "0.6.3"
source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+]
dependencies = [
- { name = "click" },
- { name = "numpy" },
+ { name = "click", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "python-dotenv", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a3/f3/3d1dcdd7b9c41d589f5cff252d32ed91cdf86ba84391cfc81d9d8773571d/magika-0.6.3.tar.gz", hash = "sha256:7cc52aa7359af861957043e2bf7265ed4741067251c104532765cd668c0c0cb1", size = 3042784, upload-time = "2025-10-30T15:22:34.499Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a2/e4/35c323beb3280482c94299d61626116856ac2d4ec16ecef50afc4fdd4291/magika-0.6.3-py3-none-any.whl", hash = "sha256:eda443d08006ee495e02083b32e51b98cb3696ab595a7d13900d8e2ef506ec9d", size = 2969474, upload-time = "2025-10-30T15:22:25.298Z" },
+ { url = "https://files.pythonhosted.org/packages/25/8f/132b0d7cd51c02c39fd52658a5896276c30c8cc2fd453270b19db8c40f7e/magika-0.6.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:86901e64b05dde5faff408c9b8245495b2e1fd4c226e3393d3d2a3fee65c504b", size = 13358841, upload-time = "2025-10-30T15:22:27.413Z" },
+]
+
+[[package]]
+name = "magika"
+version = "1.0.1"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
+dependencies = [
+ { name = "click", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform != 'darwin'" },
{ name = "onnxruntime", version = "1.20.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" },
- { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" },
- { name = "python-dotenv" },
+ { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (sys_platform != 'darwin' and sys_platform != 'win32')" },
+ { name = "python-dotenv", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/72/1a/d2cedf4e7fe98d62f444b17925eb9e61664e0225ceb27f39e30b73409404/magika-1.0.1.tar.gz", hash = "sha256:313f8cbfcdc9a7e55c24286273230a2732b89825e58a93de2b576531393b8398", size = 3042821, upload-time = "2025-10-31T11:40:45.437Z" }
wheels = [
@@ -2220,7 +2332,8 @@ dependencies = [
{ name = "cycler" },
{ name = "fonttools" },
{ name = "kiwisolver" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "packaging" },
{ name = "pillow" },
{ name = "pyparsing" },
@@ -2295,12 +2408,15 @@ dependencies = [
{ name = "httpx" },
{ name = "lightrag-hku", extra = ["api"] },
{ name = "mcp" },
+ { name = "neo4j" },
{ name = "openai" },
{ name = "pgvector" },
{ name = "pydantic-settings" },
{ name = "python-dotenv" },
{ name = "python-multipart" },
+ { name = "qdrant-client" },
{ name = "raganything" },
+ { name = "redis" },
{ name = "sqlalchemy", extra = ["asyncio"] },
{ name = "uvicorn" },
]
@@ -2325,12 +2441,15 @@ requires-dist = [
{ name = "lightrag-hku", specifier = ">=1.4.9.8" },
{ name = "lightrag-hku", extras = ["api"], specifier = ">=1.4.9.8" },
{ name = "mcp", specifier = ">=1.23.1" },
+ { name = "neo4j", specifier = ">=6.0.3" },
{ name = "openai", specifier = ">=2.9.0" },
{ name = "pgvector", specifier = ">=0.4.2" },
{ name = "pydantic-settings", specifier = ">=2.12.0" },
{ name = "python-dotenv", specifier = ">=1.2.1" },
{ name = "python-multipart", specifier = ">=0.0.20" },
+ { name = "qdrant-client", specifier = ">=1.16.2" },
{ name = "raganything", specifier = ">=1.2.8" },
+ { name = "redis", specifier = ">=7.1.0" },
{ name = "sqlalchemy", extras = ["asyncio"], specifier = ">=2.0.0" },
{ name = "uvicorn", specifier = ">=0.38.0" },
]
@@ -2354,35 +2473,105 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
]
+[[package]]
+name = "mineru"
+version = "2.6.2"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+]
+dependencies = [
+ { name = "beautifulsoup4", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "boto3", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "click", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "fast-langdetect", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "httpx", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "huggingface-hub", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "json-repair", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "loguru", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "magika", version = "0.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "mineru-vl-utils", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "modelscope", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "openai", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "opencv-python", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pdfminer-six", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pdftext", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pillow", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pypdf", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pypdfium2", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "reportlab", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "requests", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "scikit-image", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "tqdm", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+]
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/e5/e9/9937306f722d770346a603596347693ef9bfefd889284c0ea4c064715664/mineru-2.6.2-py3-none-any.whl", hash = "sha256:cd0f835ee8d9f58577f67753b9f1a8d22a26e172d1b8068f122e49a20706d1e3", size = 1280803, upload-time = "2025-10-24T10:49:14.561Z" },
+]
+
+[package.optional-dependencies]
+core = [
+ { name = "accelerate", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "dill", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "doclayout-yolo", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "fastapi", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "ftfy", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "gradio", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "gradio-pdf", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "matplotlib", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "omegaconf", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pyclipper", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "python-multipart", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "pyyaml", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "shapely", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "torch", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "torchvision", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "transformers", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "ultralytics", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "uvicorn", marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+]
+
[[package]]
name = "mineru"
version = "2.6.5"
source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "beautifulsoup4" },
- { name = "boto3" },
- { name = "click" },
- { name = "fast-langdetect" },
- { name = "httpx" },
- { name = "huggingface-hub" },
- { name = "json-repair" },
- { name = "loguru" },
- { name = "magika" },
- { name = "mineru-vl-utils" },
- { name = "modelscope" },
- { name = "numpy" },
- { name = "openai" },
- { name = "opencv-python" },
- { name = "pdfminer-six" },
- { name = "pdftext" },
- { name = "pillow" },
- { name = "pypdf" },
- { name = "pypdfium2" },
- { name = "qwen-vl-utils" },
- { name = "reportlab" },
- { name = "requests" },
- { name = "scikit-image" },
- { name = "tqdm" },
+resolution-markers = [
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
+dependencies = [
+ { name = "beautifulsoup4", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "boto3", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "click", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "fast-langdetect", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "httpx", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "huggingface-hub", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "json-repair", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "loguru", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "magika", version = "1.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "mineru-vl-utils", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "modelscope", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform != 'darwin'" },
+ { name = "openai", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "opencv-python", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform != 'darwin'" },
+ { name = "opencv-python", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "pdfminer-six", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "pdftext", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "pillow", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "pypdf", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "pypdfium2", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "qwen-vl-utils", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "reportlab", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "requests", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "scikit-image", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "tqdm", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/2d/6b/f2946d4bf499a63fd13babc35c7ccb1061ecfce4a35dccbb0697bdbe4f18/mineru-2.6.5-py3-none-any.whl", hash = "sha256:8c09a9ebc1ce9283c86448e95b0a03721b74150d64bae88e6b0ed84ff86835d0", size = 1287625, upload-time = "2025-11-26T03:52:08.036Z" },
@@ -2390,27 +2579,27 @@ wheels = [
[package.optional-dependencies]
core = [
- { name = "accelerate" },
- { name = "dill" },
- { name = "doclayout-yolo" },
- { name = "fastapi" },
- { name = "ftfy" },
- { name = "gradio" },
- { name = "gradio-pdf" },
- { name = "matplotlib" },
- { name = "mlx-vlm", marker = "sys_platform == 'darwin'" },
- { name = "omegaconf" },
+ { name = "accelerate", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "dill", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "doclayout-yolo", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "fastapi", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "ftfy", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "gradio", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "gradio-pdf", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "matplotlib", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "mlx-vlm", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "omegaconf", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
{ name = "onnxruntime", version = "1.20.1", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform == 'win32'" },
- { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "sys_platform != 'win32'" },
- { name = "pyclipper" },
- { name = "python-multipart" },
- { name = "pyyaml" },
- { name = "shapely" },
- { name = "torch" },
- { name = "torchvision" },
- { name = "transformers" },
- { name = "ultralytics" },
- { name = "uvicorn" },
+ { name = "onnxruntime", version = "1.23.2", source = { registry = "https://pypi.org/simple" }, marker = "(python_full_version < '3.14' and sys_platform == 'darwin') or (sys_platform != 'darwin' and sys_platform != 'win32')" },
+ { name = "pyclipper", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "python-multipart", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "pyyaml", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "shapely", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "torch", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "torchvision", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "transformers", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "ultralytics", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "uvicorn", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
]
[[package]]
@@ -2433,7 +2622,7 @@ name = "mlx"
version = "0.30.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "mlx-metal", marker = "sys_platform == 'darwin'" },
+ { name = "mlx-metal", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
]
wheels = [
{ url = "https://files.pythonhosted.org/packages/33/a5/e171b2caa69b346bc1abc1bfd0b139f631f68a0ff602862dd255e7dd95ec/mlx-0.30.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f46aaa6c562ba183e2a64a0e6ba15ed54f9027d9b7b1822e9eec7f59b13d610c", size = 554595, upload-time = "2025-11-20T16:45:13.919Z" },
@@ -2449,13 +2638,13 @@ name = "mlx-lm"
version = "0.28.4"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "jinja2", marker = "sys_platform == 'darwin'" },
- { name = "mlx", marker = "sys_platform == 'darwin'" },
- { name = "numpy", marker = "sys_platform == 'darwin'" },
- { name = "protobuf", marker = "sys_platform == 'darwin'" },
- { name = "pyyaml", marker = "sys_platform == 'darwin'" },
- { name = "sentencepiece", marker = "sys_platform == 'darwin'" },
- { name = "transformers", marker = "sys_platform == 'darwin'" },
+ { name = "jinja2", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "mlx", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "protobuf", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "pyyaml", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "sentencepiece", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "transformers", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f2/7f/94b3f7e00c4681a4fe2d47b519458245bd8a8f0506b1ce018d1850bbcf79/mlx_lm-0.28.4.tar.gz", hash = "sha256:3661d8ef5f0e2695d52993e0df1ed2c1f93ca1d094258146c18d9cec0c50514e", size = 232455, upload-time = "2025-12-03T22:39:59.122Z" }
wheels = [
@@ -2477,18 +2666,18 @@ name = "mlx-vlm"
version = "0.3.9"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "datasets", marker = "sys_platform == 'darwin'" },
- { name = "fastapi", marker = "sys_platform == 'darwin'" },
- { name = "mlx", marker = "sys_platform == 'darwin'" },
- { name = "mlx-lm", marker = "sys_platform == 'darwin'" },
- { name = "numpy", marker = "sys_platform == 'darwin'" },
- { name = "opencv-python", marker = "sys_platform == 'darwin'" },
- { name = "pillow", marker = "sys_platform == 'darwin'" },
- { name = "requests", marker = "sys_platform == 'darwin'" },
- { name = "soundfile", marker = "sys_platform == 'darwin'" },
- { name = "tqdm", marker = "sys_platform == 'darwin'" },
- { name = "transformers", marker = "sys_platform == 'darwin'" },
- { name = "uvicorn", marker = "sys_platform == 'darwin'" },
+ { name = "datasets", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "fastapi", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "mlx", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "mlx-lm", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "opencv-python", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "pillow", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "requests", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "soundfile", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "tqdm", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "transformers", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "uvicorn", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1d/98/6b3c2d1317a317d0df544fe9ab0ef4f233ea85c1e4ac2fe6af7289ea1ee5/mlx_vlm-0.3.9.tar.gz", hash = "sha256:ae5050d0b1a051a29099c3a65efdbf6874bb497e8465734ac1992b6b179135b4", size = 303350, upload-time = "2025-12-03T21:48:24.199Z" }
wheels = [
@@ -2678,13 +2867,26 @@ name = "nano-vectordb"
version = "0.0.4.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/cb/ff/ed9ff1c4e5b0418687c17d02fdc453c212e7550c62622914ba0243c106bc/nano_vectordb-0.0.4.3.tar.gz", hash = "sha256:3d13074476f2b739e51261974ed44aa467725579966219734c03502c929ed3b5", size = 6332, upload-time = "2024-11-11T12:50:50.584Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9b/d8/f1876f59916da0a2147e63066650c46bf7992828a9e92f1b4e3b695f1fb0/nano_vectordb-0.0.4.3-py3-none-any.whl", hash = "sha256:1b70401a54c02fabf76515b5dfb630076434547ed3c6861828ee8771b6dd7c19", size = 5590, upload-time = "2024-11-11T12:50:48.9Z" },
]
+[[package]]
+name = "neo4j"
+version = "6.0.3"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pytz" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/60/b2/87534fc0520e5f9db1432bacc3f8d0ce024608010babc4f65b96e0c34906/neo4j-6.0.3.tar.gz", hash = "sha256:7fb79e166e281aafd67d521f6611763ebcdc529f26db506c5605f91ddcd825ea", size = 239653, upload-time = "2025-11-06T16:57:57.012Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/ba/fe/55ed1d4636defb57fae1f7be7818820aa8071d45949c91ef8649930e70c5/neo4j-6.0.3-py3-none-any.whl", hash = "sha256:a92023854da96aed4270e0d03d6429cdd7f0d3335eae977370934f4732de5678", size = 325433, upload-time = "2025-11-06T16:57:55.03Z" },
+]
+
[[package]]
name = "networkx"
version = "3.6.1"
@@ -2698,6 +2900,12 @@ wheels = [
name = "numpy"
version = "2.2.6"
source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" },
@@ -2722,6 +2930,62 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" },
]
+[[package]]
+name = "numpy"
+version = "2.4.0"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
+sdist = { url = "https://files.pythonhosted.org/packages/a4/7a/6a3d14e205d292b738db449d0de649b373a59edb0d0b4493821d0a3e8718/numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934", size = 20685720, upload-time = "2025-12-20T16:18:19.023Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/a7/0d/853fd96372eda07c824d24adf02e8bc92bb3731b43a9b2a39161c3667cc4/numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea", size = 16649088, upload-time = "2025-12-20T16:16:31.421Z" },
+ { url = "https://files.pythonhosted.org/packages/e3/37/cc636f1f2a9f585434e20a3e6e63422f70bfe4f7f6698e941db52ea1ac9a/numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d", size = 12364065, upload-time = "2025-12-20T16:16:33.491Z" },
+ { url = "https://files.pythonhosted.org/packages/ed/69/0b78f37ca3690969beee54103ce5f6021709134e8020767e93ba691a72f1/numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee", size = 5192640, upload-time = "2025-12-20T16:16:35.636Z" },
+ { url = "https://files.pythonhosted.org/packages/1d/2a/08569f8252abf590294dbb09a430543ec8f8cc710383abfb3e75cc73aeda/numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e", size = 6541556, upload-time = "2025-12-20T16:16:37.276Z" },
+ { url = "https://files.pythonhosted.org/packages/93/e9/a949885a4e177493d61519377952186b6cbfdf1d6002764c664ba28349b5/numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2", size = 14396562, upload-time = "2025-12-20T16:16:38.953Z" },
+ { url = "https://files.pythonhosted.org/packages/99/98/9d4ad53b0e9ef901c2ef1d550d2136f5ac42d3fd2988390a6def32e23e48/numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a", size = 16351719, upload-time = "2025-12-20T16:16:41.503Z" },
+ { url = "https://files.pythonhosted.org/packages/28/de/5f3711a38341d6e8dd619f6353251a0cdd07f3d6d101a8fd46f4ef87f895/numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681", size = 16176053, upload-time = "2025-12-20T16:16:44.552Z" },
+ { url = "https://files.pythonhosted.org/packages/2a/5b/2a3753dc43916501b4183532e7ace862e13211042bceafa253afb5c71272/numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475", size = 18277859, upload-time = "2025-12-20T16:16:47.174Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/c5/a18bcdd07a941db3076ef489d036ab16d2bfc2eae0cf27e5a26e29189434/numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344", size = 5953849, upload-time = "2025-12-20T16:16:49.554Z" },
+ { url = "https://files.pythonhosted.org/packages/4f/f1/719010ff8061da6e8a26e1980cf090412d4f5f8060b31f0c45d77dd67a01/numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d", size = 12302840, upload-time = "2025-12-20T16:16:51.227Z" },
+ { url = "https://files.pythonhosted.org/packages/f5/5a/b3d259083ed8b4d335270c76966cb6cf14a5d1b69e1a608994ac57a659e6/numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d", size = 10308509, upload-time = "2025-12-20T16:16:53.313Z" },
+ { url = "https://files.pythonhosted.org/packages/31/01/95edcffd1bb6c0633df4e808130545c4f07383ab629ac7e316fb44fff677/numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6", size = 12491815, upload-time = "2025-12-20T16:16:55.496Z" },
+ { url = "https://files.pythonhosted.org/packages/59/ea/5644b8baa92cc1c7163b4b4458c8679852733fa74ca49c942cfa82ded4e0/numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5", size = 5320321, upload-time = "2025-12-20T16:16:57.468Z" },
+ { url = "https://files.pythonhosted.org/packages/26/4e/e10938106d70bc21319bd6a86ae726da37edc802ce35a3a71ecdf1fdfe7f/numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3", size = 6641635, upload-time = "2025-12-20T16:16:59.379Z" },
+ { url = "https://files.pythonhosted.org/packages/b3/8d/a8828e3eaf5c0b4ab116924df82f24ce3416fa38d0674d8f708ddc6c8aac/numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d", size = 14456053, upload-time = "2025-12-20T16:17:01.768Z" },
+ { url = "https://files.pythonhosted.org/packages/68/a1/17d97609d87d4520aa5ae2dcfb32305654550ac6a35effb946d303e594ce/numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3", size = 16401702, upload-time = "2025-12-20T16:17:04.235Z" },
+ { url = "https://files.pythonhosted.org/packages/18/32/0f13c1b2d22bea1118356b8b963195446f3af124ed7a5adfa8fdecb1b6ca/numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa", size = 16242493, upload-time = "2025-12-20T16:17:06.856Z" },
+ { url = "https://files.pythonhosted.org/packages/ae/23/48f21e3d309fbc137c068a1475358cbd3a901b3987dcfc97a029ab3068e2/numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c", size = 18324222, upload-time = "2025-12-20T16:17:09.392Z" },
+ { url = "https://files.pythonhosted.org/packages/ac/52/41f3d71296a3dcaa4f456aaa3c6fc8e745b43d0552b6bde56571bb4b4a0f/numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93", size = 6076216, upload-time = "2025-12-20T16:17:11.437Z" },
+ { url = "https://files.pythonhosted.org/packages/35/ff/46fbfe60ab0710d2a2b16995f708750307d30eccbb4c38371ea9e986866e/numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4", size = 12444263, upload-time = "2025-12-20T16:17:13.182Z" },
+ { url = "https://files.pythonhosted.org/packages/a3/e3/9189ab319c01d2ed556c932ccf55064c5d75bb5850d1df7a482ce0badead/numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c", size = 10378265, upload-time = "2025-12-20T16:17:15.211Z" },
+ { url = "https://files.pythonhosted.org/packages/ab/ed/52eac27de39d5e5a6c9aadabe672bc06f55e24a3d9010cd1183948055d76/numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b", size = 16647476, upload-time = "2025-12-20T16:17:17.671Z" },
+ { url = "https://files.pythonhosted.org/packages/77/c0/990ce1b7fcd4e09aeaa574e2a0a839589e4b08b2ca68070f1acb1fea6736/numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e", size = 12374563, upload-time = "2025-12-20T16:17:20.216Z" },
+ { url = "https://files.pythonhosted.org/packages/37/7c/8c5e389c6ae8f5fd2277a988600d79e9625db3fff011a2d87ac80b881a4c/numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e", size = 5203107, upload-time = "2025-12-20T16:17:22.47Z" },
+ { url = "https://files.pythonhosted.org/packages/e6/94/ca5b3bd6a8a70a5eec9a0b8dd7f980c1eff4b8a54970a9a7fef248ef564f/numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51", size = 6538067, upload-time = "2025-12-20T16:17:24.001Z" },
+ { url = "https://files.pythonhosted.org/packages/79/43/993eb7bb5be6761dde2b3a3a594d689cec83398e3f58f4758010f3b85727/numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce", size = 14411926, upload-time = "2025-12-20T16:17:25.822Z" },
+ { url = "https://files.pythonhosted.org/packages/03/75/d4c43b61de473912496317a854dac54f1efec3eeb158438da6884b70bb90/numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f", size = 16354295, upload-time = "2025-12-20T16:17:28.308Z" },
+ { url = "https://files.pythonhosted.org/packages/b8/0a/b54615b47ee8736a6461a4bb6749128dd3435c5a759d5663f11f0e9af4ac/numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded", size = 16190242, upload-time = "2025-12-20T16:17:30.993Z" },
+ { url = "https://files.pythonhosted.org/packages/98/ce/ea207769aacad6246525ec6c6bbd66a2bf56c72443dc10e2f90feed29290/numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059", size = 18280875, upload-time = "2025-12-20T16:17:33.327Z" },
+ { url = "https://files.pythonhosted.org/packages/17/ef/ec409437aa962ea372ed601c519a2b141701683ff028f894b7466f0ab42b/numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db", size = 6002530, upload-time = "2025-12-20T16:17:35.729Z" },
+ { url = "https://files.pythonhosted.org/packages/5f/4a/5cb94c787a3ed1ac65e1271b968686521169a7b3ec0b6544bb3ca32960b0/numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e", size = 12435890, upload-time = "2025-12-20T16:17:37.599Z" },
+ { url = "https://files.pythonhosted.org/packages/48/a0/04b89db963af9de1104975e2544f30de89adbf75b9e75f7dd2599be12c79/numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63", size = 10591892, upload-time = "2025-12-20T16:17:39.649Z" },
+ { url = "https://files.pythonhosted.org/packages/53/e5/d74b5ccf6712c06c7a545025a6a71bfa03bdc7e0568b405b0d655232fd92/numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df", size = 12494312, upload-time = "2025-12-20T16:17:41.714Z" },
+ { url = "https://files.pythonhosted.org/packages/c2/08/3ca9cc2ddf54dfee7ae9a6479c071092a228c68aef08252aa08dac2af002/numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9", size = 5322862, upload-time = "2025-12-20T16:17:44.145Z" },
+ { url = "https://files.pythonhosted.org/packages/87/74/0bb63a68394c0c1e52670cfff2e309afa41edbe11b3327d9af29e4383f34/numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9", size = 6644986, upload-time = "2025-12-20T16:17:46.203Z" },
+ { url = "https://files.pythonhosted.org/packages/06/8f/9264d9bdbcf8236af2823623fe2f3981d740fc3461e2787e231d97c38c28/numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471", size = 14457958, upload-time = "2025-12-20T16:17:48.017Z" },
+ { url = "https://files.pythonhosted.org/packages/8c/d9/f9a69ae564bbc7236a35aa883319364ef5fd41f72aa320cc1cbe66148fe2/numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544", size = 16398394, upload-time = "2025-12-20T16:17:50.409Z" },
+ { url = "https://files.pythonhosted.org/packages/34/c7/39241501408dde7f885d241a98caba5421061a2c6d2b2197ac5e3aa842d8/numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c", size = 16241044, upload-time = "2025-12-20T16:17:52.661Z" },
+ { url = "https://files.pythonhosted.org/packages/7c/95/cae7effd90e065a95e59fe710eeee05d7328ed169776dfdd9f789e032125/numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac", size = 18321772, upload-time = "2025-12-20T16:17:54.947Z" },
+ { url = "https://files.pythonhosted.org/packages/96/df/3c6c279accd2bfb968a76298e5b276310bd55d243df4fa8ac5816d79347d/numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f", size = 6148320, upload-time = "2025-12-20T16:17:57.249Z" },
+ { url = "https://files.pythonhosted.org/packages/92/8d/f23033cce252e7a75cae853d17f582e86534c46404dea1c8ee094a9d6d84/numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4", size = 12623460, upload-time = "2025-12-20T16:17:58.963Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/4f/1f8475907d1a7c4ef9020edf7f39ea2422ec896849245f00688e4b268a71/numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8", size = 10661799, upload-time = "2025-12-20T16:18:01.078Z" },
+]
+
[[package]]
name = "nvidia-cublas-cu12"
version = "12.8.4.1"
@@ -2888,12 +3152,14 @@ name = "onnxruntime"
version = "1.20.1"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
- "sys_platform == 'win32'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
]
dependencies = [
{ name = "coloredlogs", marker = "sys_platform == 'win32'" },
{ name = "flatbuffers", marker = "sys_platform == 'win32'" },
- { name = "numpy", marker = "sys_platform == 'win32'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'win32'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform == 'win32'" },
{ name = "packaging", marker = "sys_platform == 'win32'" },
{ name = "protobuf", marker = "sys_platform == 'win32'" },
{ name = "sympy", marker = "sys_platform == 'win32'" },
@@ -2907,14 +3173,18 @@ name = "onnxruntime"
version = "1.23.2"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
- "sys_platform == 'darwin'",
- "platform_machine == 'aarch64' and sys_platform == 'linux'",
- "(platform_machine != 'aarch64' and sys_platform == 'linux') or (sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
]
dependencies = [
{ name = "coloredlogs", marker = "sys_platform != 'win32'" },
{ name = "flatbuffers", marker = "sys_platform != 'win32'" },
- { name = "numpy", marker = "sys_platform != 'win32'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform != 'win32'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14' and sys_platform != 'win32'" },
{ name = "packaging", marker = "sys_platform != 'win32'" },
{ name = "protobuf", marker = "sys_platform != 'win32'" },
{ name = "sympy", marker = "sys_platform != 'win32'" },
@@ -2959,12 +3229,41 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/12/cf/03675d8bd8ecbf4445504d8071adab19f5f993676795708e36402ab38263/openapi_pydantic-0.5.1-py3-none-any.whl", hash = "sha256:a3a09ef4586f5bd760a8df7f43028b60cafb6d9f61de2acba9574766255ab146", size = 96381, upload-time = "2025-01-08T19:29:25.275Z" },
]
+[[package]]
+name = "opencv-python"
+version = "4.11.0.86"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
+dependencies = [
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/17/06/68c27a523103dad5837dc5b87e71285280c4f098c60e4fe8a8db6486ab09/opencv-python-4.11.0.86.tar.gz", hash = "sha256:03d60ccae62304860d232272e4a4fda93c39d595780cb40b161b310244b736a4", size = 95171956, upload-time = "2025-01-16T13:52:24.737Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/05/4d/53b30a2a3ac1f75f65a59eb29cf2ee7207ce64867db47036ad61743d5a23/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:432f67c223f1dc2824f5e73cdfcd9db0efc8710647d4e813012195dc9122a52a", size = 37326322, upload-time = "2025-01-16T13:52:25.887Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/84/0a67490741867eacdfa37bc18df96e08a9d579583b419010d7f3da8ff503/opencv_python-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:9d05ef13d23fe97f575153558653e2d6e87103995d54e6a35db3f282fe1f9c66", size = 56723197, upload-time = "2025-01-16T13:55:21.222Z" },
+ { url = "https://files.pythonhosted.org/packages/f3/bd/29c126788da65c1fb2b5fb621b7fed0ed5f9122aa22a0868c5e2c15c6d23/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b92ae2c8852208817e6776ba1ea0d6b1e0a1b5431e971a2a0ddd2a8cc398202", size = 42230439, upload-time = "2025-01-16T13:51:35.822Z" },
+ { url = "https://files.pythonhosted.org/packages/2c/8b/90eb44a40476fa0e71e05a0283947cfd74a5d36121a11d926ad6f3193cc4/opencv_python-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b02611523803495003bd87362db3e1d2a0454a6a63025dc6658a9830570aa0d", size = 62986597, upload-time = "2025-01-16T13:52:08.836Z" },
+ { url = "https://files.pythonhosted.org/packages/fb/d7/1d5941a9dde095468b288d989ff6539dd69cd429dbf1b9e839013d21b6f0/opencv_python-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:810549cb2a4aedaa84ad9a1c92fbfdfc14090e2749cedf2c1589ad8359aa169b", size = 29384337, upload-time = "2025-01-16T13:52:13.549Z" },
+ { url = "https://files.pythonhosted.org/packages/a4/7d/f1c30a92854540bf789e9cd5dde7ef49bbe63f855b85a2e6b3db8135c591/opencv_python-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:085ad9b77c18853ea66283e98affefe2de8cc4c1f43eda4c100cf9b2721142ec", size = 39488044, upload-time = "2025-01-16T13:52:21.928Z" },
+]
+
[[package]]
name = "opencv-python"
version = "4.12.0.88"
source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ac/71/25c98e634b6bdeca4727c7f6d6927b056080668c5008ad3c8fc9e7f8f6ec/opencv-python-4.12.0.88.tar.gz", hash = "sha256:8b738389cede219405f6f3880b851efa3415ccd674752219377353f017d2994d", size = 95373294, upload-time = "2025-07-07T09:20:52.389Z" }
wheels = [
@@ -2976,12 +3275,41 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/fa/80/eb88edc2e2b11cd2dd2e56f1c80b5784d11d6e6b7f04a1145df64df40065/opencv_python-4.12.0.88-cp37-abi3-win_amd64.whl", hash = "sha256:d98edb20aa932fd8ebd276a72627dad9dc097695b3d435a4257557bbb49a79d2", size = 39000307, upload-time = "2025-07-07T09:14:16.641Z" },
]
+[[package]]
+name = "opencv-python-headless"
+version = "4.11.0.86"
+source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version >= '3.14' and sys_platform == 'darwin'",
+ "python_full_version >= '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version >= '3.14' and sys_platform == 'win32'",
+ "(python_full_version >= '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version >= '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
+dependencies = [
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/36/2f/5b2b3ba52c864848885ba988f24b7f105052f68da9ab0e693cc7c25b0b30/opencv-python-headless-4.11.0.86.tar.gz", hash = "sha256:996eb282ca4b43ec6a3972414de0e2331f5d9cda2b41091a49739c19fb843798", size = 95177929, upload-time = "2025-01-16T13:53:40.22Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/dc/53/2c50afa0b1e05ecdb4603818e85f7d174e683d874ef63a6abe3ac92220c8/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:48128188ade4a7e517237c8e1e11a9cdf5c282761473383e77beb875bb1e61ca", size = 37326460, upload-time = "2025-01-16T13:52:57.015Z" },
+ { url = "https://files.pythonhosted.org/packages/3b/43/68555327df94bb9b59a1fd645f63fafb0762515344d2046698762fc19d58/opencv_python_headless-4.11.0.86-cp37-abi3-macosx_13_0_x86_64.whl", hash = "sha256:a66c1b286a9de872c343ee7c3553b084244299714ebb50fbdcd76f07ebbe6c81", size = 56723330, upload-time = "2025-01-16T13:55:45.731Z" },
+ { url = "https://files.pythonhosted.org/packages/45/be/1438ce43ebe65317344a87e4b150865c5585f4c0db880a34cdae5ac46881/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6efabcaa9df731f29e5ea9051776715b1bdd1845d7c9530065c7951d2a2899eb", size = 29487060, upload-time = "2025-01-16T13:51:59.625Z" },
+ { url = "https://files.pythonhosted.org/packages/dd/5c/c139a7876099916879609372bfa513b7f1257f7f1a908b0bdc1c2328241b/opencv_python_headless-4.11.0.86-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e0a27c19dd1f40ddff94976cfe43066fbbe9dfbb2ec1907d66c19caef42a57b", size = 49969856, upload-time = "2025-01-16T13:53:29.654Z" },
+ { url = "https://files.pythonhosted.org/packages/95/dd/ed1191c9dc91abcc9f752b499b7928aacabf10567bb2c2535944d848af18/opencv_python_headless-4.11.0.86-cp37-abi3-win32.whl", hash = "sha256:f447d8acbb0b6f2808da71fddd29c1cdd448d2bc98f72d9bb78a7a898fc9621b", size = 29324425, upload-time = "2025-01-16T13:52:49.048Z" },
+ { url = "https://files.pythonhosted.org/packages/86/8a/69176a64335aed183529207ba8bc3d329c2999d852b4f3818027203f50e6/opencv_python_headless-4.11.0.86-cp37-abi3-win_amd64.whl", hash = "sha256:6c304df9caa7a6a5710b91709dd4786bf20a74d57672b3c31f7033cc638174ca", size = 39402386, upload-time = "2025-01-16T13:52:56.418Z" },
+]
+
[[package]]
name = "opencv-python-headless"
version = "4.12.0.88"
source = { registry = "https://pypi.org/simple" }
+resolution-markers = [
+ "python_full_version < '3.14' and sys_platform == 'darwin'",
+ "python_full_version < '3.14' and platform_machine == 'aarch64' and sys_platform == 'linux'",
+ "python_full_version < '3.14' and sys_platform == 'win32'",
+ "(python_full_version < '3.14' and platform_machine != 'aarch64' and sys_platform == 'linux') or (python_full_version < '3.14' and sys_platform != 'darwin' and sys_platform != 'linux' and sys_platform != 'win32')",
+]
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/a4/63/6861102ec149c3cd298f4d1ea7ce9d6adbc7529221606ff1dab991a19adb/opencv-python-headless-4.12.0.88.tar.gz", hash = "sha256:cfdc017ddf2e59b6c2f53bc12d74b6b0be7ded4ec59083ea70763921af2b6c09", size = 95379675, upload-time = "2025-07-07T09:21:06.815Z" }
wheels = [
@@ -3057,7 +3385,8 @@ name = "pandas"
version = "2.3.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "python-dateutil" },
{ name = "pytz" },
{ name = "tzdata" },
@@ -3166,7 +3495,8 @@ name = "pgvector"
version = "0.4.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/25/6c/6d8b4b03b958c02fa8687ec6063c49d952a189f8c91ebbe51e877dfab8f7/pgvector-0.4.2.tar.gz", hash = "sha256:322cac0c1dc5d41c9ecf782bd9991b7966685dee3a00bc873631391ed949513a", size = 31354, upload-time = "2025-12-05T01:07:17.87Z" }
wheels = [
@@ -3298,6 +3628,18 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/94/7c/535646d75a1c510065169ea65693613c7a6bc64491bea13e7dad4f028ff3/polyfactory-3.1.0-py3-none-any.whl", hash = "sha256:78171232342c25906d542513c9f00ebf41eadec2c67b498490a577024dd7e867", size = 61836, upload-time = "2025-11-25T08:10:14.893Z" },
]
+[[package]]
+name = "portalocker"
+version = "3.2.0"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "pywin32", marker = "sys_platform == 'win32'" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/5e/77/65b857a69ed876e1951e88aaba60f5ce6120c33703f7cb61a3c894b8c1b6/portalocker-3.2.0.tar.gz", hash = "sha256:1f3002956a54a8c3730586c5c77bf18fae4149e07eaf1c29fc3faf4d5a3f89ac", size = 95644, upload-time = "2025-06-14T13:20:40.03Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/4b/a6/38c8e2f318bf67d338f4d629e93b0b4b9af331f455f0390ea8ce4a099b26/portalocker-3.2.0-py3-none-any.whl", hash = "sha256:3cdc5f565312224bc570c49337bd21428bba0ef363bbcf58b9ef4a9f11779968", size = 22424, upload-time = "2025-06-14T13:20:38.083Z" },
+]
+
[[package]]
name = "propcache"
version = "0.4.1"
@@ -3971,15 +4313,34 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
]
+[[package]]
+name = "qdrant-client"
+version = "1.16.2"
+source = { registry = "https://pypi.org/simple" }
+dependencies = [
+ { name = "grpcio" },
+ { name = "httpx", extra = ["http2"] },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "portalocker" },
+ { name = "protobuf" },
+ { name = "pydantic" },
+ { name = "urllib3" },
+]
+sdist = { url = "https://files.pythonhosted.org/packages/ca/7d/3cd10e26ae97b35cf856ca1dc67576e42414ae39502c51165bb36bb1dff8/qdrant_client-1.16.2.tar.gz", hash = "sha256:ca4ef5f9be7b5eadeec89a085d96d5c723585a391eb8b2be8192919ab63185f0", size = 331112, upload-time = "2025-12-12T10:58:30.866Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/08/13/8ce16f808297e16968269de44a14f4fef19b64d9766be1d6ba5ba78b579d/qdrant_client-1.16.2-py3-none-any.whl", hash = "sha256:442c7ef32ae0f005e88b5d3c0783c63d4912b97ae756eb5e052523be682f17d3", size = 377186, upload-time = "2025-12-12T10:58:29.282Z" },
+]
+
[[package]]
name = "qwen-vl-utils"
version = "0.0.14"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "av" },
- { name = "packaging" },
- { name = "pillow" },
- { name = "requests" },
+ { name = "av", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "packaging", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "pillow", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
+ { name = "requests", marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/b6/b1/ad4fc2260a3badd278b38d642f3b987412f1f6682f0ef2b31b0572d5caa8/qwen_vl_utils-0.0.14.tar.gz", hash = "sha256:9c7cad5ae803b3a10f8bb7194deb12aeacdd032f92f4224e880c73587a7346ad", size = 8453, upload-time = "2025-09-23T09:38:57.532Z" }
wheels = [
@@ -3993,7 +4354,8 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "huggingface-hub" },
{ name = "lightrag-hku" },
- { name = "mineru", extra = ["core"] },
+ { name = "mineru", version = "2.6.2", source = { registry = "https://pypi.org/simple" }, extra = ["core"], marker = "python_full_version >= '3.14' and sys_platform == 'darwin'" },
+ { name = "mineru", version = "2.6.5", source = { registry = "https://pypi.org/simple" }, extra = ["core"], marker = "python_full_version < '3.14' or sys_platform != 'darwin'" },
{ name = "tqdm" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ef/16/e42ebe1b01fa0c17c35c7a97200fb3b861357178b02497490579ec7bf7f5/raganything-1.2.8.tar.gz", hash = "sha256:3e81786d894bc123ed06b436f0b4cc598d42c2069625a440f53d0620eb626c02", size = 140007, upload-time = "2025-09-22T03:13:10.438Z" }
@@ -4007,9 +4369,11 @@ version = "3.4.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "colorlog" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "omegaconf" },
- { name = "opencv-python" },
+ { name = "opencv-python", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
{ name = "pillow" },
{ name = "pyclipper" },
{ name = "pyyaml" },
@@ -4022,6 +4386,15 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/cf/a8/401c97c8fa6c7f964ace3bf11d8fad4902f07f969a0f4f5d7518f46ebeef/rapidocr-3.4.3-py3-none-any.whl", hash = "sha256:a007bf196c41e2c7321dfa570e8cef06cd7fb41d7a283b91b7e4b7b08623ed27", size = 15060208, upload-time = "2025-12-09T14:45:34.189Z" },
]
+[[package]]
+name = "redis"
+version = "7.1.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/43/c8/983d5c6579a411d8a99bc5823cc5712768859b5ce2c8afe1a65b37832c81/redis-7.1.0.tar.gz", hash = "sha256:b1cc3cfa5a2cb9c2ab3ba700864fb0ad75617b41f01352ce5779dabf6d5f9c3c", size = 4796669, upload-time = "2025-11-19T15:54:39.961Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/89/f0/8956f8a86b20d7bb9d6ac0187cf4cd54d8065bc9a1a09eb8011d4d326596/redis-7.1.0-py3-none-any.whl", hash = "sha256:23c52b208f92b56103e17c5d06bdc1a6c2c0b3106583985a76a18f83b265de2b", size = 354159, upload-time = "2025-11-19T15:54:38.064Z" },
+]
+
[[package]]
name = "referencing"
version = "0.36.2"
@@ -4335,7 +4708,8 @@ wheels = [
[package.optional-dependencies]
torch = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "packaging" },
{ name = "torch" },
]
@@ -4348,7 +4722,8 @@ dependencies = [
{ name = "imageio" },
{ name = "lazy-loader" },
{ name = "networkx" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "packaging" },
{ name = "pillow" },
{ name = "scipy" },
@@ -4369,7 +4744,8 @@ name = "scipy"
version = "1.16.3"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/0a/ca/d8ace4f98322d01abcd52d381134344bf7b431eba7ed8b42bdea5a3c2ac9/scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb", size = 30597883, upload-time = "2025-10-28T17:38:54.068Z" }
wheels = [
@@ -4421,7 +4797,8 @@ version = "0.13.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "matplotlib" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "pandas" },
]
sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" }
@@ -4485,7 +4862,8 @@ name = "shapely"
version = "2.1.2"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/4d/bc/0989043118a27cccb4e906a46b7565ce36ca7b57f5a18b78f4f1b0f72d9d/shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9", size = 315489, upload-time = "2025-09-24T13:51:41.432Z" }
wheels = [
@@ -4591,8 +4969,8 @@ name = "soundfile"
version = "0.13.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "cffi", marker = "sys_platform == 'darwin'" },
- { name = "numpy", marker = "sys_platform == 'darwin'" },
+ { name = "cffi", marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14' and sys_platform == 'darwin'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/e1/41/9b873a8c055582859b239be17902a85339bec6a30ad162f98c9b0288a2cc/soundfile-0.13.1.tar.gz", hash = "sha256:b2c68dab1e30297317080a5b43df57e302584c49e2942defdde0acccc53f0e5b", size = 46156, upload-time = "2025-01-25T09:17:04.831Z" }
wheels = [
@@ -4736,7 +5114,8 @@ name = "tifffile"
version = "2025.10.16"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2d/b5/0d8f3d395f07d25ec4cafcdfc8cab234b2cc6bf2465e9d7660633983fe8f/tifffile-2025.10.16.tar.gz", hash = "sha256:425179ec7837ac0e07bc95d2ea5bea9b179ce854967c12ba07fc3f093e58efc1", size = 371848, upload-time = "2025-10-16T22:56:09.043Z" }
wheels = [
@@ -4870,7 +5249,8 @@ name = "torchvision"
version = "0.24.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "pillow" },
{ name = "torch" },
]
@@ -4912,7 +5292,8 @@ source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "filelock" },
{ name = "huggingface-hub" },
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "packaging" },
{ name = "pyyaml" },
{ name = "regex" },
@@ -5087,8 +5468,10 @@ version = "8.3.235"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "matplotlib" },
- { name = "numpy" },
- { name = "opencv-python" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python", version = "4.11.0.86", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
+ { name = "opencv-python", version = "4.12.0.88", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
{ name = "pillow" },
{ name = "polars" },
{ name = "psutil" },
@@ -5109,7 +5492,8 @@ name = "ultralytics-thop"
version = "2.0.18"
source = { registry = "https://pypi.org/simple" }
dependencies = [
- { name = "numpy" },
+ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.14'" },
+ { name = "numpy", version = "2.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.14'" },
{ name = "torch" },
]
sdist = { url = "https://files.pythonhosted.org/packages/1f/63/21a32e1facfeee245dbdfb7b4669faf7a36ff7c00b50987932bdab126f4b/ultralytics_thop-2.0.18.tar.gz", hash = "sha256:21103bcd39cc9928477dc3d9374561749b66a1781b35f46256c8d8c4ac01d9cf", size = 34557, upload-time = "2025-10-29T16:58:13.526Z" }