Un schéma d'outil qui à l'air juste. Un validateur qui répond « valide ». Une sortie structurée qui se parse. À chaque fois, le code tourne sans erreur, et le résultat est quand même faux.
J'ai audité les deux bibliothèques Python au cœur de la stack de Mistral AI et j'y ai trouvé trois bugs de ce type. Les trois sont reproduits, corrigés avec des tests de non-régression et proposés en amont.
Contexte : les deux bibliothèques
- mistral-common valide les requêtes de chat et les transformations en tokens. vLLM et Hugging Face Transformers s'appuient dessus pour servir les modèles Mistral.
- client-python est le SDK officiel
mistralai. Son moduleextratransforme des fonctions Python en outils et des modèles Pydantic en sorties structurées.
Un agent construit sur Mistral passe par les deux à chaque appel. Un bug silencieux à ce niveau se propage à tous les agents construits dessus.
Bug 1 : les paramètres optionnels deviennent obligatoires
create_tool_calltransformer une fonction Python en outil que le modèle peut appeler. Avec l'écriture Pydantic recommandée, la valeur par défaut se perd :
def get_weather(
city: Annotated[str, Field(description="City name")],
unit: Annotated[str, Field(description="celsius or fahrenheit")] = "celsius",
) -> str: ...
create_tool_call(get_weather).function.parameters["required"]
# ['city', 'unit'] attendu : ['city']
La valeur par défaut est dans la signature de la fonction, pas dans le Fieldextrait de Annotated: elle n'arrive jamais dans le schéma. Les outils sont envoyés en mode strict=True: le modèle est obligé de remplir unità chaque appel, et la valeur par défaut prévue par le développeur n'est jamais utilisée.
Signalé dans l' issue #632 , avec le correctif et deux tests prêts sur ma fourchette.
Bug 2 : un champ dictionnaire qui ne peut contenir aucune clé
chat.parsepermet de demander une réponse conforme à un modèle Pydantic. Avant l'envoi, le SDK rend le schéma strict en ajoutant additionalProperties: falsesur chaque objet.
Le problème : pour un champion dict[str, int], Pydantic utilise déjà additionalPropertiespour décrire les valeurs. Le SDK l'écrase. Le schéma Pydantic {"additionalProperties": {"type": "integer"}}devient {"additionalProperties": false}.
Avec ce deuxième schéma, {"apples": 3}est invalide : le champ ne peut être que vide. Le correctif n'ajoute la clé que si elle est absente, ce que fait déjà le SDK d'OpenAI.
Signalé dans l' issue #633 , avec le correctif et un test. Je n'ai pu vérifier que la partie client : je n'ai pas testé l'API de bout en bout.
Bug 3 : un retour à la ligne passe le validateur
mistral-common vérifie que les noms de fonction respectent ^[a-zA-Z0-9_-]{1,64}$et que les identifiants d'appel d'outil font 9 caractères alphanumériques. La vérification utilise re.match, et en Python $accepte aussi une \nfinale.
Résultat : "get_weather\n"et "abcDEF123\n"(10 caractères) sont acceptés, et le nom invalide se retrouve dans le prompt tokenisé. Le correctif tient en un mot par appel : fullmatchau lieu de match.
Corrigé dans la pull request #354 ( issue #353 ).
Ce que ça change pour une équipe qui industrialise des agents
- Vérifiez ce qui est envoyé, pas seulement ce qui est écrit. Affichez au moins une fois le schéma que votre SDK envoie réellement au modèle. Les bugs 1 et 2 sont invisibles dans le code Python.
- Le mode strict augmente l’enjeu. Un schéma faux en mode strict n'est pas ignoré : le modèle doit le respecter.
re.match+$n'est pas une correspondance complète. Utilisezre.fullmatchpour valider, dans votre code également.- Contribuez en retour. Chaque correctif fait quelques lignes. Le proposer en amont protège tous ceux qui utilisent la même pile.
Vous construisez des agents sur Mistral ? Je serais curieux de savoir quelles surprises vous avez rencontrées.
Pour en parler ou faire auditer vos propres agents : LinkedIn · Malt · Medium · Site
Vous formez vos équipes à l'IA générative ? J'anime avec Spar-x (organisme certifié Qualiopi, formations finançables par votre OPCO) une formation Copilot Studio : https://zakariakhchiche.github.io/formation-copilot-studio/ et j'ai publié un kit AI Act article 4 gratuit : https://zakariakhchiche.github.io/kit-ai-act/