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

+ + +

This document contains important information about our product.

+ +

Features

+ + + + + + + + + + + + + +
FeatureDescription
Multimodal ProcessingSupports images, tables, and equations
Knowledge GraphAutomatic 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" }