HYOAI (Host Your Own AI) est un client de chat IA open source développé par Zenetys…
C’est une application 100 % statique, sans serveur applicatif : le navigateur dialogue directement avec le serveur d’inférence — Mistral, Claude, ChatGPT, Gemini, Ollama, llama.cpp, vLLM ou toute API compatible OpenAI — et les conversations sont stockées localement dans le navigateur, compressées, sans transiter par un serveur intermédiaire.
- Démonstration en ligne : https://tools.zenetys.com/tool/hyoai/
- Code source : https://github.com/zenetys
Principes
La plupart des interfaces de chat IA reposent sur un serveur applicatif, qu’il faut déployer, maintenir et sécuriser, et par lequel transitent les conversations. HYOAI suit une approche différente :
- Aucun serveur HYOAI. L’application est un ensemble de fichiers statiques, déposable sur n’importe quel hébergement, y compris à côté du serveur d’inférence. Rien à déployer, rien à maintenir, aucune base de données.
- Le navigateur parle directement au modèle. Chaque requête part du poste de l’utilisateur vers le point d’accès configuré, et nulle part ailleurs. Avec un backend auto-hébergé, les échanges ne quittent pas l’infrastructure.
- Les données restent locales. Conversations, titres, réglages, branches, épingles : tout est conservé dans le stockage local du navigateur, compressé (environ deux fois plus de contenu dans le même espace). Aucun service tiers, aucune télémétrie, aucun compte à créer.
- Pas de licence par utilisateur. Le projet est publié sous licence Apache 2.0 : le déploiement se fait au coût de l’infrastructure, pour une personne comme pour une équipe.
Le raisonnement interne produit par le modèle est conservé uniquement pour la lecture : il n’est jamais renvoyé au modèle lors des échanges suivants.
La démonstration en ligne
La démonstration publique permet d’essayer l’interface sans rien installer. Elle s’appuie sur un serveur de démonstration aux réponses et sources prédéfinies ; l’interface l’annonce elle-même : « Démo : réponses et sources prédéfinies, pas une vraie génération ». En choisissant une des questions d’exemple, on voit le pipeline se dérouler : la recherche et ses étapes, la réflexion, la réponse en Markdown, les sources avec leurs scores.
La saisie libre y est volontairement désactivée, et là encore l’interface explique pourquoi au lieu de refuser en silence. Tout le reste est fonctionnel : thèmes, habillages, langues, branches, mode comparaison, export, réglages. Le menu des modèles sert par ailleurs de guide : les entrées « Exemple » (Ollama, llama.cpp, vLLM, Mistral) affichent la commande exacte pour brancher le même outil sur sa propre infrastructure.
Premiers pas après installation
À l’ouverture, l’écran d’accueil affiche le champ de saisie et, lorsque le backend en propose, un panneau repliable de questions d’exemple ; un clic sur l’une d’elles envoie directement la question. Ces suggestions ne sont pas codées dans l’application : elles sont fournies par le backend, dans la langue de l’interface.
Choisir son modèle
Le sélecteur de modèle est une pastille placée à droite du champ de saisie. Le menu liste tous les modèles configurés, locaux et distants :
- un serveur qui héberge plusieurs modèles (llama.cpp, llama-swap) est présenté en groupe : chaque modèle découvert automatiquement devient sélectionnable, et la liste est rafraîchie à chaque ouverture du menu ;
- un modèle injoignable est signalé par un triangle d’alerte, avec l’explication au survol ;
- un bouton « i » sur chaque ligne ouvre la fiche du modèle : sa configuration et, quand le serveur les expose, ses caractéristiques d’exécution (taille de contexte, nombre de paramètres, taille du vocabulaire).

Raisonnement et niveau d’effort
Pour les modèles qui le permettent, le menu du modèle propose deux contrôles :
- un interrupteur « Réflexion », qui active ou désactive le raisonnement interne du modèle ;
- un choix de niveau d’effort (par exemple Low / Medium / High) : un effort plus élevé donne des réponses plus complètes, mais plus lentes. Le niveau actif s’affiche sur la pastille du modèle.
Ces contrôles n’apparaissent que lorsque le modèle les déclare : l’interface s’adapte aux capacités réelles de chaque backend.
Pendant la génération
Les réponses arrivent en flux continu, token par token, avec un affichage lissé. Le bouton d’envoi se transforme en bouton d’arrêt pendant la génération : un clic interrompt la requête, et le texte déjà produit est conservé, marqué « Génération arrêtée ».
Au-dessus de la zone de saisie, une barre de contexte montre le remplissage de la fenêtre du modèle. Au survol, elle détaille les chiffres — contexte utilisé, sortie en cours, vitesse en tokens par seconde — et donne accès aux actions de compactage (voir plus bas).
Génération en arrière-plan
Changer de conversation n’interrompt pas une génération en cours : elle se poursuit en arrière-plan et s’enregistre automatiquement. Dans la barre latérale :
- la conversation concernée affiche un bouton d’arrêt sur sa ligne ;
- le survol de la ligne montre le texte en cours d’écriture, en direct ;
- une fois la réponse terminée, une coche verte apparaît (« Génération terminée, cliquez pour voir ») et s’efface à l’ouverture de la conversation.

Lecture d’une réponse
Les réponses sont rendues en Markdown : titres, listes, tableaux, citations, liens (ouverts dans un nouvel onglet) et blocs de code avec coloration syntaxique, nom du langage et bouton « Copier ».
Le raisonnement, affiché
Quand le modèle raisonne avant de répondre, son raisonnement est présenté : un bloc « Réflexion en cours » s’ouvre automatiquement au-dessus de la réponse et se remplit en direct. Une fois la réponse terminée, il se replie en un bloc « Raisonnement », consultable à tout moment. Un réglage permet de le garder ouvert en permanence.

Statistiques par message
Sous chaque réponse, une pastille indique le modèle utilisé (avec une icône dédiée si la réflexion était active) et, si le réglage est activé, des statistiques commutables d’un clic :
- Lecture : tokens du prompt, durée de traitement, vitesse ;
- Génération : tokens produits, durée, tokens par seconde ;
- Pipeline : pour les backends RAG, la latence de chaque étape (intention, décomposition, embedding, recherche vectorielle, reclassement, génération) ;
- Stockage : le poids de la conversation dans le navigateur.
Ces mesures permettent de comparer des modèles ou des serveurs sans outillage supplémentaire.
Transparence RAG : la recherche derrière la réponse
Avec un backend RAG ou agentique, HYOAI ne montre pas seulement la réponse finale, mais la manière dont elle a été construite.
Au-dessus de la réponse, un panneau « Recherche » s’ouvre pendant la génération et déroule le pipeline :
- les « Sous-requêtes » : les reformulations de la question par le backend ;
- la « Recherche dense » et la « Recherche lexicale », chacune repliée derrière son compteur de documents candidats ;
- le « Reclassement », l’étape finale qui retient les meilleurs documents.
En dépliant une étape, on voit la liste numérotée des documents avec leur score : le pipeline ratisse large, puis converge vers les bonnes sources.
Sous la réponse, le bloc « Sources » liste les documents retenus : titre cliquable vers la base de connaissances, extrait de deux lignes, score de pertinence. Les doublons sont fusionnés. Avec un modèle classique (non RAG), le même bloc est construit à partir des liens que la réponse cite elle-même.

Actions sur les messages
Chaque message porte une barre d’actions (au survol sur ordinateur, par appui long sur mobile) :
- Copier le message ;
- Répondre : citer la réponse pour ancrer la question suivante. Il est aussi possible de sélectionner un passage précis dans une réponse ; un bouton « Répondre » apparaît au-dessus de la sélection et seul l’extrait est cité ;
- Modifier, y compris les réponses de l’IA : une réponse peut être corrigée sans être régénérée. La modification d’un message utilisateur rouvre l’éditeur complet, pièces jointes comprises ;
- Régénérer une réponse, sans perdre l’ancienne (voir les branches ci-dessous) ;
- Créer une nouvelle conversation à partir de ce message : repartir de ce point précis dans une conversation neuve, sans toucher à l’originale ;
- Supprimer ce message et sa suite ;
- si le déploiement l’a configuré, des boutons d’avis (bonne / mauvaise réponse, avec commentaire facultatif) envoyés vers un collecteur de feedback interne.

Branches : une conversation est un arbre
Dans HYOAI, une conversation n’est pas une liste de messages mais un arbre. Modifier un message ou régénérer une réponse ne remplace rien : cela crée une version alternative, et l’ancienne reste accessible.
Un indicateur « 1/2 » encadré de deux flèches apparaît alors sur le message : la navigation entre les versions fait basculer tout le fil de la conversation sur la branche choisie. On peut explorer une piste, revenir en arrière, en essayer une autre, sans perte. Les branches sont enregistrées comme le reste et survivent au rechargement de la page.
Pièces jointes et message système
Le bouton « + » de la zone de saisie ouvre le menu des pièces jointes ; le glisser-déposer et le collage depuis le presse-papiers fonctionnent également :
- Images : redimensionnées dans le navigateur avant envoi (taille maximale réglable), ce qui réduit le volume transmis et l’espace de stockage consommé ;
- Fichiers audio (mp3, wav) pour les modèles qui les acceptent ;
- Fichiers texte : leur contenu est joint au message ;
- Fichiers PDF : au choix, texte extrait page par page, ou pages converties en images pour les modèles de vision (réglage « PDF en images »).
L’interface tient compte des capacités de chaque modèle : si le modèle actif ne traite pas les images, l’entrée est désactivée avec l’explication « Le traitement d’images nécessite un modèle de vision ».
Le même menu permet de définir un message système propre à la conversation. Une fois défini, il est visible : une pastille au-dessus de la zone de saisie le rappelle, un clic le modifie, une croix le retire.

Mode comparaison
Le bouton « Comparer » de la barre du haut divise l’écran en panneaux côte à côte (jusqu’à quatre). Chaque panneau est une conversation complète et autonome, avec son propre modèle, son propre interrupteur de réflexion et son propre niveau d’effort : on peut confronter deux modèles différents, ou le même modèle à deux niveaux d’effort.
En bas, une zone de saisie unique avec un sélecteur « Tous / Actif » : poser la même question à tous les panneaux d’un coup, ou écrire dans le panneau actif seulement. Chaque panneau garde sa propre barre de contexte et peut être arrêté indépendamment.
Le bouton « Analyser » ouvre un panneau supplémentaire qui demande à un modèle de comparer les réponses des autres : différences clés, forces et faiblesses, conclusion. La synthèse est produite par un LLM, mais elle accélère sensiblement l’évaluation.
Quand il ne reste qu’un panneau, le mode comparaison se referme et la conversation redevient une conversation simple.

Gestion des conversations
La barre latérale regroupe les conversations, épinglées puis récentes. Chaque conversation reçoit un titre automatique tiré du premier message, renommable d’un clic sur le titre. Quelques détails :
- la recherche ne se limite pas aux titres : elle porte aussi sur le contenu des messages, affiche un extrait avec le terme trouvé surligné, et amène directement au message concerné ;
- la palette de commandes (Ctrl/Cmd + K) offre la même recherche au clavier, plus les actions rapides (nouvelle conversation, paramètres) ;
- le survol d’une conversation affiche un aperçu avec sa date de dernière modification ;
- chaque conversation a une adresse partageable : « Copier le lien » produit une URL qui rouvre cette conversation ;
- plusieurs onglets ouverts sur l’application se synchronisent automatiquement ;
- la suppression demande confirmation (Maj + clic la saute).
Les données et le navigateur
L’onglet « Données » des paramètres donne une vision complète de ce que l’application stocke :
- une jauge de stockage avec le détail conversation par conversation, triée de la plus lourde à la plus légère ;
- les conversations sont compressées : environ deux fois plus d’historique dans le même espace ;
- si le stockage approche de la saturation, une alerte le signale une seule fois et amène d’un clic au bon endroit ; en cas d’échec d’écriture, rien n’est perdu silencieusement, l’application réessaie et informe l’utilisateur ;
- export sélectif en JSON, au format natif ou au format du webui llama.cpp ; import des deux formats, qui ajoute aux conversations existantes sans rien écraser ;
- un bouton « Tout effacer » supprime définitivement toutes les données du navigateur, après confirmation.
Sur ce qui circule réellement : seule la requête nécessaire part vers le serveur d’inférence configuré (messages, pièces jointes, éventuel message système). Titres, épingles, réglages, branches et statistiques restent locaux, et le raisonnement du modèle n’est jamais renvoyé.
Longues conversations et gestion du contexte
Tout modèle a une fenêtre de contexte limitée. HYOAI la gère côté navigateur, automatiquement.
Compactage
Quand la conversation approche de la limite (seuil réglable, 80 % par défaut), les échanges les plus anciens sont condensés en un résumé par le modèle lui-même, en préservant les faits, les décisions, les chiffres et les extraits importants. Les derniers échanges restent intacts. L’opération est invisible et non destructive : à l’écran, la conversation ne change pas ; seul ce qui est envoyé au modèle est allégé. Le compactage se déclenche aussi si le serveur signale un dépassement de contexte : la requête est alors compactée et relancée sans intervention. Il peut enfin être lancé manuellement (« Compacter la conversation ») depuis la barre de contexte.
Une étape supplémentaire, volontaire, « Libérer le stockage », remplace les anciens messages résumés par un bloc repliable « Résumé de la conversation », pour récupérer de l’espace local.
Découpage en chapitres
Quand une entrée (message et pièces jointes texte ou PDF) dépasse la fenêtre du modèle, HYOAI la découpe en chapitres, en respectant les paragraphes et les phrases. Chaque chapitre est analysé l’un après l’autre, visiblement : le fil affiche des lignes « Chapitre 3/12 · Extrait » et « Chapitre 3/12 · Analyse » repliables, puis une synthèse finale qui devient la réponse. Deux stratégies sont proposées, commutables en cours d’analyse : Map-reduce (chaque chapitre analysé indépendamment puis combiné) ou Cumulatif (un résumé enrichi chapitre après chapitre).
L’estimation de la taille des textes s’auto-corrige en interrogeant le serveur quand c’est possible, et le document brut n’est jamais renvoyé lors des questions suivantes : seule l’analyse consolidée reste dans le contexte.
Réglages et apparence
Les paramètres tiennent en quatre onglets : Général, Génération, Données et Config.
- L’onglet Génération expose les paramètres d’échantillonnage (temperature, top-k, top-p, pénalités de répétition) avec un principe simple : un champ vide n’est pas envoyé du tout, le serveur applique ses propres valeurs par défaut (le champ affiche « Défaut serveur »). Le nom technique de chaque paramètre est adapté automatiquement au type de serveur.
- L’onglet Config permet de modifier la liste des modèles directement depuis l’application : les changements sont enregistrés dans le navigateur comme une surcharge locale du fichier déployé, appliqués immédiatement, signalés par une pastille « Surcharge active », et réversibles sélectivement.

Côté apparence : thème clair, sombre ou système ; six habillages qui changent l’ensemble de l’interface (Soft, Flat, Contraste, Chaud, Forêt, Doux) ; trois largeurs de chat ; une disposition compacte de la saisie ; une interface disponible en français et en anglais — la langue est transmise aux backends RAG, qui peuvent répondre dans la langue de l’interface. Les polices sont embarquées dans l’application : aucun appel à un service externe.
Mobile et accessibilité
L’interface est conçue pour le tactile :
- les menus s’ouvrent en tiroirs par le bas, avec poignée et fermeture par glissement ;
- un appui long sur un message ouvre la feuille d’actions ; le défilement ne déclenche jamais d’ouverture accidentelle ;
- une action indisponible affiche sa raison en toutes lettres, plutôt qu’un bouton désactivé sans explication.
Côté accessibilité : tous les boutons portent un intitulé pour les lecteurs d’écran, le fil des réponses est annoncé au fur et à mesure sans interrompre la lecture en cours, la navigation est entièrement possible au clavier, le focus est restitué au bon endroit après chaque interaction, et les animations décoratives sont désactivées si le système demande de réduire les animations.

Raccourcis clavier
- Ctrl/Cmd + K : palette de commandes et recherche ;
- Ctrl/Cmd + B : afficher ou masquer la barre latérale ;
- Ctrl/Cmd + Maj + O : nouvelle conversation ;
- Entrée pour envoyer, Maj + Entrée pour une nouvelle ligne (inversable dans les réglages) ;
- Flèche haut / bas dans le champ vide : rappeler les messages précédents ;
- Ctrl/Cmd + Entrée : valider l’édition d’un message ; Échap : annuler.
Conclusion
HYOAI applique au client de chat IA les principes qu’on attend d’un outil d’infrastructure : local, transparent et sous contrôle. Pas de backend applicatif à maintenir, pas de licence par utilisateur, pas de données qui s’échappent — le navigateur, le modèle, et une interface qui montre ce que l’IA fait réellement.
- Démonstration en ligne : https://tools.zenetys.com/tool/hyoai/
- Code source et documentation technique : https://github.com/zenetys
HYOAI est développé et publié sous licence Apache 2.0 par Zenetys, société de services spécialisée en audit, architecture et infogérance d’infrastructures.