---
title: Инструмент выполнения кода
url: https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool
description: Запускайте код Python и bash в изолированном контейнере, чтобы анализировать данные, создавать файлы и итеративно дорабатывать решения.
featureMetadata:
  status: ga
  zdr: not-eligible
  supportedModels:
    - claude-fable-5-1
    - claude-mythos-5-1
    - claude-fable-5
    - claude-mythos-5
    - claude-opus-5-5
    - claude-opus-5
    - claude-opus-4-8
    - claude-opus-4-7
    - claude-opus-4-6
    - claude-opus-4-5-20251101
    - claude-sonnet-5-5
    - claude-sonnet-5
    - claude-sonnet-4-6
    - claude-sonnet-4-5-20250929
    - claude-haiku-5-5
    - claude-haiku-4-5-20251001
  supportedPlatforms:
    Claude API: ga
    Claude Platform on AWS: ga
    Microsoft Foundry:
      availability: ga
      note: В [Microsoft Foundry](https://platform.claude.com/docs/ru/build-with-claude/claude-in-microsoft-foundry) для выполнения кода требуется [развёртывание Hosted on Anthropic](https://platform.claude.com/docs/ru/build-with-claude/claude-in-microsoft-foundry#additional-features-not-supported-when-hosted-on-azure).
  details:
    - Каждая поддерживаемая модель принимает все три [версии инструмента](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#tool-versions). В Claude Haiku 4.5 программный вызов инструментов и сохранение состояния REPL недоступны, поэтому более новые версии ведут себя там как `code_execution_20250825`.
    - Для [Claude Mythos Preview](https://anthropic.com/glasswing) выполнение кода поддерживается в Claude API и Microsoft Foundry.
---

Claude может анализировать данные, создавать визуализации, выполнять сложные вычисления, запускать системные команды, создавать и редактировать файлы, а также обрабатывать загруженные файлы непосредственно в рамках диалога через API. Инструмент выполнения кода позволяет Claude запускать команды Bash и работать с файлами, включая написание кода, в безопасной изолированной среде — «sandbox» (песочница).

**Выполнение кода бесплатно при использовании вместе с веб-поиском или веб-загрузкой (`web_search_20260209`, `web_fetch_20260209` или более поздними версиями).** Если один из этих инструментов присутствует в вашем запросе, за выполнение кода в этом запросе не взимается никакой дополнительной платы сверх стандартной стоимости токенов. Это распространяется как на выполнение кода, лежащее в основе динамической фильтрации, так и на любой код, который Claude запускает напрямую. Если эти инструменты не включены, применяются стандартные цены на выполнение кода.

Выполнение кода также обеспечивает работу «dynamic filtering» (динамической фильтрации) в инструментах [веб-поиска](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/web-search-tool) и [веб-загрузки](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/web-fetch-tool): Claude фильтрует результаты внутри среды выполнения кода до того, как они попадут в «context window» (контекстное окно). Когда выполняется динамическая фильтрация, API автоматически предоставляет необходимое для запроса выполнение кода, поэтому вам не нужно добавлять для этого инструмент выполнения кода в запрос.

<Note>
  Поделитесь своим мнением об этой функции через [форму обратной связи](https://forms.gle/LTAU6Xn2puCJMi1n6).
</Note>

## Версии инструмента

У инструмента выполнения кода есть три актуальные версии, и каждая [поддерживаемая модель](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#compatibility) принимает все три. Каждая версия основана на предыдущей:

* `code_execution_20250825` поддерживает команды Bash и операции с файлами.
* `code_execution_20260120` добавляет сохранение состояния REPL и «[programmatic tool calling](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/programmatic-tool-calling)» (программный вызов инструментов) изнутри песочницы. Claude Haiku 4.5 принимает типы инструментов `code_execution_20260120` и `code_execution_20260521`, но программный вызов инструментов и зависящее от него сохранение состояния REPL на этой модели недоступны, поэтому более новые версии ведут себя там как `code_execution_20250825`.
* `code_execution_20260521` использует ту же среду выполнения, что и `code_execution_20260120`. Разница в том, что описание инструмента сообщает Claude о 90-секундном ограничении по реальному времени («wall-clock limit») для каждой ячейки Python при программном вызове инструментов, чтобы Claude мог планировать длительно выполняющиеся ячейки. Ячейка, превысившая ограничение, возвращает обычный результат выполнения кода с ненулевым `return_code` и сообщением о статусе `detection_timeout` в выводе. Это отличается от [кода ошибки](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#errors) `execution_time_exceeded`, который API возвращает, когда весь вызов инструмента превышает максимальное время выполнения.

Ни одна из трёх версий инструмента не требует заголовка `anthropic-beta`. Устаревшие бета-заголовки выполнения кода по-прежнему остаются допустимым способом подключения.

В примерах на этой странице используется `code_execution_20250825`, которая охватывает демонстрируемые в них операции Bash и операции с файлами и ведёт себя одинаково на всех поддерживаемых моделях; используйте `code_execution_20260120` или более позднюю версию, когда вам нужен программный вызов инструментов или сохранение состояния REPL. Актуальные инструменты [веб-поиска](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/web-search-tool) и [веб-загрузки](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/web-fetch-tool) (`web_search_20260209`, `web_fetch_20260209` и более поздние) требуют в качестве версии выполнения кода `code_execution_20260120` или более позднюю.

Совместимость старых версий инструмента с новыми моделями не гарантируется. При переходе на новую модель проверьте разделы [Версии инструмента](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#tool-versions) и [Совместимость](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#compatibility) и отдавайте предпочтение самой новой версии инструмента, которую поддерживает ваша интеграция.

Чтобы проверить, принимает ли модель инструмент выполнения кода, до отправки запроса, прочитайте ее значение `capabilities.server_tools.code_execution.supported` из Models API. Не используйте для этого значение верхнего уровня `capabilities.code_execution`. Оно сообщает, может ли код, выполняемый в этом инструменте, вызывать другие инструменты вашего запроса, как при программном вызове инструментов. Оба поля описаны в разделе [Использование Models API](https://platform.claude.com/docs/ru/models/overview#using-the-models-api).

<Note>
  Если вы всё ещё используете устаревшую версию `code_execution_20250522` (только Python), см. раздел [Обновление до последней версии инструмента](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#upgrade-to-latest-tool-version), чтобы перейти с неё.
</Note>

## Быстрый старт

Вот пример, в котором Claude просят выполнить вычисление:

<CodeGroup>
  ```bash cURL
  curl --fail-with-body -sS https://api.anthropic.com/v1/messages \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "model": "claude-opus-5-5",
      "max_tokens": 4096,
      "messages": [
        {
          "role": "user",
          "content": "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
        }
      ],
      "tools": [
        {
          "type": "code_execution_20250825",
          "name": "code_execution"
        }
      ]
    }'
  ```

  ```bash CLI
  ant messages create \
    --model claude-opus-5-5 \
    --max-tokens 4096 \
    --message '{
      role: user,
      content: "Use the code execution tool to calculate the mean and standard
        deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
    }' \
    --tool '{type: code_execution_20250825, name: code_execution}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  response = client.messages.create(
      model="claude-opus-5-5",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]",
          }
      ],
      tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
  )

  print(response.to_json())
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  const response = await client.messages.create({
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content:
          "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
      }
    ],
    tools: [{ type: "code_execution_20250825", name: "code_execution" }]
  });

  console.log(JSON.stringify(response));
  ```

  ```csharp C#
  AnthropicClient client = new();

  var message = await client.Messages.Create(new()
  {
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 4096,
      Messages = [new() { Role = Role.User, Content = "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]" }],
      Tools = [new CodeExecutionTool20250825()]
  });

  Console.WriteLine(message);
  ```

  ```go Go
  client := anthropic.NewClient()

  response, err := client.Messages.New(context.Background(), anthropic.MessageNewParams{
  	Model:     anthropic.ModelClaudeOpus5_5,
  	MaxTokens: 4096,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(anthropic.NewTextBlock("Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]")),
  	},
  	Tools: []anthropic.ToolUnionParam{
  		{OfCodeExecutionTool20250825: &anthropic.CodeExecutionTool20250825Param{}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }
  fmt.Println(response.RawJSON())
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  MessageCreateParams params = MessageCreateParams.builder()
      .model(Model.CLAUDE_OPUS_5_5)
      .maxTokens(4096L)
      .addUserMessage("Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]")
      .addTool(CodeExecutionTool20250825.builder().build())
      .build();

  Message response = client.messages().create(params);
  IO.println(ObjectMappers.jsonMapper().valueToTree(response));
  ```

  ```php PHP
  $client = new Client();

  $message = $client->messages->create(
      maxTokens: 4096,
      messages: [
          [
              'role' => 'user',
              'content' => 'Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]',
          ],
      ],
      model: Model::CLAUDE_OPUS_5_5,
      tools: [new CodeExecutionTool20250825()],
  );

  echo json_encode($message, JSON_PRETTY_PRINT), PHP_EOL;
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  message = client.messages.create(
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Use the code execution tool to calculate the mean and standard deviation of [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]"
      }
    ],
    tools: [Anthropic::CodeExecutionTool20250825.new]
  )

  puts message.to_json
  ```
</CodeGroup>

В ответе блоки `server_tool_use` (команды, которые запустил Claude) чередуются с блоками результатов инструмента, за которыми следует текст Claude. На верхнем уровне также присутствует объект `container`, чей `id` можно [повторно использовать в последующих запросах](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#container-reuse). Структура блоков описана в разделе [Формат ответа](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#response-format).

## Как работает выполнение кода

Когда вы добавляете инструмент выполнения кода в запрос к API:

1. Claude оценивает, поможет ли выполнение кода ответить на ваш вопрос

2. Инструмент автоматически предоставляет Claude следующие возможности:

   * **Команды Bash:** запуск команд оболочки для системных операций
   * **Операции с файлами:** создание, просмотр и редактирование файлов напрямую, включая написание кода

3. Claude может использовать любое сочетание этих возможностей в одном запросе

4. Все операции выполняются в безопасном изолированном контейнере. У контейнера нет доступа к интернету, поэтому Claude не может загружать пакеты во время выполнения: доступны только [предустановленные библиотеки](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#pre-installed-libraries)

5. API выполняет каждую команду на стороне сервера и возвращает результаты Claude в рамках того же запроса, поэтому вам никогда не нужно самостоятельно выполнять код или отправлять обратно блоки `tool_result`. Единственное исключение — когда Claude вызывает один из ваших клиентских инструментов вместе с выполнением кода: API возвращает вызов выполнения кода без его результата. Результат приходит в одном из последующих ответов, после того как вы отправите обратно блоки `tool_result` для своих клиентских инструментов

6. Каждый запрос выполняется в новом контейнере, если только вы не передадите обратно ID контейнера из предыдущего ответа (см. [Повторное использование контейнера](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#container-reuse))

7. Claude предоставляет результаты вместе со всеми созданными диаграммами, вычислениями или анализом

В контейнере предустановлен Python. Claude пишет код на Python с помощью подынструмента операций с файлами и запускает его командой Bash. При использовании `code_execution_20260120` или более поздней версии и [программного вызова инструментов](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/programmatic-tool-calling) состояние интерпретатора Python (например, привязки переменных) также сохраняется между запросами, повторно использующими контейнер.

### Когда Claude запускает код

Claude запускает код, когда запросу полезны вычисления или работа с файлами:

* Нетривиальная математика (большие числа, много шагов, результаты, чувствительные к точности)
* Анализ данных, разбор файлов или визуализация
* Выполнение алгоритмов или моделирование
* Явные просьбы «запусти», «вычисли» или «выполни»

Claude отвечает напрямую, не запуская код, в следующих случаях:

* Простая арифметика и общеизвестные математические факты
* Фактологические, разговорные или творческие запросы
* Простые преобразования единиц измерения или переводы

Если вы хотите, чтобы Claude запустил код для пограничного запроса, попросите об этом явно (например, «запусти код, чтобы проверить это»).

## Работа с файлами

### Загрузка и анализ собственных файлов

Чтобы проанализировать собственные файлы данных (например, CSV, Excel или изображения), загрузите их через Files API и укажите ссылку на них в запросе.

Среда Python может обрабатывать различные типы файлов, загруженных через Files API, включая:

* CSV
* Excel (.xlsx, .xls)
* JSON
* XML
* Изображения (JPEG, PNG, GIF, WebP)
* Текстовые файлы (.txt, .md, .py и другие)

#### Загрузка и анализ файлов

1. **Загрузите файл** с помощью [Files API](https://platform.claude.com/docs/ru/build-with-claude/files)
2. **Сошлитесь на файл** в сообщении с помощью блока содержимого `container_upload`
3. **Включите инструмент выполнения кода** в запрос к API

<CodeGroup>
  ```bash cURL
  # Сначала загрузите файл и сохраните его ID (с помощью jq)
  FILE_ID=$(curl --fail-with-body -sS https://api.anthropic.com/v1/files \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -F "file=@data.csv" | jq -r '.id')

  # Затем используйте file_id при выполнении кода
  curl --fail-with-body -sS https://api.anthropic.com/v1/messages \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "model": "claude-opus-5-5",
      "max_tokens": 4096,
      "messages": [{
        "role": "user",
        "content": [
          {"type": "text", "text": "Analyze this CSV data"},
          {"type": "container_upload", "file_id": "'"$FILE_ID"'"}
        ]
      }],
      "tools": [{
        "type": "code_execution_20250825",
        "name": "code_execution"
      }]
    }'
  ```

  ```bash CLI
  # Сначала загрузите файл и сохраните его ID
  FILE_ID=$(ant files upload --file ./data.csv --transform id --raw-output)

  # Затем используйте file_id при выполнении кода
  ant messages create <<YAML
  model: claude-opus-5-5
  max_tokens: 4096
  messages:
    - role: user
      content:
        - type: text
          text: Analyze this CSV data
        - type: container_upload
          file_id: $FILE_ID
  tools:
    - type: code_execution_20250825
      name: code_execution
  YAML
  ```

  ```python Python
  client = anthropic.Anthropic()

  # Загрузите файл
  file_object = client.files.upload(file=Path("data.csv"))

  # Используйте file_id при выполнении кода
  response = client.messages.create(
      model="claude-opus-5-5",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": [
                  {"type": "text", "text": "Analyze this CSV data"},
                  {"type": "container_upload", "file_id": file_object.id},
              ],
          }
      ],
      tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
  )

  print(response.to_json())
  ```

  ```typescript TypeScript
  import { createReadStream } from "node:fs";
  // ...
  const client = new Anthropic();

  // Загрузите файл
  const fileObject = await client.files.upload({
    file: createReadStream("data.csv")
  });

  // Используйте file_id при выполнении кода
  const response = await client.messages.create({
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: [
          { type: "text", text: "Analyze this CSV data" },
          { type: "container_upload", file_id: fileObject.id }
        ]
      }
    ],
    tools: [
      {
        type: "code_execution_20250825",
        name: "code_execution"
      }
    ]
  });

  console.log(JSON.stringify(response));
  ```

  ```csharp C#
  AnthropicClient client = new();

  // Загрузите файл
  var fileObject = await client.Files.Upload(new FileUploadParams
  {
      File = File.OpenRead("data.csv")
  });

  // Используйте file_id при выполнении кода
  var parameters = new MessageCreateParams
  {
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 4096,
      Messages = [
          new()
          {
              Role = Role.User,
              Content = new([
                  new TextBlockParam { Text = "Analyze this CSV data" },
                  new ContainerUploadBlockParam { FileID = fileObject.ID }
              ])
          }
      ],
      Tools = [new CodeExecutionTool20250825()]
  };

  var response = await client.Messages.Create(parameters);
  Console.WriteLine(response);
  ```

  ```go Go
  ctx := context.Background()
  client := anthropic.NewClient()

  // Загрузите файл
  file, err := os.Open("data.csv")
  if err != nil {
  	log.Fatal(err)
  }
  defer file.Close()

  fileObject, err := client.Files.Upload(ctx, anthropic.FileUploadParams{
  	File: file,
  })
  if err != nil {
  	log.Fatal(err)
  }

  // Используйте file_id при выполнении кода
  response, err := client.Messages.New(ctx, anthropic.MessageNewParams{
  	Model:     anthropic.ModelClaudeOpus5_5,
  	MaxTokens: 4096,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(
  			anthropic.NewTextBlock("Analyze this CSV data"),
  			anthropic.NewContainerUploadBlock(fileObject.ID),
  		),
  	},
  	Tools: []anthropic.ToolUnionParam{
  		{OfCodeExecutionTool20250825: &anthropic.CodeExecutionTool20250825Param{}},
  	},
  })
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(response.RawJSON())
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  // Загрузите файл
  FileMetadata fileObject = client.files().upload(
      FileUploadParams.builder()
          .file(Path.of("data.csv"))
          .build()
  );

  // Используйте file_id при выполнении кода
  Message response = client.messages().create(
      MessageCreateParams.builder()
          .model(Model.CLAUDE_OPUS_5_5)
          .maxTokens(4096L)
          .addUserMessageOfBlockParams(List.of(
              ContentBlockParam.ofText(TextBlockParam.builder()
                  .text("Analyze this CSV data")
                  .build()),
              ContentBlockParam.ofContainerUpload(ContainerUploadBlockParam.builder()
                  .fileId(fileObject.id())
                  .build())
          ))
          .addTool(CodeExecutionTool20250825.builder().build())
          .build()
  );

  IO.println(ObjectMappers.jsonMapper().valueToTree(response));
  ```

  ```php PHP
  $client = new Client();

  // Загрузите файл
  $fileObject = $client->files->upload(
      file: FileParam::fromResource(fopen('data.csv', 'r')),
  );

  // Используйте file_id при выполнении кода
  $response = $client->messages->create(
      model: Model::CLAUDE_OPUS_5_5,
      maxTokens: 4096,
      messages: [
          [
              'role' => 'user',
              'content' => [
                  TextBlockParam::with(text: 'Analyze this CSV data'),
                  ContainerUploadBlockParam::with(fileID: $fileObject->id),
              ],
          ],
      ],
      tools: [new CodeExecutionTool20250825()],
  );

  echo json_encode($response), PHP_EOL;
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  # Загрузите файл
  file_object = client.files.upload(
    file: Pathname("data.csv")
  )

  # Используйте file_id при выполнении кода
  response = client.messages.create(
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: [
          { type: "text", text: "Analyze this CSV data" },
          { type: "container_upload", file_id: file_object.id }
        ]
      }
    ],
    tools: [
      Anthropic::CodeExecutionTool20250825.new
    ]
  )

  puts response.to_json
  ```
</CodeGroup>

### Получение созданных файлов

Когда Claude сохраняет файлы в свой выходной каталог во время выполнения кода (см. [Как захватываются созданные файлы](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#how-generated-files-are-captured)), ID каждого файла появляется в результате инструмента выполнения кода, и вы можете скачать файл с помощью [Files API](https://platform.claude.com/docs/ru/build-with-claude/files):

<CodeGroup exclude="shell">
  <CodeGroupItem language="cURL">
    Для скачивания всех созданных файлов требуется цикл по ID файлов в результате инструмента, а это требует больше логики, чем одна команда оболочки. Используйте для этого [Claude SDK](https://platform.claude.com/docs/ru/cli-sdks-libraries/overview).
  </CodeGroupItem>

  <CodeGroupItem language="CLI">
    Для скачивания всех созданных файлов требуется цикл по ID файлов в результате инструмента, а это требует больше логики, чем одна команда оболочки. Используйте для этого [Claude SDK](https://platform.claude.com/docs/ru/cli-sdks-libraries/overview).
  </CodeGroupItem>

  ```python Python
  client = Anthropic()

  # Запрос на выполнение кода, создающего файлы
  response = client.messages.create(
      model="claude-opus-5-5",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Create a matplotlib visualization and save it as output.png",
          }
      ],
      tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
  )


  # Извлечение идентификаторов файлов из ответа
  def extract_file_ids(response: Message) -> list[str]:
      file_ids: list[str] = []
      for item in response.content:
          if item.type == "bash_code_execution_tool_result":
              content_item = item.content
              if content_item.type == "bash_code_execution_result":
                  for output_block in content_item.content:
                      file_ids.append(output_block.file_id)
      return file_ids


  # Скачивание созданных файлов
  for file_id in extract_file_ids(response):
      file_metadata = client.files.retrieve_metadata(file_id)
      file_content = client.files.download(file_id)
      file_content.write_to_file(file_metadata.filename)
      print(f"Downloaded: {file_metadata.filename}")
  ```

  ```typescript TypeScript
  import { writeFile } from "node:fs/promises";

  const client = new Anthropic();

  // Запрос на выполнение кода, создающего файлы
  const response = await client.messages.create({
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Create a matplotlib visualization and save it as output.png"
      }
    ],
    tools: [
      {
        type: "code_execution_20250825",
        name: "code_execution"
      }
    ]
  });

  // Извлекаем идентификаторы файлов из ответа и скачиваем каждый созданный файл
  for (const block of response.content) {
    if (block.type === "bash_code_execution_tool_result") {
      const result = block.content;
      if (result.type === "bash_code_execution_result") {
        for (const outputBlock of result.content) {
          const [fileMetadata, fileResponse] = await Promise.all([
            client.files.retrieveMetadata(outputBlock.file_id),
            client.files.download(outputBlock.file_id)
          ]);
          await writeFile(fileMetadata.filename, await fileResponse.bytes());
          console.log(`Downloaded: ${fileMetadata.filename}`);
        }
      }
    }
  }
  ```

  ```csharp C#
  AnthropicClient client = new();

  var parameters = new MessageCreateParams
  {
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 4096,
      Messages = [new() { Role = Role.User, Content = "Create a matplotlib visualization and save it as output.png" }],
      Tools = [new CodeExecutionTool20250825()]
  };

  var response = await client.Messages.Create(parameters);

  // Собираем идентификаторы файлов из результатов инструментов
  List<string> fileIds = [];
  foreach (var block in response.Content)
  {
      if (!block.TryPickBashCodeExecutionToolResult(out var toolResult))
          continue;
      if (!toolResult.Content.TryPickBashCodeExecutionResultBlock(out var result))
          continue;
      foreach (var output in result.Content)
      {
          fileIds.Add(output.FileID);
      }
  }

  // Скачиваем каждый созданный файл
  foreach (var fileId in fileIds)
  {
      var fileMetadata = await client.Files.RetrieveMetadata(fileId);
      using var download = await client.Files.Download(fileId);
      var downloadStream = await download.ReadAsStream();
      await using var target = File.Create(fileMetadata.Filename);
      await downloadStream.CopyToAsync(target);
      Console.WriteLine($"Downloaded: {fileMetadata.Filename}");
  }
  ```

  ```go Go
  	client := anthropic.NewClient()
  	ctx := context.Background()

  	response, err := client.Messages.New(ctx, anthropic.MessageNewParams{
  		Model:     anthropic.ModelClaudeOpus5_5,
  		MaxTokens: 4096,
  		Messages: []anthropic.MessageParam{
  			anthropic.NewUserMessage(anthropic.NewTextBlock("Create a matplotlib visualization and save it as output.png")),
  		},
  		Tools: []anthropic.ToolUnionParam{
  			{OfCodeExecutionTool20250825: &anthropic.CodeExecutionTool20250825Param{}},
  		},
  	})
  	if err != nil {
  		log.Fatal(err)
  	}

  	fileIDs := extractFileIDs(response)

  	for _, fileID := range fileIDs {
  		fileMetadata, err := client.Files.GetMetadata(ctx, fileID, anthropic.FileGetMetadataParams{})
  		if err != nil {
  			log.Fatal(err)
  		}

  		fileContent, err := client.Files.Download(ctx, fileID, anthropic.FileDownloadParams{})
  		if err != nil {
  			log.Fatal(err)
  		}

  		outFile, err := os.Create(fileMetadata.Filename)
  		if err != nil {
  			log.Fatal(err)
  		}

  		_, err = io.Copy(outFile, fileContent.Body)
  		if err != nil {
  			log.Fatal(err)
  		}
  		outFile.Close()
  		fileContent.Body.Close()

  		fmt.Printf("Downloaded: %s\n", fileMetadata.Filename)
  	}
  // ...

  func extractFileIDs(response *anthropic.Message) []string {
  	var fileIDs []string
  	for _, item := range response.Content {
  		switch variant := item.AsAny().(type) {
  		case anthropic.BashCodeExecutionToolResultBlock:
  			// Собираем идентификаторы файлов из результата инструмента
  			for _, file := range variant.Content.Content {
  				if file.FileID != "" {
  					fileIDs = append(fileIDs, file.FileID)
  				}
  			}
  		}
  	}
  	return fileIDs
  }
  ```

  ```java Java
  void main() throws Exception {
      AnthropicClient client = AnthropicOkHttpClient.fromEnv();

      MessageCreateParams params = MessageCreateParams.builder()
          .model(Model.CLAUDE_OPUS_5_5)
          .maxTokens(4096L)
          .addUserMessage("Create a matplotlib visualization and save it as output.png")
          .addTool(CodeExecutionTool20250825.builder().build())
          .build();

      Message response = client.messages().create(params);

      List<String> fileIds = extractFileIds(response);

      for (String fileId : fileIds) {
          FileMetadata fileMetadata = client.files().retrieveMetadata(fileId);
          try (HttpResponse fileContent = client.files().download(fileId)) {
              Files.copy(
                  fileContent.body(),
                  Path.of(fileMetadata.filename()),
                  StandardCopyOption.REPLACE_EXISTING);
          }
          IO.println("Downloaded: " + fileMetadata.filename());
      }
  }

  List<String> extractFileIds(Message response) {
      List<String> fileIds = new ArrayList<>();
      // Собираем идентификаторы файлов из результатов инструментов
      for (ContentBlock item : response.content()) {
          item.bashCodeExecutionToolResult().ifPresent(toolResult -> {
              if (toolResult.content().isBashCodeExecutionResultBlock()) {
                  BashCodeExecutionResultBlock result =
                      toolResult.content().asBashCodeExecutionResultBlock();
                  for (BashCodeExecutionOutputBlock output : result.content()) {
                      fileIds.add(output.fileId());
                  }
              }
          });
      }
      return fileIds;
  }
  ```

  ```php PHP
  $client = new Client();

  // Запрос на выполнение кода, создающего файлы
  $response = $client->messages->create(
      maxTokens: 4096,
      messages: [
          [
              'role' => 'user',
              'content' => 'Create a matplotlib visualization and save it as output.png',
          ],
      ],
      model: Model::CLAUDE_OPUS_5_5,
      tools: [new CodeExecutionTool20250825()],
  );

  /**
   * Extract file IDs from the response.
   *
   * @return list<string>
   */
  function extractFileIds(Message $response): array
  {
      $fileIds = [];
      foreach ($response->content as $block) {
          if ($block->type !== 'bash_code_execution_tool_result') {
              continue;
          }
          $resultBlock = $block->content;
          if ($resultBlock->type !== 'bash_code_execution_result') {
              continue;
          }
          foreach ($resultBlock->content as $outputBlock) {
              $fileIds[] = $outputBlock->fileID;
          }
      }
      return $fileIds;
  }

  // Скачивание созданных файлов
  foreach (extractFileIds($response) as $fileId) {
      $fileMetadata = $client->files->retrieveMetadata($fileId);
      $fileContent = $client->files->download($fileId);

      file_put_contents($fileMetadata->filename, $fileContent);
      echo "Downloaded: {$fileMetadata->filename}\n";
  }
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  response = client.messages.create(
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Create a matplotlib visualization and save it as output.png"
      }
    ],
    tools: [
      {
        type: "code_execution_20250825",
        name: "code_execution"
      }
    ]
  )

  def extract_file_ids(response)
    file_ids = []
    response.content.each do |item|
      if item.type == :bash_code_execution_tool_result
        # ОБХОДНОЕ РЕШЕНИЕ для ошибки приведения union в anthropic-sdk-ruby (SDK-636): item.content —
        # вложенный union содержимого, поэтому типизированные методы доступа `item.content` ненадёжны.
        # Вместо этого читайте необработанные данные ответа через публичный API `BaseModel#[]`.
        content_item = item.content
        if content_item[:type].to_s == "bash_code_execution_result"
          Array(content_item[:content]).each do |output_block|
            file_ids << output_block[:file_id]
          end
        end
      end
    end
    file_ids
  end

  extract_file_ids(response).each do |file_id|
    file_metadata = client.files.retrieve_metadata(file_id)
    file_content = client.files.download(file_id)

    File.open(file_metadata.filename, "wb") do |f|
      f.write(file_content.read)
    end

    puts "Downloaded: #{file_metadata.filename}"
  end
  ```
</CodeGroup>

#### Как захватываются созданные файлы

Каждый вызов `bash_code_execution` получает новый пустой каталог, доступный команде как `$OUTPUT_DIR`. Когда команда завершается, файлы на верхнем уровне этого каталога захватываются и возвращаются в виде записей `file_id` в списке `content` результата. Файлы, записанные в любое другое место, остаются в контейнере и не возвращаются.

Описание инструмента указывает Claude делиться файлами, копируя их в `$OUTPUT_DIR`. Если ваше приложение зависит от получения файла, попросите Claude скопировать его в `$OUTPUT_DIR` и вывести содержимое каталога в той же команде, чтобы вывод `ls` подтвердил захват (Claude не видит список `content`):

```bash
python /tmp/make_report.py && cp /tmp/report.pdf "$OUTPUT_DIR/" && ls "$OUTPUT_DIR"
```

Файл, который Claude записал в другое место, по-прежнему находится в контейнере, поэтому вы можете [повторно использовать контейнер](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#container-reuse) и попросить Claude скопировать его в `$OUTPUT_DIR`.

### Content Credentials в созданных файлах

В Claude API поддерживаемые файлы изображений, видео и аудио, которые Claude создаёт в песочнице выполнения кода, содержат Content Credentials [C2PA](https://c2pa.org/), когда вы скачиваете их через [Files API](https://platform.claude.com/docs/ru/build-with-claude/files). [Поддерживаемые форматы](https://opensource.contentauthenticity.org/docs/sdk-repos/c2pa-python/docs/supported-formats/) включают PNG, JPEG, GIF, WebP, TIFF, HEIC, AVIF, SVG, MP4, MOV, MP3, WAV, FLAC и M4A. Учётные данные представляют собой криптографически подписанный манифест, встроенный в метаданные файла. Он указывает Anthropic в качестве издателя, содержит метку времени и фиксирует описание действия «Claude provided this file at the request of a user and may have created or modified the file contents.»

Подписание не требует никаких изменений в ваших запросах или обработке ответов, и манифест не содержит никаких сведений о вас, вашей организации или вашем запросе. Видимое содержимое файла не меняется. Манифест добавляет несколько килобайт, поэтому размер и контрольная сумма скачанного файла отличаются от файла в том виде, в каком он существует внутри контейнера. Текстовые файлы, PDF и офисные документы не подписываются, поскольку их форматы не поддерживаются для подписания. Загружаемые вами файлы хранятся как есть, включая любые Content Credentials, которые они уже содержат.

Чтобы проверить учётные данные, изучите файл с помощью любого C2PA-совместимого инструмента, например утилиты командной строки с открытым исходным кодом [c2patool](https://github.com/contentauth/c2pa-rs). Перекодирование, преобразование формата, снимки экрана и инструменты, удаляющие метаданные, удаляют учётные данные, поэтому их отсутствие не означает, что файл не был создан с помощью Claude. Подробнее о том, почему учётные данные могут отсутствовать, см. в статье [How Claude marks AI-generated content](https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content).

## Определение инструмента

Инструмент выполнения кода не требует дополнительных параметров:

```json JSON
{
  "type": "code_execution_20250825",
  "name": "code_execution"
}
```

Оба поля фиксированы: `type` выбирает версию инструмента, а `name` должно быть `code_execution`.

Когда вы предоставляете этот инструмент, Claude автоматически получает доступ к двум подынструментам:

* `bash_code_execution`: запуск команд оболочки
* `text_editor_code_execution`: просмотр, создание и редактирование файлов, включая написание кода

Когда Claude запускает код, ответ также содержит объект верхнего уровня `container` с `id` контейнера и меткой времени `expires_at`. Передайте этот ID обратно в параметре запроса верхнего уровня `container`, чтобы продолжить использовать тот же контейнер. См. [Повторное использование контейнера](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#container-reuse).

## Формат ответа

Инструмент выполнения кода может возвращать два типа результатов в зависимости от операции:

### Ответ на команду Bash

```json Output
{
  "type": "server_tool_use",
  "id": "srvtoolu_01B3C4D5E6F7G8H9I0J1K2L3",
  "name": "bash_code_execution",
  "input": {
    "command": "ls -la | head -5"
  }
},
{
  "type": "bash_code_execution_tool_result",
  "tool_use_id": "srvtoolu_01B3C4D5E6F7G8H9I0J1K2L3",
  "content": {
    "type": "bash_code_execution_result",
    "stdout": "total 24\ndrwxr-xr-x 2 user user 4096 Jan 1 12:00 .\ndrwxr-xr-x 3 user user 4096 Jan 1 11:00 ..\n-rw-r--r-- 1 user user  220 Jan 1 12:00 data.csv\n-rw-r--r-- 1 user user  180 Jan 1 12:00 config.json",
    "stderr": "",
    "return_code": 0,
    "content": []
  }
}
```

### Ответы на операции с файлами

**Просмотр файла:**

```json Output
{
  "type": "server_tool_use",
  "id": "srvtoolu_01C4D5E6F7G8H9I0J1K2L3M4",
  "name": "text_editor_code_execution",
  "input": {
    "command": "view",
    "path": "config.json"
  }
},
{
  "type": "text_editor_code_execution_tool_result",
  "tool_use_id": "srvtoolu_01C4D5E6F7G8H9I0J1K2L3M4",
  "content": {
    "type": "text_editor_code_execution_view_result",
    "file_type": "text",
    "content": "{\n  \"setting\": \"value\",\n  \"debug\": true\n}",
    "num_lines": 4,
    "start_line": 1,
    "total_lines": 4
  }
}
```

**Создание файла:**

```json Output
{
  "type": "server_tool_use",
  "id": "srvtoolu_01D5E6F7G8H9I0J1K2L3M4N5",
  "name": "text_editor_code_execution",
  "input": {
    "command": "create",
    "path": "new_file.txt",
    "file_text": "Hello, World!"
  }
},
{
  "type": "text_editor_code_execution_tool_result",
  "tool_use_id": "srvtoolu_01D5E6F7G8H9I0J1K2L3M4N5",
  "content": {
    "type": "text_editor_code_execution_create_result",
    "is_file_update": false
  }
}
```

**Редактирование файла (str\_replace):**

```json Output
{
  "type": "server_tool_use",
  "id": "srvtoolu_01E6F7G8H9I0J1K2L3M4N5O6",
  "name": "text_editor_code_execution",
  "input": {
    "command": "str_replace",
    "path": "config.json",
    "old_str": "\"debug\": true",
    "new_str": "\"debug\": false"
  }
},
{
  "type": "text_editor_code_execution_tool_result",
  "tool_use_id": "srvtoolu_01E6F7G8H9I0J1K2L3M4N5O6",
  "content": {
    "type": "text_editor_code_execution_str_replace_result",
    "old_start": 3,
    "old_lines": 1,
    "new_start": 3,
    "new_lines": 1,
    "lines": ["-  \"debug\": true", "+  \"debug\": false"]
  }
}
```

### Результаты

Результаты команд Bash (`bash_code_execution_result`) включают:

* `stdout`: вывод при успешном выполнении
* `stderr`: сообщения об ошибках, если выполнение завершилось неудачей
* `return_code`: 0 при успехе, ненулевое значение при неудаче
* `content`: список с записью для каждого файла, который команда оставила в `$OUTPUT_DIR` (см. [Как захватываются созданные файлы](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#how-generated-files-are-captured)). Каждая запись содержит `file_id`, чтобы [получить файл](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#retrieve-generated-files) с помощью Files API

Результаты операций с файлами имеют собственные поля:

* **Просмотр** (`text_editor_code_execution_view_result`): `file_type`, `content`, `num_lines`, `start_line`, `total_lines`
* **Создание** (`text_editor_code_execution_create_result`): `is_file_update` (существовал ли файл ранее)
* **Редактирование** (`text_editor_code_execution_str_replace_result`): `old_start`, `old_lines`, `new_start`, `new_lines`, `lines` (формат diff)

### Ошибки

Каждый тип инструмента может возвращать определённые ошибки:

**Общие ошибки (все инструменты):**

```json Output
{
  "type": "bash_code_execution_tool_result",
  "tool_use_id": "srvtoolu_01VfmxgZ46TiHbmXgy928hQR",
  "content": {
    "type": "bash_code_execution_tool_result_error",
    "error_code": "unavailable"
  }
}
```

**Коды ошибок по типу инструмента:**

| Инструмент      | Код ошибки                | Описание                                                                 |
| --------------- | ------------------------- | ------------------------------------------------------------------------ |
| Все инструменты | `unavailable`             | Инструмент временно недоступен                                           |
| Все инструменты | `execution_time_exceeded` | Вызов инструмента превысил максимальное время выполнения                 |
| Все инструменты | `invalid_tool_input`      | Инструменту переданы недопустимые параметры                              |
| Все инструменты | `too_many_requests`       | Превышено «rate limit» (ограничение скорости) использования инструментов |
| bash            | `output_file_too_large`   | Вывод команды превысил максимальный размер                               |
| text\_editor    | `file_not_found`          | Файл не существует (для операций просмотра/редактирования)               |

Контейнер с истёкшим сроком действия нельзя использовать повторно: запросы, ссылающиеся на него, возвращают ошибку вместо его восстановления. Отправьте запрос повторно без параметра `container`, чтобы получить новый контейнер.

### Причина остановки `pause_turn`

Ответ может содержать причину остановки `pause_turn`, которая указывает, что API приостановил длительный ход. Вы можете передать ответ как есть в последующем запросе, чтобы Claude продолжил свой ход, или изменить содержимое, если хотите прервать диалог.

## Контейнеры

Инструмент выполнения кода работает в безопасной контейнеризированной среде, разработанной специально для выполнения кода, с повышенным вниманием к Python.

### Среда выполнения

* **Версия Python:** 3.11
* **Операционная система:** контейнер на базе Linux
* **Архитектура:** x86\_64 (AMD64)

### Ограничения ресурсов

* **Память:** 5 GiB RAM
* **Дисковое пространство:** 5 GiB хранилища рабочей области
* **ЦП:** 1 CPU
* **Время выполнения:** вызов инструмента, выполняющийся дольше максимального времени выполнения, возвращает [ошибку](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#errors) `execution_time_exceeded`. При [программном вызове инструментов](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/programmatic-tool-calling) каждая ячейка REPL также имеет 90-секундное ограничение по реальному времени

### Сеть и безопасность

* **Доступ к интернету:** полностью отключён в целях безопасности
* **Внешние подключения:** исходящие сетевые запросы не разрешены
* **Изоляция песочницы:** полная изоляция от хост-системы и других контейнеров
* **Доступ к файлам:** ограничен только каталогом рабочей области
* **Область действия рабочей области:** как и [Files API](https://platform.claude.com/docs/ru/build-with-claude/files), контейнеры привязаны к рабочей области запроса
* **Срок действия:** срок действия контейнеров истекает через 30 дней после создания

### Предустановленные библиотеки

Изолированная среда Python включает следующие часто используемые библиотеки:

* **Наука о данных:** pandas, numpy, scipy, scikit-learn, statsmodels
* **Визуализация:** matplotlib, seaborn
* **Обработка файлов:** pyarrow, openpyxl, xlsxwriter, xlrd, pillow, python-pptx, python-docx, pypdf, pdfplumber, pypdfium2, pdf2image, pdfkit, tabula-py, reportlab\[pycairo], Img2pdf
* **Математика и вычисления:** sympy, mpmath
* **Утилиты:** tqdm, python-dateutil, pytz, joblib

Контейнер также включает инструменты командной строки, такие как unzip, unrar, 7zip, bc, rg (ripgrep), fd и sqlite.

У контейнера нет доступа к интернету, поэтому Claude не может загружать или устанавливать дополнительные пакеты во время выполнения: доступны только предустановленные библиотеки.

## Повторное использование контейнера

Вы можете повторно использовать существующий контейнер в нескольких запросах к API, указав ID контейнера из предыдущего ответа. Это позволяет сохранять созданные файлы между запросами. При использовании `code_execution_20260120` или более поздней версии и [программного вызова инструментов](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/programmatic-tool-calling) также сохраняется состояние интерпретатора Python.

Срок действия контейнеров истекает через 30 дней после создания. Примерно через 5 минут бездействия для контейнера создаётся контрольная точка, и отправка запроса с его ID в пределах 30-дневного окна восстанавливает его. Метка времени `expires_at` в объекте `container` ответа — это более короткое скользящее значение, и оно не отражает 30-дневный лимит. Контейнер с истёкшим сроком действия нельзя использовать повторно. Отправьте запрос повторно без параметра `container`, чтобы получить новый контейнер.

### Пример

<CodeGroup>
  ```bash cURL
  # Первый запрос: создаём файл со случайным числом и сохраняем ID контейнера (с помощью jq)
  CONTAINER_ID=$(curl -s https://api.anthropic.com/v1/messages \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "model": "claude-opus-5-5",
      "max_tokens": 4096,
      "messages": [{
        "role": "user",
        "content": "Write a file with a random number and save it to \"/tmp/number.txt\""
      }],
      "tools": [{
        "type": "code_execution_20250825",
        "name": "code_execution"
      }]
    }' | jq -r '.container.id')

  # Второй запрос: повторно используем контейнер, чтобы прочитать файл
  curl https://api.anthropic.com/v1/messages \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -H "content-type: application/json" \
    -d '{
      "container": "'"$CONTAINER_ID"'",
      "model": "claude-opus-5-5",
      "max_tokens": 4096,
      "messages": [{
        "role": "user",
        "content": "Read the number from \"/tmp/number.txt\" and calculate its square"
      }],
      "tools": [{
        "type": "code_execution_20250825",
        "name": "code_execution"
      }]
    }'
  ```

  ```bash CLI
  # Первый запрос: создаём файл со случайным числом
  CONTAINER_ID=$(ant messages create \
    --model claude-opus-5-5 \
    --max-tokens 4096 \
    --message '{role: user, content: Write a file with a random number and save it to "/tmp/number.txt"}' \
    --tool '{type: code_execution_20250825, name: code_execution}' \
    --transform container.id --raw-output)

  # Второй запрос: повторно используем контейнер для чтения файла
  ant messages create \
    --container "$CONTAINER_ID" \
    --model claude-opus-5-5 \
    --max-tokens 4096 \
    --message '{role: user, content: Read the number from "/tmp/number.txt" and calculate its square}' \
    --tool '{type: code_execution_20250825, name: code_execution}'
  ```

  ```python Python
  client = anthropic.Anthropic()

  # Первый запрос: создать файл со случайным числом в новом контейнере
  response1 = client.messages.create(
      model="claude-opus-5-5",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Write a file with a random number and save it to '/tmp/number.txt'",
          }
      ],
      tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
  )

  # Второй запрос: передать ID контейнера обратно, чтобы Claude повторно использовал тот же контейнер
  response2 = client.messages.create(
      container=response1.container.id,
      model="claude-opus-5-5",
      max_tokens=4096,
      messages=[
          {
              "role": "user",
              "content": "Read the number from '/tmp/number.txt' and calculate its square",
          }
      ],
      tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
  )

  print(response2.to_json())
  ```

  ```typescript TypeScript
  const client = new Anthropic();

  // Первый запрос: Claude создаёт файл в новом контейнере выполнения кода
  const response1 = await client.messages.create({
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Write a file with a random number and save it to '/tmp/number.txt'"
      }
    ],
    tools: [{ type: "code_execution_20250825", name: "code_execution" }]
  });

  // Ответ содержит контейнер после того, как инструмент выполнения кода отработал
  if (!response1.container) {
    throw new Error("Expected the first response to include a container");
  }

  // Второй запрос: передайте ID контейнера обратно, чтобы повторно использовать тот же контейнер
  const response2 = await client.messages.create({
    container: response1.container.id,
    model: "claude-opus-5-5",
    max_tokens: 4096,
    messages: [
      { role: "user", content: "Read the number from /tmp/number.txt and calculate its square" }
    ],
    tools: [{ type: "code_execution_20250825", name: "code_execution" }]
  });

  console.log(JSON.stringify(response2));
  ```

  ```csharp C#
  AnthropicClient client = new();

  // Первый запрос: Claude создаёт файл в новом контейнере для выполнения кода
  var response1 = await client.Messages.Create(new()
  {
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 4096,
      Messages = [new() { Role = Role.User, Content = "Write a file with a random number and save it to '/tmp/number.txt'" }],
      Tools = [new CodeExecutionTool20250825()]
  });

  // Второй запрос: передайте ID контейнера обратно, чтобы Claude повторно использовал тот же контейнер
  var response2 = await client.Messages.Create(new()
  {
      Container = response1.Container!.ID,
      Model = Model.ClaudeOpus5_5,
      MaxTokens = 4096,
      Messages = [new() { Role = Role.User, Content = "Read the number from '/tmp/number.txt' and calculate its square" }],
      Tools = [new CodeExecutionTool20250825()]
  });

  Console.WriteLine(response2);
  ```

  ```go Go
  client := anthropic.NewClient()
  ctx := context.Background()

  codeExecution := []anthropic.ToolUnionParam{
  	{OfCodeExecutionTool20250825: &anthropic.CodeExecutionTool20250825Param{}},
  }

  // Первый запрос: создаём файл со случайным числом в новом контейнере
  response1, err := client.Messages.New(ctx, anthropic.MessageNewParams{
  	Model:     anthropic.ModelClaudeOpus5_5,
  	MaxTokens: 4096,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(anthropic.NewTextBlock("Write a file with a random number and save it to '/tmp/number.txt'")),
  	},
  	Tools: codeExecution,
  })
  if err != nil {
  	log.Fatal(err)
  }

  // Повторно используем контейнер из первого запроса, чтобы файл в нём сохранился.
  response2, err := client.Messages.New(ctx, anthropic.MessageNewParams{
  	Container: anthropic.MessageCreateParamsContainerUnion{
  		OfString: anthropic.String(response1.Container.ID),
  	},
  	Model:     anthropic.ModelClaudeOpus5_5,
  	MaxTokens: 4096,
  	Messages: []anthropic.MessageParam{
  		anthropic.NewUserMessage(anthropic.NewTextBlock("Read the number from '/tmp/number.txt' and calculate its square")),
  	},
  	Tools: codeExecution,
  })
  if err != nil {
  	log.Fatal(err)
  }

  fmt.Println(response2.RawJSON())
  ```

  ```java Java
  AnthropicClient client = AnthropicOkHttpClient.fromEnv();

  // Первый запрос: создать файл со случайным числом в новом контейнере
  MessageCreateParams params1 = MessageCreateParams.builder()
      .model(Model.CLAUDE_OPUS_5_5)
      .maxTokens(4096L)
      .addUserMessage("Write a file with a random number and save it to '/tmp/number.txt'")
      .addTool(CodeExecutionTool20250825.builder().build())
      .build();

  Message response1 = client.messages().create(params1);

  // Второй запрос: передать ID контейнера обратно, чтобы повторно использовать тот же контейнер
  MessageCreateParams params2 = MessageCreateParams.builder()
      .container(response1.container().orElseThrow().id())
      .model(Model.CLAUDE_OPUS_5_5)
      .maxTokens(4096L)
      .addUserMessage("Read the number from '/tmp/number.txt' and calculate its square")
      .addTool(CodeExecutionTool20250825.builder().build())
      .build();

  Message response2 = client.messages().create(params2);
  IO.println(ObjectMappers.jsonMapper().valueToTree(response2));
  ```

  ```php PHP
  $client = new Client();

  // Первый запрос: Claude записывает файл в новом контейнере выполнения кода
  $response1 = $client->messages->create(
      maxTokens: 4096,
      messages: [
          [
              'role' => 'user',
              'content' => "Write a file with a random number and save it to '/tmp/number.txt'",
          ],
      ],
      model: Model::CLAUDE_OPUS_5_5,
      tools: [new CodeExecutionTool20250825()],
  );

  // Второй запрос: повторно используем контейнер, чтобы '/tmp/number.txt' всё ещё был на месте
  $response2 = $client->messages->create(
      container: $response1->container->id,
      maxTokens: 4096,
      messages: [
          [
              'role' => 'user',
              'content' => "Read the number from '/tmp/number.txt' and calculate its square",
          ],
      ],
      model: Model::CLAUDE_OPUS_5_5,
      tools: [new CodeExecutionTool20250825()],
  );

  echo json_encode($response2), PHP_EOL;
  ```

  ```ruby Ruby
  client = Anthropic::Client.new

  # Первый запрос: Claude создаёт файл в новом контейнере выполнения кода
  response1 = client.messages.create(
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Write a file with a random number and save it to '/tmp/number.txt'"
      }
    ],
    tools: [Anthropic::CodeExecutionTool20250825.new]
  )

  # Второй запрос: передайте ID контейнера обратно, чтобы Claude использовал тот же контейнер
  response2 = client.messages.create(
    container: response1.container.id,
    model: Anthropic::Model::CLAUDE_OPUS_5_5,
    max_tokens: 4096,
    messages: [
      {
        role: "user",
        content: "Read the number from '/tmp/number.txt' and calculate its square"
      }
    ],
    tools: [Anthropic::CodeExecutionTool20250825.new]
  )

  puts response2.to_json
  ```
</CodeGroup>

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

Когда вы предоставляете выполнение кода вместе с клиентскими инструментами, которые также запускают код (например, [инструментом Bash](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/bash-tool) или собственным REPL), Claude работает в многокомпьютерной среде. Инструмент выполнения кода работает в изолированном контейнере Anthropic, а ваши клиентские инструменты — в отдельной среде, которую контролируете вы. Claude иногда может путать эти среды, пытаясь использовать не тот инструмент или предполагая, что состояние между ними общее.

Чтобы избежать этого, добавьте в «system prompt» (системную подсказку) инструкции, поясняющие это различие:

```text wrap
When multiple code execution environments are available, be aware that:
- Variables, files, and state do NOT persist between different execution environments
- Use the code_execution tool for general-purpose computation in Anthropic's sandboxed environment
- Use client-provided execution tools (e.g., bash) when you need access to the user's local system, files, or data
- If you need to pass results between environments, explicitly include outputs in subsequent tool calls rather than assuming shared state
```

Это особенно важно при сочетании выполнения кода с [веб-поиском](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/web-search-tool) или [веб-загрузкой](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/web-fetch-tool), которые автоматически включают выполнение кода. Если ваше приложение уже предоставляет клиентский инструмент оболочки, автоматическое выполнение кода создаёт вторую среду выполнения, которую Claude должен отличать от первой.

Когда Claude вызывает один из ваших клиентских инструментов вместе с выполнением кода, API возвращает вызов выполнения кода без его результата. Результат приходит в одном из последующих ответов, после того как вы отправите обратно блоки `tool_result` для своих клиентских инструментов.

## Потоковая передача

При включённой «[streaming](https://platform.claude.com/docs/ru/build-with-claude/streaming)» (потоковой передаче) (`"stream": true`) вы будете получать события выполнения кода по мере их возникновения. Входные данные подынструмента передаются потоком в виде событий `input_json_delta`, а каждый блок результата приходит целиком в одном событии `content_block_start`:

```sse
event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "server_tool_use", "id": "srvtoolu_xyz789", "name": "bash_code_execution"}}

// Tool input streamed as partial JSON
event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "input_json_delta", "partial_json": "{\"command\": \"python analyze.py\"}"}}

// Pause while the command runs

// Execution result delivered as a complete block
event: content_block_start
data: {"type": "content_block_start", "index": 2, "content_block": {"type": "bash_code_execution_tool_result", "tool_use_id": "srvtoolu_xyz789", "content": {"type": "bash_code_execution_result", "stdout": "   A  B  C\n0  1  2  3\n1  4  5  6", "stderr": "", "return_code": 0, "content": []}}}
```

## Пакетные запросы

Вы можете включить инструмент выполнения кода в [Messages Batches API](https://platform.claude.com/docs/ru/build-with-claude/batch-processing). Вызовы инструмента выполнения кода через Messages Batches API тарифицируются так же, как и в обычных запросах к Messages API.

## Использование и цены

**Выполнение кода бесплатно при использовании вместе с веб-поиском или веб-загрузкой.** Когда `web_search_20260209` (или более поздняя версия) или `web_fetch_20260209` (или более поздняя версия) включены в ваш запрос к API, дополнительная плата за вызовы инструмента выполнения кода не взимается, помимо стандартной стоимости входных и выходных токенов.

При использовании без этих инструментов выполнение кода оплачивается по времени выполнения, которое отслеживается отдельно от использования токенов:

* Минимальное время выполнения составляет 5 минут
* Каждая организация получает **1 550 бесплатных часов** использования в месяц
* Дополнительное использование сверх 1 550 часов оплачивается по тарифу **$0,05 USD за час, за контейнер**
* Если в запрос включены файлы, время выполнения оплачивается, даже если инструмент не вызывается, поскольку файлы предварительно загружаются в контейнер

Использование выполнения кода отслеживается в ответе:

```json
{
  "usage": {
    "input_tokens": 105,
    "output_tokens": 239,
    "server_tool_use": {
      "code_execution_requests": 1
    }
  }
}
```

## Обновление до последней версии инструмента

Последняя версия инструмента — `code_execution_20260521`. Чтобы переключаться между тремя актуальными версиями, измените строку `type` в запросе: все три возвращают блоки ответа, описанные в разделе [Формат ответа](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#response-format). О том, что добавляет каждая версия, см. в разделе [Версии инструмента](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#tool-versions), а о поддерживающих их моделях — в разделе [Совместимость](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#compatibility).

Остальная часть этого раздела посвящена переходу с устаревшей версии `code_execution_20250522`, поддерживающей только Python, на актуальные версии инструмента.

### Что изменилось

| Компонент       | Устаревшая версия           | Актуальная версия                                                   |
| --------------- | --------------------------- | ------------------------------------------------------------------- |
| Бета-заголовок  | `code-execution-2025-05-22` | Не требуется                                                        |
| Тип инструмента | `code_execution_20250522`   | `code_execution_20250825` или более поздняя                         |
| Возможности     | Только Python               | Команды Bash, операции с файлами                                    |
| Типы ответов    | `code_execution_result`     | `bash_code_execution_result`, `text_editor_code_execution_*_result` |

### Обратная совместимость

* Всё существующее выполнение кода Python продолжает работать точно так же, как раньше
* Существующие рабочие процессы, использующие только Python, не требуют изменений

### Шаги обновления

Чтобы выполнить обновление, измените тип инструмента в запросах к API:

```diff
- "type": "code_execution_20250522"
+ "type": "code_execution_20250825"
```

**Проверьте обработку ответов** (если вы разбираете ответы программно):

* API больше не отправляет прежние блоки для ответов на выполнение Python
* Вместо этого API отправляет новые типы ответов для операций Bash и операций с файлами (см. [Формат ответа](https://platform.claude.com/docs/ru/agents-and-tools/tool-use/code-execution-tool#response-format))

## Хранение данных

Выполнение кода происходит в серверных изолированных контейнерах. Данные контейнера, включая артефакты выполнения, загруженные файлы и выходные данные, хранятся до 30 дней. Этот срок хранения распространяется на все данные, обрабатываемые в среде контейнера. Файлы, которые выполнение кода создаёт в [Files API](https://platform.claude.com/docs/ru/build-with-claude/files) (их можно получить с помощью `client.files.download()` (csharp, go: `client.Files.Download()`; java: `client.files().download()`; php: `$client->files->download()`)), сохраняются до явного удаления.

Сведения о соответствии требованиям ZDR для всех функций см. в разделе [API и хранение данных](https://platform.claude.com/docs/ru/manage-claude/api-and-data-retention).

## Следующие шаги

<CardGroup cols={2}>
  <Card title="Инструмент-советник" icon="compass" href="https://platform.claude.com/docs/ru/agents-and-tools/tool-use/advisor-tool">
    Объедините более быструю модель-исполнителя с более интеллектуальной моделью-советником, которая даёт стратегические рекомендации в процессе генерации.
  </Card>

  <Card title="Программный вызов инструментов" icon="code" href="https://platform.claude.com/docs/ru/agents-and-tools/tool-use/programmatic-tool-calling">
    Вызывайте собственные инструменты из кода, выполняющегося внутри контейнера выполнения кода.
  </Card>

  <Card title="Files API" icon="file" href="https://platform.claude.com/docs/ru/build-with-claude/files">
    Загружайте файлы для анализа и скачивайте файлы, созданные при выполнении кода.
  </Card>

  <Card title="Использование Agent Skills с API" icon="book" href="https://platform.claude.com/docs/ru/build-with-claude/skills-guide">
    Узнайте, как использовать Agent Skills для расширения возможностей Claude через API.
  </Card>
</CardGroup>
