Déploiements

Un déploiement est un groupe nommé de workers qui possède un ensemble de définitions de workflow et reçoit toutes les exécutions associées. Il permet d'isoler les workers dans des espaces de travail partagés et gère automatiquement l’acheminement des exécutions.

Définir DEPLOYMENT_NAME

Définir DEPLOYMENT_NAME

DEPLOYMENT_NAME est obligatoire au démarrage du worker. Si la variable n’est pas renseignée, le worker échoue immédiatement au lancement.

DEPLOYMENT_NAME=invoice-service MISTRAL_API_KEY=your-key uv run python worker.py

Caractères autorisés : alphanumérique, tiret, souligné (128 caractères maximum).

WORKER_NAME identifie le processus worker individuel et s’affiche dans la console et l’API. Sa valeur par défaut est socket.gethostname().

Isolation des workers

Isolation des workers

Dans un espace de travail partagé, plusieurs développeurs peuvent exécuter des workers simultanément sans interférer. Chaque déploiement ne reçoit que les exécutions des définitions de workflow qu’il a enregistrées.

# Développeur A
DEPLOYMENT_NAME=alice MISTRAL_API_KEY=shared-key uv run python worker.py

# Développeur B
DEPLOYMENT_NAME=bob MISTRAL_API_KEY=shared-key uv run python worker.py

Les exécutions d’Alice sont prises en charge par les workers d’Alice. Celles de Bob sont prises en charge par les workers de Bob.

Acheminement des exécutions

Acheminement des exécutions

Lorsqu’un seul déploiement actif détient un workflow, les exécutions sont automatiquement dirigées — aucune configuration supplémentaire n’est nécessaire :

execution = await client.execute_workflow(
    workflow_identifier="invoice_processor",
    input_data=InputData(invoice_id="INV-001"),
)

Si deux déploiements actifs enregistrent le même nom de workflow, la plateforme ne peut pas effectuer l’acheminement automatiquement et retourne une erreur 409 Conflict :

{
  "code": "AMBIGUOUS_WORKFLOW",
  "deployments": ["alice", "bob"]
}

Pour résoudre le conflit, indiquez deployment_name explicitement :

execution = await client.execute_workflow(
    workflow_identifier="invoice_processor",
    deployment_name="alice",
    input_data=InputData(invoice_id="INV-001"),
)
Détection des conflits

Détection des conflits

Quand un worker enregistre un nom de workflow déjà détenu par un autre déploiement actif, la plateforme affiche un avertissement immédiat. L’enregistrement n’est pas bloqué — l’avertissement est retourné dans la réponse et apparaît dans les logs du worker :

{
  "warnings": [
    "Workflow 'invoice_processor' is also registered by active deployment 'bob'"
  ]
}

Le conflit se résout automatiquement dès que l’un des déploiements devient inactif (quand ses workers s’arrêtent).

Plusieurs workers dans un même déploiement qui enregistrent les mêmes définitions participent au scaling horizontal — aucun avertissement n’est généré.

Astuce

Pour restreindre les clés API autorisées à enregistrer des workflows dans un déploiement, consultez Déploiements sécurisés.

Cycle de vie du déploiement

Cycle de vie du déploiement

Un déploiement est considéré comme actif dès qu’au moins l’un de ses workers envoie un heartbeat dans la fenêtre de liveness. Les workers envoient un heartbeat toutes les ~10 secondes automatiquement. Quand tous les workers sont arrêtés, le déploiement passe à l’état inactif après l’expiration de la fenêtre de liveness (50 secondes en production, valeur configurable).

Un déploiement inactif ne reçoit plus d’exécution et n’est pas pris en compte lors de la détection des conflits.

Scalabilité horizontale

Scalabilité horizontale

Exécutez plusieurs workers sous le même DEPLOYMENT_NAME pour augmenter le débit. Les exécutions sont réparties sur l’ensemble des workers actifs du déploiement.

Pour la production, déployez les workers dans un objet Kubernetes Deployment ou StatefulSet, avec plusieurs replicas pointant sur le même DEPLOYMENT_NAME. La plateforme répartit la charge automatiquement.

Lister les déploiements

Lister les déploiements

Listez tous les déploiements actifs de votre espace de travail :

from mistralai.client import Mistral

client = Mistral(api_key="your_api_key")

response = client.workflows.deployments.list_deployments()
for deployment in response.deployments:
    print(deployment.name, deployment.is_active)

Vous pouvez transmettre workflow_name pour filtrer par workflow, ou active_only=false pour inclure les déploiements inactifs.

Inspectez un déploiement précis et ses workers individuels :

deployment = client.workflows.deployments.get_deployment(name="invoice-service")
print(deployment.name, deployment.is_active)
for worker in deployment.workers:
    print(worker.name, worker.updated_at)