API de Vision DeepSeek-V4.1-Flash : Comment envoyer des images au modèle multimodal natif de DeepSeek

Envoyer des images à DeepSeek-V4.1-Flash via l'ID deepseek-flash : les formats base64, URL et ID de fichier, le champ de détail, la tarification des images et une boucle de test Apidog.

Ashley Innocent

Ashley Innocent

10 September 2026

API de Vision DeepSeek-V4.1-Flash : Comment envoyer des images au modèle multimodal natif de DeepSeek

Apidog pour les entreprises

Déploiement sur site

SSO & RBAC

Conforme SOC 2

Découvrir Apidog Enterprise

La prise en charge de la vision par DeepSeek a cessé d'être un projet annexe le 10 septembre 2026. Avec la publication en GA de DeepSeek-V4.1-Flash, l'entrée d'image réside dans le modèle principal sous un seul identifiant, deepseek-flash. Il n'y a pas de build de vision séparé ni de suffixe "Exp". La note de publication retire à la fois deepseek-v4-flash et deepseek-v4-flash-vision-exp ; les requêtes vers l'un ou l'autre nom sont désormais acheminées vers V4.1-Flash.

Ceci est important si vous avez développé sur le point de terminaison expérimental il y a trois semaines. Le format de requête que vous avez écrit pour V4-Flash-Vision-Exp fonctionne toujours, mais le modèle lisant vos images est nouveau : 763 milliards de paramètres, avec un encodeur de vision entraîné à partir de zéro en parallèle avec l'épine dorsale de texte. Ce guide couvre ce que signifie "multimodal natif" en pratique, les trois façons de fournir une image, le paramètre detail, le coût des images, et comment construire un test de vision reproductible dans Apidog qui prouve que l'ancien nom et le nouveau se comportent de la même manière.

En bref

Ce que signifie "multimodal natif" ici

Vision-Exp attachait un encodeur d'image à un modèle de texte fini. V4.1-Flash fait l'inverse. Selon la carte du modèle, les images faisaient partie du corpus de pré-entraînement de 45 T de tokens dès le début, et l'encodeur est un nouveau DeepSeek-ViT entraîné à partir de zéro au lieu d'être emprunté à un modèle de vision existant. L'épine dorsale est un mélange d'experts de 552 milliards de paramètres ; avec l'encodeur attaché, le total atteint 763 milliards. Seuls 8 milliards de paramètres sont actifs pendant le préremplissage et 16 milliards pendant le décodage, ce qui explique comment un modèle aussi grand fonctionne toujours à la vitesse Flash et aux prix Flash. V4-Flash, le modèle textuel pur du guide API V4-Flash, était la base que Vision-Exp a étendue.

DeepSeek rapporte ces quatre scores de vision dans la carte du modèle. Ce sont les mesures propres au fournisseur, traitez-les donc comme des affirmations tant que vous n'avez pas traité vos propres documents via l'API.

Benchmark Ce qu'il mesure V4.1-Flash
MMMU-Pro Questions de niveau universitaire nécessitant à la fois l'image et le texte pour y répondre 56.5
CVBench Comptage, ordonnancement en profondeur et relations spatiales dans les photos naturelles 77.9
DocVQA Réponses aux questions sur des documents et formulaires scannés 95.6
RefCOCO Localisation de l'objet auquel une phrase fait référence dans une image 86.0

Pour les utilisateurs de l'API, DocVQA et RefCOCO sont les lignes à surveiller. La QA de documents est le score derrière l'extraction de factures et de formulaires. RefCOCO est l'ancrage : étant donné "le bouton Soumettre sous le champ e-mail", le modèle peut-il le trouver ? Cette compétence transforme les captures d'écran en actions d'agent. L'aperçu de l'architecture couvre le côté texte et le rapport technique plus en détail.

Le format de requête : trois façons de fournir une image

Rien n'a changé concernant le format filaire. Appelez le point de terminaison Chat Completions à l'adresse https://api.deepseek.com avec le SDK OpenAI, placez les parties texte et image dans le même tableau content, et définissez le modèle sur deepseek-flash. Voici un appel complet qui transforme une facture en JSON :

import base64, json
from openai import OpenAI

client = OpenAI(api_key="YOUR_DEEPSEEK_KEY", base_url="https://api.deepseek.com")

with open("invoice-2026-0912.png", "rb") as f:
    image_b64 = base64.b64encode(f.read()).decode()

schema_hint = (
    "Return only JSON with keys: invoice_number (string), issue_date (YYYY-MM-DD), "
    "vendor (string), currency (string), line_items (array of {description, quantity, "
    "unit_price, amount}), subtotal, tax, total (numbers)."
)

response = client.chat.completions.create(
    model="deepseek-flash",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": schema_hint},
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/png;base64,{image_b64}",
                    "detail": "high",
                },
            },
        ],
    }],
    temperature=1.0,
    max_tokens=2048,
)

invoice = json.loads(response.choices[0].message.content)
print(invoice["invoice_number"], invoice["total"])
print(response.usage.prompt_tokens, "prompt tokens")

C'est l'option un, base64 en ligne : autonome, limitée à 32 MiB par image, et adaptée aux appels uniques ou aux fichiers qui ne quittent jamais votre réseau.

L'option deux est une URL externe. Si l'image a déjà un lien public sur un CDN ou dans un stockage d'objets, ignorez l'encodage et transmettez le lien (jusqu'à 8 192 caractères). Cette requête curl lit un tableau de prix hébergé :

curl https://api.deepseek.com/chat/completions \
  -H "Authorization: Bearer $DEEPSEEK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "deepseek-flash",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "text", "text": "List every plan name and its monthly price from this chart as a JSON array."},
        {"type": "image_url", "image_url": {"url": "https://assets.example-saas.com/pricing/plans-q3.png", "detail": "auto"}}
      ]
    }]
  }'

L'option trois est un ID de fichier. Téléchargez l'image une fois via l'API de fichiers de DeepSeek, puis référencez-la avec une partie file au lieu de renvoyer les octets :

{"type": "file", "file": {"file_id": "file-api-xxxxxxxxxxxxxxxx"}}

Choisissez les ID de fichier chaque fois que la même image apparaît dans plus d'une requête, comme une capture d'écran de référence que chaque test d'une suite compare. La présentation complète des paramètres se trouve dans le guide API V4.1-Flash.

Le paramètre `detail` et les limites de requête

Le paramètre detail est optionnel et se trouve à l'intérieur de l'objet image_url. Les trois valeurs proviennent de Vision-Exp :

Les plafonds que vous atteindrez en premier :

Contrainte Valeur
Image base64 en ligne jusqu'à 32 Mio
Longueur de l'URL externe jusqu'à 8 192 caractères
Référence d'ID de fichier prise en charge via l'API Fichiers
Fenêtre de contexte 1 million de tokens
Sortie maximale 384 000 tokens
Valeurs detail low, high/original, auto

Le guide Vision-Exp énumérait d'autres plafonds sur le nombre d'images, la taille du corps et les dimensions en pixels. Ceux-ci ont été publiés pour le modèle expérimental ; vérifiez le journal des modifications de l'API avant de vous y fier pour V4.1-Flash. Une règle n'a pas changé : les images appartiennent aux messages utilisateur. Si vous en mettez une dans un message système ou d'assistant, vous obtiendrez une erreur 400.

Ce que coûtent les images sur deepseek-flash

Il n'y a pas de prix distinct pour la vision. Les images sont facturées comme des tokens d'entrée au tarif Flash de la page de tarification, à compter du 10 septembre 2026 à 04:00 UTC :

deepseek-flash, par 1 million de tokens Heures creuses Heures de pointe
Entrée, cache hit 0,003 $ 0,006 $
Entrée, cache miss 0,15 $ 0,30 $
Sortie 0,60 $ 1,20 $

Les heures de pointe sont du lundi au vendredi, de 01h00 à 04h00 et de 06h00 à 10h00 UTC ; les heures creuses sont à moitié prix. Sur Vision-Exp, chaque image était facturée pour un maximum de 384 tokens d'entrée. Il faut [VÉRIFIER] dans la documentation si ce plafond est reporté tel quel sur V4.1-Flash. Le champ usage.prompt_tokens de chaque réponse indique le nombre réel, c'est pourquoi l'exemple Python l'affiche.

Si le plafond de 384 tokens est maintenu, une image coûte environ 0,000115 $ aux tarifs de pointe en cas de cache-miss et la moitié en heures creuses, de sorte que mille factures reviennent à environ 0,12 $ d'entrée d'image. La sortie domine tout pipeline réel : 400 tokens JSON par facture coûtent environ quatre fois plus que l'image elle-même en période de pointe. Le levier est un schéma de réponse strict, et non le redimensionnement d'image. Le calcul des heures de pointe, des heures creuses et des cache-hits est expliqué en détail dans DeepSeek-V4.1-Flash pricing explained ; la version courte est que l'entrée en cas de cache-miss est 32 % moins chère que ce que Vision-Exp facturait en août.

Trois cas d'utilisation qui méritent un pilote

Extraction de documents. Factures, reçus, bons de livraison, formulaires d'assurance. Demandez un schéma JSON fixe, envoyez avec detail: "high", et vérifiez que les postes s'additionnent au sous-total avant de faire confiance à un enregistrement.

Captures d'écran d'interface utilisateur pour tester des assertions. Capturez une page après un déploiement, demandez si les éléments attendus sont présents et où, et transformez la réponse en un succès/échec. RefCOCO est le benchmark pertinent : il s'agit de trouver des éléments nommés.

Lecture de graphiques. Extrayez les noms de séries, les étiquettes d'axes et les valeurs tracées d'une image de graphique dans un tableau. Les lignes qui se chevauchent ou les axes non étiquetés nécessitent une vérification manuelle.

Tester le point de terminaison de vision dans Apidog

Les requêtes de vision sont pénibles à itérer manuellement : un blob base64 rend le corps JSON illisible, et la comparaison des paramètres detail implique de jongler avec des charges utiles presque identiques. Voici une boucle qui reste lisible et se réexécute en un clic.

  1. Configurez un environnement. Créez des variables pour base_url, api_key, model (deepseek-flash), et detail (high). Changer le niveau de détail plus tard est un changement de menu déroulant, pas une modification de la charge utile.
  2. Encodez l'image dans un script de pré-requête. Au lieu de coller du base64 dans le corps, laissez un script de pré-requête encoder le fichier d'exemple et écrire le résultat dans une variable image_b64. Le corps visible reste court, et échanger l'image de test signifie changer un seul chemin.
  3. Enregistrez le corps de la requête avec des variables. Utilisez "model": "{{model}}", "detail": "{{detail}}", et "url": "data:image/png;base64,{{image_b64}}". Enregistrez-le comme un cas de test pour qu'il soit réutilisable.
  4. Affirmez sur la forme JSON. Affirmez que la réponse est analysable en JSON, que invoice_number est une chaîne non vide, que line_items est un tableau non vide, que total est un nombre, et que usage.prompt_tokens est inférieur à un seuil que vous choisissez. Cela transforme "semble bon" en un succès/échec.
  5. Confirmez que l'ancien nom est routé vers le même modèle. Dupliquez la requête enregistrée, définissez model sur deepseek-v4-flash-vision-exp, et exécutez les deux dans un scénario de test unique sur la même image. Comparez les champs extraits et le nombre de usage.prompt_tokens. Des résultats correspondants confirment ce que la note de publication indique : les deux noms atteignent V4.1-Flash, vous pouvez donc renommer votre configuration en toute confiance.
  6. Exécutez-le en CI. Exécutez le scénario avec apidog-cli à chaque changement d'invite, afin qu'une régression de schéma fasse surface avant la production.

Téléchargez Apidog et l'installation prend environ quinze minutes à construire. Apidog teste la couche API, pas l'hôte du modèle, donc le même scénario fonctionne avec tout point de terminaison compatible OpenAI vers lequel vous vous dirigez ultérieurement.

Où cela vous mène

Le point de terminaison expérimental a prouvé le format de requête et le prix. V4.1-Flash conserve les deux et propose un modèle qui a vu des images dès son premier token d'entraînement. Pointez votre client vers deepseek-flash, gardez detail dans une variable, affirmez sur le JSON que vous recevez, et exécutez l'ancien nom via le même scénario Apidog une fois pour confirmer le reroutage. Après cela, la seule question qui reste est la précision sur vos propres documents, et vous avez maintenant un test qui y répond.

Pratiquez le Design-first d'API dans Apidog

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