Aller au contenu principal

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

  1. Prototypez en standard (0,02 $), finalisez en pro (0,07 $)
  2. Utilisez n=1 en production ciblée, n=3-5 seulement pour explorer
  3. Cachez les résultats : si le même prompt revient, réutilisez l’image déjà générée
  4. Limitez les utilisateurs : imposez un quota de générations par jour/heure
  5. 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 : utilisez requests
  • images.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