Claude Platform Docs
Managed AgentsSandbox auto-hébergées

Surveiller et dépanner les workers auto-hébergés

Consultez la profondeur de la file d'attente, arrêtez les sessions et les workers sans perdre de travail, et corrigez les défaillances courantes des sandboxes auto-hébergées.

Les appels de surveillance présentés sur cette page s'exécutent depuis vos outils de surveillance ou d'exploitation, authentifiés avec votre clé API Claude. Les helpers de worker gèrent la boucle de réclamation et de maintien en vie, vous n'appelez donc pas ces points de terminaison directement.

Consulter la profondeur de la file d'attente

client.beta.environments.work.stats() renvoie l'état de la file d'attente d'un environnement :

ChampSignificationUtilisez-le pour
depthÉléments en attente de réclamation.Dimensionner votre flotte de workers ou déclencher une alerte en cas d'arriéré.
pendingÉléments réclamés par un worker mais pas encore acquittés. Les helpers de worker acquittent chaque élément avant de le traiter, cette valeur reste donc proche de zéro en fonctionnement normal.Détecter un worker bloqué entre la réclamation et l'acquittement : déclenchez une alerte sur une valeur non nulle persistante.
oldest_queued_atHorodatage de l'élément le plus ancien encore dans la file d'attente, qu'il soit en attente de réclamation ou réclamé mais pas encore acquitté. null lorsqu'il n'y en a aucun.Voir depuis combien de temps l'élément le plus ancien attend.
workers_pollingWorkers ayant interrogé la file au cours des 30 dernières secondes.Déclencher une alerte sur la disponibilité.
import os

import anthropic

client = anthropic.Anthropic()

stats = client.beta.environments.work.stats(os.environ["ANTHROPIC_ENVIRONMENT_ID"])
print(f"depth={stats.depth} pending={stats.pending}")
{
  "type": "work_queue_stats",
  "depth": 0,
  "pending": 0,
  "oldest_queued_at": null,
  "workers_polling": 0
}

Arrêter une session proprement

Utilisez client.beta.environments.work.stop() pour demander au worker qui gère une session spécifique de l'arrêter.

Par défaut, l'élément de travail passe à l'état stopping. Le worker s'en aperçoit lors de son prochain heartbeat de bail, annule l'appel d'outil en cours de la session et confirme l'arrêt. L'élément de travail passe alors à l'état stopped.

Passez force=True pour marquer immédiatement l'élément de travail comme stopped au lieu d'attendre la confirmation du worker.

Comme ces appels s'exécutent depuis vos outils d'exploitation plutôt que depuis l'hôte du worker, ANTHROPIC_WORK_ID n'est pas défini automatiquement. Définissez-le sur l'ID de l'élément de travail cible avant d'exécuter les exemples suivants. Pour trouver l'ID d'un élément de travail, listez les éléments de travail de l'environnement via les points de terminaison Environments Work.

import os

import anthropic

client = anthropic.Anthropic()

work = client.beta.environments.work.stop(
    os.environ["ANTHROPIC_WORK_ID"],
    environment_id=os.environ["ANTHROPIC_ENVIRONMENT_ID"],
)
print(work.state)

Arrêter les workers proprement

Un worker annulé pendant l'exécution d'une session arrête son travail en cours avant de se terminer. Si des magasins de mémoire sont attachés à la session, le worker ignore la synchronisation finale mais téléverse tout de même les fichiers modifiés et supprime les répertoires des magasins.

Un processus tué n'exécute aucune procédure de nettoyage. Pour arrêter un worker proprement :

  1. Assurez-vous que SIGTERM et SIGINT annulent le worker. La méthode dépend du worker :

    WorkerQue faire
    CLI antRien. La CLI gère elle-même les deux signaux : elle annule tout appel d'outil en cours, publie son résultat d'erreur et libère l'élément de travail.
    Worker SDK constituant son propre processusEnvironmentWorker n'installe aucun gestionnaire de signaux. Annulez le worker depuis un gestionnaire de signaux, comme le font les exemples de worker autonome.
    Worker SDK au sein d'un serveur webhookAnnulez le worker depuis le hook d'arrêt propre au serveur, comme le font les exemples webhook. Le worker ne doit pas prendre le contrôle des signaux du serveur.
  2. Arrêtez le worker avec SIGTERM et prévoyez au moins 30 secondes avant tout arrêt forcé. Le téléversement final peut prendre ce temps. Par défaut, Docker envoie SIGKILL 10 secondes après le signal d'arrêt. Augmentez cette limite avec --stop-timeout sur docker run, ou avec le délai de grâce de terminaison de votre orchestrateur.

Si un worker est tué avant l'exécution de sa procédure de nettoyage, toutes les modifications de mémoire non synchronisées sont perdues. Sur un hôte de longue durée, supprimez également le répertoire de magasin résiduel sous /mnt/memory/ avant la prochaine session qui attache ce magasin. Une sandbox qui sert une seule session puis est supprimée ne nécessite aucun nettoyage.

Dépannage

Le worker ne se connecte pas

Si workers_polling reste à 0, le worker n'atteint pas la file d'attente. Vérifiez que ANTHROPIC_ENVIRONMENT_KEY et ANTHROPIC_ENVIRONMENT_ID sont définis sur l'hôte du worker.

Une session reste en file d'attente

Aucun worker ne réclame de travail. Une session en file d'attente attend plutôt que d'échouer. Vérifiez workers_polling et depth dans Consulter la profondeur de la file d'attente.

Les magasins de mémoire ne parviennent pas à se monter

Le worker journalise les échecs de montage et de synchronisation en arrière-plan plutôt que de les signaler à la session. Seuls les refus liés à la lecture seule parviennent à l'agent, sous forme d'erreurs d'outil (voir Magasins en lecture seule et conflits).

Si le worker ne peut pas monter un magasin de mémoire lorsqu'il réclame une session, il fait échouer l'élément de travail. La session n'émet aucun événement d'erreur et reste inactive.

SymptômeCauseCorrectif
Le journal du worker contient the work item carried no sessions token (en Go, l'erreur ErrSessionMemoryNoToken) et l'élément de travail échoue.Le secret par session de l'élément de travail n'a pas atteint le worker. Soit votre code ne l'a pas transmis, soit les magasins de mémoire sur les sandboxes auto-hébergées ne sont pas activés pour votre organisation.Transmettez le secret de l'élément de travail. Si le worker interroge la file et exécute les sessions dans un seul processus et journalise tout de même ce message, contactez le support.
Le journal du worker contient something already exists at the memory store's path.Un répertoire résiduel d'une session précédente, généralement une session dont le worker a été tué avant l'exécution de sa procédure de nettoyage.Supprimez le répertoire résiduel indiqué par la ligne de journal. Les modifications qu'il contient et qui n'avaient pas été synchronisées sont perdues.
Le journal du worker contient cannot create the memory store's folder et the worker host must make this mount path writable.L'utilisateur sous lequel le worker s'exécute ne peut pas créer de répertoires sous /mnt/memory.Créez /mnt/memory et attribuez-le à cet utilisateur avec chown. Consultez Préparer l'hôte.
La session reste idle avec une raison d'arrêt requires_action et aucun événement d'erreur peu après qu'un worker l'a réclamée.Le worker a fait échouer l'élément de travail parce qu'il n'a pas pu monter un magasin de mémoire, pour l'une des raisons précédentes.Corrigez la cause sur l'hôte, puis envoyez un événement user.interrupt. Le travail de la session est remis en file d'attente, et le prochain worker qui le réclame retente le montage.

Un appel d'outil personnalisé ne renvoie jamais de résultat

Si la session reste en pause avec une raison d'arrêt requires_action, aucun worker ni client ne sert cet outil. Consultez Servir un outil personnalisé.

Un appel d'outil MCP encapsulé reste bloqué

Sans délai d'expiration sur le client MCP, un appel bloqué vers un serveur MCP encapsulé ne devient un résultat d'outil en erreur que lorsqu'un mécanisme de secours se déclenche :

SDKMécanisme de secoursSe déclenche après
PythonLa limite d'appel d'outil propre au workerEnviron deux minutes et demie
TypeScriptLe délai d'expiration de requête par défaut du SDK MCPEnviron une minute
GoLe worker annule un appel d'outil qui dépasse sa limite par défaut120 secondes

Was this page helpful?