Modération, incompatibilités SDK et maîtrise des coûts
Comprendre les limites de l’API image
Pour construire des applications fiables avec l’API de génération d’images Grok, il est essentiel de connaître ses limites : la modération automatique, l’incompatibilité avec certaines méthodes du SDK OpenAI, et les mécanismes de contrôle des coûts.
La modération de contenu
L’API applique automatiquement une modération sur les prompts et les images générées. Certains types de contenu sont refusés :
- Contenu explicitement violent ou gore
- Contenu à caractère sexuel explicite
- Contenu haineux ou discriminatoire
- Contenu impliquant des mineurs de manière inappropriée
Lorsque la modération est déclenchée, l’API retourne une erreur au lieu d’une image.
Gérer les refus de modération
import requests
import os
headers = {
"Authorization": f"Bearer {os.getenv('XAI_API_KEY')}",
"Content-Type": "application/json"
}
def generate_safe(prompt, **kwargs):
"""Génère une image en gérant les refus de modération."""
try:
response = requests.post(
"https://api.x.ai/v1/images/generations",
headers=headers,
json={"model": "grok-imagine-image", "prompt": prompt, **kwargs}
)
response.raise_for_status()
return response.json()["data"][0]["url"]
except requests.exceptions.HTTPError as e:
if response.status_code == 400:
print(f"Prompt refusé par la modération : {prompt[:50]}...")
return None
raise
Bonnes pratiques de modération
- Testez vos prompts avec des variations pour identifier les mots déclencheurs
- Préfiltrez les prompts utilisateur côté serveur avant de les envoyer à l’API
- Prévoyez un message d’erreur adapté pour vos utilisateurs
L’incompatibilité du SDK OpenAI pour l’édition
C’est un point critique : la méthode images.edit() du SDK OpenAI ne fonctionne pas avec l’API xAI. Le SDK OpenAI envoie les données en multipart/form-data, alors que l’API xAI attend du application/json.
# NE FONCTIONNE PAS
from openai import OpenAI
client = OpenAI(api_key=os.getenv("XAI_API_KEY"), base_url="https://api.x.ai/v1")
client.images.edit(
model="grok-imagine-image",
image=open("photo.png", "rb"),
prompt="Modifier cette image"
)
# → Erreur de content-type !
# FONCTIONNE : appel REST direct
import requests
response = requests.post(
"https://api.x.ai/v1/images/edits",
headers={
"Authorization": f"Bearer {os.getenv('XAI_API_KEY')}",
"Content-Type": "application/json"
},
json={
"model": "grok-imagine-image",
"prompt": "Modifier cette image",
"image": {"url": "https://exemple.com/photo.jpg"}
}
)
Récapitulatif de compatibilité
| Opération | SDK OpenAI | REST (requests) |
|---|---|---|
| images.generate() | Compatible | Compatible |
| images.edit() | Incompatible | Compatible |
Maîtrise des coûts
Surveiller la consommation
Mettez en place un compteur de dépenses dans votre code :
class ImageBudgetTracker:
PRICES = {
"grok-imagine-image": 0.02,
"grok-imagine-image-pro": 0.07
}
def __init__(self, budget_limit=10.0):
self.total_spent = 0.0
self.budget_limit = budget_limit
self.image_count = 0
def can_generate(self, model, n=1):
cost = self.PRICES[model] * n
return (self.total_spent + cost) <= self.budget_limit
def record(self, model, n=1):
cost = self.PRICES[model] * n
self.total_spent += cost
self.image_count += n
def report(self):
remaining = self.budget_limit - self.total_spent
print(f"Images générées : {self.image_count}")
print(f"Dépensé : {self.total_spent:.2f} $")
print(f"Budget restant : {remaining:.2f} $")
# Utilisation
tracker = ImageBudgetTracker(budget_limit=5.0)
if tracker.can_generate("grok-imagine-image", n=5):
response = client.images.generate(
model="grok-imagine-image",
prompt="Mon image",
n=5
)
tracker.record("grok-imagine-image", n=5)
tracker.report()
Optimiser les coûts
- Prototypez en standard (0,02 $), finalisez en pro (0,07 $)
- Utilisez
n=1en production ciblée,n=3-5seulement pour explorer - Cachez les résultats : si le même prompt revient, réutilisez l’image déjà générée
- Limitez les utilisateurs : imposez un quota de générations par jour/heure
- Surveillez les rate limits : 300 RPM standard, 30 RPM pro
Estimation budgétaire mensuelle
Pour une application avec 100 utilisateurs générant 10 images par jour :
- Standard : 100 x 10 x 30 x 0,02 $ = 600 $/mois
- Pro : 100 x 10 x 30 x 0,07 $ = 2 100 $/mois
- Mixte (80/20) : 24 000 x 0,02 $ + 6 000 x 0,07 $ = 900 $/mois
Endpoint de découverte des modèles
Pour vérifier programmatiquement les modèles d’images disponibles et leurs prix :
response = requests.get(
"https://api.x.ai/v1/image-generation-models",
headers={"Authorization": f"Bearer {os.getenv('XAI_API_KEY')}"}
)
for model in response.json()["data"]:
print(f"{model['id']} : {model['image_price']} $/image, "
f"max prompt : {model['max_prompt_length']} chars")
Points clés à retenir
- La modération est automatique : gérez les refus dans votre code
images.edit()du SDK OpenAI est incompatible avec xAI : utilisezrequestsimages.generate()du SDK OpenAI fonctionne normalement- Implémentez un tracker de budget pour contrôler vos dépenses
- La longueur maximale du prompt est de 1 024 caractères
- Vérifiez les modèles et prix via l’endpoint
/v1/image-generation-models