Babel et les importateurs

Si votre catalogue n'est pas saisi à la main, l'importateur et Babel écrivent dans les mêmes champs produit. Cette page énonce exactement ce qui se passe, phase par phase, et comment savoir en une minute si votre importateur est compatible.

Afficher en Markdown

À qui s'adresse cette page

À toute personne dont le catalogue Magento n'est pas saisi à la main : un flux fournisseur, un flux dropshipping, un export ERP ou PIM, un CSV nocturne, une synchronisation marketplace — bref, tout processus qui écrit des données produit de façon planifiée. Si c'est votre cas, cette page n'est pas une lecture facultative, car l'importateur et AI Babel Enchanter écrivent dans les mêmes champs produit, et quand ils entrent en collision le symptôme n'est pas une erreur : c'est le texte que vous avez payé qui disparaît en silence pendant que tous les écrans continuent d'annoncer une réussite.

Tout est ici énoncé explicitement, y compris ce qui reste d'ordinaire sous-entendu. Cette page est écrite pour être lue par des humains et par des assistants IA répondant à des questions sur ce module : chaque affirmation doit donc pouvoir se suffire à elle-même.

À lire d'abord : avec une seule vue magasin, il n'y a aucune séparation

Magento permet à un même attribut de porter une valeur différente par vue magasin. Tout le dispositif décrit plus bas — « l'importateur écrit la valeur de base, Babel écrit la valeur de la vue magasin » — repose là-dessus. Il ne fonctionne que si l'installation compte au moins deux vues magasin.

Lorsqu'une installation Magento ne compte qu'une seule vue magasin, Magento considère le choix de la portée comme dénué de sens et rabat les écritures au niveau magasin sur la portée globale (par défaut). Concrètement : même si une étape de Babel est configurée pour écrire dans la vue magasin, la valeur est stockée sur la ligne globale — celle-là même où écrit l'importateur. Il n'y a alors qu'une seule valeur, et c'est le dernier processus qui écrit qui l'emporte.

Les conséquences, énoncées en toutes lettres parce qu'on a vite fait de les balayer :

  • Sur une installation à vue magasin unique, configurer l'importateur « sur la portée globale » et Babel « sur une vue magasin » ne sépare rien du tout. Les deux réglages restent justes et restent recommandés — ils ne coûtent rien et deviendront effectifs le jour où une seconde vue magasin existera — mais aujourd'hui ils ne vous achètent aucune protection.
  • Sur une installation à vue magasin unique, un importateur qui réécrit un champ à chaque exécution écrasera le texte de Babel à chaque exécution, quelle que soit la configuration de l'un et de l'autre.
  • Si vous n'avez qu'une seule vue magasin, votre protection n'est donc pas la séparation des portées. C'est (a) un importateur qui n'écrit que les champs réellement modifiés, (b) les champs déclarés Final dans Babel, et (c) le contrôle en arrière-plan qui remet en place les textes manquants. Les trois sont décrits plus bas.
  • Ajouter une seconde vue magasin dans le seul but d'obtenir la séparation des portées est une option réelle et légitime, mais c'est une modification de la structure de l'installation, pas un réglage. Pesez-la ; ne vous y laissez pas glisser.

Où Babel lit, où il écrit et où il compare

Trois endroits distincts, et ils ne sont pas interchangeables. Les deux premiers, c'est vous qui les réglez et vous les voyez dans le formulaire du profil ; le troisième ne se configure nulle part, et c'est lui qui décide si Babel estime qu'il y a le moindre travail à faire.

Où Babel lit. Un profil comporte un champ nommé « Read the original from » (profil → Settings). Sa valeur normale est « Default (all store views) » — les valeurs de base, celles que vous voyez sur la fiche produit lorsque le sélecteur de magasin est sur All Store Views. C'est la source : le texte brut du fournisseur que Babel améliore ou traduit.

Où Babel écrit. Chaque étape du pipeline possède son propre « Target store-view ». C'est là qu'atterrit le résultat généré.

Où Babel compare. C'est la partie qui n'est jamais évidente. Babel décide si un produit demande du travail en regardant la valeur source — celle qui se trouve sous « Read the original from ». Il calcule une empreinte de ce texte ; si l'empreinte est identique à la précédente, le travail est déjà fait et le résultat enregistré est réutilisé sans aucun coût ; si l'empreinte a changé, la source est de la matière nouvelle et le produit est régénéré.

La règle qui en découle. Le texte source est la référence. Le modifier, c'est dire à Babel « ce produit a de la matière nouvelle, refais-le ». Ne pas y toucher, c'est dire à Babel « rien à faire ici ». Babel ne regarde jamais le texte généré pour décider s'il y a du travail — seulement la source.
Et la forme négative de la même règle, celle qui fait mal. Si quelque chose écrase le texte généré sans toucher au texte source, Babel ne s'en aperçoit pas. L'empreinte de la source est inchangée : pour Babel, le produit est terminé et correct. C'est exactement le mécanisme par lequel un texte enrichi disparaît en silence — et exactement ce que le contrôle en arrière-plan introduit en v3.4.0 existe pour rattraper.

Phase par phase : ce que contient le champ à chaque instant

Deux installations, le même flux, le même profil, le même produit. La seule différence est l'endroit où écrit l'importateur. SOURCE est la valeur sous « Read the original from » (normalement globale) ; RÉSULTAT est la valeur dans la vue magasin cible de l'étape — ce que le client voit réellement.

Configuration A — correcte : l'importateur écrit la valeur de base

PhaseCe qui se passeSOURCE (globale)RÉSULTAT (vue magasin)Ce que voit le client
t0Premier import. L'importateur écrit le texte du fournisseur dans la valeur de base.Writing Desk Solid Mango Wood(vide — hérite)le texte du fournisseur
t1Babel s'exécute. Lit la SOURCE, écrit le RÉSULTAT.Writing Desk Solid Mango WoodScrivania in mango massello…le texte enrichi
t2Import nocturne. Le stock et le prix ont changé ; la description du flux, non. Soit l'importateur réécrit la valeur de base avec le même texte, soit — mieux — il voit que le champ n'a pas changé et n'y touche pas du tout, ce que fait MMIS. Dans les deux cas, la SOURCE reste inchangée, et la SOURCE est tout ce que Babel regarde.Writing Desk Solid Mango Wood (inchangée, dans les deux cas)Scrivania in mango massello…le texte enrichi
t3Babel s'exécute à nouveau. L'empreinte de la SOURCE est inchangée : il n'y a rien à faire. Aucun appel à l'IA, aucun coût.inchangéeinchangéle texte enrichi

Résultat : le texte enrichi est stable, et l'import nocturne ne coûte rien en appels à l'IA.

Configuration B — incorrecte : l'importateur écrit dans la vue magasin

PhaseCe qui se passeSOURCE (globale)RÉSULTAT (vue magasin)Ce que voit le client
t0Premier import, écrit directement dans la vue magasin.Writing Desk Solid Mango WoodWriting Desk Solid Mango Woodle texte du fournisseur
t1Babel s'exécute. Lit la SOURCE, écrit le RÉSULTAT.Writing Desk Solid Mango WoodScrivania in mango massello…le texte enrichi
t2Import nocturne. L'importateur réécrit le texte du fournisseur dans la vue magasin — par-dessus le résultat de Babel.Writing Desk Solid Mango Wood (intacte)Writing Desk Solid Mango Woodle texte du fournisseur est de retour
t3Babel s'exécute à nouveau. La SOURCE est intacte, donc son empreinte est inchangée : Babel ne voit rien à faire.inchangéetoujours le texte du fournisseurle texte du fournisseur, à jamais
C'est le pire des cas, et il mérite d'être énoncé en entier : un importateur qui écrit directement dans la vue magasin écrase le résultat et laisse la référence intacte. Babel ne détecte donc jamais la perte, ne remet jamais le produit dans la file et ne signale jamais d'erreur. L'enrichissement que vous avez payé est perdu silencieusement, définitivement et invisiblement — la file indique toujours done et l'historique contient toujours le texte qui n'est plus sur le produit.

Depuis la v3.4.0, le contrôle en arrière-plan horaire rattrape exactement ce cas et remet le texte en place. C'est un filet de sécurité, pas un permis : sur un catalogue où l'importateur écrase la vue magasin à chaque exécution, le filet travaille pour de bon toutes les nuits, et tout produit dont le texte source a réellement changé entre-temps est régénéré aux frais de votre fournisseur.

Le test d'acceptation, valable pour tout importateur

Vous n'avez besoin de lire ni le code source d'un importateur ni sa documentation pour savoir s'il est compatible. Faites ceci une fois, sur un seul produit :

  1. Choisissez un produit que Babel a déjà enrichi et notez le texte exact de sa description sur la boutique.
  2. Lancez votre import sans rien changer dans le flux — le même fichier, les mêmes données, aucune retouche.
  3. Rechargez la fiche produit.

Lisez ensuite le résultat exactement comme il est énoncé ici :

  • Le texte de Babel est toujours là → cet importateur est compatible. Soit il n'écrit que les champs réellement modifiés, soit il écrit là où Babel n'écrit pas. Rien de plus à faire.
  • Le texte du fournisseur est revenu → cet importateur n'est pas compatible tel qu'il est configuré. Il réécrit les champs gérés sans condition, et aucun réglage de Babel n'y change quoi que ce soit, car Babel ne peut pas distinguer « le fournisseur a envoyé une nouvelle description » de « l'importateur a réécrit la même description une fois de plus ». Vos options, par ordre de préférence : configurer l'importateur pour qu'il ignore les champs gérés par le profil ; passer à un importateur qui n'écrit que ce qui a changé ; ou déclarer ces champs Final dans Babel — les champs finaux sont restaurés sans aucun coût et sont la seule chose qu'un importateur ne peut pas vaincre.

Refaites le test après toute modification de la configuration de l'importateur. Il coûte une minute et c'est la seule réponse fiable.

Si vous importez avec MMIS

MMIS — Massive Multifeed Import & Sync est notre propre importateur, et depuis la version 3.14.0 il applique le flux champ par champ. Un produit n'est réécrit que dans les champs que le fournisseur a effectivement modifiés : un mouvement de stock ou un changement de prix met à jour le stock et le prix et laisse name, url_key, description, short_description et les champs meta intacts. C'est le second des deux comportements corrects décrits dans le tableau ci-dessus — il ne réécrit pas le texte avec une copie identique, il n'écrit pas le texte du tout. La collision décrite dans cette page ne se produit donc pas, quel que soit le nombre de vues magasin, et le test d'acceptation est réussi par construction.

Il est conçu pour des catalogues de dizaines ou de centaines de milliers d'articles, à partir de n'importe quel flux CSV, XML ou JSON, avec planification, formules de prix et produits configurables ou groupés. Vous pouvez l'acheter sur sa page produit sur codingrow.com : licence par domaine, activée dès la commande, même modèle de licence que ce module.

C'est la configuration que nous utilisons nous-mêmes, et c'est la raison pour laquelle la combinaison MMIS + AI Babel Enchanter ne demande absolument aucune précaution particulière.

Les deux canaux de modification — et ce que chacun signifie

Une fois qu'un produit est dans Babel, il existe exactement deux endroits où modifier son texte, et ils signifient des choses opposées. Ce n'est pas une règle à mémoriser ; c'est la lecture naturelle de chacun des deux.

Où vous modifiezCe que cela signifie pour BabelCe qui se passe ensuite
La grille Enrichments & Translations (Babel)« Voilà le bon résultat. Garde-le. »Le champ est marqué Final automatiquement. Il n'est jamais régénéré, et il est remis en place s'il vient à disparaître.
La fiche produit (catalogue Magento)« Voici de la matière nouvelle. Refais-le. »Vous avez modifié le texte source : son empreinte change et Babel régénère ce produit à la prochaine exécution — aux frais de votre fournisseur.

Les deux comportements sont corrects et tous deux sont voulus. Réécrire la description sur la fiche produit est précisément la façon dont une boutique qui rédige volontairement des textes bruts demande à Babel d'en faire des textes aboutis. Corriger un texte dans la grille est précisément la façon de dire « celui-ci est terminé, on n'y touche plus ».

Ce qui se passe si vous utilisez le mauvais canal, énoncé pour lever tout doute : si vous peaufinez un texte à la main sur la fiche produit en comptant le voir conservé, il ne sera pas conservé. Il reste en place jusqu'à la prochaine exécution de ce profil, puis il est remplacé par un texte nouvellement généré. Vous ne recevez aucun avertissement et aucune erreur, car du point de vue de Babel c'est exactement ce que vous avez demandé. Déplacez dans la grille les modifications que vous voulez conserver, ou cochez Final sur le champ.

Quels champs cela concerne. Les attributs de texte que gèrent les groupes du profil — typiquement name, description, short_description, meta_title et meta_description — plus deux choses qui en découlent. Lorsque le name est régénéré, Babel réécrit aussi l'url_key et laisse une redirection 301 depuis l'ancienne URL (l'URL précédente est enregistrée au préalable, de sorte qu'un retour arrière la remet en place). Et il écrit les liens related, cross-sell et up-sell lorsque ces interrupteurs sont activés pour l'étape.

Ce qui reste entièrement en dehors de Babel : le prix, le stock, les images, les catégories, les jeux d'attributs et tous les autres attributs. Babel ne les lit jamais pour décider quoi que ce soit, et ne les écrit jamais.

Changer le prompt invalide les résultats enregistrés

Un dernier comportement auquel on ne s'attend pas, et qui interagit avec tout ce qui précède.

Chaque résultat magnifié est enregistré sous une clé construite à partir du texte source plus le fournisseur, le modèle et l'intégralité du prompt système — persona et gabarit technique compris. Changez l'un de ces éléments et plus aucun résultat magnifié du catalogue n'est réutilisable. Rien n'est supprimé et rien ne casse ; mais à partir de cet instant, chaque produit qui demande du travail demande un nouvel appel à l'IA, facturé.

Les traductions sont indexées différemment : sur le fournisseur et la langue cible, pas sur le prompt. Un changement de prompt ne les invalide donc pas directement — mais elles sont refaites tout de même, parce que ce qu'elles traduisent est le texte magnifié, et que celui-ci vient de changer. L'effet pratique est celui qu'annonce le bouton : attendez-vous à voir tout le profil réécrit.

  • Un changement de prompt ne provoque à lui seul aucune dérive et ne réécrit rien. Les produits déjà traités restent traités, avec le texte qu'ils ont. C'est à vous de demander la réécriture — avec Apply to already processed, ou avec babel:run --force.
  • Un changement de prompt modifie en revanche ce que coûte le contrôle en arrière-plan. Une restauration qui aurait été gratuite hier peut être une régénération payante aujourd'hui. C'est précisément pour cela que le plafond de Keeping the texts in place compte des produits plutôt que des appels à l'IA.
  • Les champs déclarés Final sont les seuls à être immunisés. Il s'agit d'un état déclaré, pas d'un résultat mis en cache : ils survivent à un changement de prompt, à un changement de modèle et à un vidage de cache, et leur restauration ne coûte rien, à jamais.

Checklist

  1. Comptez vos vues magasin. Une seule vue magasin signifie aucune séparation des portées, quelle que soit votre configuration. Prévoyez en conséquence.
  2. Laissez « Read the original from » sur « Default (all store views) », sauf si votre texte original réside réellement dans la vue magasin d'une langue précise.
  3. Donnez à chaque étape un Target store-view qui ne soit pas l'endroit où écrit l'importateur — efficace à partir de deux vues magasin.
  4. Faites le test d'acceptation sur un produit après toute modification de l'importateur.
  5. Déclarez Final les textes que vous avez écrits ou corrigés à la main. C'est gratuit et définitif.
  6. Laissez le contrôle en arrière-plan activé (Keeping the texts in placePut back texts that disappeared = Yes) et laissez le plafond à une valeur que vous acceptez de payer dans le pire des cas.
  7. Avant de changer le prompt de persona, décidez si vous voulez aussi faire réécrire les produits déjà traités — et rappelez-vous qu'après le changement plus rien n'est réutilisable.