Brain : main.py (1496 l.) reduit a l'assemblage (~95 l.) ; un router par responsabilite (generation, chat, tables, imports, notebooks, settings, models), factories DI dans api/deps.py, DTOs chat + mapping anti-corruption separes, auto-pull embeddings deplace en infrastructure. Chemins HTTP inchanges. Web : SettingsComponent (729 l.) recentre sur le formulaire (~330 l.) ; sous-composants standalone updates-section (MAJ + licence Patreon + switch canal) et ollama-model-manager (liste/pull/suppression de modeles). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
27 lines
1021 B
Python
27 lines
1021 B
Python
"""Utilitaires partagés des routers : encodage SSE + garde-fous d'upload PDF."""
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
# Garde-fou taille : un livre de règles dépasse rarement quelques dizaines de Mo.
|
|
# Au-delà, on refuse (probable erreur d'upload) plutôt que d'OOM le conteneur.
|
|
MAX_PDF_BYTES = 60 * 1024 * 1024 # 60 Mo
|
|
|
|
|
|
def sse_event(event: str, data: dict) -> str:
|
|
"""Encode un évènement Server-Sent Events (accents préservés)."""
|
|
return f"event: {event}\ndata: {json.dumps(data, ensure_ascii=False)}\n\n"
|
|
|
|
|
|
def pdf_upload_error(content: bytes) -> str | None:
|
|
"""Message d'erreur si l'upload PDF est invalide (vide / trop gros), sinon None.
|
|
|
|
Utilisé par les flux SSE, où l'erreur doit partir en évènement `error`
|
|
plutôt qu'en HTTPException (le flux est déjà ouvert en 200).
|
|
"""
|
|
if not content:
|
|
return "Fichier PDF vide."
|
|
if len(content) > MAX_PDF_BYTES:
|
|
return f"PDF trop volumineux (> {MAX_PDF_BYTES // (1024 * 1024)} Mo)."
|
|
return None
|