---
title: Мониторинг и устранение неполадок самостоятельно размещаемых воркеров
url: https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-operations
description: Отслеживайте глубину очереди, останавливайте сеансы и воркеры без потери работы и устраняйте распространённые сбои самостоятельно размещаемых песочниц.
featureMetadata:
  topic:
    title: Managed Agents
    url: https://platform.claude.com/docs/en/managed-agents/overview
  status: beta
  betaHeader: managed-agents-2026-04-01
---

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

<Warning>
  Эти конечные точки принимают либо ключ API вашей организации, либо ключ среды. Вызывайте их извне хоста воркера с ключом API вашей организации. Установка `ANTHROPIC_API_KEY` на хосте воркера открывает учётные данные уровня организации для вызовов инструментов агента.
</Warning>

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

`GET /v1/environments/{environment_id}/work/stats` (python, typescript, ruby: `client.beta.environments.work.stats()`; go, csharp: `client.Beta.Environments.Work.Stats()`; java: `client.beta().environments().work().stats()`; php: `$client->beta->environments->work->stats()`; cli: `ant beta:environments:work stats`) возвращает состояние очереди для среды:

| Поле                                                                           | Значение                                                                                                                                                                                                                                       | Для чего использовать                                                                                                    |
| ------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| `depth` (csharp, go: `Depth`)                                                  | Элементы, ожидающие получения.                                                                                                                                                                                                                 | Масштабирование парка воркеров или оповещение о накоплении задач.                                                        |
| `pending` (csharp, go: `Pending`)                                              | Элементы, полученные воркером, но ещё не подтверждённые. Вспомогательные средства воркера подтверждают каждый элемент перед его обработкой, поэтому при нормальной работе это значение остаётся близким к нулю.                                | Обнаружение воркера, зависшего между получением и подтверждением: настройте оповещение на устойчивое ненулевое значение. |
| `oldest_queued_at` (java, php: `oldestQueuedAt`; csharp, go: `OldestQueuedAt`) | Временная метка самого старого элемента, всё ещё находящегося в очереди: ожидающего получения либо полученного, но ещё не подтверждённого. `null` (python: `None`; ruby: `nil`; java: `Optional.empty()`; go: `""`), если такого элемента нет. | Узнать, как долго ждёт самый старый элемент.                                                                             |
| `workers_polling` (java, php: `workersPolling`; csharp, go: `WorkersPolling`)  | Воркеры, опрашивавшие очередь за последние 30 секунд.                                                                                                                                                                                          | Оповещение о работоспособности.                                                                                          |

<CodeGroup>
  ```bash cURL
  curl -sS "https://api.anthropic.com/v1/environments/$ANTHROPIC_ENVIRONMENT_ID/work/stats" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-beta: managed-agents-2026-04-01" \
    -H "anthropic-version: 2023-06-01"
  ```

  ```bash CLI
  ant beta:environments:work stats --environment-id "$ANTHROPIC_ENVIRONMENT_ID"
  ```

  ```python Python
  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}")
  ```

  ```typescript TypeScript
  import Anthropic from "@anthropic-ai/sdk";

  const client = new Anthropic();

  const stats = await client.beta.environments.work.stats(process.env.ANTHROPIC_ENVIRONMENT_ID!);

  console.log(`depth=${stats.depth} pending=${stats.pending}`);
  ```

  ```csharp C#
  using Anthropic;

  var client = new AnthropicClient();

  var environmentId = Environment.GetEnvironmentVariable("ANTHROPIC_ENVIRONMENT_ID")!;

  var stats = await client.Beta.Environments.Work.Stats(environmentId);

  Console.WriteLine($"depth={stats.Depth} pending={stats.Pending}");
  ```

  ```go Go
  package main

  import (
  	"context"
  	"fmt"
  	"os"

  	"github.com/anthropics/anthropic-sdk-go"
  )

  func main() {
  	client := anthropic.NewClient()
  	environmentID := os.Getenv("ANTHROPIC_ENVIRONMENT_ID")

  	stats, err := client.Beta.Environments.Work.Stats(
  		context.Background(),
  		environmentID,
  		anthropic.BetaEnvironmentWorkStatsParams{},
  	)
  	if err != nil {
  		panic(err)
  	}

  	fmt.Printf("depth=%d pending=%d\n", stats.Depth, stats.Pending)
  }
  ```

  ```java Java
  import com.anthropic.client.AnthropicClient;
  import com.anthropic.client.okhttp.AnthropicOkHttpClient;
  import com.anthropic.models.beta.environments.work.BetaSelfHostedWorkQueueStats;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      BetaSelfHostedWorkQueueStats stats = client.beta()
          .environments()
          .work()
          .stats(System.getenv("ANTHROPIC_ENVIRONMENT_ID"));

      IO.println("depth=" + stats.depth() + " pending=" + stats.pending());
  }
  ```

  ```php PHP
  <?php

  use Anthropic\Client;

  $client = new Client();

  $stats = $client->beta->environments->work->stats(getenv('ANTHROPIC_ENVIRONMENT_ID'));

  printf("depth=%d pending=%d\n", $stats->depth, $stats->pending);
  ```

  ```ruby Ruby
  require "anthropic"

  client = Anthropic::Client.new

  stats = client.beta.environments.work.stats(ENV.fetch("ANTHROPIC_ENVIRONMENT_ID"))

  puts "depth=#{stats.depth} pending=#{stats.pending}"
  ```
</CodeGroup>

```text wrap
{
  "type": "work_queue_stats",
  "depth": 0,
  "pending": 0,
  "oldest_queued_at": null,
  "workers_polling": 0
}
```

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

Используйте `POST /v1/environments/{environment_id}/work/{work_id}/stop` (python, typescript, ruby: `client.beta.environments.work.stop()`; go, csharp: `client.Beta.Environments.Work.Stop()`; java: `client.beta().environments().work().stop()`; php: `$client->beta->environments->work->stop()`; cli: `ant beta:environments:work stop`), чтобы попросить воркер, обрабатывающий конкретный сеанс, завершить его.

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

Передайте `force: true` (python: `force=True`; cli: `--force`), чтобы немедленно пометить элемент работы как `stopped`, не дожидаясь подтверждения от воркера.

Поскольку эти вызовы выполняются из ваших инструментов эксплуатации, а не на хосте воркера, `ANTHROPIC_WORK_ID` не устанавливается автоматически. Перед запуском следующих примеров задайте в этой переменной ID целевого элемента работы. Чтобы найти ID элемента работы, получите список элементов работы среды через [конечные точки Environments Work](https://platform.claude.com/docs/ru/api/beta/environments/work).

<CodeGroup>
  ```bash cURL
  curl -sS "https://api.anthropic.com/v1/environments/$ANTHROPIC_ENVIRONMENT_ID/work/$ANTHROPIC_WORK_ID/stop" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-beta: managed-agents-2026-04-01" \
    -H "anthropic-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{}'
  ```

  ```bash CLI
  ant beta:environments:work stop \
    --environment-id "$ANTHROPIC_ENVIRONMENT_ID" \
    --work-id "$ANTHROPIC_WORK_ID"
  ```

  ```python Python
  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)
  ```

  ```typescript TypeScript
  import Anthropic from "@anthropic-ai/sdk";

  const client = new Anthropic();

  const work = await client.beta.environments.work.stop(process.env.ANTHROPIC_WORK_ID!, {
    environment_id: process.env.ANTHROPIC_ENVIRONMENT_ID!
  });

  console.log(work.state);
  ```

  ```csharp C#
  using Anthropic;

  var client = new AnthropicClient();

  var work = await client.Beta.Environments.Work.Stop(
      Environment.GetEnvironmentVariable("ANTHROPIC_WORK_ID")!,
      new()
      {
          EnvironmentID = Environment.GetEnvironmentVariable("ANTHROPIC_ENVIRONMENT_ID")!
      }
  );

  Console.WriteLine(work.State);
  ```

  ```go Go
  package main

  import (
  	"context"
  	"fmt"
  	"os"

  	"github.com/anthropics/anthropic-sdk-go"
  )

  func main() {
  	client := anthropic.NewClient()

  	work, err := client.Beta.Environments.Work.Stop(
  		context.Background(),
  		os.Getenv("ANTHROPIC_WORK_ID"),
  		anthropic.BetaEnvironmentWorkStopParams{
  			EnvironmentID: os.Getenv("ANTHROPIC_ENVIRONMENT_ID"),
  		},
  	)
  	if err != nil {
  		panic(err)
  	}
  	fmt.Println(work.State)
  }
  ```

  ```java Java
  import com.anthropic.client.AnthropicClient;
  import com.anthropic.client.okhttp.AnthropicOkHttpClient;
  import com.anthropic.models.beta.environments.work.BetaSelfHostedWork;
  import com.anthropic.models.beta.environments.work.BetaSelfHostedWorkStopRequest;
  import com.anthropic.models.beta.environments.work.WorkStopParams;

  void main() {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      BetaSelfHostedWork work = client.beta().environments().work().stop(
          WorkStopParams.builder()
              .environmentId(System.getenv("ANTHROPIC_ENVIRONMENT_ID"))
              .workId(System.getenv("ANTHROPIC_WORK_ID"))
              .betaSelfHostedWorkStopRequest(BetaSelfHostedWorkStopRequest.builder().build())
              .build()
      );

      IO.println(work.state());
  }
  ```

  ```php PHP
  <?php

  use Anthropic\Client;

  $client = new Client();

  $work = $client->beta->environments->work->stop(
      getenv('ANTHROPIC_WORK_ID'),
      environmentID: getenv('ANTHROPIC_ENVIRONMENT_ID'),
  );

  echo $work->state . "\n";
  ```

  ```ruby Ruby
  require "anthropic"

  client = Anthropic::Client.new

  work = client.beta.environments.work.stop(
    ENV.fetch("ANTHROPIC_WORK_ID"),
    environment_id: ENV.fetch("ANTHROPIC_ENVIRONMENT_ID")
  )

  puts work.state
  ```
</CodeGroup>

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

Воркер, отменённый во время выполнения сеанса, останавливает выполняющуюся работу перед выходом. Если к сеансу подключены [хранилища памяти](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-memory), воркер пропускает финальную синхронизацию, но всё равно выгружает изменённые файлы и удаляет каталоги хранилищ.

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

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

   | Воркер                                       | Что сделать                                                                                                                                         |
   | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
   | CLI `ant`                                    | Ничего. CLI сам обрабатывает оба сигнала: он отменяет выполняющийся вызов инструмента, отправляет результат с ошибкой и освобождает элемент работы. |
   | Воркер SDK, работающий как отдельный процесс | `EnvironmentWorker` не устанавливает обработчики сигналов. Отменяйте воркер из обработчика сигнала, как это сделано в примерах автономных воркеров. |
   | Воркер SDK внутри сервера вебхуков           | Отменяйте воркер из собственного хука завершения сервера, как это сделано в примерах с вебхуками. Воркер не должен перехватывать сигналы сервера.   |

2. **Останавливайте воркер сигналом SIGTERM и выделяйте не менее 30 секунд до любого принудительного завершения.** Финальная выгрузка может занять столько времени. По умолчанию Docker отправляет SIGKILL через 10 секунд после сигнала остановки. Увеличьте этот лимит с помощью `--stop-timeout` в `docker run` или с помощью периода ожидания завершения (termination grace period) вашего оркестратора.

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

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

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

Если `workers_polling` (java, php: `workersPolling`; csharp, go: `WorkersPolling`) остаётся равным 0, воркер не достигает очереди. Убедитесь, что `ANTHROPIC_ENVIRONMENT_KEY` и `ANTHROPIC_ENVIRONMENT_ID` установлены на хосте воркера.

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

Ни один воркер не получает работу. Сеанс в очереди ожидает, а не завершается с ошибкой. Проверьте `workers_polling` (java, php: `workersPolling`; csharp, go: `WorkersPolling`) и `depth` (csharp, go: `Depth`) в разделе [Чтение глубины очереди](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-operations#read-queue-depth).

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

Воркер записывает сбои монтирования и фоновой синхронизации в журнал, а не сообщает о них сеансу. До агента доходят только отказы, связанные с режимом только для чтения, в виде ошибок инструментов (см. [Хранилища только для чтения и конфликты](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-memory#read-only-stores-and-conflicts)).

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

| Симптом                                                                                                                                              | Причина                                                                                                                                                                                                                   | Решение                                                                                                                                                                                                                                                                                    |
| ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Журнал воркера содержит `the work item carried no sessions token` (в Go — ошибка `ErrSessionMemoryNoToken`), и элемент работы завершается с ошибкой. | `secret` (csharp, go: `Secret`) элемента работы для конкретного сеанса не дошёл до воркера. Либо ваш код не передал его, либо хранилища памяти в самостоятельно размещаемых песочницах не включены для вашей организации. | [Передайте секрет элемента работы](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-workers#forward-the-work-items-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` на этого пользователя. См. [Подготовка хоста](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-memory#prepare-the-host).                                                                                       |
| Сеанс находится в состоянии `idle` с причиной остановки `requires_action` и без события ошибки вскоре после того, как воркер его получил.            | Воркер завершил элемент работы с ошибкой, поскольку не смог смонтировать хранилище памяти по одной из указанных выше причин.                                                                                              | Устраните причину на хосте, затем отправьте событие [`user.interrupt`](https://platform.claude.com/docs/ru/managed-agents/events-and-streaming#interrupt-the-agent). Работа сеанса снова ставится в очередь, и следующий воркер, который её получит, повторит попытку монтирования.        |

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

Если сеанс приостановлен с причиной остановки `requires_action`, ни один воркер или клиент не обслуживает этот инструмент. См. [Предоставление пользовательского инструмента](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-custom-tools#serve-a-custom-tool).

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

Без тайм-аута на клиенте MCP зависший вызов к [обёрнутому серверу MCP](https://platform.claude.com/docs/ru/managed-agents/self-hosted-sandboxes-custom-tools#wrap-an-mcp-server-as-custom-tools) превращается в результат инструмента с ошибкой только при срабатывании страховочного механизма:

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