Cache x-grok-conv-id et timeout reasoning
Optimiser les couts avec le cache
Chaque requete envoyee a l’API xAI est facturee au prix standard des tokens. Mais quand vous envoyez plusieurs requetes liees (meme conversation, meme sujet), une partie du contexte se repete. Le header x-grok-conv-id permet a xAI d’identifier ces requetes liees et d’augmenter le taux de cache, reduisant ainsi vos couts.
Le header x-grok-conv-id
Pour activer le cache conversationnel, ajoutez un header personnalise avec un UUID v4 unique par conversation :
import uuid
conversation_id = str(uuid.uuid4())
# Avec le SDK OpenAI
response = await client.chat.completions.create(
model="grok-4",
messages=[{"role": "user", "content": prompt}],
extra_headers={
"x-grok-conv-id": conversation_id
}
)
Toutes les requetes qui partagent le meme x-grok-conv-id beneficient d’un taux de cache ameliore. Les tokens en cache sont factures a un tarif reduit par rapport aux tokens standards.
Regles d’utilisation
- Generez un nouvel UUID pour chaque conversation ou session logique
- Reutilisez le meme UUID pour toutes les requetes d’une meme conversation
- Ne reutilisez pas un UUID entre des conversations differentes (cela degraderait le cache)
# Pattern pour un chatbot
class ConversationManager:
def __init__(self):
self.conv_id = str(uuid.uuid4())
self.messages = []
async def send(self, user_message: str) -> str:
self.messages.append({"role": "user", "content": user_message})
response = await client.chat.completions.create(
model="grok-4",
messages=self.messages,
extra_headers={"x-grok-conv-id": self.conv_id}
)
assistant_message = response.choices[0].message.content
self.messages.append({"role": "assistant", "content": assistant_message})
return assistant_message
Timeout de 3600 secondes pour le reasoning
Les modeles de raisonnement (grok-4.20-reasoning et similaires) effectuent une reflexion interne avant de repondre. Cette reflexion peut durer plusieurs minutes pour des problemes complexes. Le timeout par defaut de la plupart des clients HTTP (30-120 secondes) est insuffisant.
# Configuration correcte pour le reasoning
from openai import AsyncOpenAI
import httpx
client = AsyncOpenAI(
api_key=os.getenv("XAI_API_KEY"),
base_url="https://api.x.ai/v1",
timeout=httpx.Timeout(
connect=10.0, # connexion rapide
read=3600.0, # 1 heure pour la lecture
write=30.0, # envoi du prompt
pool=10.0 # attente de connexion
)
)
Le read=3600.0 est la valeur critique. C’est le delai maximal entre le moment ou le serveur commence a traiter votre requete et le moment ou vous recevez la reponse. Pour un modele de raisonnement qui reflechit pendant 5 minutes, vous avez besoin de cette marge.
Quand reduire le timeout
Le timeout de 3600 secondes n’est pas toujours necessaire :
- grok-4 (non-reasoning) : un timeout de 120-300 secondes suffit generalement
- Requetes simples : meme avec un modele reasoning, les questions courtes repondent en moins d’une minute
- Environnement de test : un timeout de 60 secondes permet de detecter rapidement les problemes
# Client pour requetes rapides
fast_client = AsyncOpenAI(
api_key=os.getenv("XAI_API_KEY"),
base_url="https://api.x.ai/v1",
timeout=httpx.Timeout(120.0)
)
# Client pour raisonnement complexe
reasoning_client = AsyncOpenAI(
api_key=os.getenv("XAI_API_KEY"),
base_url="https://api.x.ai/v1",
timeout=httpx.Timeout(3600.0)
)
Utiliser deux clients avec des timeouts differents est un pattern courant en production.
Note sur grok-4 et le reasoning
Le modele grok-4 ne retourne pas le champ reasoning_content en clair dans la reponse. Le raisonnement interne est effectue mais reste opaque. Si vous avez besoin de voir le processus de raisonnement, utilisez use_encrypted_content=True pour le preserver entre les requetes sans pouvoir le lire, ou grok-4.20-reasoning qui expose davantage de son processus.
Verifier l’impact du cache
Pour mesurer l’efficacite du cache, comparez le champ usage entre les requetes avec et sans x-grok-conv-id :
response = await client.chat.completions.create(
model="grok-4",
messages=messages,
extra_headers={"x-grok-conv-id": conv_id}
)
usage = response.usage
if hasattr(usage, 'prompt_tokens_details'):
cached = usage.prompt_tokens_details.cached_tokens
total = usage.prompt_tokens
print(f"Cache hit : {cached}/{total} tokens ({cached/total*100:.0f}%)")
Un taux de cache eleve signifie que vos tokens de contexte sont reutilises au lieu d’etre retraites, ce qui reduit directement votre facture.
Points cles a retenir
x-grok-conv-idavec un UUID v4 active le cache conversationnel pour les requetes liees- Les tokens en cache sont factures a tarif reduit
- Le timeout de 3600 secondes est necessaire pour les modeles de raisonnement
- Utilisez des clients separes pour les requetes rapides et les requetes de raisonnement
grok-4ne retourne pasreasoning_contenten clair- Surveillez le taux de cache dans
usage.prompt_tokens_detailspour valider l’optimisation