Claude Opus 5.5 est disponible sur SeedRouter
LogoSeedRouter

Rechercher un modèle par nom, ex. « nano banana »

Rechercher un modèle par nom, ex. « nano banana »

Image

Nano Banana 2.1 (Gemini Nano Banana 2.1)

View Markdown

Créez et éditez des images avec Nano Banana 2.1 via un endpoint asynchrone au format generateContent de Google : 1K à 4K, niveaux de réflexion, 14 références.

Nano Banana 2.1 est le modèle d'image gemini-nano-banana-2.1 de Google, la mise à jour de Nano Banana 2. 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èleFacturation
gemini-nano-banana-2.1Un prix fixe par image livrée, quelle que soit la taille

Consultez la page du modèle pour le prix actuel.

Exemple rapide

curl https://api.seedrouter.ai/v1/images/generations \
  -H "Authorization: Bearer $SEEDROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gemini-nano-banana-2.1",
    "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êteValeur
AuthorizationBearer YOUR_API_KEY
Content-Typeapplication/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

NomTypeRequisPar défautRemarques
modelstringOui—gemini-nano-banana-2.1.
contentsContent[]Oui—1 à 32 tours. Chacun contient parts et un role facultatif (user ou model) ; le dernier tour est user.
contents[].parts[].textstring——Une partie texte. Au moins une partie texte est requise.
contents[].parts[].fileDataobjectNon—{"mimeType": "...", "fileUri": "https://..."} ; une référence image, vidéo ou PDF. Jusqu'à 14 au total.
systemInstructionobjectNon—{"parts": [{"text": "..."}]}.
safetySettingsobject[]Non—Paires {"category", "threshold"} ; voir ci-dessous.
toolsobject[]Non—[{"googleSearch": {}}] pour la recherche web, ou {"googleSearch": {"searchTypes": {"webSearch": {}, "imageSearch": {}}}} avec l’un des types ou les deux. Ancre l’image dans des résultats de recherche en temps réel ; le prix par image ne change pas.
generationConfig.responseModalitiesenum[]Nontexte et image["IMAGE"] pour des images uniquement, ou ["TEXT", "IMAGE"].
generationConfig.imageConfig.aspectRatioenumNonRatio de l'image d'entrée, sinon 1:11:1, 1:4, 4:1, 1:8, 8:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9.
generationConfig.imageConfig.imageSizeenumNon1K1K, 2K, 4K. K en majuscule. 512 n'est pas disponible pour ce modèle.
generationConfig.candidateCountintegerNon1Uniquement 1. Une requête renvoie une image.
generationConfig.temperaturenumberNonValeur par défaut du modèle0 à 2.
generationConfig.topPnumberNonValeur par défaut du modèle0 à 1.
generationConfig.topKintegerNonValeur par défaut du modèle1 ou plus.
generationConfig.seedintegerNon—Entier 32 bits.
generationConfig.maxOutputTokensintegerNonValeur par défaut du modèle1 à 32 768.
generationConfig.stopSequencesstring[]Non—Jusqu'à 5.
generationConfig.mediaResolutionenumNonValeur par défaut du modèleMEDIA_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.thinkingLevelenumNonMEDIUMMINIMAL, MEDIUM, HIGH. Quantité de réflexion du modèle avant de dessiner ; les niveaux plus élevés prennent plus de temps.
generationConfig.thinkingConfig.includeThoughtsbooleanNonfalseRenvoie les résumés de réflexion du modèle dans output.thoughts.

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 : le contenu mis en cache et responseFormat ; définissez le format et la taille avec imageConfig. inlineData n'est pas accepté ; transmettez les médias sous forme d'URL fileData.

Taille de sortie

imageSizeSortie 1:1Tokens d'image
1K1024×10241 120
2K2048×20481 680
4K4096×40962 520

Les autres ratios d'aspect conservent le même nombre de tokens ; par exemple, 16:9 en 1K donne 1376×768, et 21:9 en 4K donne 6336×2688.

Modes

Il n'existe ni paramètre de mode distinct ni point de terminaison d'édition.

OpérationParamètres
Texte vers imageune partie texte
Édition ou compositionpartie texte + une ou plusieurs parties fileData
Édition multi-tourstours 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-nano-banana-2.1",
    "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 références doivent être des URL HTTP(S) publiques de moins de 50 Mo chacune et de 100 Mo au total : images (image/png, image/jpeg, image/webp, image/heic, image/heif), vidéos (video/mp4, video/mpeg, video/mov, video/avi, video/x-flv, video/mpg, video/webm, video/wmv, video/3gpp) ou documents PDF (application/pdf). 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 le prix actuel. gemini-nano-banana-2.1 facture un prix fixe par image livrée, quels que soient la taille, le niveau de réflexion ou le prompt.

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-nano-banana-2.1",
  "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-nano-banana-2.1",
  "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": 22,
      "output_tokens": 2297,
      "total_tokens": 2319
    }
  }
}
ChampSignification
idConservez cet identifiant pour les requêtes ultérieures.
statusprocessing, completed ou failed.
created_at, finished_atHorodatages Unix en secondes.
output.data[].urlURL de l'image générée.
output.textTexte renvoyé par le modèle avec l'image, lorsque responseModalities inclut TEXT. Les réflexions n'y figurent pas.
output.thoughtsRé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.grounding_metadataAvec Google Search : webSearchQueries, imageSearchQueries, searchEntryPoint.renderedContent (le HTML des Search Suggestions que vous devez afficher) et groundingChunks (sources), tels que Google les renvoie.
output.output_formatFormat d'image réel.
output.partsLes 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.usageUtilisation de tokens. output_tokens compte la sortie texte, réflexion et image.
errorErreur 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.
  • Le prix est le même pour toutes les tailles, demandez donc celle dont vous avez besoin : 1K pour les brouillons, 2K ou 4K pour les visuels finaux.
  • Mettez entre guillemets le texte exact à afficher dans l'image, et gardez-le court.
  • Utilisez la réflexion MINIMAL pour des brouillons plus rapides et HIGH pour des mises en page denses comme les infographies.
  • Enregistrez les images renvoyées dans votre propre stockage si vous avez besoin d'une copie durable.

Ressources liées