Claude Platform Docs
Managed AgentsСамостоятельно размещаемые песочницы

Мониторинг и устранение неполадок самостоятельно размещаемых воркеров

Отслеживайте глубину очереди, останавливайте сеансы и воркеры без потери работы и устраняйте распространённые сбои самостоятельно размещаемых песочниц.

Вызовы мониторинга на этой странице выполняются из ваших инструментов мониторинга или эксплуатации с аутентификацией по вашему ключу API Claude. Вспомогательные средства воркера обрабатывают цикл получения задач и поддержания активности, поэтому вам не нужно вызывать эти конечные точки напрямую.

Чтение глубины очереди

client.beta.environments.work.stats() возвращает состояние очереди для среды:

ПолеЗначениеДля чего использовать
depthЭлементы, ожидающие получения.Масштабирование парка воркеров или оповещение о накоплении задач.
pendingЭлементы, полученные воркером, но ещё не подтверждённые. Вспомогательные средства воркера подтверждают каждый элемент перед его обработкой, поэтому при нормальной работе это значение остаётся близким к нулю.Обнаружение воркера, зависшего между получением и подтверждением: настройте оповещение на устойчивое ненулевое значение.
oldest_queued_atВременная метка самого старого элемента, всё ещё находящегося в очереди, — либо ожидающего получения, либо полученного, но ещё не подтверждённого. null, если такого нет.Узнать, как долго ждёт самый старый элемент.
workers_pollingВоркеры, опрашивавшие очередь за последние 30 секунд.Оповещение о работоспособности.
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
}

Корректная остановка сеанса

Используйте client.beta.environments.work.stop(), чтобы попросить воркер, обрабатывающий конкретный сеанс, завершить его.

По умолчанию элемент работы переходит в состояние stopping. Воркер замечает это при следующем heartbeat-сигнале аренды, отменяет выполняющийся вызов инструмента сеанса и подтверждает завершение. После этого элемент работы переходит в состояние stopped.

Передайте force=True, чтобы немедленно пометить элемент работы как stopped, не дожидаясь подтверждения от воркера.

Поскольку эти вызовы выполняются из ваших инструментов эксплуатации, а не на хосте воркера, ANTHROPIC_WORK_ID не устанавливается автоматически. Перед запуском следующих примеров задайте в этой переменной ID целевого элемента работы. Чтобы найти ID элемента работы, получите список элементов работы среды через конечные точки 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)

Корректная остановка воркеров

Воркер, отменённый во время выполнения сеанса, останавливает выполняющуюся работу перед выходом. Если к сеансу подключены хранилища памяти, воркер пропускает финальную синхронизацию, но всё равно выгружает изменённые файлы и удаляет каталоги хранилищ.

Принудительно завершённый (killed) процесс не выполняет никакой очистки. Чтобы корректно остановить воркер:

  1. Убедитесь, что SIGTERM и SIGINT отменяют воркер. Способ зависит от воркера:

    ВоркерЧто сделать
    ant CLIНичего. CLI сам обрабатывает оба сигнала: он отменяет выполняющийся вызов инструмента, отправляет результат с ошибкой и освобождает элемент работы.
    Воркер SDK, работающий как отдельный процессEnvironmentWorker не устанавливает обработчики сигналов. Отменяйте воркер из обработчика сигнала, как это сделано в примерах автономных воркеров.
    Воркер SDK внутри сервера вебхуковОтменяйте воркер из собственного хука завершения сервера, как это сделано в примерах с вебхуками. Воркер не должен перехватывать сигналы сервера.
  2. Останавливайте воркер сигналом SIGTERM и выделяйте не менее 30 секунд до любого принудительного завершения. Финальная выгрузка может занять столько времени. По умолчанию Docker отправляет SIGKILL через 10 секунд после сигнала остановки. Увеличьте этот лимит с помощью --stop-timeout в docker run или с помощью периода ожидания завершения (termination grace period) вашего оркестратора.

Если воркер принудительно завершён до выполнения очистки, все несинхронизированные изменения памяти теряются. На долгоживущем хосте также удалите оставшийся каталог хранилища в /mnt/memory/ перед следующим сеансом, который подключает это хранилище. Песочница, которая обслуживает один сеанс и затем удаляется, не требует очистки.

Устранение неполадок

Воркер не подключается

Если workers_polling остаётся равным 0, воркер не достигает очереди. Убедитесь, что ANTHROPIC_ENVIRONMENT_KEY и ANTHROPIC_ENVIRONMENT_ID заданы на хосте воркера.

Сеанс остаётся в очереди

Ни один воркер не получает работу. Сеанс в очереди ожидает, а не завершается с ошибкой. Проверьте workers_polling и depth в разделе Чтение глубины очереди.

Хранилища памяти не монтируются

Воркер записывает сбои монтирования и фоновой синхронизации в журнал, а не сообщает о них сеансу. До агента доходят только отказы, связанные с режимом только для чтения, в виде ошибок инструментов (см. Хранилища только для чтения и конфликты).

Если воркер не может смонтировать хранилище памяти при получении сеанса, он завершает элемент работы с ошибкой. Сеанс не генерирует событие ошибки и остаётся в состоянии простоя.

СимптомПричинаРешение
Журнал воркера содержит the work item carried no sessions token (в Go — ошибка ErrSessionMemoryNoToken), и элемент работы завершается с ошибкой.secret элемента работы для конкретного сеанса не дошёл до воркера. Либо ваш код не передал его, либо хранилища памяти в самостоятельно размещаемых песочницах не включены для вашей организации.Передайте секрет элемента работы. Если воркер опрашивает очередь и выполняет сеансы в одном процессе и всё равно записывает это в журнал, обратитесь в службу поддержки.
Журнал воркера содержит something already exists at the memory store's path.Каталог, оставшийся от предыдущего сеанса, обычно того, чей воркер был принудительно завершён до выполнения очистки.Удалите оставшийся каталог, указанный в строке журнала. Несинхронизированные изменения в нём теряются.
Журнал воркера содержит cannot create the memory store's folder и the worker host must make this mount path writable.Пользователь, от имени которого работает воркер, не может создавать каталоги в /mnt/memory.Создайте /mnt/memory и выполните для него chown на этого пользователя. См. Подготовка хоста.
Сеанс находится в состоянии idle с причиной остановки requires_action и без события ошибки вскоре после того, как воркер его получил.Воркер завершил элемент работы с ошибкой, потому что не смог смонтировать хранилище памяти по одной из указанных выше причин.Устраните причину на хосте, затем отправьте событие user.interrupt. Работа сеанса снова ставится в очередь, и следующий воркер, который её получит, повторит попытку монтирования.

Вызов пользовательского инструмента не возвращает результат

Если сеанс приостановлен с причиной остановки requires_action, ни один воркер или клиент не обслуживает этот инструмент. См. Предоставление пользовательского инструмента.

Вызов обёрнутого инструмента MCP зависает

Без тайм-аута на клиенте MCP зависший вызов к обёрнутому серверу MCP превращается в результат инструмента с ошибкой только при срабатывании страховочного механизма:

SDKСтраховочный механизмСрабатывает через
PythonСобственный лимит воркера на вызов инструментаОколо двух с половиной минут
TypeScriptТайм-аут запроса по умолчанию в MCP SDKОколо минуты
GoВоркер отменяет вызов инструмента, превысивший лимит по умолчанию120 секунд

Was this page helpful?