Aller au contenu principal

Limitations de la plateforme

Connaître les limites

La plateforme Workflows de Mistral est en Public Preview (avril 2026). Comme tout système d’orchestration, elle impose des limitations techniques qu’il est essentiel de connaître pour concevoir des workflows robustes. Ignorer ces limites conduit à des erreurs en production difficiles à diagnostiquer.

Vue d’ensemble des limitations

Limitation Valeur Conséquence si dépassée
Délai entre activités 2 secondes Latence incompressible entre chaque appel d'activité
Input/output par invocation 2 MB Erreur de sérialisation, workflow échoue
Événements par exécution 51 200 Workflow terminé de force
Taille totale par exécution 50 MB Workflow terminé de force
Timeout par défaut 1 heure Workflow annulé (configurable jusqu'à 7 jours)
Timeout maximum 7 jours Workflow annulé automatiquement
I/O dans les workflows Interdit Erreur de non-déterminisme lors du replay

Le délai de 2 secondes entre activités

La plateforme impose un délai minimum de 2 secondes entre chaque appel d’activité dans un workflow. Cette latence est inhérente à l’architecture d’orchestration (persistance de chaque événement).

Impact concret

Si votre workflow enchaîne 10 activités séquentielles, le temps d’orchestration minimal est de 10 x 2 = 20 secondes, indépendamment de la durée des activités elles-mêmes.

Comment optimiser

Regroupez les opérations logiquement liées dans une seule activité plutôt que de les séparer :

# SOUS-OPTIMAL : 3 activités = 6 secondes de latence d'orchestration
@workflows.workflow.define(name="pipeline_lent")
class PipelineLent:
    @workflows.workflow.entrypoint
    async def run(self, texte: str) -> dict:
        tokens = await tokeniser(texte)
        embeddings = await calculer_embeddings(tokens)
        clusters = await clusteriser(embeddings)
        return clusters

# OPTIMISÉ : 1 activité = 2 secondes de latence d'orchestration
@workflows.activity()
async def traitement_nlp_complet(texte: str) -> dict:
    tokens = tokeniser_local(texte)
    embeddings = calculer_embeddings_local(tokens)
    clusters = clusteriser_local(embeddings)
    return {"clusters": clusters}

@workflows.workflow.define(name="pipeline_rapide")
class PipelineRapide:
    @workflows.workflow.entrypoint
    async def run(self, texte: str) -> dict:
        return await traitement_nlp_complet(texte)

La règle est simple : ne créez une activité séparée que si vous avez besoin de la garantie de persistance entre deux opérations. Si deux opérations peuvent échouer ensemble sans problème, regroupez-les.

La limite de 2 MB par invocation

Chaque appel d’activité est limité à 2 MB en entrée et 2 MB en sortie. Cette limite s’applique à la représentation JSON sérialisée des données.

Comment contourner cette limite

Pour les données volumineuses, utilisez un stockage externe :

@workflows.activity()
async def traiter_gros_fichier(fichier_url: str) -> dict:
    """Télécharge, traite et re-upload le fichier.
    Seules les URLs transitent par le workflow."""
    async with httpx.AsyncClient() as client:
        # Télécharger depuis S3/GCS
        response = await client.get(fichier_url)
        contenu = response.content  # Peut faire 100 MB

        # Traiter le fichier
        resultat = traiter(contenu)

        # Uploader le résultat
        await client.put(
            "https://storage.example.com/resultats/output.json",
            content=resultat
        )

    return {"url_resultat": "https://storage.example.com/resultats/output.json"}

La limite de 51 200 événements

Chaque exécution de workflow est limitée à 51 200 événements. Un événement est généré pour chaque :

  • Démarrage d’activité
  • Complétion d’activité
  • Signal reçu
  • Timer déclenché

Estimation du nombre d’événements

En pratique, chaque appel d’activité génère environ 2-3 événements (démarrage + complétion + métadonnées). Un workflow avec 100 activités consomme environ 250-300 événements.

La limite de 51 200 événements permet donc environ 15 000 à 20 000 appels d’activité par exécution, ce qui est largement suffisant pour la plupart des cas d’usage.

Si vous approchez la limite

Pour les workflows très longs (par exemple, traiter 50 000 documents), utilisez le pattern de continuation : le workflow traite un lot, puis lance un nouveau workflow pour le lot suivant.

La limite de 50 MB par exécution

La taille totale de tous les événements d’une exécution ne doit pas dépasser 50 MB. Cette limite est atteinte plus facilement si vos activités retournent des données volumineuses.

Comment rester sous la limite

  • Retournez des identifiants plutôt que des données complètes
  • Stockez les résultats intermédiaires dans un service externe
  • Utilisez la pagination pour les traitements en lots

Pas d’I/O dans les workflows

C’est à la fois une limitation technique et une règle de conception. Le code du workflow ne doit contenir aucune opération d’entrée/sortie :

  • Pas d’appels réseau (httpx, aiohttp, requests)
  • Pas de lecture/écriture de fichiers (open, aiofiles)
  • Pas d’accès base de données
  • Pas d’accès aux variables d’environnement pour des branchements

Toutes ces opérations doivent être encapsulées dans des activités.

Points clés à retenir

  • 2 secondes de latence minimum entre chaque activité — regroupez les opérations liées
  • 2 MB maximum par input/output d’activité — utilisez un stockage externe pour les données volumineuses
  • 51 200 événements et 50 MB maximum par exécution — utilisez le pattern de continuation pour les très longs workflows
  • Aucune I/O dans le code du workflow — tout va dans les activités
  • Ces limitations sont liées à l’architecture Temporal sous-jacente et à la Public Preview