10. Annexes Techniques

Cette section constitue la référence de bas niveau du framework ECHO v5 : spécifications réseau, schémas SQL complets, inventaire des volumes Docker, collections Qdrant et dictionnaire des valves de configuration.

Topologie Réseau et Ports

ECHO orchestre un cluster de conteneurs sur un réseau Docker privé (echo-network). La passerelle BunkerWeb est l'unique point d'entrée exposé sur le WAN lorsqu'elle est activée. Les services de l'Arsenal (Browser Agent, Python Worker, SearxNG) ne sont jamais exposés directement.

Service Conteneur Port interne Port hôte Exposé WAN ?
Open WebUIecho-open-webui80803000Via BunkerWeb
Admin Managerecho-admin-manager30013001Via BunkerWeb
Qdrantecho-qdrant6333NonNon
Embedding Workerecho-embedding7997NonNon
STT Workerecho-stt-worker7995NonNon
TTS Workerecho-tts-worker7996NonNon
Browser Agentecho-browser-agent5002NonNon
Python Workerecho-python-worker5000NonNon
SearxNGecho-searxng8080NonNon
SSH Tunnel AuthIn-process WebUI8020–80248020–8024Non — localhost uniquement
Callback OAuth2In-process WebUI8025–8034NonNon — via tunnel SSH uniquement
BunkerWeb (WAF)echo-bunkerweb80 / 44380 / 443Oui

Volumes Docker

VolumePoint de montageContenu
echo-webui-data /app/backend/data webui.db, identity.db par utilisateur, bases SQLite de session ({chat_id}.db), Vault fichiers.
echo-qdrant-data /qdrant/storage Index vectoriels Qdrant (echo_memory, echo_ephemeral).
echo-backups /opt/ECHO/backups Archives tar.gz générées par l'Admin Manager.
echo-worker-data /data (Python Worker) Artefacts temporaires d'exécution Python.
echo-browser-data /data (Browser Agent) Captures d'écran, exports de sessions de navigation.
echo-bunkerweb-data /opt/ECHO/bunkerweb Configuration WAF persistante (certificats, règles).

Schéma SQL — identity.db

Base SQLite unique par utilisateur, stockée dans /app/backend/data/users/{uid}/identity.db. Gérée par EchoStateManager (instance identity_manager).

Table auth_data

CléTypeDescription
google_oauth2_access_tokenTEXTToken Bearer OAuth2 courant. Durée de vie : 3 300 s (55 min).
google_oauth2_refresh_tokenTEXTToken de rafraîchissement à longue durée de vie.
google_oauth2_last_refreshINTTimestamp Unix du dernier rafraîchissement de token.
google_user_emailTEXTAdresse e-mail du compte Google authentifié.
google_user_tierTEXTNiveau d'abonnement Google (ex. FREE, STANDARD).
google_project_idTEXTID du projet API Antigravity actif.
google_credits_totalTEXTCrédits AI disponibles (depuis paidTier.availableCredits).
google_quota_by_modelTEXT (JSON)Dict {ca_model_id: quotaInfo}. Source du quota affiché dans le HUD.
google_quota_fractionTEXTFraction quota restante du modèle principal (0,0–1,0).
google_quota_resetTEXTHeure de reset du quota (ISO 8601).
google_quota_typeTEXTType de quota (ex. CODE_ASSIST).
google_quota_last_fetchINTTimestamp Unix du dernier appel fetch_available_models. Cooldown 10 min.
google_api_keyTEXTClé API AI Studio primaire (fallback OAuth2).
google_api_key_secondaryTEXTClé API AI Studio de secours.

Schéma SQL — {chat_id}.db

Base SQLite par session de chat, stockée dans /app/backend/data/users/{uid}/chats/{chat_id}.db. Gérée par l'instance state_manager de EchoStateManager.

Table message_shadows

ColonneTypeDescription
message_idTEXT PKUUID du message fourni par Open WebUI.
updated_atINTVerrou de Version — timestamp physique de la dernière modification du message.
parent_idTEXTUUID du message parent (chaîne de conversation).
cumulative_hashTEXT FKRéférence vers suture_index.
partsTEXT (JSON)Structure Gemini complète des parts (texte, inlineData, thoughtSignature, etc.)
created_atINTTimestamp de scellement.

Table suture_index

ColonneTypeDescription
cumulative_hashTEXT PKSHA-256 cumulatif — ADN de la conversation.
message_idTEXT FKRéférence vers message_shadows.
invariant_hashTEXTSHA-256 du contenu seul, indépendant de la position dans l'historique.
parent_hashTEXTHash cumulatif du tour précédent — forme la chaîne Merkle.
created_atINTTimestamp de scellement.

Table cognitive_signatures

ColonneTypeDescription
cumulative_hashTEXT PKLié au tour courant (chaîne Merkle).
thought_signatureTEXTThoughtSignature Gemini — jeton opaque cryptographique réinjecté au tour suivant.
message_idTEXTUUID du message (colonne de migration, nullable).
model_idTEXTIdentifiant du modèle ayant généré la pensée.
updated_atINTTimestamp de scellement.

Table tool_journal

ColonneTypeDescription
cumulative_hashTEXT PKLié au tour courant.
io_jsonTEXT (JSON)Appels d'outils (arguments) et sorties (réponses multipart). Journalisation traçable.
updated_atINTTimestamp de scellement.

Table thought_archive

ColonneTypeDescription
cumulative_hashTEXT PKLié au tour courant.
raw_thoughtTEXTTexte intégral de la pensée (thinking block) du modèle, archivé pour traçabilité.
updated_atINTTimestamp de scellement.

Table processed_files

ColonneTypeDescription
chat_idTEXT PKSession de rattachement.
file_idTEXT PKUUID du fichier (clé composite avec chat_id).
filenameTEXTNom original du fichier uploadé.
mimeTEXTType MIME détecté.
modeTEXTMode de traitement (direct, rag_ephemeral, rag_organic).
message_idTEXTMessage dans lequel le fichier a été soumis.
timestampINTTimestamp de traitement.

Table call_bridge

ColonneTypeDescription
call_idTEXT PKUUID de l'appel de fonction.
signatureTEXTSignature de la fonction (nom + hash des arguments).
function_nameTEXTNom de l'outil appelé.
args_jsonTEXT (JSON)Arguments sérialisés de l'appel.
timestampINTTimestamp de l'appel.

Table rich_payloads

ColonneTypeDescription
invariant_hashTEXT PKHash invariant du message porteur.
rich_parts_jsonTEXT (JSON)Parts Gemini enrichies (inlineData, fichiers binaires encodés).
message_idTEXTUUID du message.
created_atINTTimestamp de création.

Table plans

Table utilisée par le Planificateur Stratégique pour persister les plans d'action de chaque chat. Gérée par l'outil strategic_planner.py.

Table context_stats

ColonneTypeDescription
idINT PK (=1)Ligne unique — singleton.
dataTEXT (JSON)Statistiques de contexte sérialisées (tokens, cache, etc.).
updated_atINTTimestamp de la dernière mise à jour.

Table session_state

ColonneTypeDescription
idINT PKLigne unique — singleton.
last_model_idTEXTDernier modèle utilisé dans cette session (pour reprise).
updated_atINTTimestamp.

Table cognitive_threads

Table de support pour les délégations cognitives récursives (Conseil d'Experts). Stocke les échanges par sous-session (sub_sid) et rôle (role_id).

Collections Qdrant

CollectionConstanteDimensionsDistanceScopeDurée de vie
echo_memory COLLECTION_MEMORY 1024 (bge-m3) Cosinus user_id Permanent — TTL par niveau (Admin Manager)
echo_ephemeral COLLECTION_EPHEMERAL 1024 (bge-m3) Cosinus user_id + chat_id + slug Session — purgé automatiquement en fin de session

Dictionnaire des Valves Critiques

Les valves sont des paramètres configurables exposés dans l'interface d'administration Open WebUI pour chaque composant (Pipe, Filtres, Outils). Elles permettent d'ajuster le comportement sans redéploiement.

ValveDéfautComposantImpact
MAX_DIRECT_TEXT_SIZE256 KoFiltre InletSeuil de basculement en Moulage (Smart Context).
ECHO_API_KEY_THRESHOLD2PipeNombre d'échecs avant failover vers la source d'auth suivante.
ECHO_API_MAX_RETRIES5PipeNombre maximum de tentatives par source.
ECHO_RETRY_BASE_DELAY2,0 sPipeDélai de base du backoff exponentiel.
ECHO_RETRY_MULTIPLIER2,0PipeMultiplicateur du backoff.
ECHO_RETRY_JITTER_MIN/MAX0,7 / 1,3PipePlage de jitter aléatoire pour éviter les tempêtes de retry.
PKCE_CALLBACK_TIMEOUT300 sAuthDélai maximal pour l'utilisateur pour autoriser dans le navigateur.
GOOGLE_OAUTH_TOKEN_LIFETIME3 300 sAuthDurée proactive de rafraîchissement du token (55 min).
SCORE_THRESHOLD0,45MémoireScore pondéré minimal pour inclure un résultat de search_memory.
PROBE_TIMEOUT120 sVault ExplorerTimeout de l'analyse sémantique semantic_probe (appel LLM).

✅ Source de vérité — Valves

Les valeurs ci-dessus sont celles déclarées dans les constantes de echo_constants.py (v5.2) et dans les constructeurs Valves de chaque composant. En cas de divergence entre cette documentation et le code source, le code source fait foi.

Référence API — Classes Fondamentales

EchoStateManager — Méthodes principales

MéthodeSignatureDescription
get_message_shadow(message_id, updated_at) → dict | NoneLit l'Ombre du message. Retourne None si absente ou Verrou invalide.
save_message_shadow(message_id, chat_id, role, parts, updated_at)Scelle l'Ombre en base. Upsert idempotent. 5 paramètres.
get_signature_by_id(message_id) → str | NoneLit l'Ancre ThoughtSignature depuis cognitive_signatures par message_id.
save_signature_by_id(message_id, signature)Scelle la ThoughtSignature.
index_suture(cumul, chat_id, inv, parent, message_id)Met à jour la chaîne Merkle dans suture_index. chat_id est le 2ème argument.
save_cognitive_data(cumul, sig, thought, tool_io, message_id, model_id)Journalise les données cognitives du tour (ThoughtSignature, pensées, appels d'outils, modèle).
get_auth_data(key_name, user_id) → str | NoneLecture clé-valeur depuis auth_data (identity.db).
save_api_key(key_name, value, user_id)Écriture clé-valeur dans auth_data. Upsert.

EchoGeminiClient — Méthodes principales

MéthodeDescription
call(model, payload, user_id, chat_id)Appel non-streamant (utilisé pour la distillation). Gère automatiquement le choix du backend (AI Studio / API Antigravity) et le failover.
call_distillation(prompt, __user__, __metadata__, is_json, max_tokens)Exécute une tâche de distillation. Route par défaut vers gemini-2.5-flash (API). Gère le nettoyage des thoughts et le parsing JSON.
generate_embedding(text, task_type, __user__, __metadata__)Vectorise un texte via le modèle local BAAI/bge-m3 (Embedding Worker). Retourne une liste de 1024 floats.
get_stealth_headers(url)Construit les en-têtes HTTP/2 haute fidélité (User-Agent Chrome 123, Sec-Fetch-*) pour le téléchargement Stealth. Paramètre url optionnel.