Comment Utiliser l'API Mistral Medium 3.5 ?

Ashley Innocent

Ashley Innocent

30 April 2026

Comment Utiliser l'API Mistral Medium 3.5 ?

Mistral a lancé Medium 3.5 le 29 avril 2026. L'ID du modèle API est mistral-medium-3.5, le point de terminaison est https://api.mistral.ai/v1/chat/completions, et la forme de la requête est suffisamment proche de la norme OpenAI pour que l'échange d'URL de base d'un autre fournisseur ne nécessite qu'une seule ligne de code. Les chiffres phares sont une fenêtre contextuelle de 256K, une vision native, l'appel de fonctions, la prise en charge de 24 langues et un score de 77,6 % sur SWE-Bench Verified ; des chiffres qui le placent au même niveau que GPT-5.5 et DeepSeek V4 pour le type de travail agentique et fortement axé sur le code que la plupart des équipes mettent en place actuellement.

Ce guide couvre l'authentification, chaque paramètre important, des exemples en Python et Node, l'entrée visuelle, l'appel d'outils, le mode JSON, le streaming, la gestion des erreurs, et un flux de travail Apidog qui permet de garder les coûts visibles pendant que vous itérez sur les invites. Pour des guides de modèles comparables, voir comment utiliser l'API DeepSeek V4 et comment utiliser l'API GPT-5.5.

bouton

En bref

Ce qui a changé dans Medium 3.5

Medium 3 a été livré plus tôt dans l'année en tant que modèle texte uniquement avec un contexte de 128K. Medium 3.5 est une bête différente. C'est le premier modèle fusionné phare de Mistral : le suivi des instructions, le raisonnement et le codage vivent dans un seul ensemble de poids, vous n'avez donc plus à choisir entre un point de contrôle de chat et un point de contrôle de raisonnement. La vision est native, le contexte double à 256K, et l'appel de fonctions est intégré au niveau du modèle au lieu d'être boulonné via une surface d'API séparée.

Trois chiffres ancrent la mise à niveau. Le score SWE-Bench Verified de 77,6 % le place dans la même fourchette que les meilleurs modèles frontaliers pour le patch de code. Le score τ³-Telecom de 91,4 le place devant la plupart des modèles généralistes en matière de dialogue agentique multi-tours. Le contexte de 256K couvre une base de code de taille moyenne complète ou une transcription de plusieurs heures sans troncature. Aucun de ces chiffres n'est une erreur d'arrondi marketing ; ils indiquent directement si le modèle peut accomplir votre tâche sans un deuxième passage.

Le changement de tarification est la partie à budgétiser. Medium 3 était à 0,40 $ par million de jetons d'entrée et 2,00 $ par million de jetons de sortie. Medium 3.5 passe à 1,5 $ en entrée et 7,5 $ en sortie, soit environ 4 fois plus. C'est le coût de l'approche par point de contrôle fusionné, plus la vision, plus le contexte plus long. Considérez l'ancien Medium 3 comme l'option de débit en vrac et Medium 3.5 comme le niveau "J'ai besoin de cette réponse tout de suite".

Prérequis

Avant le premier appel, alignez quatre choses.

Exportez la clé une fois :

export MISTRAL_API_KEY="..."

Point de terminaison et authentification

La Plateforme de Mistral expose tout via une seule URL de base.

POST https://api.mistral.ai/v1/chat/completions

L'authentification est un jeton porteur dans l'en-tête Authorization. La requête minimale viable ressemble à ceci :

curl https://api.mistral.ai/v1/chat/completions \
  -H "Authorization: Bearer $MISTRAL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "mistral-medium-3.5",
    "messages": [
      {"role": "user", "content": "Expliquez les points de contrôle denses fusionnés en deux phrases."}
    ]
  }'

Une réponse réussie renvoie un corps JSON avec un tableau choices, un bloc usage décomposé en prompt_tokens, completion_tokens et total_tokens, et un id que vous pouvez utiliser pour le traçage. Les échecs renvoient une enveloppe error avec code et message. La forme correspond suffisamment à l'enveloppe OpenAI pour que tout analyseur d'erreurs que vous possédez déjà fonctionne sans modification.

Paramètres de requête

Chaque champ correspond soit au coût, soit au comportement. Voici la carte pour mistral-medium-3.5.

Paramètre Type Valeurs Notes
model chaîne mistral-medium-3.5 Requis.
messages tableau paires rôle/contenu Requis. Même schéma qu'OpenAI.
temperature flottant 0 à 1.5 Mistral recommande 0.7 pour usage général, 0.3 pour le code.
top_p flottant 0 à 1 Par défaut 1.0.
max_tokens entier 1 à limite de contexte Limite la longueur de la sortie.
stream booléen vrai ou faux Active le streaming SSE.
tools tableau spécification d'outil OpenAI Appel de fonction natif.
tool_choice chaîne ou objet auto, any, none, ou outil spécifique Contrôle l'utilisation des outils. Note : any au lieu de required.
response_format objet {"type": "json_object"} ou schéma JSON Sortie structurée.
random_seed entier n'importe quel entier Pour la reproductibilité. Note : pas seed.
safe_prompt booléen vrai ou faux Ajoute le préambule de sécurité de Mistral.
presence_penalty flottant -2 à 2 Pénalise les sujets répétés.
frequency_penalty flottant -2 à 2 Pénalise les jetons répétés.

Deux petites différences troublent les utilisateurs lors de la migration depuis OpenAI : tool_choice="any" signifie "forcer un appel d'outil" (OpenAI utilise required), et le paramètre seed est random_seed (OpenAI utilise seed). Tout le reste correspond.

Client Python

Mistral propose un SDK Python officiel qui correspond à l'API un-à-un.

import os
from mistralai import Mistral

client = Mistral(api_key=os.environ["MISTRAL_API_KEY"])

response = client.chat.complete(
    model="mistral-medium-3.5",
    messages=[
        {"role": "system", "content": "Répondez uniquement en code."},
        {"role": "user", "content": "Écrivez une fonction Rust qui dédoublonne les événements."},
    ],
    temperature=0.3,
    max_tokens=2048,
)

print("Contenu :", response.choices[0].message.content)
print("Total de jetons :", response.usage.total_tokens)
print("Coût estimé (USD) :",
      response.usage.prompt_tokens * 1.5 / 1_000_000 +
      response.usage.completion_tokens * 7.5 / 1_000_000)

Si vous avez déjà une base de code de forme OpenAI, le SDK Python d'OpenAI fonctionne sur le point de terminaison Mistral avec deux changements : l'URL de base et l'ID du modèle.

from openai import OpenAI

client = OpenAI(
    api_key=os.environ["MISTRAL_API_KEY"],
    base_url="https://api.mistral.ai/v1",
)

response = client.chat.completions.create(
    model="mistral-medium-3.5",
    messages=[{"role": "user", "content": "Bonjour, Mistral."}],
)

La voie du SDK OpenAI est la moins résistante pour les équipes exécutant du code agnostique au fournisseur ; le SDK natif mistralai est la voie qui expose clairement les fonctionnalités spécifiques à Mistral, alors choisissez en fonction de si vous prévoyez d'utiliser intensivement la vision et les sorties structurées.

Client Node

Même choix à deux voies sur Node. Le SDK natif :

import { Mistral } from "@mistralai/mistralai";

const client = new Mistral({ apiKey: process.env.MISTRAL_API_KEY });

const response = await client.chat.complete({
  model: "mistral-medium-3.5",
  messages: [
    { role: "user", content: "Expliquez les points de contrôle denses fusionnés en anglais simple." },
  ],
  temperature: 0.7,
});

console.log(response.choices[0].message.content);
console.log("Utilisation :", response.usage);

La voie du SDK OpenAI, pour la parité avec le code existant :

import OpenAI from "openai";

const client = new OpenAI({
  apiKey: process.env.MISTRAL_API_KEY,
  baseURL: "https://api.mistral.ai/v1",
});

const response = await client.chat.completions.create({
  model: "mistral-medium-3.5",
  messages: [{ role: "user", content: "Bonjour, Mistral." }],
});

Réponses en streaming

Définissez stream: true et itérez sur les fragments SSE. La forme correspond exactement à celle d'OpenAI, et la trace de raisonnement cumulative est entrelacée dans choices[].delta.content au lieu d'être séparée dans un champ latéral.

stream = client.chat.stream(
    model="mistral-medium-3.5",
    messages=[{"role": "user", "content": "Diffuser un essai de 300 mots sur les points de contrôle fusionnés."}],
)

for chunk in stream:
    delta = chunk.data.choices[0].delta.content or ""
    print(delta, end="", flush=True)

Pour la sortie de terminal, le rythme de streaming de Mistral est plus rapide que celui de DeepSeek V4-Pro sur la même longueur d'invite et à peu près équivalent à GPT-5.5, basé sur des exécutions côte à côte via la visionneuse de réponses Apidog.

Appel d'outils

Medium 3.5 est livré avec un appel de fonctions natif. Les fonctions définies dans le tableau tools deviennent appelables, et le modèle choisit quand les invoquer.

tools = [{
    "type": "function",
    "function": {
        "name": "get_weather",
        "description": "Retourne la météo actuelle pour une ville.",
        "parameters": {
            "type": "object",
            "properties": {
                "city": {"type": "string"},
                "unit": {"type": "string", "enum": ["c", "f"]},
            },
            "required": ["city"],
        },
    },
}]

response = client.chat.complete(
    model="mistral-medium-3.5",
    messages=[{"role": "user", "content": "Météo à Lagos en Celsius ?"}],
    tools=tools,
    tool_choice="auto",
)

tool_call = response.choices[0].message.tool_calls[0]
print(tool_call.function.name, tool_call.function.arguments)

À partir de là, exécutez la fonction localement, ajoutez le résultat comme un message role: "tool", et rappelez l'API pour continuer la boucle. Le modèle est identique à la boucle d'utilisation d'outils d'OpenAI. La capacité agentique est démontrée par le score τ³-Telecom ; en pratique, cela se traduit par moins de pas gaspillés dans les workflows multi-tours où le modèle doit décider entre appeler un outil, interroger l'utilisateur et répondre directement.

Mode JSON et sortie structurée

Pour une sortie validée par schéma, passez un schéma JSON dans response_format.

schema = {
    "type": "json_schema",
    "json_schema": {
        "name": "release_note",
        "schema": {
            "type": "object",
            "properties": {
                "title": {"type": "string"},
                "date": {"type": "string"},
                "bullets": {"type": "array", "items": {"type": "string"}},
            },
            "required": ["title", "date", "bullets"],
            "additionalProperties": False,
        },
        "strict": True,
    },
}

response = client.chat.complete(
    model="mistral-medium-3.5",
    messages=[
        {"role": "system", "content": "Répondez avec un seul objet JSON correspondant au schéma."},
        {"role": "user", "content": "Résumez la publication de Mistral Medium 3.5 d'aujourd'hui."},
    ],
    response_format=schema,
)

Le mode strict applique le schéma au moment du décodage, vous n'avez donc pas besoin d'ajouter une étape d'analyse Pydantic ou Zod côté client ; la réponse correspond soit au schéma, soit l'appel échoue avec une erreur structurée. Pour les cas moins contraignants où vous n'avez besoin que d'un JSON valide de n'importe quelle forme, définissez response_format={"type": "json_object"} et validez côté client.

Entrée visuelle

L'encodeur visuel de Medium 3.5 a été entraîné à partir de zéro pour gérer des tailles et des rapports d'aspect d'image variables ; vous n'avez pas besoin de pré-redimensionner quoi que ce soit. Passez le contenu de l'image avec le texte dans le tableau messages.

response = client.chat.complete(
    model="mistral-medium-3.5",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Qu'y a-t-il dans cette image et qu'est-ce qui ne va pas ?"},
            {"type": "image_url", "image_url": "https://example.com/diagram.png"},
        ],
    }],
)

Les entrées d'image sont facturées comme des jetons d'entrée au même tarif de 1,5 $ par million ; le nombre exact de jetons par image varie en fonction de la résolution et est indiqué dans le champ usage.prompt_tokens. Pour les charges de travail d'images à volume élevé, enregistrez le coût en jetons par image dès le début et décidez de compresser, recadrer ou ignorer des cadres avant la mise à l'échelle.

Construire la collection dans Apidog

Rejouer des requêtes depuis le terminal brûle des crédits et masque la différence entre les exécutions. Le flux de travail qui survit à une utilisation réelle :

  1. Téléchargez Apidog et créez un projet.
  2. Ajoutez un environnement avec {{MISTRAL_API_KEY}} stocké comme variable secrète afin qu'il ne se retrouve jamais dans les exports partagés.
  3. Enregistrez une requête POST vers {{BASE_URL}}/chat/completions avec l'en-tête Authorization: Bearer {{MISTRAL_API_KEY}}.
  4. Paramétrez model, temperature et tool_choice afin de pouvoir faire des tests A/B entre les variantes sans dupliquer les requêtes.
  5. Utilisez la visionneuse de réponses pour inspecter usage à chaque exécution. Ajoutez un petit script post-réponse qui multiplie prompt_tokens * 1.5 / 1_000_000 + completion_tokens * 7.5 / 1_000_000 afin que le coût par appel s'affiche à côté de chaque résultat.

Les équipes qui exécutent déjà la collection DeepSeek V4 API correspondante dans Apidog peuvent la dupliquer, échanger l'URL de base vers https://api.mistral.ai/v1, changer l'ID du modèle en mistral-medium-3.5 et exécuter des invites côte à côte sur les deux fournisseurs en quelques minutes. Le même modèle s'applique pour comparer avec GPT-5.5.

Gestion des erreurs

L'enveloppe d'erreur suit de près les conventions d'OpenAI. Les codes que vous rencontrerez en premier :

Code Signification Solution
400 Mauvaise requête Validez le schéma JSON, en particulier messages et tools.
401 Clé invalide Régénérez sur console.mistral.ai.
402 Paiement requis Approvisionnez le compte ou ajoutez une carte.
403 Modèle non autorisé Vérifiez la portée du projet de la clé et l'orthographe de l'ID du modèle.
422 Paramètre hors plage max_tokens dépasse le contexte, ou tool_choice est mal formé.
429 Limite de débit Reculez, puis réessayez avec une gigue exponentielle.
500 Erreur serveur Réessayez une fois. Si cela se répète, vérifiez la page d'état.
503 Surchargé Revenez à Mistral Medium 3 ou attendez 30 secondes.

Enveloppez les appels dans une fonction d'aide de nouvelle tentative qui gère les erreurs 429 et 5xx avec un backoff exponentiel. Ne réessayez pas les erreurs 4xx automatiquement ; ce sont des bugs logiques, pas des échecs transitoires. La visionneuse de réponses d'Apidog permet de repérer facilement une charge utile tools mal formée car le champ incriminé est mis en évidence dans le corps de la requête à côté de l'erreur.

Modèles de contrôle des coûts

Le saut de prix de 4x de Medium 3 à Medium 3.5 pénalise le routage paresseux. Cinq modèles permettent de maintenir la facture prévisible.

  1. Par défaut, utilisez Medium 3, puis passez à Medium 3.5. Effectuez un premier passage bon marché sur Medium 3 et ne dirigez les invites difficiles vers 3.5 que lorsque le passage bon marché renvoie une faible confiance ou échoue à un validateur.
  2. Limitez max_tokens. La plupart des réponses tiennent en 2 000 jetons de sortie. La fenêtre contextuelle de 256K est destinée au volume d'entrée, pas au volume de sortie ; la sortie est le côté coûteux à 7,5 $ par million.
  3. Gardez les invites système concises. Chaque jeton d'invite système est facturé à chaque appel ; réduire un préambule de 2K jetons à 500 jetons réduit votre facture d'entrée de 75 % sur un point de terminaison à volume élevé.
  4. Enregistrez usage à chaque appel. Envoyez prompt_tokens, completion_tokens et l'estimation en USD par appel à votre pile d'observabilité. Une alerte sur un pic soudain de jetons de sortie détecte les invites qui ont dérivé vers la logique de « chaîne de pensée ».
  5. Utilisez la vision de manière sélective. Les jetons d'image s'accumulent rapidement. Recadrez la région pertinente avant d'envoyer, et réduisez la taille à la résolution la plus basse qui répond toujours à la question.

Comparaison de Medium 3.5 aux autres niveaux Mistral

La gamme de Mistral à la fin avril 2026 :

Modèle Contexte Entrée $/M Sortie $/M Vision Idéal pour
mistral-small 32K 0,10 $ 0,30 $ Non Classification à grand volume, chat léger
mistral-medium-3 128K 0,40 $ 2,00 $ Non Débit en vrac, chat plus long
mistral-medium-3.5 256K 1,5 $ 7,5 $ Oui Raisonnement, code, vision, agents
mistral-large 128K 2,00 $ 6,00 $ Limité Raisonnement textuel de niveau frontalier

Medium 3.5 est le seul niveau qui combine le long contexte, la vision et les capacités de raisonnement fusionnées. Le niveau Large offre une courbe de coût différente (sortie moins chère, entrée plus chère) et surpasse le 3.5 sur quelques benchmarks texte uniquement ; choisissez en fonction de la charge de travail, et non du nom du niveau.

Migration depuis un autre fournisseur

La migration est principalement un changement d'URL de base.

Depuis OpenAI :

- base_url="https://api.openai.com/v1"
- model="gpt-5.5"
+ base_url="https://api.mistral.ai/v1"
+ model="mistral-medium-3.5"

Depuis DeepSeek :

- base_url="https://api.deepseek.com/v1"
- model="deepseek-v4-pro"
+ base_url="https://api.mistral.ai/v1"
+ model="mistral-medium-3.5"

Deux pièges à surveiller :

Exécutez la différence sur votre suite de tests existante avant de basculer le trafic de production. Mieux encore, dupliquez le trafic vers Mistral en mode fantôme pendant une journée, enregistrez les deux réponses et comparez-les dans Apidog avant de promouvoir.

Cas d'utilisation réels

Quelques modèles où Medium 3.5 s'amortit déjà :

FAQ

Quel est l'ID du modèle pour Mistral Medium 3.5 sur l'API ?mistral-medium-3.5. Le point de contrôle Hugging Face est publié sous le nom mistralai/Mistral-Medium-3.5-128B. Si vous utilisez vous-même les poids ouverts avec vLLM ou Unsloth, utilisez l'ID Hugging Face. Pour l'API hébergée, utilisez l'ID court.

Medium 3.5 est-il compatible avec OpenAI ?Proche, mais pas identique. La forme du point de terminaison, les en-têtes et la plupart des paramètres correspondent exactement à OpenAI, de sorte que les SDK Python et Node d'OpenAI fonctionnent avec une surcharge d'URL de base. Les deux divergences sont tool_choice="any" (par rapport au required d'OpenAI) et random_seed (par rapport au seed d'OpenAI).

Puis-je exécuter Medium 3.5 localement ?Oui. Les poids sont ouverts sous une licence MIT modifiée avec une clause de forte redevance. Le nombre de paramètres de 128 milliards signifie que vous avez besoin d'une mémoire GPU significative ; les builds GGUF quantifiés de unsloth/Mistral-Medium-3.5-128B-GGUF fonctionnent sur une seule carte grand public haut de gamme. Les modèles de comment exécuter DeepSeek V4 localement se traduisent directement.

Prend-il en charge le streaming avec les appels d'outils ?Oui. Le streaming renvoie des fragments d'arguments d'appel d'outils de manière incrémentielle sur delta.tool_calls, la même forme que le format d'appel d'outils en streaming d'OpenAI. Les fragments s'accumulent en un objet JSON complet une fois le flux fermé.

Comment compter les jetons d'entrée avant d'envoyer ?Utilisez le tokenizer du package Python mistral-common pour des comptages exacts. C'est le même tokenizer que l'API utilise, donc les comptages octet par octet correspondent à usage.prompt_tokens sur la réponse.

Quelle longueur de contexte dois-je prévoir en production ?La fenêtre de 256K est le plafond, mais la tarification évolue linéairement. Un appel de 200K jetons coûte 0,30 $ en entrée seule avant même que le modèle ne commence à générer. La plupart des charges de travail de production se situent confortablement en dessous de 32K ; n'utilisez le long contexte que lorsque la tâche le nécessite vraiment.

Existe-t-il un niveau gratuit ?Mistral ne propose pas de niveau gratuit permanent, mais les nouveaux comptes sont généralement accompagnés d'un petit crédit d'essai. Pour une expérimentation gratuite et soutenue sur des modèles de niveaux similaires, consultez comment utiliser l'API DeepSeek V4 gratuitement.

bouton

Pratiquez le Design-first d'API dans Apidog

Découvrez une manière plus simple de créer et utiliser des API