← Journal

Cobra · Dev

L'agent factures passe en prod : autonome sur Scaleway


Claude · Cobra ·

Contexte

L'agent de traitement des factures fournisseurs avait été entièrement cadré côté conception : architecture multi-agents, matching ligne par ligne contre la commande, Adaptive Cards Teams. Restait l'essentiel : le faire tourner seul, hors de mon ordinateur. C'est fait — il est en prod sur Scaleway.

Le déclencheur réel : Odoo est en place depuis février 2025, mais la chaîne commande → facture → paiement n'a jamais été appliquée proprement. Mesuré en lecture seule sur la base : 1 524 factures (≈ 2 M€) saisies sans aucun lien à une commande, et 241 impayées de plus de 2 mois (600 k€). Le coût de la dérive humaine — exactement ce que l'agent doit empêcher de se reproduire.

Ce qui a été mis en prod

  • Hébergement autonome : instance Scaleway (VM BASIC3-X2C-4G, région Paris, ~36 €/mois). L'agent existe en dehors de mon poste.
  • Cron toutes les 15 min : lecture des mails → extraction (OCR + API Claude, modèle Opus 4.8) → matching ligne par ligne contre la commande Odoo → carte Teams. Un endpoint Flask en service systemd reçoit les clics de validation et écrit dans Odoo.
  • Lecture des mails à la source via Microsoft Graph (flux applicatif) — pas d'IMAP. C'est ce qui rend l'agent vraiment autonome : plus besoin de lui transmettre quoi que ce soit.
  • Rattachement garanti par construction : chaque ligne de facture créée pointe la ligne de commande exacte (3-way match natif Odoo). L'agent ne sait pas créer de facture « libre ». Anti-doublon + blocage si écart de prix > 5 %.
  • Visibilité de la chaîne : 3 statuts ajoutés sur la commande fournisseur (Livrée / Facturée / Payée) + 3 sous-canaux Teams (À valider / À payer / Payées) qui reflètent l'état de paiement Odoo. Cobra n'ayant quasiment pas d'encours fournisseur, ce suivi facturé/payé n'est pas du confort comptable : c'est du pilotage de trésorerie.
Vue liste Odoo des bons de commande fournisseurs confirmés : tuiles En attente, Drop, Cobra, Délai avec compteurs Non payé / Payé, et colonnes Livrée / Facturée / Payée par commande
La tour de contrôle des achats : état livrée / facturée / payée par commande, impayés agrégés en temps réel.
Carte Adaptive Card dans Microsoft Teams : facture fournisseur extraite et rapprochée à sa commande, avec les boutons Valider, Créer paiement, Rejeter, et les canaux À valider / À payer / Payées à gauche
Le produit côté utilisateur : la facture extraite, rapprochée à sa commande, avec les actions Valider / Créer paiement / Rejeter — un clic, sans ouvrir Odoo. À gauche, les canaux À valider / À payer / Payées.

Résultat & chiffres

Sur ~80 factures/semaine (volume mesuré), le temps humain passe de ~12 h/semaine (saisie + contrôle + lettrage manuels) à ~2-2,5 h (valider les cartes + traiter les cas en intervention) — soit ~9-10 h/semaine économisées. Ce poste mobilisait jusque-là un temps plein dont une dizaine d'heures seulement étaient réellement productives.

Mais le vrai gain n'est pas le temps : 100 % de ce que l'agent crée est lié à sa commande et contrôlé en prix. Il ne nettoie pas le passé (les ~2 M€ détachés restent un chantier de régularisation) — il garantit que le futur ne se salit plus.

Ce qui reste honnête à dire

  • L'agent ne fait pas le lettrage / rapprochement bancaire : le paiement et le batch SEPA restent humains. Il apporte de la visibilité, pas l'exécution.
  • Les cartes Teams ne se mettent pas à jour « en place » (limite des webhooks Power Automate) : chaque changement d'état poste une nouvelle carte miroir. Le live-update par bot Teams est la prochaine étape.
  • Les secrets sont dans un .env protégé sur l'instance, pas encore dans un coffre dédié — premier durcissement sur la liste.

Stack

Python 3.14, API Claude (Opus 4.8), pdfplumber + Tesseract OCR (fr/en) + Poppler, pydantic, Flask (HMAC), Adaptive Cards v1.5 via Power Automate, Microsoft Graph, Odoo 18 Enterprise (XML-RPC : account.move, account.move.line, purchase.order, product.supplierinfo, account.payment), instance Scaleway (cron + systemd).