nas-runbooks/common/openrouter-image-gen.md

2.7 KiB

OPENROUTER-IMAGE-GEN — Génération / édition d'images IA (nano-banana)

Note partagée aux 3 instances Hermes. Source : projet gsparc-mezzouna, 2026-06-14.

Pour produire ou retoucher une image (nettoyage de photo, fond neutre, illustration), utiliser OpenRouter en sortie image. À distinguer de la vision/OCR (lecture d'image → texte, cf bifrost-access).

Endpoint & modèle

  • POST https://openrouter.ai/api/v1/chat/completions
  • Auth : Authorization: Bearer <clé OpenRouter> (clé dédiée de hermes-platform/.env, ex. HERMES_PERSO_OPENROUTER_KEY).
  • Modèle : google/gemini-2.5-flash-image (nano-banana) — vraie capacité image-out.
  • Coût : payant mais négligeable (~fraction de centime / image).

PIÈGES

  • Mettre "modalities": ["image","text"] dans le payload, sinon pas de sortie image.
  • L'image générée est dans choices[0].message.images[0].image_url.url (data-URL base64), PAS dans message.content.
  • DeepSeek ne fait NI vision NI image-out (cf bifrost-access).
  • Pour de l'édition d'une image existante : envoyer l'image source en image_url (data:base64) dans le même message que le prompt texte.

TRANSPARENCE (piège majeur)

nano-banana ne renvoie PAS d'alpha réel : la sortie est RGB même en demandant explicitement un "transparent background PNG". Pour obtenir un PNG transparent fiable :

  1. Générer le sujet sur fond blanc plat (#FFFFFF), centré avec marge, sans ombre ni dégradé, le sujet ne touchant pas les bords.
  2. Détourer par flood-fill depuis les bords (PIL.ImageDraw.floodfill avec une couleur sentinelle + seuil), puis convertir la sentinelle → alpha 0. Cela préserve les blancs intérieurs (carrosserie/marquages blancs) car ils ne sont pas connexes au fond.
  • rembg/onnxruntime : indisponible sur Python 3.14 (pas de wheel). Le flood-fill PIL est suffisant et sans dépendance lourde.
  • Code de réf : _cutout_white() dans gsparc-mezzouna/scripts/generate_vehicle_images.py.

Exemple (édition)

curl -s https://openrouter.ai/api/v1/chat/completions \
  -H "Authorization: Bearer $OPENROUTER_KEY" -H "Content-Type: application/json" \
  -d '{"model":"google/gemini-2.5-flash-image","modalities":["image","text"],
       "messages":[{"role":"user","content":[
         {"type":"text","text":"Place the vehicle on a pure flat white background, centered, no shadow, keep it exactly."},
         {"type":"image_url","image_url":{"url":"data:image/jpeg;base64,..."}}]}]}'
# -> .choices[0].message.images[0].image_url.url  (data:image/png;base64,...)  PUIS flood-fill -> alpha

Implémentation de référence : gsparc-mezzouna/scripts/generate_vehicle_images.py.