Claude Platform Docs
Managed AgentsSelbst gehostete Sandboxes

Selbst gehostete Worker überwachen und Fehler beheben

Lies die Warteschlangentiefe aus, stoppe Sitzungen und Worker, ohne Arbeit zu verlieren, und behebe häufige Fehler bei selbst gehosteten Sandboxes.

Die Überwachungsaufrufe auf dieser Seite werden von deinen Überwachungs- oder Betriebstools ausgeführt und mit deinem Claude-API-Key authentifiziert. Die Worker-Helfer übernehmen die Schleife zum Beanspruchen und Aufrechterhalten von Arbeitselementen, sodass du diese Endpunkte nicht direkt aufrufst.

Warteschlangentiefe auslesen

client.beta.environments.work.stats() gibt den Warteschlangenstatus für eine Umgebung zurück:

FeldBedeutungVerwende es, um
depthElemente, die darauf warten, beansprucht zu werden.deine Worker-Flotte zu skalieren oder bei einem Rückstau zu alarmieren.
pendingElemente, die von einem Worker beansprucht, aber noch nicht bestätigt wurden. Die Worker-Helfer bestätigen jedes Element, bevor sie es verarbeiten, daher bleibt dieser Wert im Normalbetrieb nahe null.einen Worker zu erkennen, der zwischen Beanspruchen und Bestätigen hängen geblieben ist: Alarmiere bei einem anhaltend von null verschiedenen Wert.
oldest_queued_atZeitstempel des ältesten Elements, das sich noch in der Warteschlange befindet, entweder wartend auf Beanspruchung oder beansprucht, aber noch nicht bestätigt. null, wenn es keines gibt.zu sehen, wie lange das älteste Element bereits wartet.
workers_pollingWorker, die in den letzten 30 Sekunden gepollt haben.die Verfügbarkeit der Worker zu überwachen und bei Ausfall zu alarmieren.
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
}

Eine Sitzung ordnungsgemäß stoppen

Verwende client.beta.environments.work.stop(), um den Worker, der eine bestimmte Sitzung bearbeitet, aufzufordern, sie zu beenden.

Standardmäßig wechselt das Arbeitselement in den Status stopping. Der Worker bemerkt dies bei seinem nächsten Lease-Heartbeat, bricht den laufenden Tool-Aufruf der Sitzung ab und bestätigt das Herunterfahren. Das Arbeitselement wechselt dann in den Status stopped.

Übergib force=True, um das Arbeitselement sofort als stopped zu markieren, anstatt auf die Bestätigung des Workers zu warten.

Da diese Aufrufe von deinen Betriebstools und nicht vom Worker-Host ausgeführt werden, wird ANTHROPIC_WORK_ID nicht automatisch gesetzt. Setze die Variable auf die ID des Ziel-Arbeitselements, bevor du die folgenden Beispiele ausführst. Um die ID eines Arbeitselements zu finden, liste die Arbeitselemente der Umgebung über die Environments-Work-Endpunkte auf.

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)

Worker ordnungsgemäß stoppen

Ein Worker, der abgebrochen wird, während eine Sitzung läuft, stoppt seine laufende Arbeit, bevor er sich beendet. Wenn an die Sitzung Memory Stores angehängt sind, überspringt der Worker die abschließende Synchronisierung, lädt aber dennoch geänderte Dateien hoch und entfernt die Store-Verzeichnisse.

Ein beendeter (gekillter) Prozess führt kein Teardown aus. So stoppst du einen Worker sauber:

  1. Stelle sicher, dass SIGTERM und SIGINT den Worker abbrechen. Wie das geht, hängt vom Worker ab:

    WorkerWas zu tun ist
    ant CLINichts. Die CLI verarbeitet beide Signale selbst: Sie bricht jeden laufenden Tool-Aufruf ab, sendet ihr Fehlerergebnis und gibt das Arbeitselement frei.
    SDK-Worker, der ein eigener Prozess istEnvironmentWorker installiert keine Signal-Handler. Brich den Worker aus einem Signal-Handler heraus ab, wie es die Beispiele für eigenständige Worker tun.
    SDK-Worker innerhalb eines Webhook-ServersBrich den Worker aus dem eigenen Shutdown-Hook des Servers heraus ab, wie es die Webhook-Beispiele tun. Der Worker darf die Signale des Servers nicht übernehmen.
  2. Stoppe den Worker mit SIGTERM und lass mindestens 30 Sekunden Zeit, bevor du ihn hart beendest. Der abschließende Upload kann so lange dauern. Docker sendet standardmäßig 10 Sekunden nach dem Stoppsignal SIGKILL. Erhöhe dieses Limit mit --stop-timeout bei docker run oder mit der Termination Grace Period deines Orchestrators.

Wenn ein Worker beendet wird, bevor sein Teardown ausgeführt wird, gehen alle Memory-Änderungen verloren, die noch nicht synchronisiert wurden. Entferne auf einem langlebigen Host außerdem das übrig gebliebene Store-Verzeichnis unter /mnt/memory/ vor der nächsten Sitzung, die diesen Store anhängt. Eine Sandbox, die eine einzige Sitzung bedient und danach verworfen wird, benötigt keine Bereinigung.

Fehlerbehebung

Der Worker verbindet sich nicht

Wenn workers_polling bei 0 bleibt, erreicht der Worker die Warteschlange nicht. Vergewissere dich, dass ANTHROPIC_ENVIRONMENT_KEY und ANTHROPIC_ENVIRONMENT_ID auf dem Worker-Host gesetzt sind.

Eine Sitzung bleibt in der Warteschlange

Kein Worker beansprucht Arbeit. Eine Sitzung in der Warteschlange wartet, anstatt fehlzuschlagen. Prüfe workers_polling und depth unter Warteschlangentiefe auslesen.

Memory Stores lassen sich nicht einbinden

Der Worker protokolliert Fehler beim Einbinden und bei der Hintergrundsynchronisierung, anstatt sie an die Sitzung zu melden. Nur Ablehnungen wegen Schreibschutz erreichen den Agenten, und zwar als Tool-Fehler (siehe Schreibgeschützte Stores und Konflikte).

Wenn der Worker beim Beanspruchen einer Sitzung einen Memory Store nicht einbinden kann, lässt er das Arbeitselement fehlschlagen. Die Sitzung gibt kein Fehlerereignis aus und bleibt im Leerlauf.

SymptomUrsacheLösung
Das Worker-Log enthält the work item carried no sessions token (in Go den Fehler ErrSessionMemoryNoToken), und das Arbeitselement schlägt fehl.Das sitzungsspezifische secret des Arbeitselements hat den Worker nicht erreicht. Entweder hat dein Code es nicht weitergeleitet, oder Memory Stores auf selbst gehosteten Sandboxes sind für deine Organisation nicht aktiviert.Leite das Secret des Arbeitselements weiter. Wenn der Worker in einem einzigen Prozess pollt und Sitzungen ausführt und dies trotzdem protokolliert, wende dich an den Support.
Das Worker-Log enthält something already exists at the memory store's path.Ein Verzeichnis, das von einer vorherigen Sitzung übrig geblieben ist, meist von einer, deren Worker beendet wurde, bevor sein Teardown ausgeführt wurde.Entferne das übrig gebliebene Verzeichnis, das in der Log-Zeile genannt wird. Darin enthaltene Änderungen, die noch nicht synchronisiert wurden, gehen verloren.
Das Worker-Log enthält cannot create the memory store's folder und the worker host must make this mount path writable.Der Benutzer, unter dem der Worker läuft, kann unter /mnt/memory keine Verzeichnisse erstellen.Erstelle /mnt/memory und übertrage es mit chown an diesen Benutzer. Siehe Den Host vorbereiten.
Die Sitzung verharrt kurz nachdem ein Worker sie beansprucht hat im Status idle mit dem Stop-Grund requires_action und ohne Fehlerereignis.Der Worker hat das Arbeitselement fehlschlagen lassen, weil er aus einem der vorgenannten Gründe einen Memory Store nicht einbinden konnte.Behebe die Ursache auf dem Host und sende dann ein user.interrupt-Ereignis. Die Arbeit der Sitzung wird erneut in die Warteschlange gestellt, und der nächste Worker, der sie beansprucht, versucht das Einbinden erneut.

Ein benutzerdefinierter Tool-Aufruf kehrt nie zurück

Wenn die Sitzung mit dem Stop-Grund requires_action pausiert bleibt, bedient kein Worker oder Client dieses Tool. Siehe Ein benutzerdefiniertes Tool bereitstellen.

Ein gekapselter MCP-Tool-Aufruf hängt

Ohne Timeout auf dem MCP-Client wird ein hängender Aufruf an einen gekapselten MCP-Server erst dann zu einem Fehlerergebnis, wenn eine Absicherung greift:

SDKAbsicherungGreift nach
PythonDas eigene Tool-Aufruf-Limit des WorkersEtwa zweieinhalb Minuten
TypeScriptDas Standard-Request-Timeout des MCP SDKEtwa einer Minute
GoDer Worker bricht einen Tool-Aufruf ab, der sein Standardlimit überschreitet120 Sekunden

Was this page helpful?