Microservizio per l'elaborazione di documenti business (immagini e PDF) con output JSON strutturato per LLM.
- Elaborazione di immagini (JPG, PNG, WEBP) e PDF
- Estrazione testo tramite OCR per immagini e PDF scannerizzati
- Classificazione automatica del tipo di documento
- Estrazione dati strutturati basata sul tipo di documento
- Integrazione con Mistral AI tramite OpenRouter per analisi avanzata
- API REST con FastAPI
- Deployment automatico su Railway
- Fatture: Estrazione di numero fattura, data, importi, mittente, destinatario, ecc.
- Bilanci: Analisi di stato patrimoniale, conto economico, ecc.
- Documenti di magazzino: Inventari, movimentazioni, ecc.
- Corrispettivi: Scontrini, ricevute, ecc.
- Analisi di mercato: Report, grafici, tabelle, ecc.
Il worker è strutturato in modo modulare con i seguenti componenti:
- API FastAPI: Gestisce le richieste HTTP e coordina l'elaborazione
- Document Processor: Servizio principale che coordina l'elaborazione
- Image Processor: Elaborazione specifica per le immagini
- PDF Processor: Elaborazione specifica per i PDF
- OCR Service: Servizio OCR per estrazione testo
- LLM Service: Integrazione con Mistral AI per analisi avanzata
- Python 3.11+
- Tesseract OCR
- Poppler (per la conversione PDF)
-
Clona il repository:
git clone <repository-url> cd railway-document-worker
-
Crea un ambiente virtuale e installa le dipendenze:
python -m venv venv source venv/bin/activate # Linux/Mac # oppure venv\Scripts\activate # Windows pip install -r requirements.txt
-
Crea un file
.envcon le variabili di ambiente necessarie:ENVIRONMENT=dev OPENROUTER_API_KEY=your_openrouter_api_key LOG_LEVEL=INFO MAX_FILE_SIZE_MB=10 -
Avvia il server:
uvicorn app.main:app --reload
-
Assicurati di avere l'account Railway e CLI installata
-
Configura le variabili d'ambiente su Railway:
ENVIRONMENT=productionOPENROUTER_API_KEY=your_openrouter_api_keyLOG_LEVEL=INFOMAX_FILE_SIZE_MB=10
-
Deploy su Railway:
railway link railway up
curl -X POST http://localhost:8000/process-document \
-F "file=@path/to/your/document.pdf" \
-F "document_type=fattura" # Opzionale{
"status": "success",
"timestamp": "2023-10-01T12:34:56.789Z",
"document_id": "123e4567-e89b-12d3-a456-426614174000",
"document_type": "fattura",
"confidence_score": 0.95,
"processing_time_ms": 1234,
"result_json": {
"document_id": "123e4567-e89b-12d3-a456-426614174000",
"processing_timestamp": "2023-10-01T12:34:56.789Z",
"document_type": "fattura",
"confidence_score": 0.95,
"metadata": {
"original_filename": "fattura_esempio.pdf",
"file_type": "pdf",
"file_size": 123456,
"pages_processed": 1,
"processing_time_ms": 1234,
"md5_hash": "a1b2c3d4e5f6g7h8i9j0"
},
"extracted_data": {
"numero_fattura": "F12345",
"data_fattura": "2023-09-30",
"importo_totale": 1000.00,
"iva": 220.00,
"mittente": {
"nome": "Azienda SRL",
"indirizzo": "Via Roma 123",
"partita_iva": "IT12345678901"
},
"destinatario": {
"nome": "Cliente SpA",
"indirizzo": "Via Milano 456",
"partita_iva": "IT98765432101"
}
},
"raw_text": "Testo estratto dal documento...",
"processing_notes": []
},
"processing_notes": []
}Per testare l'integrazione con N8N, puoi utilizzare l'endpoint /test-webhook:
curl -X POST http://localhost:8000/test-webhook \
-H "Content-Type: application/json" \
-d '{"test": "payload"}'- In N8N, crea un nuovo workflow
- Aggiungi un nodo HTTP Request (POST) che invia il file al worker
- Configura il nodo con:
- URL:
https://tuo-worker-railway.app/process-document - Metodo: POST
- Modalità binaria: ON
- Form data con:
file: Il file binario da elaboraredocument_type(opzionale): Tipo di documento
- URL:
- Collega l'output al resto del tuo workflow
railway-document-worker/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI app principale
│ ├── models/
│ │ ├── __init__.py
│ │ ├── document.py # Modelli Pydantic per documenti
│ │ └── response.py # Modelli per risposte API
│ ├── services/
│ │ ├── __init__.py
│ │ ├── document_processor.py # Service per processare documenti
│ │ ├── image_processor.py # Elaborazione immagini
│ │ ├── pdf_processor.py # Elaborazione PDF
│ │ ├── ocr_service.py # Servizio OCR
│ │ └── llm_service.py # Integrazione con Mistral
│ ├── utils/
│ │ ├── __init__.py
│ │ ├── file_utils.py # Utility per file
│ │ ├── logging_utils.py # Configurazione logging
│ │ └── validators.py # Validatori input
│ └── config/
│ ├── __init__.py
│ └── settings.py # Configurazioni app
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_main.py
│ ├── test_document_processor.py
│ ├── test_image_processor.py
│ └── test_pdf_processor.py
├── requirements.txt
├── Dockerfile
├── railway.toml
└── README.md
pytestMIT