22 KiB
Carte fonctionnelle RPA Vision V3 — 2026-05-08
Branche : feature/qw-suite-mai | HEAD : 731b5bcae
Vue produit (pas code). Inventaire des fonctionnalités telles qu'elles existent réellement dans le repo à cette date.
1. Modes opérationnels de Léa (agent_v1)
Le client Léa V1 (agent_v0/agent_v1/) n'expose pas d'enum MODE_* discret. Son comportement runtime est piloté par trois booléens cumulables dans AgentState (ui/shared_state.py) :
| Mode | Module(s) concerné(s) | Activation | Statut |
|---|---|---|---|
| Capture / enregistrement | ui/shared_state.py:30 (_recording), core/captor.py, vision/capturer.py |
Bouton "Démarrer" dans systray (smart_tray.py:377) ou ChatWindow → state.start_recording(name) |
actif |
| Replay (polling serveur) | main.py:130 (_replay_poll_loop), core/executor.py:510-1900 |
Boucle daemon permanente, lancée à l'init de AgentV1 indépendamment de toute session — poll GET /replay/next toutes les 1 s sur agent_{user_id} |
actif |
| Heartbeat permanent (background) | main.py:131 (_background_heartbeat_loop) |
Daemon permanent, screenshot toutes les 5 s vers POST /traces/stream/image (session bg_{machine_id}) |
actif |
| Heartbeat session | main.py:434 (_heartbeat_loop) |
Démarre seulement quand session_id actif (pendant un enregistrement) |
actif |
Watchdog fichier command.json |
main.py:247 (_command_watchdog_loop) |
Poll fichier C:\rpa_vision\command.json toutes les 1 s, exécute execute_normalized_order |
actif (legacy GHOST replay) |
| Capture à la demande HTTP | ui/capture_server.py |
Mini-serveur HTTP local port 5006 lancé au boot | actif |
| Auto-stop session | main.py:160 (_auto_stop_loop) |
Notifie 10 min avant et stoppe à MAX_SESSION_DURATION_S |
actif |
Modes "shadow / copilot / assisté / autonomous" : ils n'existent pas côté client Léa V1. Côté serveur, execution_mode est un paramètre de replay ("autonomous" par défaut, voir api_stream.py:2969, replay_engine.py:1520). Les valeurs détectées : "autonomous", "verified", "supervised" (déduit du test _exec_mode != "autonomous" à api_stream.py:2974). Le frontend VWB définit en plus 'basic' | 'intelligent' | 'debug' | 'verified' (types.ts:15) — ce sont des modes VWB, pas des modes Léa. [À VÉRIFIER PAR DOM]
Endpoints /api/v1/shadow/* (start/stop/feedback/build/understanding) existent côté serveur (api_stream.py:1661-1820) mais aucun n'est appelé depuis le client Léa V1 (grep dans agent_v0/agent_v1/ : zéro hit). [À VÉRIFIER PAR DOM]
2. Capacités du serveur (rpa-streaming + dépendances)
54 endpoints exposés par agent_v0/server_v1/api_stream.py.
2.1 Streaming session / heartbeat
POST /api/v1/traces/stream/register— Enregistrer une session (session_id + machine_id)POST /api/v1/traces/stream/event— Pousser un événement clavier/souris/fenêtrePOST /api/v1/traces/stream/image— Pousser un screenshot (heartbeat ou shot d'action)POST /api/v1/traces/stream/finalize— Clore une sessionGET /api/v1/traces/stream/processing/status— État de la file de traitementPOST /api/v1/traces/stream/processing/requeue— Re-traiter une session déjà finaliséeGET /api/v1/traces/stream/stats— Statistiques globales du serveurGET /api/v1/traces/stream/machines— Liste machines enrôléesGET /api/v1/traces/stream/sessions— Liste sessions (filtrable par machine_id)
2.2 Replay (next/report/resolve_target/pause)
POST /api/v1/traces/stream/replay— Lancer un replay depuis un workflow_idPOST /api/v1/traces/stream/replay/raw— Lancer un replay depuis une liste d'actions brutesPOST /api/v1/traces/stream/replay-session— Re-rejouer une session enregistréePOST /api/v1/traces/stream/replay/single— Enqueuer une action uniquePOST /api/v1/traces/stream/replay/plan— Lancer depuis un ExecutionPlan (V4)POST /api/v1/traces/stream/workflow/compile— Compiler session → WorkflowIR + ExecutionPlanGET /api/v1/traces/stream/replay/next— Action suivante à exécuter (pollée par Léa)POST /api/v1/traces/stream/replay/result— Rapport d'exécution d'une actionPOST /api/v1/traces/stream/replay/error_callback— Callback erreur configurableGET /api/v1/traces/stream/replay/{replay_id}— État d'un replayGET /api/v1/traces/stream/replays— Liste des replaysPOST /api/v1/traces/stream/replay/{replay_id}/resume— Reprendre après pause superviséePOST /api/v1/traces/stream/replay/{replay_id}/cancel— Annuler un replayPOST /api/v1/traces/stream/replay/resolve_target— Résoudre la position d'une ancre (cascade vLLM/Ollama)POST /api/v1/traces/stream/replay/pre_analyze— Pré-analyse de l'écran avant action
2.3 Extraction (text / table / décision T2A)
Pas d'endpoint HTTP dédié — ces actions sont enqueuées côté serveur via le replay et traitées sans round-trip Léa par replay_engine.py:_handle_extract_text_action / _handle_extract_table_action / _handle_t2a_decision_action (modules core/llm/ocr_extractor.py et core/llm/t2a_decision.py).
2.4 Federation / learning packs
GET /api/v1/traces/stream/learning-pack/export— Export anonymisé (par client_id)POST /api/v1/traces/stream/learning-pack/import— Import + merge dans FAISS global
2.5 Health / monitoring
GET /health— Healthcheck simpleGET /api/v1/traces/stream/workflows— Liste workflows visiblesPOST /api/v1/traces/stream/reload-workflows— Rechargement à chaudGET /api/v1/traces/stream/workflow/{workflow_id}— Détail workflowGET /api/v1/traces/stream/session/{session_id}— Détail sessionGET /api/v1/audit/history— Historique audit (RGPD/IA Act)GET /api/v1/audit/summary— Résumé auditGET /api/v1/audit/export— Export audit
2.6 Autres
POST /api/v1/shadow/start— Démarrer un observateur shadow (existe, voir §1)POST /api/v1/shadow/stop— ArrêterPOST /api/v1/shadow/feedback— Feedback humain sur une étape observéeGET /api/v1/shadow/{session_id}/understanding— Lire la compréhension construitePOST /api/v1/shadow/build— Compiler en workflowPOST /api/v1/task— Tâche planifiée (TaskPlanner)GET /api/v1/task/capabilities— Capacités déclarées (action types)POST /api/v1/chat/session— Créer une session de chat serveurPOST /api/v1/chat/{session_id}/message— Envoyer messageGET /api/v1/chat/{session_id}/history— HistoriquePOST /api/v1/chat/{session_id}/confirm— Confirmer un planGET /api/v1/chat/sessions— Liste sessions chatPOST /api/v1/agents/enroll— Enrôler un nouvel agent (nouvelle machine)POST /api/v1/agents/uninstall— DésenrôlerGET /api/v1/agents/fleet— État de la flotte
3. Stack VLM / grounding active
Synthèse de docs/HISTORIQUE_VLM_IMPLEMENTATIONS_2026-05-08.md (§1, §6).
| Modèle | Backend | Module appelant | Statut |
|---|---|---|---|
InfiX-ai/InfiGUI-G1-3B 4-bit NF4 |
Transformers in-process (Flask) | core/grounding/server.py (port 8200) |
câblé mais inactif (pas dans la cascade actuelle) |
InfiX-ai/InfiGUI-G1-3B 4-bit NF4 |
Transformers subprocess one-shot | core/grounding/infigui_worker.py |
câblé mais inactif (utilisé en fallback de la socket) |
InfiX-ai/InfiGUI-G1-3B 4-bit NF4 |
Transformers daemon Unix socket /run/rpa/grounding.sock |
core/grounding/infigui_server.py (service systemd rpa-grounding.service) |
service présent — rpa-grounding.service.parked détecté dans /etc/systemd/system/ [À VÉRIFIER PAR DOM] |
Qwen/Qwen2.5-VL-7B-Instruct-AWQ |
vLLM HTTP OpenAI-compat (port VLLM_PORT=8100) |
agent_v0/server_v1/resolve_engine.py:785-816 (_resolve_by_grounding) |
utilisé en prod — essai 1 (fallback Ollama) [À VÉRIFIER PAR DOM si vLLM tourne] |
qwen2.5vl:7b |
Ollama HTTP /api/chat |
resolve_engine.py:818-832 (fallback de vLLM) |
utilisé en prod — fallback principal de la cascade |
qwen2.5vl:7b |
Ollama HTTP /api/chat |
resolve_engine.py:2536-2585 (_locate_popup_button) |
utilisé en prod — cas spécifique popup |
qwen3-vl:8b, gemma4:e4b |
Ollama HTTP | core/detection/ollama_client.py (utilisé par ui_detector.py, som_engine.py, vram_orchestrator.py) |
utilisé en prod — détection UI + SoM côté core/detection |
qwen2.5vl:3b |
Ollama HTTP | visual_workflow_builder/backend/api_v3/capture.py:245 (description anchor) |
utilisé en prod — chaîne capture VWB |
qwen3-vl:8b |
Ollama HTTP | visual_workflow_builder/backend/api_v3/dag_execute.py:468 (LLMActionHandler) |
utilisé en prod — DAG executor LLM |
qwen2.5vl |
Ollama HTTP | visual_workflow_builder/backend/catalog_routes_v2_vlm.py |
utilisé en prod — catalog UI |
| OpenAI-compat cloud (OpenAI/Gemini/Anthropic) | HTTP cloud (opt-in VLM_ALLOW_CLOUD=true) |
visual_workflow_builder/backend/vlm_provider.py |
câblé mais inactif (cloud désactivé par défaut, contraire à la directive 100% local) |
cckevinn/SeeClick (Qwen-VL) |
Transformers in-process | core/detection/seeclick_adapter.py |
téléchargé non utilisé (signalé "cassé" par commit d1b556b6c, exporté par __init__.py mais zéro call site actif) |
Owlv2 (Google OWL-v2) |
Transformers in-process | core/detection/owl_detector.py (via ui_detector.py:31,113,126) |
câblé mais inactif (présent dans la chaîne de détection — bench récent inconnu) [À VÉRIFIER PAR DOM] |
ByteDance-Seed/UI-TARS-1.5-7B |
Transformers (référencé) | tools/start_grounding_server.sh |
référencé en doc seulement (modèle remplacé par InfiGUI dans le code par commit 77faa03ec) |
4. Capacités du VWB (visual_workflow_builder)
4.1 Modes de construction de workflows
Trois voies coexistent :
- Capture interactive : sélection de zones/ancres via
POST /api/v3/capture/screen+POST /api/v3/capture/select(frontendCapturePanel.tsx,CaptureLibrary.tsx). - Édition manuelle dans le canvas : ajout d'étapes via
POST /api/v3/workflow/{id}/step(frontendStepNode.tsx,ToolPalette.tsx,PropertiesPanel.tsx). - Import de workflow appris par Léa :
POST /api/v3/learned-workflows/{id}/importlit les workflows produits côté streaming server (sessions enregistrées) et les insère en SQLite VWB.
4.2 Types d'actions supportées
36 types listés dans frontend_v4/src/types.ts:40-82 (constante ACTIONS).
Souris :
click_anchor— Clic gauche sur élément visuel — needs anchor : ouidouble_click_anchor— Double-clic — needs anchor : ouiright_click_anchor— Clic droit (menu contextuel) — needs anchor : ouihover_anchor— Survol — needs anchor : ouidrag_drop_anchor— Glisser-déposer vers cible — needs anchor : ouiscroll_to_anchor— Défiler jusqu'à élément — needs anchor : ouifocus_anchor— Donner focus clavier — needs anchor : oui
Clavier :
type_text— Saisir texte (templating{{var}}) — needs anchor : nontype_secret— Saisir secret depuis coffre-fort — needs anchor : nonkeyboard_shortcut— Combinaison touches — needs anchor : non
Attente :
wait_for_anchor— Attendre apparition élément — needs anchor : oui
Données :
extract_text— OCR EasyOCR fr+en sur dernier screenshot → variable — needs anchor : nonextract_table— OCR + filtre regex → liste structurée → variable — needs anchor : ouiscreenshot_evidence— Capture preuve — needs anchor : nondownload_to_folder— Télécharger fichier — needs anchor : nondb_save_data/db_read_data— BDD locale — needs anchor : nonimport_excel/db_foreach— Boucle Excel/CSV → BDD — needs anchor : non
Logique :
visual_condition— Branchement si ancre trouvée — needs anchor : oui (hidden : true)loop_visual— Boucle tant qu'ancre visible — needs anchor : oui (hidden : true)pause_for_human— Pause supervisée + safety_checks (QW4) — needs anchor : nont2a_decision— Analyse DPI urgences via LLM local (qwen2.5:7b par défaut) — needs anchor : non
IA (Ollama vision/text) :
ai_ocr— OCR IA sur ancre — needs anchor : ouiai_summarize— Résumé LLM — needs anchor : nonai_extract— Extraction structurée IA — needs anchor : ouiai_classify— Classification — needs anchor : nonai_analyze_text— Analyse libre — needs anchor : nonai_custom— Appel IA libre avec system prompt — needs anchor : non
LLM via DAGExecutor (parallèle) :
llm_analyze/llm_translate/llm_extract_data/llm_generate— needs anchor : non
Fichiers :
file_list_dir/file_create_dir/file_move/file_copy/file_sort_by_ext— needs anchor : non
Validation :
verify_element_exists— needs anchor : ouiverify_text_content— needs anchor : oui
4.3 Intégration avec Léa
Le VWB ne pousse pas un workflow à Léa : il l'enregistre côté streaming server. Mécanisme :
- Workflow sauvé en SQLite VWB (
workflows.db). POST /api/v3/workflow/{id}/export-for-lea(learned_workflows.py:413) sérialise et envoie au streaming server (proxySTREAMING_SERVER_URL=http://localhost:5005).- Lancement : frontend appelle
POST /api/v3/execute/start(execute.py:1528) qui transite versPOST /api/v1/traces/stream/replaycôté streaming server. - Léa V1 récupère ensuite les actions une à une via son polling
GET /replay/next(cf. §1).
4.4 Bibliothèque de captures
Disponible. Architecture v2 (avril 2026) :
- PNG HD écrit dans
data/library_captures/{id}.png(source de vérité) data/capture_library.json= métadonnées + thumbnail base64 640×360 q85 (rapide à charger pour la grille)- Endpoints :
GET/POST /api/v3/capture/library,POST /api/v3/capture/library/upload,GET /api/v3/capture/library/{id}/full,DELETE /api/v3/capture/library/{id} - Permet à l'utilisateur de réutiliser des captures (ancres) entre workflows sans recapturer.
5. Capacités de l'agent_chat
5.1 Endpoints
23 routes Flask dans agent_chat/app.py :
GET /— UI principale chatGET /classic— UI classiqueGET /api/status— Statut serveurGET /api/workflows— Liste workflows disponiblesPOST /api/workflows/refresh— RechargerGET /api/machines— Liste machinesPOST /api/search— Recherche workflowPOST /api/execute— Exécuter un workflow nomméGET /api/history— Historique conversationsPOST /api/chat— Endpoint chat principal (routage NLP)POST /api/gpu/<action>— Contrôle GPU (start/stop/status)GET /api/llm/status— Statut OllamaPOST /api/llm/model— Changer modèle actifPOST /api/agent/plan— Planifier (autonomous_planner)POST /api/agent/execute— Lancer planGET /api/agent/status— Statut agentGET /api/gestures— Catalogue de gestures réflexesPOST /api/chat/upload— Upload pièce jointeGET /api/help— AidePOST /api/urgences/parse— Parsing intent "traite N dossiers" (gemma3:1b)POST /api/urgences/start— Démarre l'orchestrateur urgencesGET /api/urgences/status/<orch_id>— État orchestrateurGET /api/urgences/list— Liste orchestrations en cours
5.2 Cas d'usage métier
- Orchestration urgences GHT (
urgences_orchestrator.py) : reçoit "traite N dossiers" en chat, parse viagemma3:1b, ouvre Chrome (Win+R) sur la maquette Easily Assure via/replay/raw, extrait la liste IPP avecextract_table, puis pour chaque IPP lance le workflowUrgence_unitvia/replayavecvariables={"patient_id": ipp}. Synthèse finale postée dans le chat. État pollable via/api/urgences/status/<id>. - Recherche/exécution workflow par nom naturel (
/api/search+/api/execute) — résolution sémantique nom utilisateur → workflow_id. - Plan autonome (
/api/agent/plan+/api/agent/execute) —autonomous_planner.pyplanifie un workflow inédit à partir d'un objectif libre viaqwen2.5:7b.
5.3 Modèles LLM utilisés
gemma3:1b— NLP intent parsing urgences (urgences_orchestrator.py:58, envLEA_NLP_MODEL)qwen2.5:7b— chat principal + autonomous_planner (app.py:229,319,intent_parser.py:283,690)qwen3:8b— modèle Léa par défaut envLEA_LLM_MODEL(app.py:675), avecthink=Falsedésactivé (qwen3)
6. Modules orphelins (code présent mais non câblé)
| Module | Chemin | Pourquoi orphelin (factuel) | Mentionné en commit ou doc ? |
|---|---|---|---|
core/grounding/fast_pipeline.py |
core/grounding/ |
Référencé uniquement par core/execution/observe_reason_act.py:1639 (lui-même semi-orphelin, voir ci-dessous). Zéro import depuis agent_v0/server_v1/, visual_workflow_builder/backend/, agent_chat/. |
commit b30d4b665 (Phase 4 FAST→SMART→THINK) |
core/grounding/fast_detector.py |
core/grounding/ |
Zéro import depuis le code actif. | commit ea36bba5c (Phase 1-2) |
core/grounding/smart_matcher.py |
core/grounding/ |
Zéro import depuis le code actif. | commit ea36bba5c |
core/grounding/think_arbiter.py |
core/grounding/ |
Zéro import depuis le code actif. | commit e4a48e78b (Phase 3) |
core/grounding/shadow_learning_hook.py |
core/grounding/ |
Zéro import dans agent_v0/server_v1/, visual_workflow_builder/, agent_chat/. |
commit 73cea2385 (Phase 6) ; mémoire mentionne "ShadowLearningHook non branché" |
core/grounding/template_matcher.py |
core/grounding/ |
Zéro import depuis le code actif. | commit 9da589c8c (création) |
core/grounding/pipeline.py |
core/grounding/ |
Zéro import depuis le code actif. | commit 9da589c8c |
core/grounding/element_signature.py |
core/grounding/ |
Zéro import depuis le code actif. | commit e4a48e78b |
core/grounding/server.py (Flask 8200) |
core/grounding/ |
Daemon Flask single-thread alternatif à infigui_server.py (Unix socket). Pas de service systemd actif pointant dessus. |
doc tools/start_grounding_server.sh (toujours obsolète, pointe UI-TARS) |
core/detection/seeclick_adapter.py |
core/detection/ |
Encore exporté par core/detection/__init__.py mais zéro call site actif. Signalé "cassé" par commit d1b556b6c. |
commit 21bfa3b33 (création) ; d1b556b6c (suppression call site) |
core/learning/target_memory_store.py |
core/learning/ |
Référencé par agent_v0/server_v1/replay_memory.py:62 et replay_learner.py:210 — pas orphelin (semi-actif via replay_memory). |
mémoire "V3/V4 découplés au runtime" |
core/learning/continuous_learner.py |
core/learning/ |
Zéro import depuis code actif. | — |
core/learning/feedback_processor.py |
core/learning/ |
Zéro import. | — |
core/learning/versioned_store.py |
core/learning/ |
Zéro import. | — |
core/execution/target_resolver.py |
core/execution/ |
Zéro import depuis code actif. | mémoire "TargetResolver cross-frame bug" |
core/execution/target_memory.py |
core/execution/ |
Zéro import. | — |
core/execution/action_executor.py |
core/execution/ |
Zéro import. | — |
core/execution/execution_robustness.py |
core/execution/ |
Zéro import. | — |
core/execution/recovery_strategies.py |
core/execution/ |
Zéro import. | — |
core/execution/observe_reason_act.py |
core/execution/ |
Importé par visual_workflow_builder/backend/api_v3/execute.py:1431,1955 (mode verified ORALoop). Pas pleinement orphelin mais activé seulement dans ce mode. |
mémoire "Phase 5 intégration FAST→SMART→THINK dans ORA" |
core/healing/healing_engine.py + confidence_scorer.py + recovery_logger.py + learning_repository.py |
core/healing/ |
Zéro import depuis agent_v0/server_v1/ et visual_workflow_builder/backend/api_v3/. Seul execution_integration.py est référencé (2 occurrences). |
— |
Service systemd rpa-streaming.service |
deploy/systemd/ |
Présent dans le repo mais /etc/systemd/system/rpa-streaming.service.parked → inactif sur la machine de Dom. |
— |
Service systemd rpa-grounding.service |
deploy/systemd/ |
/etc/systemd/system/rpa-grounding.service.parked → inactif. |
commit 3d6868f02 |
Service systemd rpa-vision-v3-api.service / rpa-vision-v3-worker.service / rpa-vision-v3-dashboard.service / rpa-agent-chat.service |
deploy/systemd/ |
Tous trouvés .parked dans /etc/systemd/system/. |
— |
agent_v0/server_v1/safety_checks_provider.py |
agent_v0/server_v1/ |
Pas orphelin : importé par api_stream.py:2980 (QW4 build_pause_payload). Listé pour contexte. |
mémoire "QW4 safety_checks hybrides" |
Endpoints /api/v1/shadow/* |
agent_v0/server_v1/api_stream.py:1661-1820 |
Définis côté serveur, aucun appelant identifié dans agent_v0/agent_v1/ (Léa client) ni dans visual_workflow_builder/, ni dans agent_chat/. |
— [À VÉRIFIER PAR DOM] |
7. À vérifier avec Dom (synthèse des [À VÉRIFIER PAR DOM])
- Modes Léa "shadow / copilot / assisté" : seuls les booléens
_recording/_replay_activeexistent côté client. Confirme-tu qu'aujourd'hui Léa V1 n'a effectivement que ces deux modes runtime (et que les modes VWBbasic/intelligent/debug/verifiedne pilotent rien du client) ? - Endpoints
/api/v1/shadow/*côté serveur : zéro appelant identifié dans le repo. Sont-ils consommés par un script externe / une démo, ou candidats à archivage ? - Service
rpa-grounding.service: présent dansdeploy/systemd/mais en.parkedsur la machine. La cascade vLLM→Ollama tourne donc sansinfigui_server.py? Confirmer que le grounding Transformers est bien désactivé en prod actuellement. - Service
rpa-streaming.service: trouvé.parkeddans/etc/systemd/system/. Le streaming server tourne-t-il viasvc.sh/run.shau lieu de systemd ? core/detection/seeclick_adapter.py: encore exporté par__init__.pymais signalé cassé. Sortir de l'export ou tenter une réparation pour Qwen3-VL ?core/detection/owl_detector.py(Owlv2) : câblé viaui_detector.pymais aucun bench récent. Encore appelé en prod ou candidat à l'archivage ?- vLLM (port 8100) : code prêt dans
resolve_engine.py:785-816. Confirmer si vLLM tourne actuellement ou si la cascade saute systématiquement à Ollama. - Mode VWB
verified: seul mode qui activecore/execution/observe_reason_act.py(ORALoop). Est-il utilisé en démo GHT ou réservé au debug ?