Aller au contenu principal

Envoyer une Image par URL

La méthode la plus simple

Envoyer une image par URL est la manière la plus directe d’utiliser la Vision API. Vous fournissez l’adresse d’une image accessible publiquement, et Mistral la télécharge pour l’analyser.

Cette méthode est idéale quand vos images sont déjà hébergées (CDN, stockage cloud, site web) ou quand vous travaillez avec des images accessibles via le web.

Format du message

Le message multimodal avec une URL d’image suit cette structure :

message = {
    "role": "user",
    "content": [
        {
            "type": "text",
            "text": "Votre question sur l'image"
        },
        {
            "type": "image_url",
            "image_url": "https://exemple.com/mon-image.jpg"
        }
    ]
}

Le champ image_url accepte toute URL HTTP ou HTTPS pointant vers un fichier image valide (JPEG, PNG, GIF, WebP).

Exemple complet en Python

Voici un script complet pour analyser une image accessible par URL :

from mistralai import Mistral
import os

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

# Image publique à analyser
url_image = "https://upload.wikimedia.org/wikipedia/commons/thumb/a/a7/Camponotus_flavomarginatus_ant.jpg/800px-Camponotus_flavomarginatus_ant.jpg"

# Appel à l'API Vision
response = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Décrivez précisément ce que vous voyez dans cette image."
                },
                {
                    "type": "image_url",
                    "image_url": url_image
                }
            ]
        }
    ]
)

print(response.choices[0].message.content)

Ajouter un prompt système

Vous pouvez combiner un message système (pour définir le rôle de l’assistant) avec un message utilisateur contenant l’image :

response = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {
            "role": "system",
            "content": "Vous êtes un expert en entomologie. Analysez les images d'insectes avec précision scientifique, en identifiant l'espèce, la famille et les caractéristiques morphologiques visibles."
        },
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Identifiez cet insecte."},
                {"type": "image_url", "image_url": url_image}
            ]
        }
    ]
)

Le prompt système guide le modèle dans sa manière d’analyser l’image — c’est un levier puissant pour obtenir des réponses spécialisées.

Conditions requises pour l’URL

Pour que l’API puisse télécharger l’image, l’URL doit respecter ces conditions :

  • Accessible publiquement : pas de page derrière une authentification
  • URL directe vers le fichier : pas une page HTML contenant l’image
  • Format supporté : JPEG, PNG, GIF (première frame), WebP
  • Taille raisonnable : moins de 20 Mo

Vérifier l’accessibilité d’une URL

import requests

def verifier_url_image(url):
    """Vérifie qu'une URL pointe vers une image accessible."""
    try:
        response = requests.head(url, timeout=5, allow_redirects=True)
        content_type = response.headers.get("Content-Type", "")

        if response.status_code == 200 and "image" in content_type:
            taille = int(response.headers.get("Content-Length", 0))
            print(f"Image accessible : {content_type}, {taille / 1024:.0f} Ko")
            return True
        else:
            print(f"Problème : status={response.status_code}, type={content_type}")
            return False
    except requests.RequestException as e:
        print(f"Erreur de connexion : {e}")
        return False

verifier_url_image("https://exemple.com/photo.jpg")

Images depuis un stockage cloud

Si vos images sont dans un bucket S3, Google Cloud Storage ou Azure Blob, vous pouvez générer une URL pré-signée temporaire :

import boto3

s3 = boto3.client("s3")

# Générer une URL pré-signée valide 1 heure
url_presignee = s3.generate_presigned_url(
    "get_object",
    Params={"Bucket": "mon-bucket", "Key": "images/facture.png"},
    ExpiresIn=3600
)

# Utiliser cette URL avec l'API Vision
response = client.chat.complete(
    model="mistral-small-latest",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Extrayez le montant total de cette facture."},
                {"type": "image_url", "image_url": url_presignee}
            ]
        }
    ]
)

Cette approche est sécurisée : l’URL expire après le délai spécifié.

Gestion des erreurs

Prévoyez toujours la gestion des erreurs réseau et API :

from mistralai import Mistral

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

try:
    response = client.chat.complete(
        model="mistral-small-latest",
        messages=[
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "Décrivez cette image."},
                    {"type": "image_url", "image_url": "https://exemple.com/image.jpg"}
                ]
            }
        ]
    )
    print(response.choices[0].message.content)
except Exception as e:
    print(f"Erreur : {e}")

Points clés à retenir

  • L’envoi par URL est la méthode la plus simple — une URL publique suffit
  • Le champ content du message est un tableau contenant des éléments text et image_url
  • L’URL doit pointer directement vers un fichier image accessible
  • Les URL pré-signées permettent d’utiliser des images privées en toute sécurité
  • Ajoutez toujours un prompt système pour guider l’analyse du modèle