Aller au contenu principal

Le SDK Python xAI : operations asynchrones

Automatiser vos workflows RAG en Python

Le SDK Python de xAI offre une interface native pour toutes les operations vues dans ce cours : upload de fichiers, gestion de collections, recherche et generation. Son architecture asynchrone (async/await) permet de gerer efficacement les operations paralleles et les temps d’attente.

Installation et configuration

pip install xai-sdk

La configuration du client necessite vos deux cles API :

import os
from xai_sdk import Client

client = Client(
    api_key=os.getenv("XAI_API_KEY"),
    management_api_key=os.getenv("XAI_MANAGEMENT_API_KEY"),
    timeout=3600
)

Le parametre timeout (en secondes) est important pour les operations longues comme l’upload de gros fichiers ou le polling du traitement des documents.

Operations sur les collections

Creer une collection

collection = await client.collections.create(
    name="base-documentaire-2026"
)
collection_id = collection.id
print(f"Collection creee : {collection_id}")

Lister les collections

collections = await client.collections.list()
for col in collections:
    print(f"{col.id}{col.name}")

Supprimer une collection

await client.collections.delete(collection_id)

Upload et ajout de documents

Le SDK simplifie le processus en deux etapes :

import asyncio

async def ajouter_document(client, collection_id, chemin_fichier):
    # Upload du fichier
    with open(chemin_fichier, "rb") as f:
        upload = await client.files.create(
            file=f,
            purpose="assistants"
        )
    file_id = upload.id

    # Ajout a la collection
    await client.collections.upload_document(
        collection_id=collection_id,
        name=chemin_fichier.split("/")[-1],
        data=open(chemin_fichier, "rb").read()
    )

    return file_id

Polling du traitement

Attendez que le document soit indexe avant de lancer des recherches :

async def attendre_indexation(client, file_id, collection_id):
    while True:
        doc = await client.collections.get_document(
            file_id, collection_id
        )
        if doc.status == "DOCUMENT_STATUS_PROCESSED":
            print("Document pret")
            return
        print(f"Statut : {doc.status}, attente...")
        await asyncio.sleep(3)

Recherche dans les collections

results = await client.collections.search(
    query="Procedure de validation des commandes",
    collection_ids=[collection_id]
)

for result in results:
    print(f"Score: {result.score:.2f}")
    print(f"Contenu: {result.content[:200]}")
    print("---")

Pipeline complet async

Voici un pipeline complet qui cree une collection, y ajoute des documents et lance une recherche :

import asyncio
import os
from xai_sdk import Client

async def pipeline_rag():
    client = Client(
        api_key=os.getenv("XAI_API_KEY"),
        management_api_key=os.getenv("XAI_MANAGEMENT_API_KEY"),
        timeout=3600
    )

    # 1. Creer la collection
    collection = await client.collections.create(
        name="documentation-projet"
    )

    # 2. Ajouter des documents en parallele
    fichiers = [
        "docs/architecture.pdf",
        "docs/api-reference.pdf",
        "docs/guide-deploiement.md"
    ]

    tasks = [
        ajouter_document(client, collection.id, f)
        for f in fichiers
    ]
    file_ids = await asyncio.gather(*tasks)

    # 3. Attendre l'indexation de tous les documents
    await asyncio.gather(*[
        attendre_indexation(client, fid, collection.id)
        for fid in file_ids
    ])

    # 4. Rechercher
    results = await client.collections.search(
        query="Comment deployer en production ?",
        collection_ids=[collection.id]
    )

    for r in results:
        print(f"[{r.score:.2f}] {r.content[:150]}")

    # 5. Generer une reponse avec RAG
    response = await client.responses.create(
        model="grok-3",
        input="Explique la procedure de deploiement.",
        tools=[{
            "type": "collections_search",
            "collection_ids": [collection.id]
        }]
    )

    print(response.output_text)

asyncio.run(pipeline_rag())

L’avantage de l’asynchrone

L’architecture async du SDK permet de :

  • Uploader plusieurs fichiers en parallele avec asyncio.gather()
  • Attendre le traitement sans bloquer grace a await asyncio.sleep()
  • Lancer des recherches concurrentes dans plusieurs collections
  • Integrer dans des frameworks web async (FastAPI, aiohttp)

Pour un workflow avec 10 fichiers, l’upload parallele peut diviser le temps total par 5 ou plus, compare a un traitement sequentiel.

Points cles a retenir

  • Le SDK Python xAI fournit une interface async native pour toutes les operations Collections et RAG
  • Les deux cles (API + Management) se configurent dans le client
  • asyncio.gather() permet d’uploader et d’attendre l’indexation en parallele
  • Le pipeline complet va de la creation de collection a la generation de reponse avec RAG
  • L’architecture async s’integre naturellement avec les frameworks web modernes (FastAPI, etc.)