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
contentdu message est un tableau contenant des élémentstextetimage_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