Images et fichiers
Envoyez des images avec un message : quels modèles les acceptent, les formes acceptées et leurs limites.
POST https://api.shannon-ai.com/v1/chat/completions
Une image voyage dans un message utilisateur, comme une partie de son content. L'exemple lit un fichier local et l'envoie sous forme d'URL de données.
import base64
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY", base_url="https://api.shannon-ai.com/v1")
with open("photo.jpg", "rb") as f:
image = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="shannon-3",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64," + image}},
],
}],
)
print(response.choices[0].message.content) import fs from "node:fs";
import OpenAI from "openai";
const client = new OpenAI({ apiKey: "YOUR_API_KEY", baseURL: "https://api.shannon-ai.com/v1" });
const image = fs.readFileSync("photo.jpg").toString("base64");
const response = await client.chat.completions.create({
model: "shannon-3",
messages: [{
role: "user",
content: [
{ type: "text", text: "What is in this picture?" },
{ type: "image_url", image_url: { url: "data:image/jpeg;base64," + image } },
],
}],
});
console.log(response.choices[0].message.content); # Linux: base64 -w0 photo.jpg macOS: base64 -i photo.jpg
IMAGE=$(base64 -w0 photo.jpg)
curl https://api.shannon-ai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d @- <<EOF
{
"model": "shannon-3",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,${IMAGE}"}}
]
}]
}
EOF {
"id": "chatcmpl-8d1f3a5c7e9b4d2f6a8c0e2b4d6f8a1c",
"object": "chat.completion",
"created": 1791590400,
"model": "shannon-3",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "A grey cat asleep on a windowsill, with a potted fern beside it.",
"reasoning_content": null
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 286,
"completion_tokens": 19,
"total_tokens": 305
}
} Quels modèles acceptent les images
| Modèles | Lit |
|---|---|
shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro | Images, et documents : PDF, Word, PowerPoint, Excel et fichiers en texte brut. |
shannon-1.6-lite, shannon-1.6-pro | Images. |
shannon-2-lite, shannon-2-pro | Images, dans les requêtes qui envoient aussi tools ou response_format. |
Kimi-K3-3BIT-REAP, MiniMax-M3-3BIT-REAP, Kimi-K2.6-W4A16-AUTOROUND-REAP, inkling-W4A16-AUTOROUND-REAP, MiMo-V2.5-W8A16 | Images. |
DeepSeek-V4-Pro-0813-3BIT-REAP, GLM-5.2-3BIT-REAP, Nemotron3Ultra-3BIT-REAP, DeepSeek-V4-Flash-0731-W4A16-AUTOROUND-REAP, Laguna-S-2.1-W4A16-AUTOROUND-REAP, MiMo-V2.5-Pro-W8A16, Hy3-W8A16 | Texte. Une requête avec une image reçoit le statut 400. |
shannon-coder-1 | Texte. |
GET /v1/models indique l'entrée image par id sous la forme capabilities.vision. Modèles et tarifs
- Les modèles Shannon lisent les fichiers du dernier message utilisateur. Placez l'image dans le message qui pose la question.
- La famille Shannon 3 garde aussi en vue quelques images et documents des messages utilisateur précédents lorsqu'ils ont été envoyés en ligne, et lit un nombre maximal fixé d'images par requête, comptées à partir de la première.
- Les modèles open-weight hébergés lisent les images de chaque message de la conversation.
Formes acceptées
Un fichier est envoyé de l'une de deux façons : dans la requête en base64, ou sous forme d'adresse que l'API récupère. Chaque fichier voyage avec la requête ; l'API n'a pas de point de terminaison d'envoi.
| Point de terminaison | Dans la requête (base64) | Par adresse |
|---|---|---|
/v1/chat/completions | {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,…"}} | {"type": "image_url", "image_url": {"url": "https://…"}} |
/v1/responses | {"type": "input_image", "image_url": "data:image/jpeg;base64,…"} | {"type": "input_image", "image_url": "https://…"} |
/v1/messages | {"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": "…"}} | {"type": "image", "source": {"type": "url", "url": "https://…"}} |
Le même message utilisateur dans chaque format :
{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD…"
}
}
]
} {
"role": "user",
"content": [
{"type": "input_text", "text": "What is in this picture?"},
{
"type": "input_image",
"image_url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD…"
}
]
} {
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRgABAQAAAQABAAD…"
}
}
]
} - Une URL de données a la forme
data:<media type>;base64,<data>. La partie;base64est obligatoire. - Sur
/v1/chat/completionset/v1/responses,image_urlpeut être la chaîne elle-même ou un objet{"url": "…"}. - Le type de fichier provient de l'URL de données ou de
media_type. Sans type, une image est lue commeimage/png. - Les fichiers en ligne comptent dans la taille du corps de la requête, qui peut atteindre 32 MiB.
- Accepté pour la compatibilité :
image_url.detail.
Limites des fichiers distants
Quand vous envoyez une adresse, l'API récupère le fichier avant l'exécution du modèle, dans ces limites :
| Limite | Règle |
|---|---|
| Taille | Jusqu'à 8 MiB par fichier. |
| Durée | 20 secondes pour répondre. |
| Redirections | 5 au maximum. |
| Adresse | http:// ou https://, sans nom d'utilisateur ni mot de passe dans l'adresse, sur un hôte à adresse publique. |
| Réponse de l'hôte | Un statut de la plage 200 et un corps non vide. Le type de fichier est lu dans Content-Type. |
| Demandé comme | User-Agent: ShannonBot/1.0 (+https://shannon-ai.com) |
Comment les images sont comptées en tokens
Sur les modèles open-weight hébergés, une image compte un token par bloc de 28 × 28 pixels : la largeur divisée par 28, arrondie au supérieur, multipliée par la hauteur divisée par 28, arrondie au supérieur. Le résultat fait partie de usage.prompt_tokens et est facturé comme entrée.
- 1024 × 1024
- 1,369 tokens
- 1920 × 1080
- 2,691 tokens
- 512 × 512
- 361 tokens
- Une image distante est d'abord récupérée, c'est donc sa taille réelle qui est comptée.
- Une image dont la taille ne peut pas être lue compte pour 1,024 tokens.
- Les points de terminaison de comptage appliquent la même règle aux URL de données. Ils ne récupèrent pas une adresse distante et la comptent pour 1,024 tokens. Décompte de tokens
- Pour un modèle Shannon, lisez ce qu'a coûté une requête avec des images dans
usagede la réponse.
Documents et autres fichiers
La famille Shannon 3 (shannon-3, shannon-3-pro, shannon-3.1, shannon-3.1-pro) lit aussi les documents. Le texte du document est extrait et donné au modèle avec votre message.
| Document | Type de média |
|---|---|
application/pdf | |
| Word | application/vnd.openxmlformats-officedocument.wordprocessingml.document |
| PowerPoint | application/vnd.openxmlformats-officedocument.presentationml.presentation |
| Excel | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet |
Un document est une partie du message utilisateur, comme une image :
| Point de terminaison | Dans la requête (base64) | Par adresse |
|---|---|---|
/v1/chat/completions, /v1/messages | {"type": "document", "source": {"type": "base64", "media_type": "application/pdf", "data": "…"}} | {"type": "document", "source": {"type": "url", "url": "https://…"}} |
/v1/responses | {"type": "input_file", "file_data": "data:application/pdf;base64,…"} | {"type": "input_file", "file_url": "https://…"} |
{
"model": "shannon-3",
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": "JVBERi0xLjcKJeLjz9MK…"
}
},
{"type": "text", "text": "Summarise this report in five points."}
]
}
]
} {
"model": "shannon-3",
"input": [
{
"role": "user",
"content": [
{
"type": "input_file",
"file_data": "data:application/pdf;base64,JVBERi0xLjcKJeLjz9MK…"
},
{
"type": "input_text",
"text": "Summarise this report in five points."
}
]
}
]
} {
"model": "shannon-3",
"messages": [
{
"role": "user",
"content": [
{
"type": "document",
"source": {
"type": "base64",
"media_type": "application/pdf",
"data": "JVBERi0xLjcKJeLjz9MK…"
}
},
{"type": "text", "text": "Summarise this report in five points."}
]
}
]
} - Indiquez le véritable type de média du fichier. Sans type, un document est lu comme
application/pdf. - Un fichier en texte brut, comme un CSV, est lu comme du texte et joint de la même manière.
- Quand un document ne peut pas être lu, ou que le fichier est d'un autre type, le modèle en est informé et peut le dire dans sa réponse. Le statut reste
200. - Sur tout autre modèle, une partie document est retirée de ce que lit le modèle, et la requête reçoit une réponse fondée sur le reste.
- Un document envoyé par adresse est récupéré selon les limites des fichiers distants ci-dessus.
Erreurs
| Statut | Type | Message | Quand |
|---|---|---|---|
400 | invalid_request_error | <id> does not accept image input | Une image a été envoyée à un modèle open-weight hébergé qui n'accepte que du texte. Rien n'est prélevé sur votre solde. |
400 | invalid_request_error | audio and video input are not supported by any hosted model | Une partie audio ou vidéo a été envoyée à un modèle open-weight hébergé. |
413 | invalid_request_error | Failed to buffer the request body: … | Le corps de la requête, avec ses fichiers en ligne, dépasse 32 MiB. L'erreur porte code: "request_too_large". |
Un modèle Shannon répond avec le statut 200 quels que soient les fichiers de la requête : une partie qu'il ne lit pas est retirée. Gestion des erreurs