Parsing & Document Processor
Parsing & Document Processor
Le parsing des documents est délégué à un microservice dédié (apps/document-processor/) appelé par le serveur Bun via un client HTTP (apps/server/src/utils/document-processor-client.ts).
Architecture
Admin (web) → processUploadedFile (ORPC, admin)
↓
regular-processing.ts
↓
documentProcessor.processDocument()
↓
POST http://DOCUMENT_PROCESSOR_URL/process
↓
document-processor microservice (FastAPI)
↓
Chunks → INSERT INTO chunks (DB)Microservice document-processor
Localisation: apps/document-processor/
Stack: Python, FastAPI, uvicorn
Démarrage
# Variables d'environnement
DOCUMENT_PROCESSOR_HOST=0.0.0.0
DOCUMENT_PROCESSOR_PORT=8001
MAX_FILE_SIZE_MB=50
ENABLE_OCR=false
TESSERACT_PATH= # optionnel, si tesseract n'est pas dans PATH
LOG_LEVEL=INFOcd apps/document-processor
pip install -e .
uvicorn src.main:app --host 0.0.0.0 --port 8001Endpoints
GET /health
Response (HealthResponse):
{
"status": "healthy",
"timestamp": "2024-01-15T10:30:00.000Z"
}POST /process
Parse et découpe un document en chunks.
Request (ProcessingRequest):
{
file_content: string; // base64, data URL, ou texte brut (pour text/plain, text/markdown, text/csv, application/json)
file_name: string;
file_type: string; // MIME type (voir formats supportés)
chunk_size?: number; // default: 1000 (taille en caractères)
overlap?: number; // default: 200 (chevauchement entre chunks)
extract_qa_pairs?: boolean; // default: false
extract_tables?: boolean; // default: true
extract_images?: boolean; // default: false
}Response (ProcessingResult):
{
success: boolean;
chunks: Chunk[]; // liste des chunks extraits
qa_pairs: QAPair[]; // si extract_qa_pairs: true
tables: Table[]; // tableaux extraits (si extract_tables: true)
images: Image[]; // images extraites (si extract_images: true)
metadata: Record<string, any>;
processing_time_ms: number;
error?: string; // présent si success: false
}
type Chunk = {
rank: number;
content: string;
category: string; // "not categorized" par défaut
}Codes d'erreur:
400— contenu fichier invalide (base64 malformé)413— fichier trop grand (> MAX_FILE_SIZE_MB)415— type de fichier non supporté500— erreur de parsing interne
Formats supportés
| MIME type | Extension | Parser utilisé |
|---|---|---|
application/pdf | .pdf | PDFParser |
text/csv | .csv | CSVParser |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | .xlsx | CSVParser |
application/vnd.ms-excel | .xls | CSVParser |
application/vnd.openxmlformats-officedocument.wordprocessingml.document | .docx | OfficeParser |
application/vnd.openxmlformats-officedocument.presentationml.presentation | .pptx | OfficeParser |
text/markdown | .md, .markdown | MarkdownParser |
text/plain | .txt | MarkdownParser |
application/json | .json | JSONParser |
Priorité: le type MIME est prioritaire sur l'extension. Les types text/plain et text/markdown ignorent le PDF parser même si l'extension est .pdf.
OCR (optionnel)
Si ENABLE_OCR=true, le PDFParser utilise Tesseract pour extraire le texte des PDFs scannés. Requiert l'installation de tesseract-ocr sur le système. Si Tesseract n'est pas trouvé et ENABLE_OCR=true, l'OCR est automatiquement désactivé avec un log d'erreur.
Client côté serveur Bun
apps/server/src/utils/document-processor-client.ts
documentProcessor.processDocument(request: {
file_content: string,
file_name: string,
file_type: string,
chunk_size: number,
overlap: number,
extract_qa_pairs: boolean,
extract_tables: boolean,
extract_images: boolean
}): Promise<ProcessingResult>La variable d'environnement DOCUMENT_PROCESSOR_URL doit pointer vers le microservice (ex: http://localhost:8001 en local, URL interne Kubernetes en production).
Flux processUploadedFile (serveur)
apps/server/src/utils/regular-processing.ts:
- Valide:
fileContentnon vide,chunkSize > overlap. - Insère un enregistrement
files(status:pending) → obtientfileId. - Appelle
documentProcessor.processDocument(...). - Si échec ou 0 chunks: supprime l'entrée
fileset retourne{ success: false }. - Insère chaque chunk dans
chunks(rank,contentsanitisé,category: "not categorized",fileId). - Retourne
{ success: true, fileId, chunkCount }.
Paramètres d'input:
| Paramètre | Type | Default | Description |
|---|---|---|---|
fileContent | string | — | Contenu base64 ou texte brut |
fileName | string | — | Nom du fichier (détermine le parser) |
fileType | string | "text/plain" | MIME type |
uploaderId | string | — | ID de l'utilisateur (admin) |
chunkSize | number | 1000 | Taille des chunks en caractères |
overlap | number | 200 | Chevauchement entre chunks |
Flux processUploadedQA (serveur)
apps/server/src/utils/qa-processing.ts — pour les fichiers CSV Q&A:
- Parse le CSV (colonnes
question,answer). - Insère un enregistrement
files(type:qa). - Insère chaque ligne dans
qa_pair(rank,question,answer,category: "not categorized").
Le microservice document-processor n'est pas utilisé pour les QA (parsing interne direct).
Variables d'environnement serveur liées au parsing
| Variable | Description | Exemple |
|---|---|---|
DOCUMENT_PROCESSOR_URL | URL du microservice document-processor | http://doc-processor:8001 |
INDEX_API_URL | URL de l'API d'index FAISS (chatbot) | http://chatbot-index:8502 |
Kalli