Vision
Les trois modèles Mina acceptent des images en entrée. Envoyez une capture d'écran, une photo de document, un graphique : le modèle la décrit, en extrait le texte ou répond à vos questions dessus.
Envoyer une image#
Le format est le format standard : un tableau de blocs mêlant texte et
image_url.
import base64
from openai import OpenAI
client = OpenAI(api_key="zir_ai_...", base_url="https://api.cloudzir.com/v1")
with open("facture.png", "rb") as fichier:
image = base64.b64encode(fichier.read()).decode()
reponse = client.chat.completions.create(
model="mina-low",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Quel est le montant total de cette facture ?"},
{"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{image}"}},
],
}],
max_tokens=300,
)
print(reponse.choices[0].message.content)import fs from "node:fs";
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.CLOUDZIR_API_KEY,
baseURL: "https://api.cloudzir.com/v1",
});
const image = fs.readFileSync("facture.png").toString("base64");
const reponse = await client.chat.completions.create({
model: "mina-low",
messages: [{
role: "user",
content: [
{ type: "text", text: "Quel est le montant total de cette facture ?" },
{ type: "image_url", image_url: { url: `data:image/png;base64,${image}` } },
],
}],
max_tokens: 300,
});
console.log(reponse.choices[0].message.content);# l'image doit être encodée en base64 dans une data URI
IMAGE=$(base64 -w 0 facture.png)
curl https://api.cloudzir.com/v1/chat/completions \
-H "Authorization: Bearer $CLOUDZIR_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"mina-low\",
\"messages\": [{
\"role\": \"user\",
\"content\": [
{\"type\": \"text\", \"text\": \"Que montre cette image ?\"},
{\"type\": \"image_url\", \"image_url\": {\"url\": \"data:image/png;base64,$IMAGE\"}}
]
}],
\"max_tokens\": 300
}"Deux façons de fournir l'image#
| Forme | Exemple | Remarque |
|---|---|---|
| Data URI base64 (recommandé) | data:image/png;base64,iVBORw0… |
L'image part avec la requête : rien à héberger, rien à exposer publiquement. |
| URL http(s) | https://example.invalid/photo.jpg |
L'image doit être accessible publiquement (pas d'authentification, pas de réseau privé). |
Limites#
| Contrainte | Valeur |
|---|---|
| Formats acceptés | PNG, JPEG, WebP, GIF |
| Taille par image | 8 Mo une fois décodée |
| Images par requête | 8 |
| Modèles | Les trois : mina-flash, mina-low, mina-full |
Une image mal encodée, dans un format non listé ou trop lourde renvoie un 400
dont le message dit précisément ce qui cloche.
Ce que ça coûte#
Une image est convertie en jetons d'entrée, facturés au tarif normal du modèle. La
quantité dépend de la taille de l'image : comptez de l'ordre de 200 à 1 700 jetons par
image. Le décompte exact est toujours dans le champ usage de la réponse et dans
Usage.
Redimensionnez avant l'envoi : une capture d'écran en 4K coûte cher et n'apporte rien de plus qu'une version 1024 px de large pour lire du texte. Recadrez sur la zone utile quand vous le pouvez.
Format Anthropic#
Sur /anthropic, utilisez les blocs image de la spécification
Anthropic : c'est ce qu'envoient les SDK et les agents compatibles.
import anthropic, base64
client = anthropic.Anthropic(
api_key="zir_ai_...",
base_url="https://api.cloudzir.com/anthropic",
)
with open("capture.png", "rb") as fichier:
image = base64.b64encode(fichier.read()).decode()
message = client.messages.create(
model="mina-low",
max_tokens=500,
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Décris cette capture d'écran."},
{"type": "image", "source": {
"type": "base64", "media_type": "image/png", "data": image,
}},
],
}],
)
print(message.content[0].text){
"model": "mina-low",
"max_tokens": 500,
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Décris cette capture d'écran."},
{"type": "image", "source": {
"type": "base64",
"media_type": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUg..."
}}
]
}]
}La forme {"type": "url", "url": "https://…"} est également acceptée.
Cas d'usage courants#
- Lecture de documents : factures, bons de commande, formulaires manuscrits : demandez une sortie JSON (guide) pour récupérer des champs exploitables directement.
- Captures d'écran : diagnostiquer une erreur, décrire une interface, aider un utilisateur qui ne sait pas décrire son problème.
- Contrôle qualité : comparer une photo produit à une description attendue.
- Accessibilité : générer des textes alternatifs pour un catalogue d'images.
Ce qui n'est pas encore supporté#
- Les documents PDF envoyés tels quels (blocs
documentcôté Anthropic). Convertissez les pages en images, ou extrayez le texte : voir API Fichiers. - La génération d'images. L'API produit du texte à partir d'images, pas l'inverse.
- La vidéo et l'audio.