top of page

Anthropic GitHub corrige deux défaillances cachées dans LangChain 1.5.3

il y a 54 minutes
14 min de lecture

Les intégrations Anthropic ont bénéficié de deux correctifs ciblés lorsque LangChain a publié la version 1.5.3 le 28 juillet 2026. La mise à jour GitHub d’Anthropic traite des défaillances susceptibles d’interrompre les boucles d’agents Claude avec des erreurs HTTP 400. Aucun de ces changements n’ajoute de capacité visible au modèle, mais tous deux protègent l’historique des messages dont dépendent les agents.

Un correctif préserve un champ thinking vide lorsque LangChain traite des données de signature diffusées en streaming. Sans ce champ, une réponse Claude valide pouvait devenir un message invalide lors de sa relecture au prochain appel au modèle. Le second correctif retire des blocs de contenu de messages système les identifiants propres à LangChain avant leur envoi à Anthropic.

Cette combinaison en fait davantage qu’un correctif de routine. La version met en lumière un conflit récurrent dans l’infrastructure des agents : les frameworks souhaitent un format de message portable unique, tandis que les fournisseurs de modèles imposent des schémas d’API plus restrictifs. OpenAI, Google, Anthropic et d’autres fournisseurs appliquent chacun des règles différentes à la frontière finale de la requête.

LangChain se situe entre ces formats. Ses abstractions aident les développeurs à changer de modèles et à composer des outils, mais chaque conversion crée un nouvel endroit où un état valide peut être perdu. La version 1.5.3 montre comment une chaîne vide manquante ou un identifiant supplémentaire peut désactiver un agent pourtant fonctionnel.

Ce qui change dans LangChain Anthropic 1.5.3

LangChain Anthropic 1.5.3 corrige deux chemins de conversion de messages qui produisaient des requêtes rejetées par l’API Claude.

Les notes de version officielles d’Anthropic répertorient deux correctifs depuis la version 1.5.2. L’un concerne les blocs de réflexion diffusés en streaming. L’autre assainit le contenu des messages système avant transmission.

La correction du streaming cible une séquence d’événements précise impliquant la réflexion adaptative. La réflexion adaptative permet à Claude de déterminer la quantité de raisonnement interne à appliquer dans les limites configurées par le fournisseur. L’API peut renvoyer un contenu de réflexion structuré et une signature cryptographique en complément de la réponse visible.

Pendant le streaming, ces résultats n’arrivent pas nécessairement sous la forme d’un objet complet unique. LangChain reçoit plusieurs événements et les combine dans un AIMessage, sa représentation normalisée d’une réponse de modèle. Ce message assemblé peut ensuite faire partie d’une autre requête.

La défaillance signalée apparaissait lorsqu’un bloc de réflexion contenait une chaîne vide tout en recevant un signature_delta. Un delta de signature est un fragment diffusé en streaming qui porte des données de signature pour le bloc de réflexion. Aucun thinking_delta ne suivait, puisqu’aucun texte de raisonnement n’était à ajouter.

LangChain écartait initialement l’état du bloc vide. Il reconstruisait ensuite le bloc à partir de l’événement de signature, produisant un objet avec les champs type et signature. Toutefois, la clé thinking obligatoire était absente.

Le message pouvait paraître inoffensif lorsqu’il était stocké dans une application. Il échouait uniquement lorsque l’agent rejouait cet historique vers Claude. Anthropic rejetait alors la requête parce que le bloc de réflexion ne contenait pas son champ obligatoire.

Le correctif de streaming utilise setdefault("thinking", "") lors du traitement des deltas de signature. Cette opération conserve une valeur existante ou insère une chaîne vide lorsque la clé est absente. Elle préserve ainsi la structure d’objet attendue par le fournisseur sans inventer de texte de raisonnement.

Le correctif des messages système traite le problème inverse. Au lieu de perdre un champ obligatoire, LangChain en transmettait un qui n’était pas pris en charge.

Les blocs de contenu LangChain v1 peuvent inclure un id interne. Cet identifiant aide le framework à représenter et suivre le contenu de manière cohérente. Le schéma des messages système d’Anthropic n’accepte pas ce même champ à cet emplacement.

Avant la version 1.5.3, _format_messages pouvait transmettre un contenu SystemMessage fondé sur une liste sans restreindre chaque bloc de texte. Un bloc créé via create_text_block() pouvait donc transporter son identifiant interne dans la charge utile sortante.

Anthropic rejetait cette requête avec une erreur indiquant que des entrées supplémentaires n’étaient pas autorisées. Le même chemin de formatage affectait également le comptage des jetons via get_num_tokens_from_messages. Une application pouvait échouer avant la génération alors qu’elle ne faisait qu’estimer la taille de la requête.

La correction des blocs système applique un assistant de formatage partagé aux blocs de texte système. Elle conserve les propriétés prises en charge telles que type, text, cache_control et les citations, tout en supprimant les métadonnées non prises en charge.

Ces changements sont modestes en volume de code. Leur effet opérationnel est plus important, car ils interviennent tous deux à des frontières utilisées de manière répétée par les applications d’agents. L’un protège l’état de réponse pendant le streaming, tandis que l’autre nettoie l’état de l’application avant transmission.

Pourquoi le correctif GitHub d’Anthropic importe pour les boucles d’agents

La défaillance importante était différée : LangChain pouvait accepter la réponse de Claude, l’enregistrer, puis ne découvrir la corruption qu’au tour suivant.

Un chatbot élémentaire peut envoyer une invite et afficher une réponse. Une boucle d’agent effectue une séquence plus longue. Le modèle choisit un outil, l’application l’exécute, puis le modèle reçoit à la fois son message précédent et le résultat de l’outil.

Cette exigence de relecture rend la fidélité des messages cruciale. L’application ne peut pas se contenter de conserver le texte visible. Elle peut avoir besoin d’appels d’outils structurés, de blocs de réflexion, de signatures et de métadonnées propres au fournisseur afin de poursuivre correctement la conversation.

Les instructions d’Anthropic sur la réflexion étendue expliquent que les blocs de réflexion peuvent contenir des signatures. Lorsque ces blocs figurent dans des requêtes ultérieures, les applications doivent préserver leur structure pertinente. Le framework agit donc comme un sérialiseur d’état, et non comme une simple enveloppe de texte.

Le rapport de bug initial incluait une reproduction déterministe ne nécessitant aucun appel API actif. Il simulait le début d’un bloc de réflexion au contenu vide, suivi d’un delta de signature. Le résultat agrégé ne contenait pas la clé thinking.

Cette omission ne rompait pas nécessairement la première réponse diffusée en streaming. L’utilisateur pouvait recevoir une réponse normale et l’agent pouvait exécuter l’outil sélectionné. La défaillance apparaissait lorsque la requête suivante incluait le message précédent mal formé.

Ce calendrier rend le bug plus difficile à diagnostiquer. Un développeur pouvait incriminer la sortie de l’outil, la seconde invite ou une restauration de point de contrôle. Le défaut réel avait été introduit un tour plus tôt, lorsque LangChain assemblait le message diffusé en streaming.

Les points de contrôle persistants accroissaient encore les enjeux. Un mécanisme de pointage enregistre l’état de l’agent afin qu’un flux de travail puisse reprendre après une interruption ou se poursuivre entre plusieurs processus. S’il stocke le bloc mal formé, le redémarrage du worker ne répare pas la conversation.

L’agent peut rencontrer à répétition le même rejet, car l’objet invalide demeure dans son historique. La récupération peut nécessiter la suppression ou la transformation de l’état sauvegardé, et pas simplement une nouvelle tentative de la requête échouée.

Prenons un agent de programmation qui demande à Claude d’inspecter un dépôt. Claude sélectionne un outil de recherche, et le framework stocke le message de l’assistant diffusé en streaming. L’outil renvoie des fichiers correspondants, mais l’appel de suivi échoue avant que Claude puisse les analyser.

Aucun problème n’affecte l’opération de recherche. L’agent échoue plutôt parce que le bloc de réflexion rejoué comporte une signature sans le champ thinking vide. La version 1.5.3 reconstruit la forme requise pour ce second appel.

Un agent de support présente le même schéma. Il peut récupérer avec succès le dossier d’un client, puis échouer lorsqu’il demande à Claude d’interpréter le résultat. Le défaut se manifeste comme un flux de travail métier instable, même si le modèle et la source de données restent disponibles.

Le problème de message système peut survenir plus tôt. De nombreuses applications construisent des instructions système à partir de blocs de contenu réutilisables. Ces blocs peuvent comporter des identifiants de framework après leur passage par des API LangChain courantes.

Si Anthropic rejette ces métadonnées, le modèle ne commence jamais la génération. L’estimation des jetons peut également échouer parce qu’elle utilise la même logique de formatage. Le code de planification peut donc s’arrêter avant que l’application ne soumette sa requête de complétion prévue.

Le correctif de streaming Anthropic et la modification d’assainissement système traitent des sens de circulation différents. Le streaming convertit les événements du fournisseur en objets LangChain. Le formatage des messages reconvertit les objets LangChain en requêtes pour le fournisseur.

Ensemble, ils protègent un aller-retour. Claude produit un état structuré, LangChain le stocke, puis l’application le renvoie ultérieurement. La fiabilité des agents dépend du fait que ce cycle reste sans perte lorsque nécessaire et restrictif lorsque requis.

Un schéma de framework face à une frontière fournisseur plus stricte

LangChain doit préserver l’état significatif du fournisseur tout en supprimant les métadonnées du framework, et ces objectifs peuvent entrer en conflit au sein d’une même conversation.

La tension principale n’oppose pas LangChain à Anthropic. Elle oppose la portabilité à la conformité exacte au schéma. LangChain propose des abstractions de messages partagées, tandis qu’Anthropic valide la structure de requête attendue par son API.

Un bloc de contenu normalisé peut inclure des informations utiles dans l’ensemble du framework. Les développeurs peuvent attacher des identifiants, des citations, des informations sur les outils ou des contrôles de cache. Les adaptateurs de fournisseur traduisent ensuite cette représentation générale dans un format filaire plus restreint.

Cette conception aide les applications à basculer entre les intégrations. Une équipe peut utiliser des schémas d’orchestration similaires avec Claude, les modèles OpenAI ou les modèles Google. Pourtant, la charge utile finale doit toujours respecter le contrat distinct de chaque fournisseur.

La version 1.5.3 illustre les deux erreurs possibles d’adaptateur.

La première consiste à filtrer excessivement ou à reconstruire de manière incomplète. LangChain a perdu la présence d’un champ vide, car les chaînes vides paraissent souvent équivalentes à des valeurs absentes dans la logique applicative ordinaire. Le schéma d’Anthropic traitait ces états différemment.

Une valeur thinking vide indique que le champ existe et ne contient aucun texte. Une clé absente indique que l’objet ne satisfait pas à la structure attendue. Le contenu sémantique est vide, mais la distinction structurelle reste importante.

La seconde erreur consiste à filtrer insuffisamment. LangChain a permis à un id interne de quitter le framework via un bloc de texte système. Cet identifiant pouvait être valide dans LangChain tout en restant invalide à la frontière d’Anthropic.

Le comportement correct de l’adaptateur est donc asymétrique. Il doit conserver un champ fournisseur apparemment vide tout en supprimant un champ de framework apparemment utile. Une règle générique telle que « supprimer les valeurs vides » ou « préserver toutes les métadonnées » échouerait d’un côté.

C’est pourquoi les adaptateurs de fournisseur demeurent des composants d’ingénierie substantiels. Ils font plus que renommer des propriétés. Ils concilient différentes hypothèses sur l’identité, l’état, le streaming, la validation, les outils et la relecture des conversations.

Les utilisateurs directs de SDK font face à moins de couches de traduction, car ils construisent les requêtes à partir des types natifs d’un seul fournisseur. Cette approche plus étroite peut réduire l’ambiguïté. Elle lie également davantage de logique applicative à une seule représentation d’API.

Les utilisateurs de frameworks gagnent en composition et en portabilité, mais ils héritent du risque lié aux adaptateurs. Le framework doit évoluer à mesure que chaque fournisseur modifie ses modèles, ses événements de streaming, ses types de contenu et ses comportements de validation.

Les intégrations OpenAI et Google font face à des pressions similaires, même lorsque les champs exacts diffèrent. Chaque fournisseur définit ses propres blocs de contenu acceptés et ses règles relatives aux messages d’outils. Une abstraction partagée ne peut pas effacer ces différences à la frontière réseau.

Cette version ne prouve pas que les SDK directs sont universellement plus sûrs. Les applications directes peuvent elles aussi corrompre l’historique ou envoyer des champs non pris en charge. Elle montre que l’abstraction déplace la responsabilité plutôt que de l’éliminer.

LangChain devient responsable de déterminer quels détails sont portables et lesquels sont spécifiques à un fournisseur. Les applications restent responsables des mises à niveau, des tests de régression, de la compatibilité avec les états stockés et de l’observabilité.

La publication LangChain Anthropic souligne également pourquoi les erreurs de schéma méritent une attention en production. Les réponses HTTP 400 semblent souvent indiquer une mauvaise utilisation par le développeur. Dans ces cas, l’application pouvait utiliser des objets de framework documentés tout en produisant une charge utile rejetée.

Cette distinction affecte la réponse aux incidents. Réessayer une requête invalide sans en modifier la structure fait perdre du temps et peut amplifier les arriérés de file d’attente. La surveillance doit conserver le message de validation du fournisseur et identifier l’index du bloc de contenu concerné.

Les équipes doivent également distinguer les échecs d’appel initial des échecs de relecture. Une erreur sur la première requête oriente vers la construction du prompt ou le formatage du message système. Une erreur après l’exécution d’un outil suggère un état d’assistant stocké ou un séquencement des résultats d’outil.

Cette classification ne remplace pas le débogage. Elle réduit la zone de recherche. La version 1.5.3 offre aux développeurs deux chemins de conversion concrets à examiner lorsque les requêtes Anthropic échouent autour de messages structurés.

Le correctif est ciblé, et l’état existant demeure le risque

La mise à niveau évite les transformations documentées, mais elle ne prouve pas automatiquement que chaque conversation enregistrée est valide ou que chaque chemin de déploiement utilise le nouveau package.

Le correctif de streaming cible une séquence précise : un bloc de réflexion adaptative vide suivi de données de signature sans delta de réflexion. Les applications qui n’activent jamais le comportement de réflexion concerné peuvent ne pas le rencontrer.

La correction du message système a également une portée définie. Elle assainit les blocs de texte dans les messages système et préserve les propriétés prises en charge. Les blocs système non textuels passent sans modification, selon le changement fusionné.

Cette portée limitée convient à une version corrective. Des réécritures étendues des messages pourraient modifier des applications fonctionnelles ou supprimer des métadonnées requises par un autre chemin. Des correctifs ciblés réduisent ce risque de compatibilité.

Toutefois, des changements de code ciblés exigent une validation ciblée. Les équipes doivent reproduire leurs propres modèles de messages plutôt que de considérer une installation réussie du package comme une preuve suffisante.

Le premier test devrait diffuser une réponse Claude via une véritable boucle d’agent. Le flux de travail devrait exécuter au moins un outil et se poursuivre par un autre appel de modèle. Cela vérifie le chemin de relecture qui a révélé le défaut du champ de réflexion.

Les développeurs doivent inspecter le contenu assistant assemblé avant la requête suivante. Un bloc de réflexion avec une signature doit conserver la clé thinking même lorsque sa valeur est vide. Les journaux doivent éviter d’exposer des raisonnements sensibles ou des données utilisateur.

Le deuxième test devrait construire un message système basé sur une liste en utilisant les mêmes assistants que la production. Il devrait inclure un identifiant interne et une propriété prise en charge telle que le contrôle du cache. La charge utile Anthropic sortante devrait supprimer l’identifiant tout en conservant les données prises en charge.

Le comptage des jetons nécessite sa propre assertion. Le rapport sur les messages système a constaté que get_num_tokens_from_messages partageait le formateur défectueux. Un test de génération seul pourrait manquer des défaillances de budgétisation, de routage ou de validation préalable.

Les points de contrôle enregistrés présentent une incertitude distincte. La pull request fusionnée modifie la façon dont les nouveaux événements de flux sont assemblés. Elle n’affirme pas migrer chaque AIMessage malformé déjà stocké par une application.

Les équipes utilisant un état d’agent persistant devraient échantillonner les conversations créées avant la mise à niveau. Elles peuvent identifier les blocs de réflexion qui contiennent des signatures mais omettent thinking. Ces enregistrements peuvent nécessiter une réparation contrôlée ou une nouvelle conversation.

Toute migration doit rester prudente. Ajouter une valeur vide correspond à la correction documentée du bogue, mais les données de production peuvent contenir d’autres formes de blocs. Les équipes doivent valider avec leurs versions exactes de package et leurs paramètres de fournisseur.

La résolution des dépendances peut aussi masquer la mise à jour. Une application peut déclarer une plage de versions large tandis qu’un fichier de verrouillage conserve la version 1.5.2. Un autre service peut se construire depuis un fichier de verrouillage différent ou une couche de conteneur mise en cache.

La télémétrie d’exécution doit enregistrer la version installée de langchain-anthropic. Cette preuve est plus fiable que la vérification du seul manifeste source. Les workers distribués doivent signaler la même version résolue avant que les opérateurs ne clôturent un incident.

La page de publication indique que la version 1.5.3 a suivi la version 1.5.2 et incluait les deux corrections listées. Elle ne présente ni benchmarks de performance, ni améliorations de latence, ni nouvelles affirmations sur la qualité des modèles. Les développeurs ne doivent pas en déduire ces résultats.

Rien ne prouve non plus que ces correctifs éliminent tous les cas limites du streaming Claude. Ils couvrent des échecs signalés avec des chemins reproductibles. D’autres combinaisons d’événements, types de contenu ou changements côté fournisseur nécessitent toujours des tests.

Les preuves de test du correctif sont encourageantes mais limitées. La pull request sur les messages système a signalé 241 tests unitaires réussis dans sa description soumise. GitHub a ensuite affiché un état de vérification plus large pendant le processus de fusion, ce qui ne doit pas être interprété comme une validation universelle en production.

Le changement de streaming inclut de même une couverture de régression pour le champ manquant. Un test déterministe est utile car il isole le comportement du framework sans dépendre de la disponibilité du fournisseur. Il ne peut toutefois pas représenter chaque configuration d’agent en production.

La lecture sceptique est donc simple. La version 1.5.3 corrige deux défauts confirmés, mais la fiabilité dépend de l’ensemble du cycle de vie des messages. Les couches de stockage, sérialiseurs personnalisés, middlewares et anciens points de contrôle peuvent réintroduire un état malformé.

Ce que les développeurs devraient modifier après le correctif de streaming Anthropic

La réponse la plus sûre est une mise à niveau mesurée, suivie de tests de relecture, de messages système et de points de contrôle correspondant au trafic réel de production.

Commencez par confirmer la version de package installée dans chaque processus qui envoie des requêtes Claude. Vérifiez le développement local, l’intégration continue, les workers en arrière-plan et les conteneurs déployés. Des versions mixtes peuvent produire des historiques de conversation incohérents.

Ajoutez ensuite un cas de régression pour un delta de réflexion ne contenant qu’une signature. Le bloc agrégé attendu doit inclure thinking: "". Le test doit ensuite relire ce message et vérifier que la construction de la charge utile réussit.

Ce cas est important même si les modèles actuels émettent rarement cette séquence. Les événements structurels rares peuvent dominer la fiabilité lorsque les agents fonctionnent en continu. Un défaut peu fréquent devient visible sur des milliers d’appels d’outils.

Ajoutez un second test pour les blocs de texte système créés via les assistants v1 de LangChain. Incluez un identifiant de bloc interne, du texte pris en charge et tous les champs de contrôle du cache utilisés par l’application. Effectuez l’assertion sur la charge utile finale du fournisseur.

Ne vous arrêtez pas aux tests unitaires. Exécutez une conversation de préproduction à travers le graphe complet de l’agent. Incluez le streaming, un appel d’outil, la persistance des points de contrôle, la reprise du processus et une autre requête Claude.

Cette séquence exerce les frontières où les données changent de propriétaire. Le client Anthropic émet des événements, LangChain les agrège, le point de contrôle les enregistre et un worker ultérieur les reformate.

L’observabilité doit capturer des informations structurelles sans enregistrer de contenu sensible. Les champs utiles incluent le type de bloc, la présence des champs, la position du message, la version du package et la catégorie d’erreur du fournisseur. Le texte complet de réflexion ne doit pas devenir une pratique courante de journalisation applicative.

Pour les réponses HTTP 400, conservez si possible le chemin de champ du fournisseur. Un emplacement tel que messages.1.content.0 oriente vers un état assistant relu. Un emplacement sous system.0 oriente vers le formatage du contenu système.

Les applications doivent éviter les nouvelles tentatives aveugles en cas d’échec de validation de schéma. La même charge utile invalide échouera normalement à nouveau. Une politique de nouvelle tentative doit séparer les erreurs de transport transitoires des erreurs de requête déterministes.

Les responsables des points de contrôle doivent définir une stratégie de récupération. Une option consiste à invalider les conversations concernées et à recommencer. Une autre est une migration examinée qui restaure le champ vide absent dans des blocs de réflexion précisément identifiés.

Le bon choix dépend des besoins de conservation et des exigences d’audit. Un flux de support peut devoir préserver sa trace conversationnelle. Une courte session de programmation peut redémarrer sans risque avec un contexte résumé.

Les équipes évaluant les frameworks doivent également ajuster leurs critères. La prise en charge des modèles n’est pas seulement une liste de classes disponibles. Elle comprend la fidélité du streaming, des outils, de la relecture des messages, du comptage des jetons, de la mise en cache et de la persistance.

L’intégration directe au SDK reste un point de comparaison utile. Si une application n’utilise que Claude et nécessite un contrôle strict des types de messages natifs, moins de traductions peuvent simplifier le débogage. Ce choix sacrifie une partie de la portabilité et de l’orchestration offertes par le framework.

Une intégration LangChain est plus pertinente lorsque l’application bénéficie d’interfaces partagées, du routage des modèles, de l’exécution de graphes ou de composants de framework existants. La version 1.5.3 ne tranche pas cette décision. Elle clarifie les obligations d’adaptateur qui l’accompagnent.

Trois signaux méritent une attention au cours des prochains mois.

Premièrement, surveillez les nouveaux signalements impliquant des blocs de réflexion, des signatures ou des conversations d’outils relues. Un gestionnaire d’incidents calme renforcerait la confiance dans le fait que le correctif de streaming Anthropic couvre la séquence observée. Des défaillances associées indiqueraient des problèmes de reconstruction plus larges.

Deuxièmement, surveillez les changements dans la normalisation des blocs de contenu multi-fournisseurs de LangChain. Le défaut de message système provenait d’un décalage entre les identifiants internes et les schémas des fournisseurs. Davantage de travail d’assainissement partagé suggérerait que les mainteneurs traitent ce modèle dans l’ensemble des intégrations.

Troisièmement, surveillez la documentation d’Anthropic sur les schémas et le streaming afin de détecter les changements apportés aux contenus de réflexion ou système acceptés. L’évolution côté fournisseur peut invalider des hypothèses même lorsque le code du framework reste inchangé.

Pour les développeurs utilisant aujourd’hui l’intégration Anthropic GitHub, la démarche pratique est claire : mettez à niveau, vérifiez la version résolue et relisez un véritable flux de travail avec appels d’outils. Inspectez ensuite les anciens points de contrôle avant de supposer que le correctif a réparé l’état stocké. Si vos agents dépendent de longues conversations, faites des tests de régression de la forme des messages une partie de chaque mise à jour de fournisseur.

 
 

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