---
suivi: 1373
date: 2026-08-31
sujet: ocr_timeout_ajuste
chantier: depot_factures
type: fix
statut: poussé
hash: 7fa5e19a
fichiers:
  - app/Services/DepotFactureClaudeAnalysisService.php
  - app/Services/OcrFactureService.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1373_ocr_timeout_ajuste.md
---

## PROMPT ENVOYÉ

SUIVI #1373 — Augmenter le timeout OCR facture (cURL 28 à 6s / 0 byte en prod).
Mesurer la durée réelle. Aligner `OcrFactureService`. Conserver seuil lot, anti-retry,
plafond alerte, dépôt non bloquant (#1361/#1362).

## FICHES LUES

- **#1361** — timeouts 2s/6s, seuil 2 échecs, pas de retry, api_operation, max_execution_time 300.
- **#1362** — formulaire saisie malgré échec OCR (non régressé ; pas touché `DepotFactureSaisieForm.vue`).

## SYNTHÈSE

### ⚠️ Test compta manuel obligatoire
Services OCR touchés ; tests sqlite Feature souvent SKIPPED — validation prod manuelle requise.

### Valeurs retenues

| Paramètre | Avant (#1361) | Après (#1373) |
|-----------|---------------|---------------|
| `OCR_CONNECT_TIMEOUT_SECONDS` | 2 | **2** (conservé) |
| `OCR_TOTAL_TIMEOUT_SECONDS` | 6 | **25** |

**Calcul** (`max_execution_time` web = 300 s, lot max 10 PDF) :
- API lente sans échec : `10 × 25 = 250 s` < 300 (marge **50 s**)
- Panne franche (seuil 2 échecs) : `2 × 25 = 50 s` puis circuit ouvert
- Connect 2 s : handshake TLS rapide ; le goulot est le traitement PDF (0 byte à 6 s = réponse
  pas commencée). Conservé après vérification code (pas de latence connect observée côté Aktor).

### Mesure durée
- `LogOutboundHttpCall` enregistrait déjà `duration_ms` (+ tokens / coût) pour
  `api_operation=depot_facture_ocr` (y compris `ConnectionFailed` / timeout).
- Ajout log applicatif `OCR Claude analyse` (issue, duree_ms, jetons, timeouts) succès **et** échec
  dans `DepotFactureClaudeAnalysisService` — sans clé API ni PDF.
- `OcrFactureService` : `duree_ms` déjà présent ; timeouts alignés via les constantes du service dépôt.

### Inchangé
Seuil lot 2 échecs, aucun retry, plafond 1 alerte/lot, dépôt+formulaire (#1362), pas de
`withoutVerifying`, ventilation `api_operation`.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

Pas de migration. Pas de front.

### Procédure mesure durée (Robin — pas mesurable depuis Cursor)
1. Déposer 1 PDF simple (1 page) + 1 PDF multi-pages.
2. Admin → API logs : filtrer `operation = depot_facture_ocr`, noter `duration_ms`.
3. Ou `storage/logs/laravel.log` : greffer `OCR Claude analyse` / `duree_ms`.
4. Lot 3 PDF : confirmer seuil après 2 échecs si OCR forcé en panne.

## LEÇON

Un timeout OCR doit être dimensionné sur le **traitement PDF**, pas sur le handshake, et borné
par `N_max_lot × timeout ≪ max_execution_time`. Sans `duration_ms` en prod, tout nouvel ajustement
reste à l’aveugle.

