diff --git a/common/openrouter-image-gen.md b/common/openrouter-image-gen.md new file mode 100644 index 0000000..f4ef575 --- /dev/null +++ b/common/openrouter-image-gen.md @@ -0,0 +1,36 @@ +# 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](bifrost-access.md)). + +## Endpoint & modèle +- `POST https://openrouter.ai/api/v1/chat/completions` +- Auth : `Authorization: Bearer ` (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) +```bash +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`.