common: ajoute le fichier runbook image-gen (manquant) + section transparence/flood-fill

This commit is contained in:
Nabil Derouiche 2026-06-14 14:55:58 +01:00
parent 998c47fb60
commit 73f435deb5
1 changed files with 36 additions and 0 deletions

View File

@ -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é 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)
```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`.