Blog - Construire Hibrido : ce qui change quand le modèle n'a pas le droit de nommer un mouvement

Comment Everseed a construit Hibrido, un entraînement hybride quotidien publié en trois langues, en sortant le vocabulaire des exercices du prompt pour le placer dans un catalogue versionné où le modèle ne peut que choisir.

Blogue Everseed

Produit et Ventures

Sierra Vaughn
Développeuse logicielle et penseuse produit

La plupart des produits « l'IA écrit votre entraînement » se résument à un questionnaire, un abonnement et un plan généré pour une seule personne. Nous avons construit Hibrido dans l'autre sens : un entraînement par jour, le même pour tout le monde, publié chaque matin en espagnol, en anglais et en portugais, gratuitement et sans compte.

Cette décision a rendu le problème intéressant inévitable. Si tout le monde reçoit la même séance et que personne ne peut poser de question, la séance doit être juste du premier coup, à six heures du matin, pour un inconnu.

Voici comment nous nous y sommes pris.

« Le plus souvent » est le mauvais standard

Mettez « pas d'haltérophilie, pas de gymnastique technique » dans un system prompt et un bon modèle s'y tiendra le plus souvent. Le plus souvent suffit quand la défaillance est une phrase maladroite. Cela ne suffit pas quand la défaillance est quelqu'un qui tente un arraché, seul, dans une salle de sport, parce qu'un site le lui a dit.

Il existe une seconde défaillance, plus terne, qui n'apparaît qu'après quelques semaines. Un modèle qui écrit lui-même les noms des mouvements les écrit un peu différemment chaque nuit, et différemment encore dans chaque langue. Sled push devient sled drive, empuje de trineo devient empujón de trineo, et les lecteurs de trois langues cessent peu à peu de faire le même entraînement.

Les deux problèmes ont la même forme. On confie le vocabulaire au modèle, et le vocabulaire est précisément ce qui doit rester stable.

La solution : un catalogue, pas un prompt

Nous le lui avons donc retiré.

Hibrido dispose d'un catalogue fixe de 59 mouvements, versionné dans le dépôt et déjà traduit dans les trois langues. Chaque mouvement porte les variantes d'équipement où il existe. Le modèle reçoit ce catalogue et compose la séance en choisissant des identifiants. Il n'écrit jamais le nom d'un mouvement.

La sortie est validée contre le catalogue avant tout enregistrement. Un identifiant inconnu est rejeté. Un identifiant connu employé dans une variante d'équipement où il n'existe pas est rejeté. En cas de rejet, le générateur réessaie avec les erreurs de validation jointes, trois fois, puis fait échouer l'exécution plutôt que d'enregistrer quelque chose de dégradé.

La différence n'a rien de subtil. « Merci d'éviter X » est une demande. « X n'est pas dans le catalogue, et ce qui est hors catalogue ne se parse pas » est une contrainte. Une seule des deux tient encore la quatre-centième nuit.

C'est la leçon générale, et elle vaut bien au-delà du fitness : ce que votre produit ne peut pas se permettre de voir inventé, sortez-le du prompt et mettez-le dans des données où le modèle ne peut que choisir. Le prompt, c'est là où vous mettez le jugement. Le dépôt, c'est là où vous mettez les faits.

Deux appels, pour que la traduction ne fasse pas dériver l'entraînement

La génération se fait en deux appels, et l'ordre compte.

Le premier produit la structure neutre du point de vue de la langue : quels mouvements, combien de répétitions, quelles charges, quels domaines de temps, dans quel ordre. Pas de prose, pas de consignes, aucune langue au-delà des identifiants.

Le second écrit les consignes dans les trois langues contre cette structure déjà figée. Il peut expliquer la sensation recherchée, où se retenir et où pousser. Il ne peut changer aucun chiffre, parce que les chiffres ont été décidés avant son exécution.

La traduction est d'ordinaire l'endroit où le contenu multilingue diverge en silence, chaque langue étant générée comme son propre artefact et relue par celui qui, par hasard, lit cette langue. Séparer structure et prose supprime la possibilité au lieu de l'auditer. Le lecteur portugais et le lecteur anglais regardent la même séance par construction.

On en dit encore moins au modèle d'image

Hibrido produit ses propres visuels : une image 16:9 pour le site et une 4:5 pour les réseaux, toutes deux sans typographie, délibérément, pour pouvoir poser du texte par-dessus.

On ne dit jamais au modèle d'image comment s'appelle l'entraînement. Il reçoit une description physique du mouvement dominant du jour, tirée d'un fichier comptant une ligne par identifiant du catalogue. Un test casse le build dès qu'un identifiant du catalogue n'a pas de scène, de sorte que les deux fichiers ne peuvent pas se désynchroniser.

Deux conséquences en découlent. Les exclusions tiennent pour l'image comme pour la séance, puisqu'une scène n'existe que pour un mouvement du catalogue. Et la prose de l'entraînement ne parvient jamais à un modèle qui la peindrait volontiers dans le coin d'un cadre fait pour recevoir du vrai texte.

Les personnes présentes sur ces images viennent d'une table Postgres : des athlètes inventés, une ligne chacun, avec une description physique et un portrait de référence rendu à partir d'elle. Les jours tournent dans la distribution, et lorsqu'une personne a un portrait, il est envoyé au modèle d'image avec le prompt, limité à la seule identité. Une semaine de visuels montre visiblement les mêmes visages plutôt que sept inconnus correspondant à sept phrases. Si la table est vide ou injoignable, la génération retombe sur une liste interne de descriptions : sans visage, mais les images continuent de sortir.

Une étape a le droit d'échouer

La structure et le texte renoncent plutôt que de se dégrader. L'étape d'image fait l'inverse : en cas d'échec, celui-ci est consigné à son propre stade et l'entraînement est enregistré malgré tout.

Cette asymétrie est délibérée, et elle mérite d'être écrite noir sur blanc dans toute chaîne comportant plusieurs appels de modèles. Posez la question à chaque étape : une sortie manquante est-elle pire qu'une sortie fausse ? Pour la séance, une fausse est bien pire : elle échoue bruyamment. Pour l'image, une manquante coûte un fond : elle échoue en silence et le produit fonctionne toujours.

Publier deux jours à l'avance

La tâche nocturne s'exécute à 08:00 UTC et génère deux jours à l'avance.

Les entraînements générés sont enregistrés comme publiés immédiatement, ce qui paraît imprudent jusqu'à ce qu'on lise la seconde règle : une date n'est affichée que lorsqu'elle est déjà en cours quelque part sur terre. Il existe donc une fenêtre de 48 heures pendant laquelle une séance existe, est relisible dans le tableau de bord, et n'est visible par personne. Une exécution ratée, une panne de modèle ou une séance qui se lit simplement mal disposent de deux jours pour être repérées et retirées.

Savoir quelle date est la vôtre est une autre question : la page d'accueil y répond depuis le fuseau horaire du lecteur, résolu côté serveur à partir de la requête. Un lecteur à Vancouver ne reçoit pas la séance de demain au petit-déjeuner, tandis que celui qui est déjà le 9 peut ouvrir le 9 directement.

La stack

Next.js 16 avec React 19, chaque page datée rendue côté serveur. Supabase et Postgres pour les séances, la distribution et la liste d'inscription, l'écriture étant réservée au rôle de service. Appels de modèles via OpenRouter, validés avec Zod. Les migrations vont uniquement vers l'avant et sont appliquées automatiquement à la fusion par la CI, avec le script que le développeur exécute en local, les instructions destructrices étant refusées sauf autorisation explicite dans le fichier. Déployé sur Vercel, la génération nocturne tournant sur Vercel Cron.

Il n'existe pas de retour arrière pour les migrations, volontairement. Une migration descendante exécutée sans surveillance est plus dangereuse que le problème qu'elle résout ; la récupération passe par une nouvelle migration vers l'avant, ou par une restauration.

Où en est le projet

Délibérément au début. Le générateur tourne chaque nuit, le site publie en trois langues, et le formulaire conserve l'adresse que vous lui laissez. Rien n'a encore été envoyé : ni e-mail, ni confirmation, ni désabonnement, parce que rien de tout cela n'est construit. WhatsApp et les réseaux sociaux sont des phases ultérieures.

Cet ordre est tout l'argument. La qualité de l'entraînement est le produit ; le reste n'est que la distribution de quelque chose qui doit d'abord être bon.

Lisez la séance du jour sur hibrido.app, ou consultez l'étude de cas Hibrido complète.

More articles

L'IA pour les entreprises canadiennes d'entretien commercial : ce qu'elle ne peut pas encore régler et son utilité réelle

Un regard franc sur ce que l'IA ne peut pas faire pour les entreprises canadiennes d'entretien ménager commercial, suivi des flux de travail concrets qui font gagner un temps précieux au bureau dès aujourd'hui.

En savoir plus

10 automatisations pratiques que les PME canadiennes peuvent déployer cette semaine pour se conformer à la LPRPDE et à la Loi 25

Préparez votre entreprise canadienne à la conformité à la LPRPDE et à la Loi 25 du Québec grâce à 10 automatisations logicielles et d'IA faciles à déployer cette semaine.

En savoir plus

Parlez-nous de votre projet

Nos bureaux

Paula Quintero

Paula Quintero

Absente, de retour bientôt

Bonjour! Je suis Paula d'Everseed. Je ne suis pas disponible en ce moment, mais laissez-moi vos coordonnées et je vous recontacte dès mon retour!