Aller au contenu principal

store:false pour les images

Pourquoi ne pas stocker les images

L’API Responses de xAI offre une fonctionnalité de stockage des requêtes et réponses côté serveur. Activée par défaut avec store: true, cette persistance conserve vos échanges pendant 30 jours. Cependant, quand vous travaillez avec des images, la documentation xAI recommande explicitement de désactiver ce stockage.

Le problème du stockage avec les images

Quand vous envoyez des images avec store: true (le comportement par défaut), la requête complète — y compris les données d’images — est conservée sur les serveurs xAI. Cela pose deux problèmes majeurs :

Échecs de requêtes

La documentation xAI met en garde : les requêtes contenant des images peuvent échouer si le stockage est activé. Ce comportement se manifeste particulièrement quand :

  • Les images sont volumineuses (proches de la limite de 20 MiB)
  • Plusieurs images sont envoyées dans la même requête
  • Les images sont encodées en Base64 (la chaîne encodée est ~33% plus lourde que le fichier original)

Considérations RGPD et confidentialité

Si vos images contiennent des données personnelles (photos d’identité, documents sensibles, visages), les stocker pendant 30 jours sur un serveur tiers soulève des questions de conformité avec le RGPD et les réglementations européennes.

Comment désactiver le stockage

La solution est simple : ajoutez store: false à chaque requête contenant des images.

API Responses (Python)

response = client.responses.create(
    model="grok-4",
    input=[
        {"type": "input_image", "image_url": url_image},
        {"type": "input_text", "text": "Décris cette image."}
    ],
    store=False  # Désactive le stockage
)

API Responses (cURL)

curl -X POST "https://api.x.ai/v1/responses" \
  -H "Authorization: Bearer $XAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "grok-4",
    "store": false,
    "input": [
      {"type": "input_image", "image_url": "https://exemple.com/photo.jpg"},
      {"type": "input_text", "text": "Décris cette image."}
    ]
  }'

API Chat Completions

L’API Chat Completions est stateless par nature et ne stocke rien côté serveur. Aucune configuration supplémentaire n’est nécessaire. C’est l’un des avantages de cet endpoint pour le traitement d’images sensibles.

Impact sur le chaînage de conversations

Avec store: false, vous perdez la possibilité d’utiliser previous_response_id pour chaîner les requêtes. Chaque requête devient indépendante.

Si vous avez besoin de maintenir un contexte conversationnel autour d’images, deux approches sont possibles :

Approche 1 : renvoi manuel du contexte

# Première requête
response1 = client.responses.create(
    model="grok-4",
    input=[
        {"type": "input_image", "image_url": url_image},
        {"type": "input_text", "text": "Décris cette image."}
    ],
    store=False
)

# Deuxième requête : inclure la réponse précédente comme contexte
response2 = client.responses.create(
    model="grok-4",
    input=[
        {"type": "input_text", "text": f"Contexte précédent : {response1.output_text}"},
        {"type": "input_image", "image_url": url_image},
        {"type": "input_text", "text": "Maintenant, identifie les couleurs dominantes."}
    ],
    store=False
)

Approche 2 : utiliser Chat Completions

Si le chaînage est essentiel, utilisez l’API Chat Completions qui gère le contexte via le tableau messages sans rien stocker :

messages = [
    {
        "role": "user",
        "content": [
            {"type": "image_url", "image_url": {"url": url_image}},
            {"type": "text", "text": "Décris cette image."}
        ]
    }
]

response1 = client.chat.completions.create(
    model="grok-4",
    messages=messages
)

# Ajouter la réponse et la question suivante
messages.append({"role": "assistant", "content": response1.choices[0].message.content})
messages.append({"role": "user", "content": "Identifie les couleurs dominantes."})

response2 = client.chat.completions.create(
    model="grok-4",
    messages=messages
)

Bonne pratique : wrapper systématique

Pour ne jamais oublier store: false quand vous travaillez avec des images, créez un wrapper :

def vision_request(images, prompt, detail="auto"):
    """Requête vision avec store:false automatique."""
    input_data = []

    for img in images:
        input_data.append({
            "type": "input_image",
            "image_url": img,
            "detail": detail
        })

    input_data.append({
        "type": "input_text",
        "text": prompt
    })

    return client.responses.create(
        model="grok-4",
        input=input_data,
        store=False  # Toujours désactivé pour les images
    )

Points clés à retenir

  • Utilisez toujours store: false quand vous envoyez des images via l’API Responses
  • Le stockage activé peut provoquer des échecs de requêtes avec des images
  • store: false protège aussi la confidentialité des données visuelles
  • Le chaînage via previous_response_id n’est pas disponible avec store: false
  • L’API Chat Completions est naturellement stateless et ne nécessite pas cette option