Nano Banana Pro (Gemini 3 Pro Image)
Génération et édition d'images avec Nano Banana Pro via un point de terminaison asynchrone au format generateContent de Google : réflexion intégrée, sortie 4K, 14 références.
Nano Banana Pro est le modèle Gemini 3 Pro Image de Google, conçu pour les visuels professionnels et les instructions complexes. Il réfléchit avant de dessiner, les réponses indiquent donc des tokens de raisonnement. Envoyez le corps de requête generateContent de Google avec un champ model, conservez l'identifiant de tâche renvoyé et interrogez cette tâche pour obtenir l'image terminée. Les images de référence se placent dans contents sous forme d'URL fileData.
ID de modèle
| ID de modèle | Canal | Facturation |
|---|---|---|
gemini-3-pro-image | Standard | Un prix fixe par image livrée |
gemini-3-pro-image-official | Official | Tarifs au token pour l'entrée, la sortie texte/réflexion et la sortie image |
Les deux ID acceptent les mêmes paramètres. Consultez la page du modèle pour les prix actuels.
Exemple rapide
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3-pro-image",
"contents": [{"parts": [{"text": "A ceramic teapot on a linen tablecloth, soft window light"}]}],
"generationConfig": {
"responseModalities": ["IMAGE"],
"imageConfig": {"aspectRatio": "16:9", "imageSize": "2K"}
}
}'Point de terminaison
POST https://api.seedrouter.ai/v1/images/generations| En-tête | Valeur |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
Le corps est la requête generateContent de Google avec un seul ajout : model, car ce point de terminaison ne porte aucun modèle dans son chemin. La réponse contient un identifiant de tâche, pas l'image terminée. Conservez les clés API dans du code côté serveur. L'appel direct à /v1beta/models/...:generateContent n'est pas pris en charge ; utilisez ce point de terminaison.
Paramètres
| Nom | Type | Requis | Par défaut | Remarques |
|---|---|---|---|---|
model | string | Oui | — | L'un des deux ID de modèle ci-dessus. |
contents | Content[] | Oui | — | 1 à 32 tours. Chacun contient parts et un role facultatif (user ou model) ; le dernier tour est user. |
contents[].parts[].text | string | — | — | Une partie texte. Au moins une partie texte est requise. |
contents[].parts[].fileData | object | Non | — | {"mimeType": "...", "fileUri": "https://..."} ; une image de référence. Jusqu'à 14 au total. |
systemInstruction | object | Non | — | {"parts": [{"text": "..."}]}. |
safetySettings | object[] | Non | — | Paires {"category", "threshold"} ; voir ci-dessous. |
generationConfig.responseModalities | enum[] | Non | texte et image | ["IMAGE"] pour des images uniquement, ou ["TEXT", "IMAGE"]. |
generationConfig.imageConfig.aspectRatio | enum | Non | Ratio de l'image d'entrée, sinon 1:1 | 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9. |
generationConfig.imageConfig.imageSize | enum | Non | 1K | 1K, 2K, 4K. K en majuscule. |
generationConfig.candidateCount | integer | Non | 1 | Uniquement 1. Une requête renvoie une image. |
generationConfig.temperature | number | Non | Valeur par défaut du modèle | 0 à 2. |
generationConfig.topP | number | Non | Valeur par défaut du modèle | 0 à 1. |
generationConfig.topK | integer | Non | Valeur par défaut du modèle | 1 ou plus. |
generationConfig.seed | integer | Non | — | Entier 32 bits. |
generationConfig.maxOutputTokens | integer | Non | Valeur par défaut du modèle | 1 à 32 768. |
generationConfig.stopSequences | string[] | Non | — | Jusqu'à 5. |
generationConfig.mediaResolution | enum | Non | Valeur par défaut du modèle | MEDIA_RESOLUTION_LOW, MEDIA_RESOLUTION_MEDIUM, MEDIA_RESOLUTION_HIGH. Détermine le nombre de tokens utilisés par les médias d'entrée. |
generationConfig.thinkingConfig.includeThoughts | boolean | Non | false | Renvoie les résumés de réflexion du modèle dans output.thoughts. |
generationConfig.responseFormat.image | object | Non | — | mimeType : IMAGE_JPEG ; delivery : INLINE ; aspectRatio et imageSize sous forme d’énumérations Google, par ex. ASPECT_RATIO_SIXTEEN_BY_NINE et IMAGE_SIZE_TWO_K, avec les mêmes formats et tailles que imageConfig. Non accepté par gemini-3-pro-image-official. |
Catégories de sécurité : HARM_CATEGORY_HARASSMENT, HARM_CATEGORY_HATE_SPEECH, HARM_CATEGORY_SEXUALLY_EXPLICIT, HARM_CATEGORY_DANGEROUS_CONTENT. Seuils : BLOCK_NONE, BLOCK_ONLY_HIGH, BLOCK_MEDIUM_AND_ABOVE, BLOCK_LOW_AND_ABOVE, OFF.
Les champs inconnus sont rejetés. Pas encore disponibles : l'ancrage Google Search (tools) et le contenu mis en cache ; thinkingLevel n'est pas documenté pour ce modèle. inlineData n'est pas accepté ; transmettez les médias sous forme d'URL fileData. responseFormat.image.delivery n'accepte que INLINE : les images terminées sont toujours renvoyées sous forme d'URL hébergées.
Taille de sortie
imageSize | Sortie 1:1 | Tokens d'image |
|---|---|---|
1K | 1024×1024 | 1 120 |
2K | 2048×2048 | 1 120 |
4K | 4096×4096 | 2 000 |
Les autres ratios d'aspect conservent le même nombre de tokens ; par exemple, 16:9 en 1K donne 1376×768.
Modes
Il n'existe ni paramètre de mode distinct ni point de terminaison d'édition.
| Opération | Paramètres |
|---|---|
| Texte vers image | une partie texte |
| Édition ou composition | partie texte + une ou plusieurs parties fileData |
| Édition multi-tours | tours user et model précédents, puis un nouveau tour user (voir la note ci-dessous) |
Pour poursuivre une conversation, reconstruisez le tour model à partir des output.parts de la tâche précédente, dans l'ordre : une partie texte devient {"text": ..., "thoughtSignature": ...} et une partie image devient {"fileData": {"mimeType": "image/<output_format>", "fileUri": <data[image].url>}, "thoughtSignature": ...}. Conservez chaque thoughtSignature exactement tel qu'il a été renvoyé : c'est l'URL de la signature que nous avons stockée pour vous (la signature d'une image 4K pèse plusieurs mégaoctets), et nous la restaurons avant que la requête n'atteigne le modèle. Seules les signatures issues de vos propres résultats de tâche sont acceptées.
Éditer avec une image de référence
curl https://api.seedrouter.ai/v1/images/generations \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3-pro-image",
"contents": [{
"role": "user",
"parts": [
{"text": "Turn this photo into a watercolor painting. Keep the composition."},
{"fileData": {"mimeType": "image/jpeg", "fileUri": "https://example.com/photo.jpg"}}
]
}]
}'Remplacez l'URL d'exemple par votre propre image accessible.
Entrées média
Cette API n'accepte que des références par URL. Le base64 inlineData, les URL data: et les envois multipart ne sont pas acceptés. Le Playground téléverse les fichiers sélectionnés vers le stockage avant d'en soumettre les URL.
Les images de référence doivent être des URL HTTP(S) publiques pointant vers des fichiers PNG, JPEG, WebP, HEIC ou HEIF, de moins de 50 Mo chacune et de 100 Mo au total. mimeType doit correspondre au fichier. Les URL sont récupérées pendant le traitement ; une image inaccessible fait échouer la tâche, et une tâche échouée n'est pas facturée.
Facteurs de coût
Consultez la section tarifs du modèle pour les tarifs actuels. gemini-3-pro-image facture un prix fixe par image livrée, quels que soient la taille ou le prompt. gemini-3-pro-image-official facture à l'usage : tokens d'entrée (texte et images de référence), tokens de sortie texte et de réflexion, et tokens de sortie image, chacun à son propre tarif. La taille de l'image est le facteur principal ; voir le tableau ci-dessus.
Consultez les frais définitifs dans l'historique d'utilisation de votre compte. Les tâches échouées ne sont pas facturées.
Schéma de sortie
La soumission renvoie une référence de tâche :
{
"id": "task_...",
"model": "gemini-3-pro-image",
"status": "processing",
"created_at": 1790310979
}Interroger la tâche
curl https://api.seedrouter.ai/v1/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"Interrogez toutes les quelques secondes jusqu'à ce que status vaille completed ou failed. Un dépassement de délai réseau pendant l'interrogation ne signifie pas que la génération a échoué : conservez l'identifiant de tâche et reprenez la vérification. Ne créez pas une autre tâche pour vérifier l'avancement.
Exemple d'interrogation complet
Exécutez ceci après l'exemple de soumission Python ci-dessus.
import time
deadline = time.monotonic() + 600
while time.monotonic() < deadline:
result = requests.get(
f"https://api.seedrouter.ai/v1/tasks/{task_id}",
headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
timeout=30,
)
result.raise_for_status()
task = result.json()
if task["status"] == "completed":
for image in task["output"]["data"]:
print(image["url"])
break
if task["status"] == "failed":
raise RuntimeError(task["error"]["message"])
time.sleep(3)
else:
raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")Tâche terminée
{
"id": "task_...",
"model": "gemini-3-pro-image",
"status": "completed",
"created_at": 1790310979,
"finished_at": 1790311001,
"output": {
"created": 1790310999,
"data": [{"url": "https://static.seedrouter.ai/media/tasks/task_example/0.jpg"}],
"output_format": "jpeg",
"usage": {
"input_tokens": 27,
"output_tokens": 1366,
"total_tokens": 1393,
"output_tokens_details": {"image_tokens": 1120, "text_tokens": 95, "reasoning_tokens": 151}
}
}
}| Champ | Signification |
|---|---|
id | Conservez cet identifiant pour les requêtes ultérieures. |
status | processing, completed ou failed. |
created_at, finished_at | Horodatages Unix en secondes. |
output.data[].url | URL de l'image générée. |
output.text | Texte renvoyé par le modèle avec l'image, lorsque responseModalities inclut TEXT. Les réflexions n'y figurent pas. |
output.thoughts | Résumés de réflexion du modèle, lorsque includeThoughts vaut true. Les images intermédiaires dessinées pendant la réflexion ne sont pas livrées. |
output.output_format | Format d'image réel. |
output.parts | Les parties finales de la réponse, dans l'ordre, pour l'édition multi-tours : {"text", "thoughtSignature"} ou {"image": <index into data>, "thoughtSignature"}. thoughtSignature est une URL ; renvoyez-la sans la modifier. |
output.usage | Utilisation de tokens. output_tokens compte la sortie texte, réflexion et image ; output_tokens_details.image_tokens correspond à la partie image. |
error | Erreur structurée pour une tâche échouée. |
Le streaming (streamGenerateContent) n'est pas pris en charge ; les résultats sont livrés via la tâche.
Erreurs
Les requêtes rejetées avant la création d'une tâche renvoient une erreur HTTP accompagnée d'un objet error. Une tâche qui échoue après acceptation renvoie HTTP 200 à l'interrogation, avec status: "failed" et un objet error. Une image bloquée par les filtres de sécurité du modèle échoue avec content_policy_violation ; une réponse sans image échoue avec no_output.
Voir le catalogue d'erreurs commun pour les codes, les statuts HTTP et les conseils de reprise.
{
"id": "task_...",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}Si la soumission elle-même dépasse le délai, vérifiez votre historique de tâches avant de soumettre à nouveau : la première requête a peut-être déjà été acceptée.
Conseils
- Décrivez le sujet, le décor, la lumière et le style en phrases complètes.
- Pour une édition, précisez ce qui doit changer et ce qui doit rester identique.
2Kcoûte les mêmes tokens d'image que1K; utilisez4Kpour les visuels destinés à l'impression.- Enregistrez les images renvoyées dans votre propre stockage si vous avez besoin d'une copie durable.
