feat: journée 17 avril — tests E2E validés, dashboard fleet+audit, VWB bridge, cleaner C2
Some checks failed
security-audit / Bandit (scan statique) (push) Successful in 14s
security-audit / pip-audit (CVE dépendances) (push) Successful in 10s
security-audit / Scan secrets (grep) (push) Successful in 8s
tests / Lint (ruff + black) (push) Successful in 13s
tests / Tests unitaires (sans GPU) (push) Failing after 14s
tests / Tests sécurité (critique) (push) Has been skipped

Pipeline E2E complet validé :
  Capture VM → streaming → serveur → cleaner → replay → audit trail
  Mode apprentissage supervisé fonctionne (Léa échoue → humain → reprise)

Dashboard :
  - Cleanup 14→10 onglets (RCE supprimée)
  - Fleet : enregistrer/révoquer agents, tokens, ZIP pré-configuré téléchargeable
  - Audit trail MVP (/audit) : filtres, tableau, export CSV, conformité AI Act/RGPD
  - Formulaire Fleet simplifié (nom + email, machine_id auto)

VWB bridge Léa→VWB :
  - Compound décomposés en N steps (saisie + raccourci visibles)
  - Layout serpentin 3 colonnes (plus colonne verticale)
  - Badge OS 🪟/🐧, filtre OS retiré (admin Linux voit Windows)
  - Fix import SQLite readonly

Cleaner intelligent :
  - Descriptions lisibles (UIA/C2) + détection doublons
  - Logique C2 : UIElement identifié = jamais parasite
  - Patterns parasites resserrés
  - Message Léa : "Je n'y arrive pas, montrez-moi comment faire"

Config agent (INC-1 à INC-7) :
  - SERVER_URL + SERVER_BASE unifiés
  - RPA_OLLAMA_HOST séparé
  - allow_redirects=False sur POST
  - Middleware réécriture URL serveur

CI Gitea : fix token + Flask-SocketIO + ruff propre
Fleet endpoints : /agents/enroll|uninstall|fleet + agent_registry SQLite
Backup : script quotidien workflows.db + audit

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Dom
2026-04-17 17:46:40 +02:00
parent 2fa864b5c7
commit 4f61741420
27 changed files with 5088 additions and 1543 deletions

View File

@@ -0,0 +1,289 @@
# FAQ — Questions des experts RPA (démo 26 avril 2026)
**Audience** : DG/DSI de groupements de cliniques, dont **plusieurs ont déjà
déployé UiPath, Automation Anywhere ou Power Automate**. Ils connaissent les
limites du RPA classique. Ils vont challenger.
**Posture de réponse** : factuelle, posée, ni défensive ni bravache. Quand
on n'a pas, on le dit. On finit toujours par ramener la conversation sur
**le cas métier urgences et le ROI chiffré**.
---
## Bloc TECHNO
### Q1. Pourquoi pas UiPath / Automation Anywhere / Power Automate ?
Les RPA classiques se cassent dès que l'UI change d'un pixel ou qu'on passe
par Citrix. Ils fonctionnent bien sur des processus répétitifs ultra-stables
(compta, RH), mal sur des métiers visuels variables comme les urgences.
Léa ne lit pas le DOM ni l'accessibility tree : elle **voit l'écran comme
un humain** et s'adapte quand l'UI bouge. On n'est pas un concurrent
généraliste d'UiPath : on est le bon outil pour **un métier précis où
UiPath échoue**.
### Q2. Comment Léa gère Citrix / RDP / VDI ?
C'est notre terrain principal, pas un cas dégradé. Léa capture l'écran
(image), comprend la structure via un modèle de vision, et interagit
via clavier/souris standard. Pas d'API, pas de tree, pas de crochet.
Citrix ou natif, c'est transparent. En contrepartie, la latence est
légèrement plus élevée (100-300 ms par action vs 50 ms en natif) —
acceptable pour du codage PMSI, pas pour du trading.
### Q3. Vous utilisez quel VLM ? Vos modèles sont open source ?
100 % modèles open source, tournant en local. Le stack actuel combine :
Qwen2.5-VL (grounding visuel), UI-TARS-1.5-7B (action sur UI), et des
prompts métier spécifiques par domaine (PMSI urgences, facturation, etc.).
Rien chez OpenAI, rien chez Anthropic au runtime client. Infrastructure
minimum pour un pilote : un serveur GPU (RTX 5070 ou équivalent) sur site
ou dans le cloud souverain.
### Q4. Que se passe-t-il quand l'UI change (mise à jour du DPI) ?
C'est la vraie question. Trois niveaux de réponse :
1. **Petit changement** (position d'un bouton, couleur) : Léa s'adapte
toute seule, parce qu'elle reconnaît sémantiquement "bouton Valider",
pas "bouton en x=420 y=180".
2. **Gros changement** (refonte UI) : Léa **détecte qu'elle ne comprend
plus**, se met en pause, et demande à l'humain. Pas de casse silencieuse.
3. **Réapprentissage** : la TIM refait le workflow une fois en mode
"apprends-moi", Léa se remet à jour. Temps typique : 15-30 minutes.
### Q5. Vous supportez quels OS ?
Agent client : **Windows 10/11** (cible principale, c'est ce que les
cliniques ont). Serveur : **Linux** (Ubuntu 22.04+). macOS et Linux
côté client ne sont pas prioritaires — la demande est marginale en milieu
hospitalier.
### Q6. Que faites-vous contre le drift d'écran entre deux sessions (taille de fenêtre, thème Windows) ?
Trois couches : (1) capture normalisée en résolution logique, (2)
invariance aux thèmes sombres/clairs via apprentissage multi-contextes,
(3) mémoire des cibles par signature sémantique plutôt que par coordonnées.
En pratique, sur nos tests chez Resurgences, le drift normal (thème,
multi-écran) ne casse pas l'exécution.
### Q7. Qu'est-ce qui se passe si le médecin ou la TIM tape au clavier pendant que Léa exécute ?
Détection d'interférence humaine : Léa met en pause dès qu'elle détecte une
activité clavier/souris non-Léa sur son fil d'exécution. L'humain reprend
la main, Léa reprend quand il a fini. Pas de conflit, pas de frappe
mélangée.
---
## Bloc SCALING / ROBUSTESSE
### Q8. Combien de postes Léa peut-on déployer en parallèle ?
Sur un serveur GPU mid-range (RTX 5070), on vise **10-20 postes en
parallèle** pour des workflows typiques (pas de vidéo temps réel 4K). Au-
delà, on scale horizontalement (plusieurs serveurs) ou on passe sur un GPU
plus costaud (A100, DGX). L'architecture est modulaire, le goulet
d'étranglement est le GPU, pas le code.
### Q9. Latence serveur ?
Action simple (clic, frappe) : 200-400 ms côté Léa (capture → inférence →
commande). Action complexe (compréhension d'écran + décision) : 1-3 s.
Pour du codage PMSI, ça passe largement. Pour du trading haute fréquence,
ce n'est pas le bon produit.
### Q10. Que fait Léa si le serveur est down ?
L'agent client bascule en **buffer local** : il continue à capturer ce que
l'utilisateur fait, stocke les sessions, et les envoie quand le serveur
revient. Pas de perte de données. L'exécution autonome, elle, se met en
pause — pas de fallback aveugle.
### Q11. Reprise après erreur ? Replay automatique ?
Trois niveaux :
1. **Reprise automatique** si l'erreur est transiente (popup, dialogue
inattendu reconnu par Léa).
2. **Pause + demande à l'humain** si Léa ne comprend pas ce qu'elle voit
("je vois un écran que je ne connais pas, merci de m'aider"). C'est la
règle : un échec devient un apprentissage, pas un crash.
3. **Replay à froid** du workflow complet depuis l'observation humaine
initiale, si on veut tout rejouer.
### Q12. Et si Léa fait une erreur qui a un impact réel (un mauvais code envoyé au PMSI) ?
Trois garde-fous : (1) **mode strict** où Léa ne valide jamais un envoi
final — toujours confirmation humaine, (2) **seuil de confidence** configurable
par workflow, (3) **log d'audit complet** (toutes les décisions Léa sont
tracées, replay vidéo possible). En 100 % autonomous, Léa agit seulement
sur des workflows **validés plusieurs fois** et avec un seuil de confidence
haut. Pour les urgences pilote, on démarre en mode "assistante" (copilote),
pas en 100 % autonome.
---
## Bloc SÉCURITÉ / CONFORMITÉ
### Q13. RGPD, AI Act, HDS — comment vous vous positionnez ?
- **RGPD** : 100 % local, aucune donnée patient ne sort du SI. L'agent
capture l'écran, traite sur un serveur **sur site ou en cloud souverain**
(3DS Outscale, OVH HDS). Pas de routing cloud US.
- **AI Act** : Léa est système IA au sens de l'article 50 (cf. LISEZMOI),
flag d'information utilisateur intégré. Classification "risque limité" en
copilote, "risque élevé" si autonome — documentation dans
`docs/RAPPORT_CONFORMITE_AI_ACT.md`.
- **HDS** : l'hébergement serveur doit être HDS-certifié. On accompagne le
pilote sur le choix de l'hébergeur si besoin.
### Q14. "100 % local", ça veut dire quoi concrètement ?
Deux niveaux d'installation possibles :
1. **Tout sur site** : serveur GPU dans le SI de la clinique, zéro sortie
réseau. Cas le plus sûr, le plus cher (hardware).
2. **Serveur en cloud souverain HDS** : données chiffrées en transit et au
repos, clés maîtrisées par le client. Aucun transit hors UE.
Dans les deux cas : **aucun appel cloud US**, aucun LLM propriétaire
externe (pas de ChatGPT, pas de Claude, pas de Gemini).
### Q15. Logs d'audit, traçabilité des décisions IA ?
Chaque décision de Léa (ce qu'elle a vu, ce qu'elle a décidé, sur quel
élément elle a cliqué) est loggée : screenshot avant/après, prompt soumis
au VLM, réponse, action exécutée. Rétention paramétrable (**minimum 180
jours** en config par défaut pour conformité). Replay vidéo d'un workflow
possible pour audit DIM ou ARS.
### Q16. Où est stocké le modèle ? Il apprend sur nos données ? Qui les possède ?
Modèles **open source** stockés sur le serveur client (poids Qwen, UI-TARS,
etc.). **Aucun apprentissage en ligne sur les données patient** par défaut —
on ne renvoie rien aux éditeurs des modèles. Un mode "fine-tuning local"
existe pour spécialiser Léa sur le vocabulaire d'une clinique, **exécuté
sur le serveur du client, poids gardés par le client**. Le client est
propriétaire de ses données ET de ses fine-tunings.
### Q17. Qui accède aux données chez vous ? Vos équipes ?
En prod chez un client : personne chez AIVANOV n'accède aux données sans
autorisation écrite. En pilote : un accès de debug peut être demandé avec
procédure documentée (lecture seule, logs anonymisés). **Les credentials
métier (compte DPI de la TIM) sont stockés dans un vault chiffré
Fernet/AES local** — jamais en clair côté serveur, jamais chez nous.
---
## Bloc BUSINESS
### Q18. Licensing ? C'est combien ?
**Modèle économique aligné sur la valeur**. Les postes utilisateurs ne
sont qu'une étape (Shadow puis Copilot) : une fois Léa entraînée, elle
tourne **en autonome** sur infrastructure dédiée — facturer "par poste"
reviendrait à facturer la phase d'apprentissage, pas la valeur créée.
**Notre proposition de valeur** : vous ne payez significativement **que
sur la valeur démontrée** (gains PMSI récupérés, mesurés via audit trail).
Plusieurs modèles possibles selon votre contexte (forfait établissement,
% de la valeur récupérée, volume traité, hybride) — **on cale ensemble
le modèle qui vous convient en one-to-one**.
Pour les **premiers pilotes** : accompagnement gratuit 2 mois
(infrastructure + setup + apprentissage), puis bascule sur le modèle
pérenne choisi ensemble.
*→ Rediriger vers one-to-one à la pause si question poussée — ne pas
annoncer un chiffre précis en plénière.*
### Q19. Support, maintenance, SLA ?
Pilote : accompagnement direct Dom + Amina, réponse < 4 h ouvrées.
Production : SLA à contractualiser (8 h ouvrées standard, 2 h premium).
Maintenance : mises à jour modèles trimestrielles, correctifs sur demande.
### Q20. Qui êtes-vous, votre équipe, vos références ?
AIVANOV, SAS française, fondée par Amina ETTORCHI (présidente,
ex-TIM/DIM, 15 ans d'expérience PMSI). Équipe technique lead Dom
(architecture vision + RPA). Projet Léa en développement depuis 2025,
version 1.0 déployable depuis avril 2026. **Premier pilote client à
démarrer** — pas de référence client public aujourd'hui, on est
transparent sur ce point et c'est une **opportunité pour les premiers
cliniques** (conditions pilote spécifiques).
### Q21. Combien de temps pour un pilote ? Pour une prod ?
- **Pilote** : 6-8 semaines (semaine 1-2 cadrage + capture workflow,
semaine 3-4 test en double avec la TIM, semaine 5-8 mesure ROI).
- **Mise en prod** : 2-3 mois après pilote validé, selon intégration SI
et HDS.
- **Rampe multi-clinique** : 1 clinique par mois en rythme raisonnable.
### Q22. Qu'est-ce qui n'est pas encore prêt, honnêtement ?
- Mode **autonomous 100 % non-supervisé** : en développement, pas
production-ready. En pilote, on démarre en **copilote** (Léa propose,
la TIM valide).
- **Fiche d'identité par DPI** : Resurgences et quelques autres sont
bien testés, les outils plus rares demandent une phase d'apprentissage
dédiée.
- **Support macOS / Linux côté client** : pas prioritaire, à la demande.
- **Multilingue** : français uniquement aujourd'hui. Anglais prévu S2 2026.
---
## Bloc URGENCES (spécifique)
### Q23. Pourquoi les urgences d'abord ? Pourquoi pas la facturation ou la pharmacie ?
Deux raisons : (1) **c'est là qu'Amina a prouvé 150 k€/mois de récupération
manuelle** — on bâtit sur une preuve terrain chiffrée. (2) C'est un
domaine à **forte douleur** (TIM sous pression, codage fait vite, DPI
variés). Le ROI est évident, la reproductibilité est haute. Facturation
et pharmacie suivront, après un premier carton aux urgences.
### Q24. Quels DPI urgences supportés aujourd'hui ?
**Testés et opérationnels** : Resurgences (Softway). **En cours de
validation** : Urqual, DxCare, CristalNet Urgences, Hôpital Manager.
**Non testés aujourd'hui** : Osiris, outils métier propriétaires
d'établissement. Le coût d'ajout d'un nouveau DPI est faible (5-10 jours
de capture/apprentissage TIM) grâce à l'approche 100 % vision.
### Q25. Quel ROI moyen sur les urgences ?
Borne basse prouvée (sans IA, Amina en manuel) : **150 k€/mois/clinique**.
Avec Léa, on **scale cette méthode sur des volumes que la TIM ne pouvait
pas traiter manuellement** — on couvre 100 % des dossiers au lieu de 10-20 %.
Projection prudente : **+30 à +70 % vs manuel**, soit **200-250 k€/mois/
clinique potentiel** pour des groupements avec volumes urgences élevés.
**À confirmer sur pilote.**
### Q26. Est-ce que Léa remplace la TIM ?
Non. Léa fait le travail répétitif à haute valeur/faible complexité (les
80 % des dossiers "évidents") et **libère la TIM pour les 20 % de cas
complexes** (dossiers longs, arbitrages médicaux, contrôle qualité). Le
discours pour la TIM : "on t'enlève les corvées, tu gardes le cœur du
métier". En pratique, on gagne du temps qualifié et on réduit le turn-over
TIM (douleur RH forte dans la plupart des cliniques).
### Q27. Comment vous convainquez un médecin urgentiste que Léa sait coder mieux que lui le soir à 23 h fatigué ?
On ne le convainc pas, **on lui montre sur son dossier d'hier soir** ce
qu'il a oublié, avec la justification ligne par ligne. L'adhésion médecin
se joue en démo, pas en réunion. Et ce n'est pas "Léa contre le médecin",
c'est "Léa filet de sécurité pour le médecin fatigué à 23 h".
---
## Ce qu'on ne dit JAMAIS devant cette audience
- "On n'a pas encore..." (à transformer en "c'est sur la roadmap S2 2026").
- "Notre produit est un prototype" (il est en v1.0, livrable).
- "Ça ne marche pas toujours" (on dit "il y a un mode supervisé pour les
cas où Léa doute").
- "UiPath c'est nul" (on dit "UiPath est excellent sur d'autres terrains,
nous on est spécialisés urgences").
- "On est une startup de 2 personnes" (on dit "une équipe ramassée, agile,
avec 15 ans d'expertise métier en lead").

View File

@@ -0,0 +1,200 @@
# GRILLE D'INTERVIEW — TIM urgences (préparation démo du 26 avril)
**Objectif** : identifier **LE** workflow urgences à transformer en démo live
percutante devant 10-20 DG/DSI de groupements de cliniques.
**Durée cible de l'entretien** : **45-60 min** max.
**Posture** : Amina pose les questions métier, Dom écoute et prend des notes
techniques. On ne contredit **jamais** la TIM sur sa description du terrain —
même si ça ne correspond pas à ce qu'on avait imaginé. C'est elle l'experte.
**À la sortie de l'entretien, on doit repartir avec :**
1. Un workflow précis (5-15 étapes) à reproduire en démo.
2. Un chiffre de ROI estimé (euros/dossier ou euros/mois).
3. La liste des logiciels concernés (DPI + outils annexes).
4. Un verdict "on demande à la TIM d'être présente à la démo ? Oui/Non".
---
## Bloc A — Son quotidien (5 questions)
### A1. Combien de dossiers urgences tu codes par jour ?
*Pourquoi on pose cette question : pour calibrer le volume annuel et projeter
le ROI — 50/jour vs 200/jour change complètement l'échelle du chiffre qu'on
montre aux DG.*
### A2. Quel est ton temps moyen par dossier (du moment où tu l'ouvres au moment où tu valides) ?
*Pourquoi on pose cette question : pour chiffrer le gain potentiel en minutes
× nombre de dossiers × coût chargé TIM. C'est la promesse "temps gagné", qui
est secondaire à la promesse "récupération de valorisation", mais utile.*
### A3. Quel DPI urgences tu utilises ? (Resurgences, Urqual, DxCare, CristalNet, Hôpital Manager, autre ?)
*Pourquoi on pose cette question : on veut savoir si elle utilise **un DPI
qu'on a déjà testé** (Resurgences côté Softway est le plus probable en
clinique). Si c'est un outil exotique, on ajuste la démo ou on bascule sur
un de ses collègues.*
### A4. Où tu saisis le RUM ? Où tu saisis le RPU ? (même logiciel, onglets séparés, deux logiciels ?)
*Pourquoi on pose cette question : la structure PMSI urgences est double (RUM
PMSI + RPU ARS). On veut savoir combien d'écrans/logiciels sont impliqués
pour dimensionner la complexité du scénario démo.*
### A5. À quelle heure/dans quel contexte tu codes ? (temps réel pendant que le médecin voit le patient, J+1 en batch, fin de semaine ?)
*Pourquoi on pose cette question : si elle code en différé (J+1 ou J+3), le
scénario "audit rétrospectif" colle parfaitement — c'est exactement ce que
Léa fait de mieux. Si c'est en temps réel, scénario B "assistant temps réel"
est plus adapté mais plus risqué.*
---
## Bloc B — Les pertes et les douleurs (5 questions)
### B1. Quels sont les codes les plus souvent oubliés ou sous-valorisés ? Tu peux me citer le top 5 ?
*Pourquoi on pose cette question : **question clé**. On cherche LE pattern qui
revient (ex : "la suture complexe qui devient simple", "le monitoring oublié",
"l'anesthésie locale pas codée"). C'est ce qu'on fera détecter à Léa en démo,
et c'est crédible parce que ça vient du terrain.*
### B2. Tu as un exemple récent (cette semaine ou la semaine dernière) d'un dossier où tu as récupéré un acte ou un code que le médecin avait oublié ? Raconte-moi.
*Pourquoi on pose cette question : on cherche une **histoire vraie, concrète,
chiffrable** qu'Amina pourra raconter en ouverture de démo. "Lundi dernier,
dossier M. X, ECG non codé = 42 €." C'est 100× plus fort que des stats.*
### B3. Dans ta journée, combien de temps tu passes à **chercher** dans le DPI (scroll, changement d'onglets, copier-coller d'un écran à l'autre) versus à réellement **coder** ?
*Pourquoi on pose cette question : on veut quantifier la friction UI. Léa
élimine justement la partie "navigation/recherche". Si elle répond "70 % du
temps à chercher", on a un slide killer.*
### B4. Quelles sont les étapes répétitives qui t'énervent le plus ? (celles qui te donnent l'impression de perdre ton temps)
*Pourquoi on pose cette question : on cherche la **douleur émotionnelle**, pas
juste le gain chiffré. Les DG aiment les vraies histoires ("Pendant qu'elle
fait ça 80 fois par jour, elle pourrait faire autre chose"). Ça humanise.*
### B5. À côté de ton DPI, tu utilises des outils Excel / Word / listes papier / mail pour compléter le codage ? (suivi, relance des médecins, consolidation)
*Pourquoi on pose cette question : c'est là que **Léa est imbattable** — faire
le pont entre DPI et outils bureautiques. Si elle tient un Excel des "dossiers
à relancer", on a un scénario en or : Léa lit le DPI, remplit l'Excel,
envoie le mail au médecin.*
---
## Bloc C — Un scénario démo idéal (5 questions)
### C1. Si tu devais impressionner ton directeur général avec un outil qui fait ton travail pour toi, **qu'est-ce que tu lui montrerais en premier** ?
*Pourquoi on pose cette question : meilleure question du blocage. Elle nous
dit **exactement** ce qui, pour elle, est le plus impressionnant. Si elle
hésite, reformuler : "Qu'est-ce qui, pour toi, serait magique ?"*
### C2. Ton workflow de codage typique, il tient en combien d'étapes ? (5 clics ? 20 ? 50 ?)
*Pourquoi on pose cette question : pour dimensionner la durée de la démo live.
Au-dessus de 15 étapes, on découpe en segments ou on enregistre une vidéo
backup pour la partie répétitive.*
### C3. Est-ce que tu valides parfois plusieurs dossiers à la suite en **batch** (par exemple le lundi matin pour les passages du week-end) ?
*Pourquoi on pose cette question : le batch est le cas d'usage où Léa brille
(2 min × 30 dossiers = 1 h gagnée d'un coup). Si elle dit oui, c'est notre
scénario A idéal.*
### C4. Y a-t-il un cas où tu **croises plusieurs logiciels** (DPI + courrier SAMU + Excel de suivi + mail au médecin) pour clôturer un dossier ?
*Pourquoi on pose cette question : **démo multi-app = effet "waouh"
maximum** devant les RPA-experts qui savent que ça casse leurs bots UiPath.
Si elle dit oui et que le workflow est reproductible, c'est notre scénario
roi.*
### C5. Si je te disais "Léa lit un dossier urgence et te dit : il manque un acte (ECG non codé = 42 €)", est-ce que ton DG comprendrait tout de suite la valeur ?
*Pourquoi on pose cette question : test de pitch. Si elle dit "oui, il
comprend direct", on tient notre angle. Si elle dit "non, il s'en fout, c'est
la TIM qui décide", on doit repivoter vers un autre interlocuteur (DAF ? DIM ?).*
---
## Bloc D — Contraintes pratiques (4 questions)
### D1. Ton poste c'est quoi exactement ? Windows 10 ou 11 ? Portable ou fixe ? Un ou deux écrans ?
*Pourquoi on pose cette question : Léa tourne sur Windows 10/11. Si c'est un
vieux Windows 7 ou un thin client sans OS local, on a un problème. Le nombre
d'écrans change la captation (multi-screen = plus complexe).*
### D2. Ton DPI urgences, il tourne **en local sur le poste** ou via Citrix / VDI / bureau à distance ?
*Pourquoi on pose cette question : **question cruciale**. Si c'est Citrix, on
est en zone 100 % vision sans accessibility tree. C'est notre cas nominal mais
il faut s'y préparer (latence serveur +50-100 ms). Si c'est natif, démo plus
fluide.*
### D3. Est-ce qu'il y a un antivirus corporate agressif sur ton poste (Kaspersky, Sophos, Cortex XDR, Defender ATP) ?
*Pourquoi on pose cette question : certains AV bloquent les outils qui
capturent l'écran ou simulent clavier/souris. Il faut prévoir une exception
IT **avant** l'installation, pas le jour de la démo.*
### D4. Pour la démo, on veut travailler sur des **données fictives anonymisées**, jamais de vrais patients. Tu peux nous préparer 5-10 dossiers urgences fictifs représentatifs, ou on doit les créer ensemble ?
*Pourquoi on pose cette question : **RGPD non négociable**. Même si la TIM dit
"y a pas de souci, on prend des vrais", on refuse. Montrer en démo un vrai
dossier = fin de carrière commerciale. Il faut des dossiers fictifs, mais
réalistes (pathos plausibles, codes cohérents, chiffres crédibles).*
---
## Questions bonus si on a le temps (à piocher)
- **Depuis combien de temps tu fais ce métier ?** (crédibilise la démo si
elle est expérimentée)
- **Vous êtes combien de TIM dans l'établissement ?** (volume de déploiement)
- **Ton DIM (Département Information Médicale) connaît combien tu récupères
par an sur les urgences ?** (pour calibrer le pitch ROI)
- **Y a-t-il déjà eu une tentative d'automatisation sur ton poste (UiPath, AA,
BluePrism, macro Excel) ?** (pour anticiper le "on a déjà essayé, ça a pas
marché" du DG)
---
## Après l'entretien — synthèse en 10 minutes
À remplir **tout de suite après**, pendant que c'est frais :
- [ ] Workflow démo choisi : __________________________________________
- [ ] Nombre d'étapes : _______
- [ ] DPI principal : _______
- [ ] Outils annexes : _______
- [ ] Chiffre ROI par dossier : ___ €
- [ ] Volume annuel extrapolable : ___ dossiers/an/clinique → ___ €/an
- [ ] Citrix/VDI : Oui / Non
- [ ] Antivirus à faire débloquer : _______
- [ ] Histoire vraie utilisable en ouverture : _______________________
- [ ] TIM invitée à la démo du 26 avril : Oui / Non / Peut-être
- [ ] Date de tournage de la **vidéo de backup** (au cas où démo live plante) :
_______
---
## Règles d'or pendant l'interview
1. **Ne pas lui vendre Léa.** On écoute, on ne pitch pas. Elle nous parlera
plus librement si elle ne se sent pas en position de cliente.
2. **Ne pas promettre qu'on va faire X.** On dit "on regarde si c'est faisable",
jamais "Léa le fera en démo" — tant qu'on ne l'a pas testé.
3. **Prendre des notes écrites.** Pas d'enregistrement audio sans accord
écrit (RGPD).
4. **Demander si elle est partante pour la démo en présentiel.** Sa présence
à Paris/Lyon le 26 avril vaut 10 slides.
5. **Lui demander son retour sincère.** À la fin : "Tu nous trouves
crédibles ? Qu'est-ce qui te rendrait sceptique à la place des DG ?"

View File

@@ -0,0 +1,259 @@
# GUIDE D'INSTALLATION — Agent Léa sur poste TIM
**Public** : TIM (Technicienne Information Médicale) ou son service informatique.
**Durée cible** : **10 minutes** (hors téléchargement).
**Prérequis** : Windows 10/11, compte avec droits utilisateur standard (pas besoin d'admin sauf étape Python), accès Internet, **DPI urgences fonctionnel** sur le poste.
> **Avant de commencer** : vérifier que la TIM peut ouvrir son DPI urgences
> habituel (Resurgences, Urqual, DxCare, CristalNet, Hôpital Manager…) et y
> naviguer normalement. Si le DPI passe par Citrix/VDI, le vérifier avant
> d'installer Léa. **Si le DPI ne marche pas, l'agent ne servira à rien.**
---
## Pourquoi pas un installeur `.exe` ?
On livre un **ZIP + scripts**, pas un installeur Inno Setup. Raison : un `.exe`
non signé (code-signing EV à 500 €/an) déclenche le SmartScreen rouge Windows
("Windows a protégé votre PC") + l'antivirus corporate. Sur le poste d'une TIM
en clinique, **c'est la pire première impression possible**.
L'approche ZIP + `.bat` passe sous le radar du SmartScreen et s'installe dans
le dossier utilisateur (pas besoin d'admin pour le copier).
---
## Étape 1 — Récupérer le package (1 min)
1. Télécharger `Lea_v1.0.0.zip` depuis l'URL fournie par Dom
(lien Owncloud interne ou clé USB si réseau isolé).
2. Fichier attendu : environ **5 Mo**.
3. **Vérifier l'intégrité** : clic droit sur le ZIP → Propriétés → si un bouton
"Débloquer" est visible en bas, le cocher puis OK (sinon Windows peut
bloquer l'exécution des `.bat`).
---
## Étape 2 — Extraire dans `C:\rpa_vision\Lea\` (1 min)
1. Créer le dossier **`C:\rpa_vision\Lea\`** (ou `C:\Lea\` si l'admin préfère).
2. Clic droit sur `Lea_v1.0.0.zip`**Extraire tout…** → choisir
`C:\rpa_vision\Lea\` → Extraire.
3. Vérifier que le dossier contient :
```
C:\rpa_vision\Lea\
├── install.bat
├── Lea.bat
├── config.txt
├── LISEZMOI.txt
├── requirements_agent.txt
└── run_agent_v1.py
```
> **Piège** : si Windows extrait un dossier intermédiaire
> (`Lea_v1.0.0\Lea_v1.0.0\...`), **déplacer le contenu d'un cran** pour que
> `install.bat` soit à la racine `C:\rpa_vision\Lea\`.
---
## Étape 3 — Vérifier Python (1 min)
Ouvrir une invite de commandes (`Démarrer` → taper `cmd` → Entrée) et taper :
```
python --version
```
- **Si ça affiche** `Python 3.10.x` à `3.12.x` → OK, passer à l'étape 4.
- **Si erreur** `'python' n'est pas reconnu` → installer Python :
1. Aller sur https://www.python.org/downloads/
2. Télécharger Python 3.12.x
3. **Important** : pendant l'installation, **cocher
"Add Python to PATH"** (case du bas, souvent décochée).
4. Terminer, fermer/rouvrir l'invite de commandes, re-tester
`python --version`.
> Python installé en "Microsoft Store" fonctionne aussi mais peut poser des
> soucis de PATH. Si ça bloque, désinstaller la version Store et installer
> celle de python.org.
---
## Étape 4 — Configurer `config.txt` (2 min)
Ouvrir `C:\rpa_vision\Lea\config.txt` **avec le Bloc-notes**
(clic droit → "Ouvrir avec" → Bloc-notes).
Vérifier/modifier ces 3 lignes :
```
RPA_SERVER_URL=https://lea.labs.laurinebazin.design/api/v1
RPA_API_TOKEN=<TOKEN_FOURNI_PAR_DOM>
RPA_SERVER_HOST=lea.labs.laurinebazin.design
```
- **URL du serveur** : celle de prod publique OU une URL interne si on bascule
sur un serveur clinique pendant la démo.
- **Token** : Dom fournit un token **dédié à la TIM** (révocable). Ne pas
réutiliser le token de dev.
- **Sauvegarder** (Ctrl+S), fermer.
> Ne **pas** toucher aux autres lignes (`RPA_BLUR_SENSITIVE`, etc.).
---
## Étape 5 — Lancer `install.bat` (3-4 min)
1. Double-cliquer sur `install.bat`.
2. Une fenêtre noire s'ouvre avec le titre "Lea - Installation".
3. Écrans attendus dans l'ordre :
```
[1/5] Verification de Python...
Python 3.12.2 detecte - OK
[2/5] Creation de l'environnement isole...
Environnement cree - OK
[3/5] Activation de l'environnement...
Active - OK
[4/5] Installation des composants (cela peut prendre 1-2 min)...
Composants installes - OK
[5/5] Configuration Windows...
Configuration terminee - OK
Tous les composants sont OK !
Installation terminee !
```
4. Appuyer sur une touche pour fermer.
> **Durée typique** : 2-3 minutes (dépend de la bande passante — `pip install`
> télécharge ~50 Mo).
---
## Étape 6 — Lancer Léa (30 s)
1. Double-cliquer sur `Lea.bat`.
2. Une fenêtre noire affiche :
```
Demarrage de Lea...
(Lea apparait dans la barre des taches, en bas a droite)
```
3. **Au bout de 3-5 secondes**, une **icône ronde** apparaît dans la barre
des tâches (en bas à droite de l'écran, à côté de l'horloge, parfois
cachée sous la flèche `^`).
4. **Clic droit sur l'icône** → menu :
- Apprenez-moi une tâche
- C'est terminé
- Discuter avec Léa
- ARRÊT D'URGENCE
- Quitter Léa
Si l'icône apparaît et que le menu s'ouvre → **installation réussie**.
> La fenêtre noire peut être fermée. L'agent tourne en arrière-plan via
> `pythonw.exe`.
---
## Étape 7 — Vérifier côté dashboard (1 min)
Côté Dom, depuis un navigateur :
```
GET https://lea.labs.laurinebazin.design/api/v1/agents/fleet
Header: Authorization: Bearer <TOKEN_ADMIN>
```
La réponse doit contenir une entrée avec :
```json
{
"agent_id": "<nom_du_poste_TIM>",
"status": "online",
"last_seen": "2026-04-...",
"version": "1.0.0"
}
```
Si le poste n'apparaît pas après 30 s, voir la section "Si ça plante" ci-dessous.
Alternative : ouvrir le dashboard web (`http://<serveur>:5001`) → onglet
"Flotte" → le poste de la TIM doit s'afficher en vert.
---
## Si ça plante (5 cas les plus probables)
### 1. "Token invalide" / erreur 401 dans les logs
- Vérifier que `RPA_API_TOKEN` dans `config.txt` **ne contient pas d'espace**
en début/fin, **pas de guillemets**, pas de retour à la ligne.
- Le format attendu : `RPA_API_TOKEN=abc123def...` (sans espace autour du `=`).
- Si le token a été copié-collé depuis un mail, il peut contenir un caractère
invisible. **Retaper à la main** ou recopier depuis un éditeur brut.
### 2. "Python n'est pas installé" alors qu'il l'est
- `python --version` marche dans un cmd "normal" mais `install.bat` le trouve
pas → Python est installé **pour l'utilisateur** mais la TIM lance le `.bat`
en mode admin (session différente).
- **Solution** : double-cliquer sur `install.bat` en user normal, PAS en
"Exécuter en tant qu'administrateur".
### 3. Firewall bloque la connexion au serveur
- Au premier lancement, Windows Defender peut demander
"Autoriser pythonw.exe à communiquer sur le réseau ?" → **Autoriser**.
- Si firewall corporate plus strict : demander au service IT d'autoriser
les connexions sortantes vers `lea.labs.laurinebazin.design:443` (HTTPS).
- Test rapide depuis le poste : ouvrir un navigateur sur
`https://lea.labs.laurinebazin.design/health` → doit répondre `{"status":"ok"}`.
### 4. Antivirus bloque `pythonw.exe`
- Certains AV corporate (Kaspersky, Sophos, Cortex XDR) mettent `pythonw.exe`
en quarantaine dès qu'il capture l'écran.
- Symptôme : `Lea.bat` affiche "Lea n'a pas demarre correctement" et le mode
verbeux montre un `pythonw.exe n'a pas pu se lancer` ou rien du tout.
- **Solution** : demander au service IT d'ajouter **une exception pour le
dossier** `C:\rpa_vision\Lea\.venv\Scripts\` (et pas juste pour `pythonw.exe`
globalement — ce serait une faille de sécurité).
### 5. Double-clic sur `Lea.bat` ouvre le Notepad
- Cause classique : la TIM a fait clic droit → "Ouvrir avec…" → "Toujours
utiliser Notepad" une fois par erreur. Windows a associé `.bat` à Notepad.
- **Solution** :
1. Clic droit sur `Lea.bat` → "Ouvrir avec" → "Choisir une autre application"
→ "Plus d'applications" → "Rechercher une autre app sur ce PC"
`C:\Windows\System32\cmd.exe`**ne PAS cocher** "Toujours utiliser".
2. Ou alternative rapide : ouvrir un cmd, taper
`cd C:\rpa_vision\Lea` puis `Lea.bat`.
---
## Désinstaller Léa (si besoin)
1. Clic droit sur l'icône Léa → "Quitter Léa".
2. Supprimer le dossier `C:\rpa_vision\Lea\`.
3. (Optionnel) Supprimer les logs dans `%LOCALAPPDATA%\Lea\` si existant.
Pas de désinstalleur, pas de clé registre, pas de service : Léa est un **binaire
portable**. C'est voulu : aucune trace système, facile à auditer.
---
## Check final avant la démo (à faire ensemble avec la TIM)
- [ ] Icône Léa visible dans la tray.
- [ ] Clic droit → menu s'ouvre.
- [ ] Dashboard côté serveur affiche le poste en "online".
- [ ] Le DPI urgences de la TIM s'ouvre et répond normalement (pas de lenteur).
- [ ] Démo d'enregistrement de 30 s : clic droit → "Apprenez-moi une tâche"
→ faire 2-3 clics → clic droit → "C'est terminé". Vérifier côté serveur
que la session arrive.
**Si tout est vert → on est prêts pour le 26 avril.**

View File

@@ -0,0 +1,284 @@
**SCÉNARIOS DE DÉMO — Urgences (26 avril 2026)**
**Contexte** : 10-20 DG/DSI de groupements de cliniques, dont plusieurs
 
 RPA-experts (UiPath, Automation Anywhere). Pitch duo Amina + Dom.
**Cadre narratif** : Amina a prouvé manuellement 150 k€/mois de
 
 récupération PMSI urgences par clinique. **Léa est le scaler de cette**
 **
 méthode prouvée** — pas une techno RPA de plus.
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANUlEQVR4nO3OMQ2AABAAsSNBCkLfE07YGfHAiAU2QtIq6DIzW7UHAMBfnGt1V8fXEwAAXrse4eQF6VhvmPsAAAAASUVORK5CYII=)
**Critères d'évaluation (grille commune aux 3 scénarios)**
| | | |
|-|-|-|
| **Critère** | **Description** | **Note** |
| Impact émotionnel DG | Est-ce que ça fait lever les sourcils ? | /5 |
| Faisabilité technique | On sait le faire aujourd'hui sans rustine ? | /5 |
| Risque démo live | Probabilité que ça plante devant 20 personnes | /5 (5 = très risqué) |
| Reproductibilité | On peut le refaire dans 3 pilotes différents | /5 |
| Crédibilité ROI | Le chiffre annoncé est défendable si un DAF challenge | /5 |
 
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAALUlEQVR4nO3OQQ0AIAwEsAMlSJ0UrOFkGngRklZBR1WtJDsAAPzizNcDAADuNcKwAyU+nb+5AAAAAElFTkSuQmCC)
**Scénario A — "L'audit rétrospectif des actes oubliés"**
**Titre pitchable**
**"Récupération de 15 000 € d'actes oubliés en 5 minutes — sur un lot de**
 **
 30 dossiers urgences de la semaine."**
**Durée démo live**
**5 minutes** (+ 2 min de commentaire par Amina sur le chiffrage).
**Pitch en une phrase**
Léa relit les dossiers urgences de la semaine écoulée, détecte les actes
 
 cliniques non codés, propose les corrections, chiffre le gain PMSI.
 
 
**Étapes de la démo**
1. **[Dom, 10 s]** Ouvre l'interface Léa (dashboard). Montre un dossier
 
 d'entrée : "30 passages urgences du 15 au 19 avril, à auditer."
2. **[Amina, 15 s]** "Normalement, c'est ce que je fais moi-même, à la main,
 
 en une après-midi. Je vais vous montrer ce que Léa fait en 3 minutes."
3. **[Dom, 3 min]** Lance Léa en mode "audit rétrospectif". À l'écran :
 
 Léa ouvre le DPI (Resurgences en natif ou en vidéo captée), parcourt
 
 chaque dossier, lit le compte-rendu médical, compare aux actes cotés.
 
 Dans une side-pane dashboard, on voit apparaître en temps réel :
- Dossier 1 : ✅ OK
- Dossier 2 : ⚠️ ECG mentionné dans CR, non codé → +42 €
- Dossier 3 : ⚠️ Suture complexe codée comme simple → +78 €
- Dossier 4 : ✅ OK
- ... (avec un compteur ROI qui monte)
4. **[Amina, 30 s]** Commentaire pendant que ça défile : "Regardez, ça, c'est
 
 exactement ce que j'aurais vu. Et là, on est à 14 800 € de récupération
 
 sur **une semaine**."
5. **[Dom, 30 s]** Fin de l'audit. Léa affiche un rapport final : 12 actes
 
 oubliés, 3 erreurs de cotation, total **14 850 €**. Export CSV + mail
 
 automatique au médecin urgentiste pour validation.
6. **[Amina, 60 s, closing du scénario]** "Sur un volume annuel de 50 000
 
 passages urgences par clinique — un groupement de 10 cliniques c'est
 **plus de 8 M€/an** de valorisation récupérable. Et on ne parle que des
 
 urgences."
**Chiffre clé à afficher**
- **14 850 €** récupérés sur 30 dossiers = **495 €/dossier en moyenne**
- Projection : **150 000 €/mois/clinique** (la preuve Amina, sans IA, donc
 borne inférieure)
- Groupement 10 cliniques = **18 M€/an de potentiel**
 
 
**Prérequis**
- **Corpus de 30 dossiers fictifs** réalistes — à préparer avec la TIM
- Léa connaît les patterns de codage PMSI urgences (prompts métier déjà
 
 chargés)
- Dashboard avec side-pane "audit en cours" prête
- Vidéo de backup enregistrée **avant la démo** (au cas où)
**Risques live & mitigation**
| | | |
|-|-|-|
| **Risque** | **Proba** | **Mitigation** |
| Léa rate un code évident | Moyenne | Préalable : **tourner le scénario 5× à l'avance**, fixer le corpus |
| Latence serveur sur Citrix | Moyenne | Basculer sur DPI natif local pour la démo |
| Amina coupe Dom pour commenter trop tôt | Élevée | **Répétition en binôme la veille** |
| Un DG dit "vous avez scripté ça" | Haute | Proposer un **pilote 2 semaines chez lui** tout de suite |
 
**Notes**
- **Scénario préféré** : très visuel, chiffrage direct, colle au narratif
 
 Amina, risque maîtrisable.
- Avantage : la partie "Léa lit/compare" peut être accélérée en post-prod
 
 si on passe sur une vidéo backup.
- Limite : ne montre pas la capacité **autonomous** de Léa (elle ne clique
 
 pas pour valider, elle propose). À compléter éventuellement par B ou C.
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANElEQVR4nO3OQQmAUBBAwSfIb+HdmNvAkgaxgjcRZhLMNjNHdQUAwF/ce7Wq8+sJAACvrQctewNKtdojwQAAAABJRU5ErkJggg==)
**Scénario B — "L'assistant temps réel"**
**Titre pitchable**
**"Pendant que la TIM code un dossier qui vient de sortir, Léa regarde**
 **
 par-dessus son épaule et signale ce qu'elle oublie."**
 
 
**Durée démo live**
**3 minutes**.
**Pitch en une phrase**
La TIM code normalement. Léa observe l'écran, compare au CR médical, et
 
 pop-up une alerte quand elle détecte un acte manquant.
**Étapes de la démo**
1. **[Dom, 15 s]** "La TIM (ou un intervenant qui joue la TIM — idéalement
 
 la vraie TIM si elle est venue) ouvre un dossier. Léa tourne en arrière-
 
 plan."
2. **[TIM, 90 s]** Code un dossier comme d'habitude. Amina commente ce
 
 qu'elle fait ("elle ouvre le CR, elle regarde les actes, elle saisit…").
3. **[Pop-up Léa, 5 s]** Dans le coin, une bulle apparaît :
 
 "Acte probablement manquant : monitoring cardiaque (mentionné ligne 3
 
 du CR) — +28 €. Confirmer ?"
4. **[TIM, 15 s]** Clique "Confirmer". Léa ajoute le code dans le DPI
 
 (ou propose le code et la TIM le saisit — à choisir selon niveau de
 
 risque).
5. **[Amina, 45 s, closing]** "En temps réel. Pas de batch. Pas de
 
 vérification rétrospective. La TIM garde la main, Léa est le filet."
**Chiffre clé à afficher**
- **80 % des actes oubliés** détectés en temps réel
- **+8 à 12 min par dossier économisées** (pas besoin de revenir dessus
 J+1)
- "Un filet de sécurité sur chaque dossier"
 
 
 
 
**Prérequis**
- Un dossier fictif avec **au moins un acte clairement détectable** (ECG ou
 
 monitoring)
- La pop-up Léa visuellement propre (pas de dialog Windows moche)
- Couplage visuel OCR du CR ↔ interface de saisie (à tester spécifiquement)
- Latence < 5 secondes entre le moment où la TIM est sur le bon écran et la
 
 pop-up Léa
**Risques live & mitigation**
| | | |
|-|-|-|
| **Risque** | **Proba** | **Mitigation** |
| Pop-up n'apparaît pas / trop tard | **Haute** | Fixer un déclencheur manuel de secours (Amina dit "et regardez, Léa a détecté…") |
| Faux positif en direct | Moyenne | Trigger garde-fou : seuil de confidence > 0.8 |
| TIM stressée, perd ses moyens | Moyenne | **Répétition 3× la veille** si la TIM joue live |
| Écran capturé mal rendu au projecteur | Haute | Test projecteur 1h avant, résolution fixe |
 
**Notes**
- Effet "magie" maximum si ça marche.
- **Risque de plantage > scénario A.** À faire en **deuxième position**, pas
 
 en ouverture.
- Peut être joué en "complément" du A (audit rétrospectif, puis "et en
 
 temps réel, voici ce que Léa fait aussi"), en 2 min flat.
- Si la TIM est venue à la démo : énorme plus-value émotionnelle (elle
 
 raconte elle-même). Si elle n'est pas là, Dom ou Amina joue son rôle,
 
 ce qui est moins crédible.
 
 
 
 
 
 
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBACPiUML0NpGACyywEZJWQZeZ2aszAAD+4l6rrTq+ngAA8Nr1AL/SBEZwuCSwAAAAAElFTkSuQmCC)
**Scénario C — "Le codeur autonome"**
**Titre pitchable**
**"Léa code seule un dossier urgence complet — admission, examens, actes,**
 **
 sortie — en 90 secondes. La TIM valide, c'est parti au PMSI."**
**Durée démo live**
**7 minutes** (2 min setup + 90 s exécution Léa + 3 min commentaires +
 
 30 s validation).
**Pitch en une phrase**
Léa prend un CR brut d'urgence, ouvre le DPI, navigue dans les écrans,
 
 remplit les champs RUM + RPU, valide le codage PMSI. Humain en superviseur.
**Étapes de la démo**
1. **[Dom, 30 s]** Montre le CR en entrée : texte brut (1 page).
2. **[Amina, 30 s]** "Normalement, coder ce dossier me prend 4-5 minutes.
 
 Regardez Léa."
3. **[Dom, 90 s]** Lance Léa en mode autonomous. À l'écran :
- Léa ouvre le DPI (clic sur l'icône du bureau)
- Navigue dans le menu "nouveau passage"
- Saisit nom, prénom, date de naissance (issus du CR)
- Remplit motif d'entrée (CIM-10 auto depuis CR)
- Navigue vers "actes réalisés", cote chaque acte
- Remplit diagnostic principal + associés
- Clique "Enregistrer" → dialogue de validation
- **S'arrête** sur la validation finale
4. **[Amina, 30 s]** "Léa s'arrête ici **volontairement**. C'est la TIM qui
 
 valide. On garde l'humain dans la boucle."
5. **[TIM ou Dom, 15 s]** Valide → message "RUM/RPU envoyés au PMSI".
6. **[Amina, 2 min, closing]** "4 minutes économisées par dossier.
 
 50 dossiers/jour. 10 cliniques. Faites le calcul." (et elle projette.)
 
 
**Chiffre clé à afficher**
- **90 s vs 4 minutes** (division par 2.5 à 3 du temps)
- **Sur un volume de 50 k passages/an** : 3 300 heures TIM économisées/an
- Projection ROI : dépend du chargé TIM (60 k€/an chargé = **~160 k€ de**
 **temps dégagé/clinique/an**, hors récupération PMSI)
**Prérequis**
- Workflow **très** répété, testé 20 fois au moins avant la démo
- DPI cible **fixé et gelé** (pas de mise à jour 48h avant)
- Mode autonomous Léa stable (voir Phase 3 roadmap : probablement **pas**
 **
 encore prêt le 26 avril**)
- Vidéo de backup non négociable
- Plan B : passer en "Léa remplit les champs un à un, la TIM valide
 
 étape par étape" (demi-autonomous, moins risqué)
**Risques live & mitigation**
| | | |
|-|-|-|
| **Risque** | **Proba** | **Mitigation** |
| Léa rate un clic au milieu | **Très haute** | Vidéo de backup + plan B demi-autonomous |
| DPI a changé d'UI depuis la capture | Haute | Freeze DPI version 48h avant |
| Timing perçu comme "lent" par le public | Moyenne | Accélérer en post-prod (si vidéo) |
| Question acerbe d'un RPA-expert sur l'UI drift | Haute | Réponse cadrée (cf. FAQ, question "UI qui change") |
| Dom stressé et Léa refuse de démarrer | Moyenne | 15 min de setup tranquille avant + test final 5 min avant |
 
**Notes**
- **Le plus spectaculaire**, mais aussi **le plus risqué**.
- **À GARDER POUR PLUS TARD** — début juin, voire fin mai. Le 26 avril,
 
 Léa en full autonomous devant des RPA-experts = roulette russe.
- Option : montrer ce scénario **en vidéo enregistrée** en bonus (2 min),
 pas en live. On garde l'impact sans le risque.
 
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANUlEQVR4nO3OQQmAABRAsSd49m4tA8nPaQJjWMGbCFuCLTOzV2cAAPzFvVZbdXw9AQDgtesBorcEPwOKyvQAAAAASUVORK5CYII=)
 
**Recommandation**
**Plan proposé pour la démo du 26 avril**
1. **Ouverture Amina** (2 min, storytelling 150 k€/mois urgences).
2. **Démo principale = scénario A** (audit rétrospectif, 5 min).
3. **Bonus = scénario B** (assistant temps réel, 3 min), **uniquement si**
 **
 la TIM est présente et à l'aise**. Sinon on saute.
4. **Teaser = scénario C en vidéo** (2 min, "voilà ce qu'on déploiera en
 
 pilote"), pas en live.
5. **Closing Amina** (3 min, ROI projetté, appel à pilote).
**Pourquoi ce plan**
- **A en premier** : visuel, chiffré, quasi zéro risque live, parle
 directement aux DG.
- **B en bonus** : effet "waouh" si on a les billes, skipable sinon.
- **C en vidéo** : montre l'ambition/roadmap sans se prendre un plantage
 en pleine figure.
- **Amina bookends** : c'est elle qui ouvre et ferme. Elle est la crédibilité
 métier. Dom est l'exécution.
**Question ouverte à trancher**
**Est-ce qu'on invite la TIM à la démo du 26 avril ?**
- Oui = scénario B devient solide, mais +1 logistique (transport, hôtel,
 
 briefing, déblocage de sa journée avec la clinique).
- Non = on joue tous les scénarios en simulation, narratif un peu moins fort.
- **À décider avec Amina demain matin** en fonction de son feeling
 
 sur la TIM pendant l'interview.

View File

@@ -0,0 +1,326 @@
**SCRIPT DE PITCH DUO — Démo 26 avril 2026**
**Durée totale** : **15 minutes** (strict, on coupe tout ce qui dépasse).
**Duo** : **Amina ETTORCHI** (métier, ROI, closing) + **Dom** (technique,
 
 démo, réponses techniques).
**Principe** : Amina ouvre, Amina ferme. Dom exécute au milieu. C'est
 
 **Amina la figure de crédibilité** pour cette audience (TIM/DIM/DG savent
 
 qu'une présidente de société qui vient du terrain PMSI vaut 10 ingénieurs).
**Objectif closing** : **3-5 rendez-vous pilote** pris avant que la salle
 
 se vide.
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANUlEQVR4nO3OQQmAABRAsSeYxKS/kJkED6bwYAVvImwJtszMVu0BAPAXx1rd1fn1BACA164HHDwF+DpPyKwAAAAASUVORK5CYII=)
**BEAT 1 — Opening Amina (2 min)**
**Qui parle**
**Amina seule**, debout, sans slide au début (slide 1 : logo AIVANOV + titre).
**Message clé**
"J'ai prouvé 150 000 €/mois de récupération aux urgences **sans aucune**
 **
 technologie**. Ce que je vais vous montrer aujourd'hui, c'est comment on
 
 scale ça."
**Exemples de phrases à dire (à peu près mot à mot)**
*"Bonjour. Je m'appelle Amina ETTORCHI, je suis présidente d'AIVANOV. Avant* * * *ça, j'ai été TIM, j'ai été responsable département d'information médicale.*
 *
 Pendant 15 ans, je suis allée dans vos cliniques. J'ai lu vos dossiers*
 *
 *
 
*urgences."*
*"Et j'ai trouvé * ***systématiquement*** * la même chose : entre 100 000 et*
 *
 180 000 € par mois et par clinique, de valorisation PMSI qui partait*
 *
 à la poubelle. Des actes pas codés. Des sutures complexes marquées*
 *
 simples. *
*Des ECG oubliés."* * * *"J'ai fait ça * ***à la main*** *, en lisant les dossiers un par un. J'ai récupéré* * * *cet argent pour mes clients. Sans IA. Sans automatisation. Juste avec de* * * *l'expertise et du temps."*
*"Aujourd'hui, je vais vous présenter Léa. Léa, c'est moi. En plus rapide,* * * *24 h/24, sur tous vos dossiers, pas juste ceux que j'ai eu le temps de* * * *lire. C'est Dom qui va vous la montrer."*
**À l'écran pendant ce beat**
- **Slide 1** : logo AIVANOV + Amina ETTORCHI + "150 000 €/mois/clinique
 
 prouvés sans IA"
- **Slide 2** (en fond) : un chiffre massif — "+150 k€ / mois / clinique"
**Durée**
**2 min strict**. Si Amina dépasse à 2 min 30 s, Dom glisse un signal visuel
 
 discret (pointer l'horloge, tousser). **La règle : ne pas entrer dans la**
 **
 technique à ce beat.**
**Piège à éviter**
- Ne pas dire "on est une startup qui démarre" → on dit "on industrialise ce
 que j'ai fait pendant 15 ans à la main".
- Ne pas lister les DPI supportés → Amina reste sur le chiffre.
- Ne pas montrer de graph → storytelling pur, pas de slide data.
 
 
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBACPiUML0NpGACyywEZJWQZeZ2aszAAD+4l6rrTq+ngAA8Nr1AL/SBEZwuCSwAAAAAElFTkSuQmCC)
**BEAT 2 — Transition Dom (1 min)**
**Qui parle**
**Dom**, sur scène, assis ou debout à côté d'Amina.
**Message clé**
"Voilà l'idée technique : on a construit une IA qui regarde l'écran comme Amina, pas comme un bot UiPath."
**Exemples de phrases à dire**
*"Merci Amina. Concrètement, Léa est une assistante qui * ***regarde votre*** *** *** ***écran comme un humain*** *. Pas de connexion API, pas de DOM, pas de* * * *configuration par workflow. Elle * ***voit*** * le DPI. Elle * ***comprend*** * ce* * * *qu'elle voit. Elle * ***agit*** *."*
*"C'est important de le préciser tout de suite parce que plusieurs d'entre* * * *vous ont déjà déployé de l'UiPath ou de l'Automation Anywhere. * ***On ne*** *** *** ***remplace pas UiPath.*** * UiPath est très bon sur la compta, sur les RH. Mais* * * *sur un dossier urgence, où l'UI change selon le patient, où le DPI passe* * * *par Citrix — UiPath a beaucoup de mal. Pas Léa."*
*"Je vais vous montrer. Je ne vais pas faire de slides, je vais lancer*
 *
 Léa."*
**À l'écran pendant ce beat**
- **Slide 3** : schéma simple — Léa = "Observe → Comprend → Agit" (3 pictos,
 
 pas de jargon)
- **Transition visible** vers le desktop de démo à la fin du beat
 
 
 
 
**Durée**
**1 min strict**.
**Piège à éviter**
- Ne pas entrer dans les détails du VLM ou du grounding visuel ici → c'est
 pour la FAQ en fin de session.
- Ne pas dire "c'est 100 % local" ici → on le dit au beat 5 (vision/roadmap), pour garder de la munition.
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBCkLfFR7wwIgHRiywEZJWQZeZ2ao9AAD+4lyruzq+ngAA8Nr1AOIEBeX8aGZPAAAAAElFTkSuQmCC)
**BEAT 3 — Démo live (5-7 min selon scénario)**
**Qui parle**
**Dom pilote**, **Amina commente en temps réel** (métier/impact).
**Message clé**
"Regardez ce que Léa fait. Regardez ce qu'elle récupère."
**Structure (scénario A recommandé — audit rétrospectif)**
1. **[Dom, 15 s]** Lance le dashboard, montre l'entrée : "30 passages
 
 urgences du 15 au 19 avril, à auditer."
2. **[Amina, 15 s]** "Ces 30 passages, je les aurais faits moi-même en 4 h.
 
 Regardez Léa en 3 minutes."
3. **[Dom, 2-3 min]** Lance Léa. Les détections défilent à l'écran :
- Dossier 5 : ECG non codé → +42 €
- Dossier 12 : suture complexe → +78 €
- etc.
4. **[Amina, 20 s, à deux moments]** Commentaires courts pendant le défilé :
 
 "Regardez, ça c'est typique." / "Sur celui-là, le médecin aurait
 
 pris 10 min pour rechercher. Léa 3 secondes."
5. **[Dom, 30 s]** Rapport final affiché : **14 850 €** sur 30 dossiers.
6. **[Dom → Amina, 10 s]** "Et maintenant, Amina te projette le chiffre."
 
 
**Exemples de phrases à dire pendant la démo**
**Dom (technique, posé)** :
*"Là, Léa vient de lire le CR médical, et elle compare avec les actes*
 *cotés dans le DPI. Elle voit qu'il manque un ECG mentionné en page 2. Elle* * * *propose le code. Elle ne valide pas elle-même, c'est la TIM qui valide.* * * *C'est un filet de sécurité, pas un remplacement."*
**Amina (métier, chaleureuse)** :
*"C'est exactement ce que je fais moi, sauf que Léa le fait en temps réel* * * *sur * ***tous*** * vos dossiers, pas juste ceux que j'ai le temps de lire."*
**À l'écran pendant ce beat**
- **Dashboard Léa** plein écran
- Side-pane "détections" avec compteur ROI qui monte (important : le
 
 compteur en gros chiffre vert est **le** visuel qui accroche les DG)
**Durée**
**5 min strict scénario A**, **+2 min si on enchaîne sur scénario B bonus**.
**Piège à éviter**
- Ne **JAMAIS** dire "attendez, ça plante" ou "normalement ça marche" →
 
 si ça plante, **Dom bascule en vidéo backup sans commentaire**,
 
 continue comme si de rien n'était.
- Ne pas faire defiler trop vite les détections — laisser **les DG voir**
 **
 chaque ligne** avec le chiffre.
- Amina ne coupe **pas** Dom en pleine exécution technique. Elle attend les
 
 respirations.
 
 
 
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBACPiUML0NpGACyywEZJWQZeZ2aszAAD+4l6rrTq+ngAA8Nr1AL/SBEZwuCSwAAAAAElFTkSuQmCC)
**BEAT 4 — Chiffrage (2 min)**
**Qui parle**
**Amina seule**, retour sur une slide projection.
**Message clé**
"Multipliez ça par votre volume. Voilà ce que vous laissez sur la table
 
 aujourd'hui."
**Exemples de phrases à dire**
*"On vient de voir 14 850 € récupérés sur * ***une semaine*** * de 30 dossiers.*
 *
 Vous, dans vos cliniques, vous traitez combien de passages urgences par an ?*
 *
 30 000 ? 50 000 ? 100 000 pour un gros établissement ?"*
*"Sur 50 000 passages par an, en projetant le même taux de récupération,*
 *
 vous êtes à * ***2,5 millions d'euros de valorisation PMSI récupérée par an*** *** *** ***et par clinique*** *. Pour un groupement de 10 cliniques, on est à * ***25*** *** *** ***millions*** *. Ça, c'est avec les données que j'ai prouvées à la main.*
 *
 Léa ne fait que scaler."*
*"Je vous rappelle : ce ne sont * ***pas*** * des économies. C'est de l'argent*
 *
 qui vous revient de droit, que vous ne facturez pas aujourd'hui, parce que* * * *vos TIM n'ont pas le temps de tout relire."*
 
 
 
**À l'écran pendant ce beat**
- **Slide 4** : tableau projection
- 30 000 passages/an → 1,5 M€/an
- 50 000 passages/an → 2,5 M€/an
- 100 000 passages/an → 5 M€/an
- **Astérisque** : "Base Amina 2024-2026, borne basse. Pilote à chiffrer
 
 chez vous."
**Durée**
**2 min strict**.
**Piège à éviter**
- Ne pas sous-estimer dans le chiffrage (prudent = perd en impact), ne pas surestimer (perd en crédibilité). **Borne basse + "à chiffrer chez vous"**.
- Ne pas dire "licensing", "coût", "abonnement" ici → c'est dans la FAQ ou
 le closing. **Ici c'est la projection, rien d'autre.**
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAM0lEQVR4nO3OMQ0AIAwAwZIgBKm1gjSMNCwYYCIkd9OP3zJzRMQMAAB+sfqJeroBAMCN2pTWBSSZVtjzAAAAAElFTkSuQmCC)
**BEAT 5 — Vision + roadmap (2 min)**
**Qui parle**
**Dom ou Amina** (au choix, Amina préférable si elle est à l'aise avec la
 
 technique), **court, honnête sur la maturité**.
**Message clé**
"On démarre sur les urgences. On n'est pas une techno générique. Et on est
 
 100 % local."
 
 
 
 
**Exemples de phrases à dire**
*"Deux choses importantes avant de conclure. Un : * ***Léa est 100 % locale*** *.* * * *Les données de vos patients * ***ne sortent jamais de votre SI*** *. Serveur sur* * * *site ou cloud souverain HDS, au choix. Pas de ChatGPT, pas de Claude, pas* * * *de Gemini. Tout est open source, tout tourne chez vous."*
*"Deux : on * ***ne promet pas*** * de faire tout tout de suite. On * ***démarre sur***
 ***les urgences*** *, parce que c'est là qu'Amina a l'expertise prouvée, et que* * * *l* *e ROI est évident. Après les urgences, dans l'ordre, on fera la*
 *facturation, puis la pharmacie, puis le codage hospitalisation. On*
 *n'essaie pas de tout faire en même temps."*
*"Pour le pilote : * ***6 à 8 semaines, 2 mois gratuits*** *, accompagnement*
 *direct par Amina et mon équipe. Après le pilote, on contractualise."*
**À l'écran pendant ce beat**
- **Slide 5** : "100 % local, 100 % souverain" (en gros) + petit schéma
 
 infrastructure simple (agent + serveur en dessous d'un cadenas)
- **Slide 6** : roadmap en 4 blocs — Urgences (2026) → Facturation (2027) →
 
 Pharmacie (2027) → Hospit. (2028)
**Durée**
**2 min strict**.
**Piège à éviter**
- Ne pas lister la roadmap interne détaillée (phases 0/1/2/3, apprentissage,
 
 etc.) → c'est du jargon interne, ils s'en fichent.
- Ne pas s'excuser de "on ne fait pas encore X" → transformer en
 
 "la prochaine étape c'est X".
 
 
 
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBACPiUML0NpGACyywEZJWQZeZ2aszAAD+4l6rrTq+ngAA8Nr1AL/SBEZwuCSwAAAAAElFTkSuQmCC)
**BEAT 6 — Closing Amina + appel à pilote (1 min)**
**Qui parle**
**Amina seule**, debout, direct caméra/salle.
**Message clé**
"Qui veut qu'on mesure ensemble ce qu'on laisse sur la table chez vous ?"
**Exemples de phrases à dire**
*"On cherche * ***3 à 5 cliniques*** * pour démarrer un pilote, entre mai et*
 *juin. Vous nous donnez un mois de dossiers urgences, nous, on vous*
 *chiffre exactement ce que vous pourriez récupérer. * ***Sans engagement de*** *** *** ***contrat*** *. Si après un mois on n'a rien trouvé, on repart. Si on trouve,* * * *vous savez combien ça vaut pour vous."*
*"Je suis là pendant toute la pause. Venez me voir. On regarde ensemble* * * *sur votre cas précis."*
*"Merci."*
 
**À l'écran pendant ce beat**
- **Slide 7** (final, restera à l'écran pendant la pause) :
- "Pilote 6-8 semaines, 2 mois gratuits"
- Coordonnées Amina + Dom (mail, téléphone)
- QR code vers une landing page pour prendre RDV
**Durée**
**1 min strict**. Amina **ne** prend **pas** de questions depuis la scène,
 
 les questions se font à la pause en one-to-one. **Pourquoi** : les questions
 
 publiques attirent toujours le RPA-expert sceptique qui peut plomber
 
 l'ambiance. Off-stage, on gère en tête-à-tête.
 
**Piège à éviter**
- Ne pas ouvrir un Q&R ouvert plénière → trop de risques, durée non maîtrisée.
- Ne pas dire "merci pour votre attention" mièvre → c'est sec, c'est franc.
 
 "Venez me voir. »
 
- Ne pas oublier de dire **"sans engagement"** — c'est ce qui débloque le
 
 DG hésitant.
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBCkLfFR7wwIgHRiywEZJWQZeZ2ao9AAD+4lyruzq+ngAA8Nr1AOIEBeX8aGZPAAAAAElFTkSuQmCC)
**ANNEXE A — Phrases toxiques à bannir**
- "On est encore en bêta." / "C'est un prototype."
- "On a rencontré quelques difficultés techniques." / "Ça ne marche pas
 toujours."
- "On est une petite équipe." / "On est une startup qui débute."
- "Nos concurrents font mieux sur X."
- "UiPath c'est du passé." (trop arrogant, les RPA-experts dans la salle
 
 l'ont payé cher, ne pas insulter leur choix)
- "Il faudra qu'on teste chez vous." (à remplacer par "le pilote est fait
 
 pour ça, on chiffre ensemble")
- "Ça dépend." (tuer ce réflexe — toujours répondre par une borne concrète
 
 même approximative)
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAM0lEQVR4nO3OUQmAQBBAwSdcjsu6HYxoDsEK/okwk2COmdnVGQAAf3GtalX76wkAAK/dDxFWBDkFf6+SAAAAAElFTkSuQmCC)
**ANNEXE B — Phrases magiques à caser**
- **"Vos données ne sortent pas de votre SI. 100 % local."** (beat 5)
- **"150 000 €/mois prouvés sans IA. Imaginez avec."** (beat 1)
- **"On ne remplace pas la TIM, on lui enlève les corvées."** (si question
 
 RH)
- **"Filet de sécurité, pas remplacement."** (si question médecin/humain)
- **"Sans engagement, 2 mois gratuits."** (beat 6)
- **"On chiffre chez vous, pas en PowerPoint."** (si DG sceptique)
- **"Léa, c'est Amina. En plus rapide, 24 h/24."** (accroche beat 1)
- **"Ce n'est pas une économie, c'est de l'argent qui vous revient de**
 **
 droit."** (beat 4)
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAnEAAAACCAYAAAA3pIp+AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAANklEQVR4nO3OMQ2AABAAsSNBACPykMH4NpGACyywEZJWQZeZ2aszAAD+4l6rrTo+jgAA8N71AL/CBEiG5xPoAAAAAElFTkSuQmCC)
**ANNEXE C — Check-list matériel (48 h avant)**
**Technique**
- PC démo testé (autonomie 2 h, adaptateur écran HDMI + mini-DP)
- Connexion au serveur Léa testée **depuis le lieu de démo** (wifi
 
 local si possible, 4G backup)
- Agent Léa installé sur le PC démo, test complet de 15 min la veille
- **Vidéo de backup** du scénario A enregistrée, dans un dossier
 
 accessible depuis le bureau (raccourci visible)
- Deuxième PC de backup (au cas où le principal plante)
- Câble Ethernet + switch portable (si wifi instable)
- Mode avion sur tous les téléphones du binôme pendant la démo
**Slides**
- Slides exportées en PDF (backup si PowerPoint plante)
- Slides sur clé USB + cloud (double backup)
- Slides testées sur le projecteur du lieu (résolution, couleurs)
**Logistique**
- Arrivée 1 h avant minimum (pas 30 min — trop juste)
- Café/eau pour Amina avant la prise de parole
- Téléphone Dom + Amina muets
- QR code de la slide 7 testé (scanner avec un vrai téléphone, pas
 juste en preview)
**Contenu**
- Corpus de 30 dossiers fictifs urgences validé avec la TIM
- Chiffres de la slide 4 recalculés et validés à 2 par Amina + Dom
- FAQ experts RPA relue, les 5 questions probables identifiées
- Script de pitch répété **au moins 2 fois** en binôme la veille
- Qui fait quoi à chaque beat écrit sur une fiche cartonnée (Amina
 aime avoir ça en poche)
 
 
**Après la démo**
- Feuille d'émargement des DG intéressés (pré-imprimée, pas de Google
 
 Form)
- Agenda de RDV pilote partagé Amina + Dom, à remplir à chaud pendant
 la pause
- Mail de suivi prêt, à envoyer dans les 24 h (template à préparer
 à l'avance)

View File

@@ -0,0 +1,269 @@
# Evaluation exhaustive des blocs VWB -- Demo 26 avril 2026
**Date** : 13 avril 2026
**Objectif** : Savoir exactement ce qui marche, ce qui est stub, ce qui manque.
---
## Section A -- Inventaire complet des blocs (37 blocs)
### SOURIS (7 blocs)
| Bloc | action_type | Backend execute.py | Backend BaseVWBAction | Fonctionnel ? |
|------|-------------|--------------------|-----------------------|---------------|
| Clic | click_anchor | OUI (basic + vision) | OUI (VWBClickAnchorAction) | OUI |
| Double-clic | double_click_anchor | OUI | OUI (VWBDoubleClickAnchorAction) | OUI |
| Clic droit | right_click_anchor | OUI | OUI (VWBRightClickAnchorAction) | OUI |
| Survol | hover_anchor | NON dans execute.py | OUI (VWBSurvolElementAction) | PARTIEL -- pas wire dans l'executeur lineaire |
| Glisser-deposer | drag_drop_anchor | NON dans execute.py | OUI (VWBGlisserDeposerAction) | PARTIEL -- idem |
| Defiler vers | scroll_to_anchor | NON dans execute.py | OUI (VWBScrollToAnchorAction) | PARTIEL -- idem |
| Focus | focus_anchor | NON dans execute.py | OUI (VWBFocusAnchorAction) | PARTIEL -- idem |
**Diagnostic** : Seuls click, double-click, right-click sont cables dans `execute_action()`. Les 4 autres ont des classes backend mais ne sont pas dispatches a l'execution.
### CLAVIER (3 blocs)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Saisir texte | type_text | OUI (safe_type_text AZERTY) | OUI |
| Saisir secret | type_secret | OUI (VWBTypeSecretAction) | OUI (via credential_vault) |
| Raccourci clavier | keyboard_shortcut | OUI (pyautogui.hotkey) | OUI |
**Diagnostic** : Les 3 fonctionnent. `type_text` supporte la substitution `{{variable}}`.
### ATTENTE (1 bloc)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Attendre element | wait_for_anchor | OUI (time.sleep) | PARTIEL -- fait un sleep, pas de detection visuelle d'apparition |
**Diagnostic** : Fonctionne comme un timer, mais ne fait PAS de polling visuel "attendre que l'element apparaisse". Le DAGExecutor le traite comme un StepType.WAIT.
### DONNEES (7 blocs)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Extraire texte | extract_text | VWBExtractTextAction | **STUB** -- `_find_visual_element` retourne random, `_perform_ocr_extraction` retourne du texte hardcode |
| Extraire tableau | extract_table | VWBExtraireTableauAction | **OPERATIONNEL** -- appel Ollama reel avec prompt structurel, fallback OCR |
| Capture preuve | screenshot_evidence | VWBScreenshotEvidenceAction | OUI |
| Telecharger | download_to_folder | VWBTelechargerVersDossierAction | A verifier -- fichier existe |
| Sauvegarder BDD | db_save_data | VWBSauvegarderDonneesAction | **OPERATIONNEL** -- SQLite via GestionnaireDB |
| Lire BDD | db_read_data | VWBChargerDonneesAction | **OPERATIONNEL** -- SQLite via GestionnaireDB |
| Importer Excel | import_excel | ExcelImporter (core/data/) | **OPERATIONNEL** -- import .xlsx dans SQLite, detection de types |
### BOUCLE DONNEES (1 bloc)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Pour chaque ligne | db_foreach | DBIterator + DAG sub-execution | **OPERATIONNEL** -- itere sur table SQLite, injecte `${current_row.colonne}`, execute sous-DAG par ligne |
**Diagnostic** : Le pipeline `import_excel` -> `db_foreach` est completement implemente dans `dag_execute.py`. C'est le mecanisme de boucle de donnees le plus mature du projet.
### LOGIQUE (2 blocs)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Condition visuelle | visual_condition | DAGExecutor (StepType.CONDITION) | **PARTIEL** -- le DAGExecutor evalue la condition via `safe_eval_condition`, mais le frontend n'a pas de vrai branchement visuel (edges on_found/on_not_found) |
| Boucle visuelle | loop_visual | **AUCUN** | **NON IMPLEMENTE** -- present dans la palette, aucun handler backend |
**Diagnostic** : `visual_condition` a un squelette dans le DAGExecutor mais n'est pas connecte a la detection visuelle "est-ce que l'ancre est visible ?". `loop_visual` est un **placeholder UI pur** -- aucun code backend.
### IA (6 blocs)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| OCR Intelligent | ai_ocr | Non cable | **NON** -- pas de handler |
| Resume IA | ai_summarize | Non cable | **NON** -- pas de handler |
| Extraction IA | ai_extract | Non cable | **NON** -- pas de handler |
| Classification IA | ai_classify | Non cable | **NON** -- pas de handler |
| Analyse complete | ai_analyze_text | **OUI** (execute_ai_analyze) | **OPERATIONNEL** -- appel Ollama reel, mode texte + mode image, variables {{}} |
| IA Personnalisee | ai_custom | Non cable | **NON** -- pas de handler |
**Diagnostic** : Seul `ai_analyze_text` est cable et fonctionnel. Les 5 autres sont des placeholders. Ils pourraient tous passer par `execute_ai_analyze` avec des prompts differents -- c'est 1-2 jours de travail.
### IA / LLM (4 blocs -- DAGExecutor)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Analyser texte | llm_analyze | LLMActionHandler.analyze_text | **OPERATIONNEL** -- Ollama /api/chat |
| Traduire | llm_translate | LLMActionHandler.translate | **OPERATIONNEL** -- Ollama /api/chat |
| Extraire donnees | llm_extract_data | LLMActionHandler.extract_data | **OPERATIONNEL** -- JSON schema extraction |
| Generer texte | llm_generate | LLMActionHandler.generate_text | **OPERATIONNEL** -- Ollama /api/chat |
**Diagnostic** : Les 4 blocs LLM/DAG sont completement operationnels. Execution parallele via ThreadPool. Injection de resultats `${step_id.result}`.
### FICHIERS (5 blocs)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Lister dossier | file_list_dir | FileActionHandler._list_dir | **OPERATIONNEL** -- avec securite path traversal |
| Creer dossier | file_create_dir | FileActionHandler._create_dir | **OPERATIONNEL** |
| Deplacer fichier | file_move | FileActionHandler._move_file | **OPERATIONNEL** |
| Copier fichier | file_copy | FileActionHandler._copy_file | **OPERATIONNEL** |
| Classer par ext | file_sort_by_ext | FileActionHandler._sort_by_extension | **OPERATIONNEL** |
**Diagnostic** : Les 5 blocs fichiers sont implementes dans `file_actions.py` avec validation de securite. Mais ils ne sont pas dispatches dans `execute_action()` (executeur lineaire) -- seulement accessibles via le DAGExecutor (les types sont declares dans `_FILE_ACTION_TYPES` de `dag_execute.py`, mais le dispatch dans `_execute_ui_step` du DAG passe par le `ui_handler` qui n'a pas de logique pour les fichiers). **Il faut cabler le dispatch.**
### VALIDATION (2 blocs)
| Bloc | action_type | Backend | Fonctionnel ? |
|------|-------------|---------|---------------|
| Verifier presence | verify_element_exists | VWBVerifyElementExistsAction | PARTIEL -- classe existe, pas cable dans execute_action |
| Verifier texte | verify_text_content | VWBVerifyTextContentAction | **OPERATIONNEL** -- OCR via Ollama + docTR, matching multi-mode |
---
## Section B -- Blocs operationnels (prets pour la demo)
### Pret a l'emploi (17 blocs)
1. **click_anchor** -- Clic gauche (basic + vision intelligente + self-healing)
2. **double_click_anchor** -- Double-clic
3. **right_click_anchor** -- Clic droit
4. **type_text** -- Saisie texte (AZERTY, variables {{var}})
5. **type_secret** -- Saisie mot de passe (credential vault)
6. **keyboard_shortcut** -- Raccourci clavier
7. **ai_analyze_text** -- Analyse IA (Ollama, mode texte + image)
8. **llm_analyze** -- Analyse LLM parallele
9. **llm_translate** -- Traduction LLM
10. **llm_extract_data** -- Extraction structuree JSON
11. **llm_generate** -- Generation texte
12. **import_excel** -- Import Excel dans SQLite
13. **db_foreach** -- Boucle sur table (injection ${current_row.col})
14. **db_save_data** -- Sauvegarde BDD (cle-valeur + collections)
15. **db_read_data** -- Lecture BDD
16. **extract_table** -- Extraction tableau (Ollama VLM)
17. **verify_text_content** -- Verification texte (OCR Ollama + docTR)
### Pipeline data-loop fonctionnel
Le chemin **import_excel -> db_foreach -> (sous-workflow par ligne)** est completement implemente et teste dans `dag_execute.py` :
- Upload Excel via `/api/v3/upload-excel`
- Import automatique dans SQLite
- Iteration avec injection de colonnes
- Sous-DAG execute par ligne (LLM parallele + UI sequentiel)
---
## Section C -- Blocs a completer (effort estime)
| Bloc | Ce qui manque | Effort |
|------|---------------|--------|
| hover_anchor | Ajouter `elif action_type == 'hover_anchor'` dans execute_action() avec pyautogui.moveTo() | 0.5h |
| drag_drop_anchor | Ajouter dispatch + pyautogui.moveTo + drag | 1h |
| scroll_to_anchor | Ajouter dispatch + pyautogui.scroll() | 0.5h |
| focus_anchor | Ajouter dispatch + pyautogui.click() | 0.5h |
| wait_for_anchor | Remplacer sleep par boucle de detection visuelle (screenshot + match) | 2-4h |
| extract_text | Remplacer le stub par un vrai appel OCR (Ollama VLM ou docTR) -- le pattern existe deja dans verify_text_content | 2-4h |
| visual_condition | Connecter la detection visuelle (ancre trouvee ?) au branchement du DAG + gerer les edges on_found/on_not_found dans le frontend | 1-2j |
| verify_element_exists | Cabler dans execute_action() -- la classe backend est prete | 1h |
| file_* (5 blocs) | Cabler le dispatch dans execute_action() ou dans le ui_handler du DAGExecutor | 2-4h |
| ai_ocr, ai_summarize, ai_extract, ai_classify, ai_custom | Creer des wrappers autour de execute_ai_analyze avec des prompts systeme specifiques | 1-2j |
---
## Section D -- Blocs manquants (a creer)
| Fonctionnalite | Description | Effort |
|----------------|-------------|--------|
| **loop_visual** (boucle visuelle) | Repeter tant qu'une ancre est visible. Necessite : boucle de detection + condition de sortie + limite iterations + gestion dans le DAG | 2-3j |
| **set_variable / get_variable** | Blocs explicites pour definir/lire des variables. Actuellement fait implicitement via output_variable dans les params -- pas de bloc dedie | 0.5j (optionnel) |
| **Export CSV/Excel** | Exporter les resultats dans un fichier. Pas de bloc dedie. | 1j |
| **Envoyer email** | Notification des resultats. Absent. | 1-2j |
| **Attente conditionnelle** | wait_until_text("Chargement termine", timeout=30s). Combine wait + OCR. | 1-2j |
---
## Section E -- Faisabilite des 3 cas d'usage
### Cas A : "Traite toutes les factures du mois"
**Besoins** : variable mois, boucle sur factures, extraction montant
| Composant | Bloc VWB | Statut |
|-----------|----------|--------|
| Importer la liste de factures | import_excel | VERT |
| Boucler sur chaque facture | db_foreach | VERT |
| Ouvrir chaque facture (clic) | click_anchor | VERT |
| Extraire le montant (OCR) | extract_text | **ORANGE** -- stub, mais extract_table + ai_analyze_text fonctionnent |
| Saisir dans le SI | type_text + {{current_row.montant}} | VERT |
| Sauvegarder le resultat | db_save_data | VERT |
**Verdict : ORANGE -- faisable avec 2-4h de travail** pour remplacer le stub extract_text par un appel Ollama VLM (le pattern existe dans extract_table et verify_text_content).
**Alternative immediate** : utiliser `ai_analyze_text` avec un prompt "Extrait le montant de cette facture" au lieu de extract_text. Fonctionne aujourd'hui.
### Cas B : "Recupere tous les CR de tous les dossiers de la journee"
**Besoins** : variable date_jour, iterateur sur dossiers, extraction CR, stockage
| Composant | Bloc VWB | Statut |
|-----------|----------|--------|
| Importer la liste de dossiers | import_excel ou db_read_data | VERT |
| Boucler sur chaque dossier | db_foreach | VERT |
| Naviguer vers le dossier (clics) | click_anchor + type_text | VERT |
| Extraire le CR (texte) | ai_analyze_text (mode image) | VERT |
| Sauvegarder le CR | db_save_data | VERT |
| Variable date du jour | Pas de bloc dedie, mais {{date_jour}} dans type_text marche si variable initialisee | VERT (si pre-setee) |
**Verdict : VERT -- faisable avec l'existant.** Le chemin complet import_excel -> db_foreach -> (navigation + extraction IA + sauvegarde) est operationnel. La variable date_jour doit etre initialisee au debut du workflow (via le VariableManager du frontend).
### Cas C : "Code les diagnostics de ce dossier patient"
**Besoins** : extraction texte medical, appel LLM pour CIM-10, saisie dans le DPI
| Composant | Bloc VWB | Statut |
|-----------|----------|--------|
| Ouvrir le dossier patient | click_anchor | VERT |
| Extraire le texte medical | ai_analyze_text (mode image, prompt: "Extrait le texte medical") | VERT |
| Suggerer codes CIM-10 | llm_analyze (prompt: "Propose les codes CIM-10 pour ce texte") | VERT |
| Afficher/valider la suggestion | Pas de bloc "dialogue humain" -- necessite le mode supervised | **ORANGE** -- le mode `paused_need_help` existe dans l'executeur |
| Saisir les codes dans le DPI | type_text + clic | VERT |
**Verdict : ORANGE -- faisable pour la demo avec 1j de preparation.** La chaine extraction -> LLM CIM-10 -> saisie fonctionne. Le maillon faible est la validation humaine intermediaire -- mais pour une demo, on peut le montrer en mode step-by-step (pause entre etapes).
---
## Section F -- Recommandation pour la demo du 26 avril
### A montrer en live (confiance haute)
1. **Workflow record-and-replay basique** : clic -> saisie texte -> raccourci clavier. Fonctionne deja.
2. **Pipeline data-loop Excel** : importer un fichier Excel de 5-10 lignes, boucler avec db_foreach, remplir un formulaire web par ligne. C'est le cas d'usage le plus impressionnant et le plus solide techniquement. **Preparer un formulaire web simple ou utiliser un outil metier reel.**
3. **Extraction + IA** : capturer un ecran d'application, lancer ai_analyze_text pour extraire des informations, montrer le resultat en temps reel. Parfait pour le cas "codage diagnostique".
4. **Execution DAG parallele** : montrer que pendant qu'un LLM analyse un texte (10-30s), le workflow continue a executer d'autres taches. Visuellement impressionnant quand on voit les etapes s'allumer en parallele.
### A preparer avant la demo (effort minimal)
| Tache | Effort | Impact demo |
|-------|--------|-------------|
| Cabler hover/scroll/focus dans execute_action | 2h | Proprete (eviter un plantage si utilise par erreur) |
| Cabler les file_* dans le dispatch | 2h | Permet de montrer la gestion de fichiers |
| Remplacer le stub extract_text par un vrai OCR | 4h | Permet d'utiliser ce bloc au lieu du workaround ai_analyze_text |
| Preparer 2-3 workflows de demo pre-configures | 4h | **Indispensable** |
| Tester E2E sur un outil metier reel (DPI, Excel, Webapp) | 8h | **Indispensable** |
### A ne PAS montrer (risque de plantage)
- **loop_visual** : pas implemente, aucun backend
- **ai_ocr, ai_summarize, ai_extract, ai_classify, ai_custom** : pas cables -- utiliser ai_analyze_text ou les blocs llm_* a la place
- **visual_condition** : le branchement conditionnel n'est pas fiable -- le frontend ne gere pas les edges multiples proprement
### A promettre comme roadmap
- Boucles visuelles intelligentes (loop_visual) : Q3 2026
- Conditions visuelles avec branchement dans le canvas : Q3 2026
- Export automatique CSV/Excel des resultats : Q2 2026 (facile)
- Notifications email en fin de workflow : Q2 2026
- Les 5 blocs IA manquants sont des variations de prompt -- livraison rapide apres la demo
### Resumme
Sur 37 blocs dans la palette :
- **17 sont operationnels** (46%)
- **10 sont partiellement implementes** (27%) -- necessitent du cablage (heures)
- **10 sont des placeholders** (27%) -- necessitent du developpement (jours)
Le pipeline le plus impressionnant pour la demo est le **data-loop** (import_excel + db_foreach + LLM parallele) -- c'est le seul qui est 100% fonctionnel de bout en bout pour un cas d'usage concret de type "traiter N dossiers".

View File

@@ -0,0 +1,306 @@
# Architecture de Configuration Agent -- Serveur
**Date** : 2026-04-13
**Auteur** : Analyse automatique (Claude)
**Statut** : Diagnostic + recommandation -- PAS de code modifie
---
## 1. Schema de la chaine de configuration
```
config.txt (fichier plat sur le poste Windows)
|
| Lea.bat (for /f "eol=# tokens=1,* delims==" => set)
v
Variables d'environnement du process Python
|
+---> agent_v1/config.py
| SERVER_URL = os.getenv("RPA_SERVER_URL", "http://localhost:5005/api/v1")
| STREAMING_ENDPOINT = f"{SERVER_URL}/traces/stream"
| API_TOKEN = os.environ.get("RPA_API_TOKEN", "")
|
+---> lea_ui/server_client.py
| _stream_base = RPA_SERVER_URL (si defini) OU http://{RPA_SERVER_HOST}:{5005}
| Utilise _stream_base + "/api/v1/traces/stream/..." (chemin COMPLET en dur)
|
+---> agent_v1/main.py
| _background_heartbeat_loop : utilise SERVER_URL DIRECTEMENT (pas STREAMING_ENDPOINT)
| _replay_poll_loop : passe SERVER_URL a executor.poll_and_execute()
|
+---> agent_v1/core/executor.py
poll_and_execute : construit f"{server_url}/traces/stream/replay/next"
_server_resolve_target : construit f"{server_url}/traces/stream/replay/resolve_target"
_observe_screen : construit f"{server_url}/traces/stream/replay/pre_analyze"
```
### Cote serveur (generation du config.txt)
```
web_dashboard/app.py
|
+---> _RPA_PUBLIC_URL = RPA_PUBLIC_URL ou RPA_SERVER_URL ou "https://lea.labs.laurinebazin.design"
+---> _build_custom_config(machine_id, user_name, token)
| server_url = _RPA_PUBLIC_URL.rstrip("/")
| if not server_url.endswith("/api/v1"):
| server_url += "/api/v1" <=== CORRECTIF RECENT (fonctionne)
| -> RPA_SERVER_URL={server_url}
| -> RPA_SERVER_HOST={host sans schema ni path}
|
+---> deploy/lea_package/config.txt (template statique dans le repo)
+---> deploy/installer/config_template.txt (template pour installeur Inno Setup)
```
### Cote serveur (routes FastAPI, port 5005)
```
agent_v0/server_v1/api_stream.py
|
+---> TOUTES les routes sous /api/v1/traces/stream/...
| /register, /event, /image, /finalize, /replay/next, etc.
|
+---> /health (public, a la racine)
|
+---> Middleware url_compat_rewrite :
/traces/stream/... => /api/v1/traces/stream/...
```
---
## 2. Inventaire des incoherences
### INC-1 : Deux systemes paralleles de resolution d'URL (CRITIQUE)
**Fichiers concernes** :
- `agent_v0/agent_v1/config.py` (ligne 43-45) : `SERVER_URL` = URL complete avec `/api/v1` ; `STREAMING_ENDPOINT = SERVER_URL + "/traces/stream"`
- `agent_v0/lea_ui/server_client.py` (ligne 77-81) : `_stream_base` = `RPA_SERVER_URL` BRUTE (sans garantie de `/api/v1`) ; utilise ensuite `_stream_base + "/api/v1/traces/stream/..."` (chemin complet en dur)
**Probleme** : Si `RPA_SERVER_URL=https://lea.labs.laurinebazin.design/api/v1` :
- `config.py` produit `STREAMING_ENDPOINT = .../api/v1/traces/stream` (CORRECT)
- `server_client.py` produit `_stream_base/api/v1/traces/stream/...` = `.../api/v1/api/v1/traces/stream/...` (DOUBLE `/api/v1` !)
Si `RPA_SERVER_URL=https://lea.labs.laurinebazin.design` :
- `config.py` produit `STREAMING_ENDPOINT = .../traces/stream` (MANQUE `/api/v1`)
- `server_client.py` produit `_stream_base/api/v1/traces/stream/...` (CORRECT)
**Il n'existe aucune valeur de `RPA_SERVER_URL` qui fasse fonctionner les deux modules simultanement.**
### INC-2 : `_background_heartbeat_loop` utilise `SERVER_URL` au lieu de `STREAMING_ENDPOINT`
**Fichier** : `agent_v0/agent_v1/main.py` (ligne 370)
```python
req.post(f"{SERVER_URL}/traces/stream/image", ...)
```
`SERVER_URL` = `http://localhost:5005/api/v1` => URL finale = `/api/v1/traces/stream/image` (CORRECT).
Mais c'est un accident : le heartbeat bypasse `STREAMING_ENDPOINT` (`SERVER_URL + "/traces/stream"`) et reconstruit son propre chemin. Le meme pattern se retrouve dans `executor.py` qui recoit `server_url` (= `SERVER_URL`) et construit `f"{server_url}/traces/stream/replay/next"`.
**Consequence** : Deux conventions coexistent :
1. `STREAMING_ENDPOINT + "/register"` (streamer.py) -- attend que `SERVER_URL` contienne `/api/v1`
2. `SERVER_URL + "/traces/stream/image"` (main.py, executor.py) -- attend aussi que `SERVER_URL` contienne `/api/v1`
Aujourd'hui les deux marchent parce que `SERVER_URL` inclut `/api/v1`. Mais `server_client.py` utilise une troisieme convention (chemin complet en dur), d'ou l'INC-1.
### INC-3 : `LeaServerClient.check_connection()` appelle `/health` sur `_stream_base`
**Fichier** : `agent_v0/lea_ui/server_client.py` (ligne 161)
```python
resp = requests.get(f"{self._stream_base}/health", ...)
```
Si `_stream_base = "https://lea.labs.laurinebazin.design/api/v1"`, l'URL finale est `/api/v1/health` -- **cette route n'existe pas**. La route sante est `GET /health` (racine).
Si `_stream_base = "https://lea.labs.laurinebazin.design"`, l'URL finale est `/health` -- OK.
Encore un conflit : `server_client.py` attend une URL **sans** `/api/v1`, `config.py` la fournit **avec**.
### INC-4 : Template `deploy/lea_package/config.txt` contient de vrais secrets
**Fichier** : `deploy/lea_package/config.txt` (ligne 19)
```
RPA_API_TOKEN=86031addb338e449fccdb1a983f61807aec15d42d482b9c7748ad607dc23caab
```
Ce fichier est versionne dans Git. Le token reel est en clair dans le repo.
### INC-5 : Copie ancienne non maintenue (`agent_v0/deploy/windows_client/`)
**Fichier** : `agent_v0/deploy/windows_client/config.py` (ligne 41)
```python
SERVER_URL = os.getenv("RPA_SERVER_URL", "http://localhost:8000/api/traces/upload")
```
Cette copie pointe encore sur l'ancien serveur API (port 8000, endpoint `/api/traces/upload`). Completement obsolete. Idem pour `agent_v0/config.py` (ligne 41).
### INC-6 : `RPA_SERVER_HOST` sert a deux choses incompatibles
- **`server_client.py`** : utilise `RPA_SERVER_HOST` comme **hostname nu** (ex: `192.168.1.40` ou `lea.labs.laurinebazin.design`) pour construire `http://{host}:5005`
- **`executor.py`** : utilise `RPA_SERVER_HOST` pour construire des URLs **Ollama** (`http://{host}:11434/api/chat`)
- **`main.py`** (ligne 94-95) : passe `RPA_SERVER_HOST` comme `server_host` au `LeaServerClient` et au `ChatWindow`
Le `config.txt` genere par Fleet met `RPA_SERVER_HOST=lea.labs.laurinebazin.design`. Cela provoque :
- `executor.py` tente `http://lea.labs.laurinebazin.design:11434/api/chat` -- **Ollama n'est pas expose sur Internet** (echec silencieux)
### INC-7 : Redirect POST -> GET (Bug 3, non resolu cote client)
La lib Python `requests` suit les redirections 301/302 en transformant les POST en GET (RFC 7231). Quand NPM redirige `http://` vers `https://`, tous les POST streaming (register, event, image, finalize) deviennent des GET et recevront un 405.
**Aucune protection cote client**. Le middleware serveur `url_compat_rewrite` ne resout que le probleme de path (pas le probleme de schema HTTP/HTTPS).
---
## 3. Recommandation architecturale
### Principe : une seule variable, deux composants
```
RPA_SERVER_URL = URL complete incluant le prefixe API
Exemples :
http://localhost:5005/api/v1 (dev local)
http://192.168.1.40:5005/api/v1 (LAN)
https://lea.labs.laurinebazin.design/api/v1 (Internet)
```
**Toutes les URLs de l'agent sont construites par concatenation de `SERVER_URL` + suffixe de route** :
```python
# config.py
SERVER_URL = os.getenv("RPA_SERVER_URL", "http://localhost:5005/api/v1")
# Pour le health-check (route a la racine, pas sous /api/v1) :
SERVER_BASE = SERVER_URL.rsplit("/api/v1", 1)[0] # ex: "https://lea.labs.laurinebazin.design"
# streamer.py, executor.py, main.py : tous utilisent
STREAMING_ENDPOINT = f"{SERVER_URL}/traces/stream" # inchange
HEALTH_ENDPOINT = f"{SERVER_BASE}/health" # NOUVEAU
# server_client.py : supprimer le systeme parallele
# _stream_base = SERVER_URL (plus de re-concatenation de "/api/v1" en dur)
```
### Supprimer `RPA_SERVER_HOST`
Cette variable est source de confusion (INC-6). Elle ne doit pas exister. Le hostname est derive de `RPA_SERVER_URL` si besoin (pour l'affichage dans la chat window, etc.).
L'acces Ollama doit avoir sa propre variable `RPA_OLLAMA_HOST` (defaut : `localhost`), car Ollama n'est JAMAIS accessible via le reverse proxy Internet.
### Protection POST -> GET
Ajouter dans `streamer.py` et `executor.py` :
```python
# Dans chaque session requests :
session = requests.Session()
session.max_redirects = 0 # Refuser les redirections (echouer bruyamment)
```
Ou forcer `https://` cote client si le host est un domaine public (pas localhost/IP privee).
### Template config.txt
```
RPA_SERVER_URL=CONFIGURE_ME
RPA_API_TOKEN=CONFIGURE_ME
RPA_MACHINE_ID=CONFIGURE_ME
```
Pas de token reel, pas de valeur par defaut fonctionnelle. L'agent doit refuser de demarrer si `RPA_SERVER_URL` contient "CONFIGURE_ME".
---
## 4. Matrice scenarios x configuration
| Scenario | RPA_SERVER_URL | RPA_API_TOKEN | Notes |
|---|---|---|---|
| Dev local (meme machine) | `http://localhost:5005/api/v1` | (vide ou token dev) | RPA_AUTH_DISABLED=true cote serveur |
| LAN interne (Dom <-> VM) | `http://192.168.1.40:5005/api/v1` | token prod | HTTP OK en LAN ferme |
| Internet via NPM (TIM) | `https://lea.labs.laurinebazin.design/api/v1` | token prod | HTTPS obligatoire, pas de redirect |
| Futur DGX on-premise | `http://<ip_dgx>:5005/api/v1` ou `https://...` | token prod | Selon reseau client |
---
## 5. Liste des fichiers a corriger
### Priorite HAUTE (bloquant pour le deploiement TIM)
| Fichier | Ligne(s) | Action |
|---|---|---|
| `agent_v0/lea_ui/server_client.py` | 77-81, 161, 230, 287, 321, 349 | Supprimer la double logique `_stream_base`. Utiliser `SERVER_URL` de config.py comme base, ne plus concatener `/api/v1` en dur dans les appels. Pour `/health`, utiliser `SERVER_BASE` (sans `/api/v1`). |
| `agent_v0/agent_v1/main.py` | 94-95 | Supprimer l'utilisation de `RPA_SERVER_HOST` pour construire le `LeaServerClient`. Passer `SERVER_URL` directement. |
| `agent_v0/agent_v1/main.py` | 370 | Utiliser `STREAMING_ENDPOINT` au lieu de reconstruire le chemin manuellement. |
| `agent_v0/agent_v1/network/streamer.py` | 34 | Aucun changement (utilise deja `STREAMING_ENDPOINT` correctement). |
| `deploy/lea_package/config.txt` | 14, 19, 20 | Remplacer les valeurs par des placeholders `CONFIGURE_ME`. Supprimer le token reel. |
| `deploy/installer/config_template.txt` | 26-27 | Idem, remplacer le token reel par un placeholder. |
### Priorite MOYENNE (coherence du codebase)
| Fichier | Ligne(s) | Action |
|---|---|---|
| `agent_v0/agent_v1/config.py` | 43-45 | Ajouter `SERVER_BASE` (URL sans `/api/v1`) pour le health-check. |
| `agent_v0/agent_v1/core/executor.py` | 1144, 1280, 1595 | Remplacer `RPA_SERVER_HOST` par une nouvelle var `RPA_OLLAMA_HOST` (defaut `localhost`). |
| `web_dashboard/app.py` | 2055-2060 | Renommer `_RPA_PUBLIC_URL` en `_RPA_PUBLIC_SERVER_URL`. S'assurer que le `/api/v1` est toujours present dans le config.txt genere (deja fait, ligne 2097-2098). |
| `web_dashboard/app.py` | 2119 | Supprimer la ligne `RPA_SERVER_HOST=` du config.txt genere. |
### Priorite BASSE (nettoyage)
| Fichier | Action |
|---|---|
| `agent_v0/config.py` | Supprimer ou marquer deprecated (ancien agent V0, port 8000). |
| `agent_v0/deploy/windows_client/` | Supprimer l'arborescence entiere (copie obsolete, remplacee par le ZIP Fleet). |
| `agent_v0/deploy/windows_client/config.py` | Port 8000, endpoint `/api/traces/upload` -- completement mort. |
### Protection anti-redirect (Bug 3)
| Fichier | Action |
|---|---|
| `agent_v0/agent_v1/network/streamer.py` | Utiliser `requests.Session()` avec `max_redirects=0` ou forcer HTTPS si domaine public. |
| `agent_v0/agent_v1/core/executor.py` | Idem pour les appels HTTP du replay (resolve_target, pre_analyze, replay/next, replay/result). |
---
## 6. Diagramme de flux (etat cible)
```
config.txt (genere par Fleet ou rempli a la main)
|
| RPA_SERVER_URL=https://lea.labs.laurinebazin.design/api/v1
| RPA_API_TOKEN=<token>
| RPA_MACHINE_ID=<id>
| (plus de RPA_SERVER_HOST)
|
v
Lea.bat -> set variables d'environnement
|
v
agent_v1/config.py
| SERVER_URL = "https://lea.labs.laurinebazin.design/api/v1"
| SERVER_BASE = "https://lea.labs.laurinebazin.design"
| STREAMING_ENDPOINT = "https://lea.labs.laurinebazin.design/api/v1/traces/stream"
| HEALTH_ENDPOINT = "https://lea.labs.laurinebazin.design/health"
|
+-------> streamer.py : STREAMING_ENDPOINT + "/register", "/event", "/image", "/finalize"
+-------> main.py : STREAMING_ENDPOINT + "/image" (heartbeat)
| SERVER_URL (passe a executor.poll_and_execute)
+-------> executor.py : SERVER_URL + "/traces/stream/replay/next", etc.
+-------> server_client.py : SERVER_URL + "/traces/stream/workflows", etc.
| HEALTH_ENDPOINT (pour check_connection)
|
v (HTTPS, port 443)
NPM Reverse Proxy
|
v (HTTP, port 5005)
FastAPI api_stream.py
| /health
| /api/v1/traces/stream/register
| /api/v1/traces/stream/event
| /api/v1/traces/stream/image
| /api/v1/traces/stream/replay/next
| ...
```
---
## 7. Resume des bugs originaux et leur resolution
| Bug | Cause racine | Correction |
|---|---|---|
| Bug 1 (URL obsolete dans config.txt) | Template `deploy/lea_package/config.txt` jamais mis a jour | DEJA CORRIGE (le fichier actuel contient `/api/v1`). Mais le token reel est toujours en clair. |
| Bug 2 (mismatch /api/v1) | Deux modules (`config.py` vs `server_client.py`) avec des conventions incompatibles pour construire les URLs | Unifier sur une seule convention : `RPA_SERVER_URL` inclut TOUJOURS `/api/v1`. `server_client.py` doit utiliser `SERVER_URL` de `config.py` au lieu de reimplementer sa propre logique. |
| Bug 3 (POST -> GET sur redirect) | `requests` suit les 301 en changeant la methode HTTP | Forcer HTTPS cote client quand le domaine est public, OU desactiver les redirections (`max_redirects=0`) pour echouer explicitement. Le middleware serveur `url_compat_rewrite` est un filet de securite pour le path, pas pour le schema. |