top of page

LangChain langchain==1.4.3 corrige les scénarios d’échec que les agents ne peuvent ignorer

29 sept.
14 min de lecture

LangChain a publié langchain==1.4.3 avec sept changements, dont des correctifs pour la relève de modèles, la sortie structurée et les appels d’outils mal formés. Le correctif ajoute également la prise en charge de Bedrock Mantle à l’initialiseur de modèles du framework. Cette combinaison rend cette version plus importante que ne le laisse penser son numéro de patch.

Le conflit central oppose fiabilité et abstraction. LangChain permet aux développeurs d’utiliser une interface d’agent unique avec différents modèles et fournisseurs. Toutefois, les paramètres propres aux fournisseurs, les formats de réponse et les règles de messages continuent de transparaître derrière cette interface.

La version 1.4.3 traite plusieurs situations où ces différences pouvaient arrêter un agent après son déploiement. La version officielle est arrivée le 28 septembre 2026, un jour après que deux rapports de suivi ont remis en question une précédente correction d’appel d’outil.

La mise à jour n’introduit pas une nouvelle architecture d’agent. Elle renforce la couche de traduction entre le code des agents et l’évolution du comportement des fournisseurs. Pour les équipes exploitant des agents sur des endpoints compatibles OpenAI, Amazon Bedrock, Anthropic, Fireworks ou Azure OpenAI, cette couche détermine souvent si la relève fonctionne réellement.

Ce qui change dans langchain==1.4.3

La version se concentre sur les échecs qui surviennent lorsque les agents franchissent les frontières entre fournisseurs ou rejouent un historique de conversation imparfait.

Les notes de version de LangChain recensent sept pull requests depuis la version 1.4.2. Quatre influent directement sur le comportement des modèles ou des agents. Les autres changements mettent à jour la documentation, suppriment du code commenté et actualisent une dépendance verrouillée.

Le premier correctif comportemental assainit les paramètres de modèle liés au cache lors d’une relève. Une relève intervient lorsqu’un agent passe de son modèle préféré à un autre après une erreur ou un problème de disponibilité.

Avant ce correctif, des paramètres destinés au premier fournisseur pouvaient accompagner la requête. Le fournisseur de relève pouvait rejeter ces paramètres inconnus au lieu de terminer la requête. Une fonctionnalité de résilience devenait alors un nouveau point de défaillance.

Le deuxième changement majeur enregistre deux fournisseurs Amazon Bedrock Mantle auprès de init_chat_model. Cette fonction offre aux applications un point d’entrée commun pour créer des intégrations de modèles de chat.

Les développeurs peuvent désormais identifier bedrock_mantle_openai ou bedrock_mantle_anthropic comme fournisseur. LangChain connecte alors la requête aux classes correspondantes fournies par langchain-aws.

Le troisième changement ajuste la manière dont les agents sélectionnent la sortie structurée pour GPT-6 Sol, Luna et Astra. La sortie structurée signifie que le modèle renvoie des données conformes à un schéma attendu plutôt qu’un texte libre.

Lorsque les profils de modèles n’étaient pas disponibles, LangChain pouvait auparavant envoyer ces modèles vers une stratégie fondée sur les outils. Cette voie pouvait boucler ou échouer sur Bedrock. La version 1.4.3 reconnaît les noms de modèles et sélectionne par défaut la sortie structurée native du fournisseur.

Le quatrième changement comportemental répare les appels d’outils mal formés stockés dans l’historique des agents. Les appels d’outils sont des demandes générées par le modèle pour qu’une application exécute une fonction, récupère des données ou réalise une autre action définie.

Certains fournisseurs exigent que chaque appel d’outil identifiable dispose d’un message de résultat correspondant. Un appel mal formé sans ce résultat peut rendre une relecture ultérieure invalide, même si le tour initial est déjà terminé.

LangChain ajoute désormais un résultat d’erreur pour les appels invalides identifiables tout en préservant les résultats valides associés par ID d’appel d’outil. La réparation s’applique aux messages actuels et historiques et ne demande pas au modèle de répéter l’appel.

La version fait également passer la version verrouillée d’AnyIO de 4.11.0 à 4.14.2. AnyIO assure une compatibilité asynchrone entre les implémentations de boucles d’événements Python. Les notes de version présentent ce changement comme une mise à jour de dépendance plutôt que comme une nouvelle capacité d’exécution.

Une correction documentaire actualise les instructions de configuration du dépôt et les détails du package. Un autre changement de maintenance supprime un extra Cohere commenté. Aucun des deux ne devrait modifier le comportement des applications.

Ensemble, ces changements font de la version 1.4.3 une version de compatibilité. Elle étend un parcours fournisseur tout en renforçant trois parcours d’échec qui affectent la continuité des agents.

La relève de modèles élimine désormais les paramètres de cache incompatibles

La relève n’améliore la disponibilité que lorsque le second modèle reçoit une requête qu’il peut comprendre.

Au niveau des politiques, la relève de modèles semble simple. Une application choisit un modèle principal, identifie une ou plusieurs alternatives et parcourt cette liste lorsqu’une requête échoue.

La requête réelle transporte davantage que des messages. Elle peut inclure des clés de cache, des en-têtes personnalisés, des instructions de format de réponse, des définitions d’outils, des délais d’attente et des options propres au fournisseur.

Ces paramètres créent un problème de compatibilité caché. Un paramètre de cache accepté par un fournisseur peut être dénué de sens ou invalide pour un autre. Le transmettre sans modification peut faire échouer la requête de relève avant que le modèle alternatif ne produise le moindre token.

Le correctif de cache pour la relève cible deux paramètres. Il supprime x-session-affinity lorsque la relève n’utilise pas Fireworks. Il supprime également prompt_cache_key hors de Fireworks, OpenAI et Azure OpenAI.

L’affinité de session dirige les requêtes liées vers le même emplacement de service, ce qui peut améliorer la réutilisation du cache. Ce comportement dépend de l’infrastructure du fournisseur et ne peut être supposé d’un endpoint à l’autre.

Une clé de cache de prompt aide de la même manière les fournisseurs pris en charge à associer des requêtes à du contenu de prompt mis en cache. Ce n’est pas un champ universel dans toutes les API de modèles.

Le middleware préserve ces paramètres lorsque la relève sélectionnée les prend en charge. Il laisse également intacts les en-têtes et configurations sans rapport, y compris la gestion existante des marqueurs de cache Anthropic.

Cette distinction est importante. Supprimer tous les paramètres optionnels éviterait certaines erreurs de compatibilité, mais sacrifierait aussi des comportements utiles chez les fournisseurs qui prennent ces paramètres en charge.

L’implémentation utilise plutôt le _llm_type du modèle de relève pour déterminer ce qui doit rester. Elle crée des paramètres assainis pour l’appel de relève sans modifier la requête d’origine.

Cette conception protège le traitement ultérieur. Si un objet de requête est partagé entre plusieurs middlewares ou réessayé par une autre voie, une tentative de relève ne doit pas effacer définitivement sa configuration.

La pull request inclut une couverture synchrone et asynchrone. Les tests vérifient le nettoyage des en-têtes, la suppression des clés de cache non prises en charge et leur préservation lorsque le fournisseur de relève accepte le paramètre.

Il s’agit d’un correctif ciblé avec une leçon opérationnelle large. La relève entre fournisseurs n’est pas simplement une liste de noms de modèles. C’est un problème de traduction impliquant chaque champ attaché à la requête.

Les équipes devraient toujours tester chaque paire ordonnée de fournisseurs qu’elles déploient. Un parcours OpenAI-vers-Azure réussi ne valide pas le comportement OpenAI-vers-Anthropic ou Fireworks-vers-Bedrock.

Le patch n’assainit que les paramètres visés par la pull request. D’autres paramètres propres aux fournisseurs peuvent encore créer des incompatibilités à mesure que les API de modèles évoluent.

Les équipes applicatives devraient donc surveiller l’aboutissement des relèves séparément du succès du modèle principal. Un tableau de bord qui combine les deux parcours peut masquer un système de relève qui n’obtient jamais de réponse exploitable.

Elles devraient également enregistrer quel modèle a finalement traité chaque requête. Sans ce signal, une équipe ne peut pas relier les changements de sortie ou l’augmentation de la latence à une transition de fournisseur.

Le test le plus révélateur ne consiste pas à vérifier que le middleware intercepte une exception forcée. Il consiste à déterminer si l’intégralité de la requête en aval réussit avec les paramètres exacts utilisés en production.

Cela inclut la sortie structurée, les outils, le cache et l’historique des messages. La version 1.4.3 élimine deux pièges connus, mais elle ne rend pas tous les fournisseurs interchangeables.

Bedrock Mantle rejoint le point d’entrée commun des modèles LangChain

LangChain expose désormais Bedrock Mantle via son initialiseur partagé, mais les applications doivent identifier explicitement le fournisseur.

La nouvelle intégration ajoute bedrock_mantle_openai et bedrock_mantle_anthropic aux fournisseurs reconnus par init_chat_model. Ces noms se connectent à ChatOpenAIMantle et ChatAnthropicMantle.

Les deux classes se trouvent dans langchain-aws, et non dans le package LangChain principal. L’intégration Mantle exige langchain-aws version 1.7.9 ou ultérieure à l’exécution.

Selon la pull request fusionnée, les classes résolvent elles-mêmes l’endpoint Mantle régional. Elles peuvent également gérer une clé d’API Bedrock, la variable d’environnement AWS_BEARER_TOKEN_BEDROCK ou des identifiants temporaires dérivés des identifiants AWS standard.

Cela évite d’utiliser des fonctions de création personnalisées dans la configuration habituelle. Les développeurs peuvent employer le même initialiseur de haut niveau qui route déjà les autres fournisseurs.

Toutefois, l’inférence fondée sur les noms reste délibérément limitée. LangChain continue d’associer les identifiants de modèles commençant par anthropic.* à son fournisseur Bedrock existant.

Les identifiants OpenAI hébergés sur Bedrock commençant par openai.* ne sélectionnent pas automatiquement Mantle. Les développeurs doivent fournir le nom du fournisseur Mantle ou un préfixe de fournisseur explicite.

Les mainteneurs ont évité de modifier l’inférence existante, car cela redirigerait silencieusement les applications vers un endpoint différent. Préserver le comportement actuel réduit le risque de mise à niveau pour les équipes utilisant déjà des intégrations Bedrock.

Cela crée un compromis raisonnable. Une configuration explicite ajoute une légère exigence de paramétrage, mais elle évite qu’une version corrective ne change la destination des requêtes de charges de travail établies.

L’installation des dépendances mérite une attention similaire. La discussion de la pull request a retenu des extras composites pour la famille de modèles utilisée.

Les combinaisons documentées sont langchain[aws,openai] pour les modèles Mantle compatibles OpenAI et langchain[aws,anthropic] pour les modèles compatibles Anthropic. Cette approche permet de conserver un extra AWS général plus léger.

La discussion relève également une préoccupation résiduelle liée aux dépendances dans langchain-aws. Les clés temporaires dérivées d’identifiants peuvent importer paresseusement un package supplémentaire de génération de tokens lors de leur renouvellement.

Cela signifie qu’un test d’importation ou de démarrage réussi peut ne pas couvrir tous les parcours d’authentification. Les équipes utilisant des identifiants temporaires devraient tester le comportement de renouvellement en préproduction, et pas uniquement la première requête.

La pression plus générale repose sur les mainteneurs de frameworks plutôt que sur une seule entreprise concurrente. Les plateformes cloud exposent de plus en plus les modèles au travers de plusieurs familles d’API, systèmes d’identifiants et endpoints régionaux.

Un initialiseur commun doit masquer suffisamment de variations pour réduire le code applicatif. Il doit également exposer suffisamment de variations pour éviter des choix automatiques trompeurs.

La décision de LangChain privilégie un routage explicite à la frontière du fournisseur. C’est plus sûr que de deviner lorsque des préfixes de familles de modèles identiques peuvent atteindre des services Bedrock distincts.

Pour les développeurs, l’avantage pratique est une construction cohérente. Une application peut sélectionner un modèle soutenu par Mantle via la configuration sans créer de fonction de fabrique distincte.

La limite est tout aussi importante. Une construction commune ne garantit pas un comportement identique entre fournisseurs. L’authentification, les paramètres pris en charge, les événements de streaming, les appels d’outils et la sortie structurée peuvent encore différer.

Les équipes adoptant cette nouvelle voie devraient tester leur charge de travail d’agent réelle. Un prompt de base confirme la connectivité, mais ne valide pas l’exécution d’outils, l’application de schémas, la relève ou le renouvellement des identifiants.

Cette version facilite l’accès à Mantle. La préparation à la production dépend toujours de la vérification du cycle de vie complet des requêtes.

La sortie structurée de GPT-6 s’éloigne de l’émulation par outils

La correction GPT-6 privilégie la gestion native des schémas lorsque les métadonnées de profil du modèle sont absentes, réduisant la dépendance aux appels d’outils synthétiques.

Les frameworks d’agents ont besoin d’une stratégie pour convertir la sortie d’un modèle en données d’application typées. Une approche consiste à demander au fournisseur une sortie structurée native. Une autre représente le schéma souhaité comme un outil appelable.

La stratégie basée sur les outils peut fonctionner avec des modèles dépourvus de contrôles natifs de schéma. Elle ajoute également une couche de protocole supplémentaire, incluant la sélection d’outils, la génération d’arguments, la gestion des résultats et la relecture de la conversation.

LangChain utilise généralement les profils de modèles pour déterminer quelle stratégie un modèle prend en charge. Un profil de modèle est une métadonnée qui décrit des capacités telles que la sortie structurée native.

Le problème survient lorsque ces métadonnées sont absentes. LangChain doit alors prendre une décision de repli en fonction de l’identifiant du modèle ou d’autres informations disponibles.

Pour GPT-6 Sol, Luna et Astra, le repli précédent sélectionnait une sortie structurée basée sur les outils. La correction GPT-6 indique que ce chemin pouvait boucler ou échouer sur Bedrock.

La version 1.4.3 ajoute ces identifiants de modèles à la liste de repli vers la sortie native. D’après les tests associés, elle reconnaît les noms simples ainsi que les formes préfixées pour Bedrock.

L’effet est ciblé. Les agents utilisant ces variantes de GPT-6 sans profils choisissent désormais par défaut la sortie structurée native du fournisseur.

Cela ne signifie pas que tous les modèles reçoivent le même traitement. Il s’agit d’une règle de compatibilité pour des modèles identifiés dont la capacité attendue est déjà connue.

Ce changement montre également pourquoi les métadonnées de capacités sont devenues une infrastructure critique. Les seuls noms de modèles donnent souvent une vision incomplète du comportement d’un endpoint.

Un même fournisseur peut héberger un modèle via plusieurs interfaces. Ces interfaces peuvent exposer des fonctionnalités de schéma, des champs acceptés ou des sémantiques d’erreur différents.

Un système fondé sur les profils donne aux frameworks un emplacement central pour décrire ces variations. Les applications ont néanmoins besoin d’un comportement raisonnable lorsque les profils sont absents, retardés ou indisponibles.

La liste de repli de LangChain comble cette lacune. Sa faiblesse réside dans la maintenance : chaque nouvelle famille de modèles prise en charge doit être reconnue correctement et mise à jour à mesure que le comportement des fournisseurs évolue.

Les faux négatifs font passer un modèle capable par une émulation d’outil inutile. Les faux positifs peuvent demander une sortie native à un endpoint qui ne l’implémente pas correctement.

La correction actuelle priorise un cas d’échec connu. Elle supprime un chemin problématique pour les modèles GPT-6 nommés sans redéfinir la sélection de sortie structurée dans l’ensemble du framework.

Les développeurs devraient toujours valider des schémas qui ressemblent à leurs contrats de production. Les objets imbriqués, les unions, les champs facultatifs et les longues énumérations peuvent révéler des différences qu’un petit exemple ne détecte pas.

Ils devraient également examiner séparément les erreurs de validation et les erreurs du fournisseur. Une requête de sortie structurée acceptée peut toujours renvoyer des données qui échouent face au schéma de l’application.

Les nouvelles tentatives nécessitent des limites soigneusement définies. Un échec de schéma qui déclenche une autre requête identique peut produire une boucle coûteuse, en particulier lorsque le framework classe mal les capacités de l’endpoint.

Le déploiement le plus sûr compare trois résultats : l’acceptation par le fournisseur, la validation du schéma et l’utilisation en aval. La réussite de la seule première étape ne démontre pas la fiabilité de la sortie structurée.

Cette version réduit l’émulation d’outil inutile pour certains modèles. Elle renforce également la valeur de profils précis alors que les catalogues de modèles continuent de s’étendre.

Les appels d’outils invalides révèlent le problème d’état le plus difficile des agents

La réparation de LangChain préserve un historique rejouable, mais des signalements ultérieurs montrent que la normalisation des messages reste sensible aux règles des fournisseurs.

Une conversation d’agent est plus qu’une transcription. C’est une machine à états dans laquelle les demandes d’outils de l’assistant et les résultats d’outils doivent former des paires valides.

Un appel d’outil malformé peut rompre cette séquence. Le modèle peut produire des arguments invalides, omettre des identifiants requis ou renvoyer une structure que le framework ne peut pas analyser.

Si le framework stocke cet appel sans résultat correspondant, les requêtes ultérieures peuvent échouer lorsque le fournisseur valide l’historique rejoué. L’erreur peut apparaître plusieurs tours après le défaut initial.

La réparation des appels d’outils de LangChain ajoute un ToolMessage d’erreur pour chaque appel d’outil invalide identifiable. Elle vérifie également les appels historiques lors de la reconstruction de l’état des messages.

La réparation préserve les résultats existants en les associant à leurs identifiants d’appel d’outil. Elle ne réessaie pas la requête malformée, ce qui évite de demander au modèle de répéter automatiquement une action.

Ce comportement soutient un objectif de récupération important. La conversation peut enregistrer que l’action d’outil demandée a échoué tout en conservant un historique environnant exploitable.

Sans un tel enregistrement, un agent pourrait devenir impossible à reprendre. Les applications devraient supprimer l’historique, réécrire manuellement les messages ou démarrer un nouveau fil.

La difficulté tient au fait que les fournisseurs n’interprètent pas tous les relations entre messages d’outil de la même façon. Une réparation valide selon un protocole de messages peut enfreindre les règles d’ordonnancement plus strictes d’un autre fournisseur.

La chronologie de la pull request rend cette incertitude visible. Le 27 septembre, des utilisateurs ont ouvert des signalements de suivi impliquant des fils Anthropic et des résultats d’outils réparés.

Un signalement affirmait qu’un tool_result généré ne possédait pas de tool_use correspondant, entraînant une erreur du fournisseur après un appel invalide. Un autre proposait de conserver les appels réparés rattachés à un parent dans chaque payload.

Ces signalements ont été fermés avant la sortie de la version 1.4.3, et la réparation est restée dans la version. Leur présence reste toutefois un avertissement utile contre l’idée que la normalisation des messages est définitivement réglée.

La pull request a également reçu une alerte de performance durant son développement. Un benchmark enregistré montrait que le temps d’instanciation des agents passait de 4,5 millisecondes à 5,4 millisecondes, soit une régression de 16,62 pour cent.

Ce chiffre provenait d’une comparaison intermédiaire et ne devrait pas être considéré comme un benchmark indépendant de la version finale. Il identifie un domaine qui mérite des tests plutôt qu’un impact de production confirmé.

Pour la plupart des agents déployés, la latence du fournisseur éclipsera une différence de construction d’une milliseconde. Les services à haut débit qui construisent à répétition des agents peuvent présenter un profil de coûts différent.

Les équipes devraient évaluer le package final au sein de leur propre processus. Le résultat dépend des schémas d’initialisation, des middlewares, des outils, de la configuration du modèle et de la réutilisation des objets.

La justesse demeure l’enjeu principal. Un historique réparé doit satisfaire le fournisseur tout en représentant fidèlement ce qui s’est passé.

Un résultat d’erreur ne devrait pas laisser entendre qu’une action externe a été exécutée. Il devrait également éviter d’inciter l’agent à supposer une réussite lors d’un raisonnement ultérieur.

Les applications dotées d’outils aux conséquences importantes devraient conserver des enregistrements d’exécution distincts de la liste des messages conversationnels. L’historique destiné au modèle n’est pas une piste d’audit suffisante.

Ces enregistrements devraient inclure l’outil demandé, les arguments validés, le statut d’exécution, les données renvoyées et les éventuels effets de bord. Ils aident également les équipes à reconstruire les échecs sans dépendre d’un texte généré.

Les équipes d’ingénierie peuvent soutenir ce travail avec une collection consultable de documents techniques locaux. Les runbooks, schémas et notes d’incident deviennent particulièrement précieux lorsque des erreurs de fournisseur apparaissent après une relecture différée.

La leçon plus profonde est que la durabilité des agents dépend de la réparation de l’état. De meilleurs modèles ne suppriment pas la nécessité de normaliser les messages malformés, de préserver la causalité et de distinguer les actions tentées des actions achevées.

La version 1.4.3 améliore ce chemin de réparation. La discussion de suivi montre pourquoi les développeurs devraient le tester avec chaque fournisseur auprès duquel ils prévoient de rejouer des conversations.

Ce que les développeurs devraient surveiller après la sortie

Les prochains éléments de preuve devraient provenir de charges de travail multi-fournisseurs, de profils de modèles actualisés et de tests de relecture construits autour de défaillances réelles.

Le premier signal est la réussite du repli entre fournisseurs mixtes. Les équipes devraient tester les modèles principaux et de secours avec les paramètres de cache, les outils, le streaming et la sortie structurée activés simultanément.

Si ces requêtes se terminent sans nettoyage manuel propre à chaque fournisseur, la nouvelle logique de nettoyage fait son travail. De nouveaux paramètres rejetés affaibliraient l’hypothèse selon laquelle le filtre actuel est suffisamment large.

Le deuxième signal est le comportement de Bedrock Mantle sous authentification prolongée. Un test de démarrage ne peut pas exercer le rafraîchissement des identifiants temporaires, les workers de longue durée ou les changements d’endpoints régionaux.

Un rafraîchissement réussi pour les deux familles de modèles prises en charge renforcerait le cas d’intégration. Des échecs de dépendances pendant le rafraîchissement révéleraient que les consignes d’installation doivent encore être améliorées.

Le troisième signal est la portabilité des historiques réparés. Les développeurs devraient rejouer des historiques d’appels d’outils malformés et partiellement réparés via chaque fournisseur utilisé en production.

Un résultat solide signifie que l’agent reprend sans supprimer le contexte ni inventer une réussite d’outil. Des erreurs de validation propres à un fournisseur montreraient qu’une stratégie de réparation partagée nécessite davantage de spécialisation.

Les équipes passant de la version 1.4.2 devraient commencer par des tests de régression plutôt que par un vaste déploiement en production. Les cas les plus précieux sont les historiques et configurations de requêtes qui échouaient auparavant.

Épinglez langchain-aws à une version compatible lorsque vous utilisez Mantle, puis vérifiez les extras requis dans un environnement propre. Les machines de développement existantes peuvent masquer des dépendances manquantes grâce à des installations sans rapport.

Pour la sortie structurée de GPT-6, inspectez la stratégie sélectionnée et validez des schémas réalistes. Ne supposez pas qu’un simple objet réussi couvre des réponses de production imbriquées.

Pour le repli de modèle, consignez le modèle sélectionné et les catégories de requêtes nettoyées. Évitez de journaliser des secrets, des identifiants bruts ou du contenu confidentiel de prompts.

Pour la réparation des appels d’outils, capturez les appels malformés comme fixtures de test après avoir supprimé les données sensibles. Ces fixtures peuvent protéger contre les régressions lorsque les fournisseurs ou les versions du framework évoluent.

Aucun de ces changements ne supprime le besoin de contrôles au niveau de l’application. Les délais d’expiration, les nouvelles tentatives limitées, les clés d’idempotence, les enregistrements d’exécution et la revue humaine restent nécessaires pour les actions importantes.

La version améliore plutôt le comportement du framework lorsque les différences entre fournisseurs atteignent la couche agent. C’est précieux, car ces différences deviennent plus fréquentes, et non moins.

langchain==1.4.3 doit donc être compris avant tout comme un correctif de fiabilité comportant un ajout d’intégration notable. Son importance réside dans les situations qu’il tente de préserver : le repli, la génération de schémas, la relecture des conversations et le routage entre fournisseurs.

Si vos agents utilisent ces chemins, reproduisez les échecs avant la mise à niveau et relancez-les ensuite. Testez ensuite le workflow combiné, car les défaillances de production respectent rarement les frontières entre correctifs individuels.

 
 

Commencez pour Gratuit

Un premier assistant IA local avec gestion des connaissances personnelles

Pour une meilleure expérience IA,

remio ne supporte que Windows 10+ (x64) et M-Chip Macs actuellement.

Votre partenaire IA au travail
Faites-en plus avec remio

Planifiez. Créez. Livrez.
Tout au même endroit.

bottom of page