4. L'Écosystème HUD & UI
ECHO ne se limite pas à générer du texte dans une fenêtre de chat. Il dispose d'un moteur
d'interface dynamique capable d'injecter des composants visuels directement dans le DOM d'Open WebUI :
jauges, moniteurs, indicateurs de quota et interfaces de replay. Cet écosystème est piloté par
echo_ui.py (v5.27), assisté de echo_visuals.py pour les interfaces
riches multi-moteurs.
💡 Qu'est-ce que le HUD ?
Le HUD (Heads-Up Display) n'est pas une interface séparée : c'est une surcouche d'affichage injectée dynamiquement par-dessus le DOM d'Open WebUI. Elle permet d'afficher en temps réel des informations techniques (état du contexte, quota d'API, statut d'authentification) directement dans le flux de conversation, sans polluer le texte produit par le modèle.
Architecture de communication Backend ↔ Frontend
Le système repose sur un pipeline à trois niveaux :
-
Backend (
echo_ui.EchoUI) : génère des payloads JavaScript polymorphes encapsulant les données (métriques de contexte, quota, images Base64). Ces payloads sont de simples chaînes de caractères contenant du code JS. -
Canal d'Événements (
EchoEvents) : les pontsemitetcalld'Open WebUI servent de tunnel pour injecter le code JS dans le DOM global de l'interface. Cette injection est possible uniquement depuis les hooks Pipe et Filter. -
Runtime Frontend : un singleton JavaScript éphémère
(ex.
window.echoEngine_HUD_{uuid}) est créé dans le navigateur de l'utilisateur et gère les interactions locales (zoom, pan, état du drag).
La Context Gauge (Cortex Monitoring)
La Context Gauge est l'outil central de pilotage de l'état cognitif. Elle est injectée dans la
barre de navigation d'Open WebUI via EchoUI.deploy_context_gauge() et mise à jour
à chaque tour de conversation par le Pipe.
A. Barre de contexte (tokens)
Une barre colorée à quatre segments représente l'utilisation de la fenêtre contextuelle en cours :
| Segment | Couleur | Variable source | Signification |
|---|---|---|---|
| Cache | Violet #8b5cf6 |
cache_pct |
Tokens déjà ingérés et mis en cache par Google (économie de coût de ~90 %). |
| Prompt actif | Vert #10b981 |
prompt_pct |
Charge active du message courant. |
| Génération | Orange #f59e0b |
gen_pct |
Tokens produits par ECHO lors de ce tour. |
| Vide | Transparent | — | Espace mémoire de travail restant avant saturation. |
Au survol de la barre, un tooltip affiche les valeurs absolues : cache, prompt actif, génération, total et maximum de la fenêtre contextuelle.
B. Icône Quota (jauge circulaire SVG)
Une icône cadenas à gauche de la barre représente le quota restant du modèle API Antigravity
actuellement actif. La jauge circulaire SVG est calculée via l'attribut
stroke-dashoffset à partir de quota_fraction
(0,0 = épuisé, 1,0 = plein). La couleur varie selon trois seuils :
- Vert
#10b981:quota_fraction > 0,50 - Orange
#f59e0b:0,20 < quota_fraction ≤ 0,50 - Rouge
#f85149:quota_fraction ≤ 0,20
C. Tooltip Authentification / Quotas
Au survol de l'icône cadenas, un tooltip affiche deux sections :
🔐 Source : méthode d'auth (OAUTH2, API_KEY, etc.)
👤 Compte : google_user_email (depuis identity.db)
🏗️ Projet : google_project_id (depuis identity.db)
💳 Crédits : google_credits_total (crédits AI disponibles)
🤖 Modèle CA : ca_model_id actif (ex: gemini-3-flash-agent)
📊 Quota : quota_fraction × 100% — coloré selon seuils
📅 Req/jour : requestsPerDayRemaining / requestsPerDayLimit (N/A si non fourni)
⚡ Req/min : requestsPerMinuteRemaining / requestsPerMinuteLimit (N/A si non fourni)
🔄 Reset : heure de reset du quota — formatée HH:MM (Xmin restantes)
🏷️ Type : google_quota_type (ex: CODE_ASSIST)
Source et fraîcheur des données quota
Les données de quota proviennent de fetch_available_models() (endpoint API Antigravity
:fetchAvailableModels), stockées dans google_quota_by_model
(JSON dict dans identity.db). Le rafraîchissement est déclenché de manière
asynchrone et non-bloquante via refresh_quota_if_needed() avec un cooldown
de 10 minutes. Les champs requestsPerDay/Min peuvent être absents selon les
réponses de l'API — dans ce cas, « N/A » est affiché. Cela n'affecte pas la
quota_fraction, calculée séparément.
D. Signature complète de deploy_context_gauge()
La fonction principale du HUD accepte les paramètres suivants (tous avec valeurs par défaut sécurisées) :
deploy_context_gauge(
events, # EchoEvents — canal d'injection JS
plan_name, credits_val, # Identité du plan et crédits disponibles
quota_str, # Résumé quota formaté
c_t, active_p_t, g_t, max_t, # Tokens absolus (cache, prompt, génération, max)
cache_pct, prompt_pct, gen_pct,# Pourcentages de la barre (0–100)
user_email, user_tier, # Identité utilisateur
project_id, # google_project_id
auth_sources, # Liste des méthodes d'auth actives
quota_amount, # Montant quota brut (héritage — N/A si non dispo)
quota_fraction, # Fraction restante du quota modèle (0.0–1.0)
quota_reset, # Heure de reset formatée (HH:MM ou HH:MM (Xmin))
quota_type, # Type de quota (ex: CODE_ASSIST)
quota_model, # CA model_id de ce quota
quota_rpd_rem, # Requests per day remaining (ou "N/A")
quota_rpd_lim, # Requests per day limit (ou "N/A")
quota_rpm_rem, # Requests per minute remaining (ou "N/A")
quota_rpm_lim # Requests per minute limit (ou "N/A")
)
Le Monitor ECHO / Image Viewer (Visualiseur Intelligent)
Invoqué via EchoUI.monitor_ECHO() (navigation web) ou
EchoUI.show_image_js() (affichage d'images), ce composant est une fenêtre flottante
surdimensionnable, déplaçable et zoomable injectée dans le DOM.
v5.20 — Unification du moteur visuel
Depuis la v5.20, show_image_js() réutilise le même moteur
_generate_webplayer_js() que le navigateur web. L'ancien overlay basique
(sans zoom/pan/resize) est supprimé. Deux nouveaux paramètres pilotent la personnalisation :
direct_url: si fourni, l'image est chargée directement depuis l'URL au lieu d'undata:…;base64,…. Utilisé parshow_image_to_user.icon: emoji affiché dans l'en-tête du HUD. Par défaut👁️(image viewer),🌐pour le navigateur web.
Fonctionnalités techniques
-
Accélération GPU : utilisation de
translate3d(x, y, 0)pour forcer la création de calques de composition matérielle et assurer une fluidité 60 fps même sur des images haute résolution. -
Calcul de ratio dynamique : la fonction
getBestSizeajuste automatiquement les dimensions de la fenêtre pour respecter le ratio natif de l'image (aspect ratio). -
Zoom & Pan universel : Ctrl + Molette pour le zoom
(jusqu'à 15×), Clic + Glisser pour le déplacement. Pilotage via la
propriété CSS
transform: scale()sur le conteneur image. - Crop-Box interactif : boîte de sélection redimensionnable permettant de définir une zone d'intérêt à transmettre au modèle pour une analyse ciblée.
Persistance de l'état (LocalStorage)
Le Monitor mémorise sa position et son zoom dans le localStorage du navigateur,
sous la clé STATE_KEY générée par le backend. Format :
{ "x": 120, "y": 45, "s": 1.5, "ix": 0, "iy": 0, "m": false }
Où s est le facteur d'échelle, ix/iy l'offset pan,
et m l'état du mode crop.
_generate_codex_js() — Moteur HUD Monaco Codex (v5.23+)
Ajouté en echo_ui.py v5.23, _generate_codex_js() génère
le script JavaScript complet du HUD Monaco Codex (voir
ECHO Codex →). Comme tous les HUDs ECHO,
il est injecté via __event_call__({type: 'execute', data: {code: ...}}).
| Paramètre | Type | Description |
|---|---|---|
files_json | str | JSON des fichiers Codex existants (liste [{filename, language, content}]). |
quick_actions_json | str | JSON de CODEX_QUICK_ACTIONS — boutons prédefinis dans le mini-chat AI. |
chat_id | str | Identifiant du chat courant — clé localStorage de persistance position/taille HUD. |
⚙️ Caractéristiques techniques
- Monaco Editor 0.52.2 — chargé via CDN jsDelivr (AMD loader)
- Détection thème —
document.documentElement.classList.contains('dark')→vs-darkouvs - Persistance HUD — position/taille stockées dans
localStorage['echo_codex_{chat_id}'] - Pattern draggable — même architecture que
monitor_ECHO()(mousedown/move/up)