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>
270 lines
16 KiB
Markdown
270 lines
16 KiB
Markdown
# 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".
|