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>
16 KiB
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)
- click_anchor -- Clic gauche (basic + vision intelligente + self-healing)
- double_click_anchor -- Double-clic
- right_click_anchor -- Clic droit
- type_text -- Saisie texte (AZERTY, variables {{var}})
- type_secret -- Saisie mot de passe (credential vault)
- keyboard_shortcut -- Raccourci clavier
- ai_analyze_text -- Analyse IA (Ollama, mode texte + image)
- llm_analyze -- Analyse LLM parallele
- llm_translate -- Traduction LLM
- llm_extract_data -- Extraction structuree JSON
- llm_generate -- Generation texte
- import_excel -- Import Excel dans SQLite
- db_foreach -- Boucle sur table (injection ${current_row.col})
- db_save_data -- Sauvegarde BDD (cle-valeur + collections)
- db_read_data -- Lecture BDD
- extract_table -- Extraction tableau (Ollama VLM)
- 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)
-
Workflow record-and-replay basique : clic -> saisie texte -> raccourci clavier. Fonctionne deja.
-
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.
-
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".
-
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".