---
title: Переход на версию API 2026-10-21
url: https://platform.claude.com/docs/ru/api/migration-2026-10-21
description: "Обновление интеграции с Claude API с версии API 2023-06-01 до 2026-10-21: какую версию SDK установить и какие изменения внести в код."
---

В этом руководстве перечислены изменения кода, необходимые для перехода с версии API `2023-06-01` на `2026-10-21`. В [шагах обновления](https://platform.claude.com/docs/ru/api/migration-2026-10-21#migration-checklist) по порядку описано, что нужно сделать.

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

<Steps>
  <Step title="Переход на 2026-10-21">
    Если вы используете SDK, ваши запросы используют версию API, которая была актуальной на момент выпуска мажорной версии вашего SDK. Версии, указанные для вашего языка, — первые, которые используют `2026-10-21`, поэтому обновитесь до них. Если вы вызываете API без SDK, установите заголовок `anthropic-version` в значение `2026-10-21`.

    <Tabs>
      <Tab title="cURL">
        Установите заголовок `anthropic-version` в значение `2026-10-21`:

        ```bash
        curl https://api.anthropic.com/v1/messages \
          -H "x-api-key: $ANTHROPIC_API_KEY" \
          -H "anthropic-version: 2026-10-21" \
          -H "content-type: application/json" \
          -d '{
            "model": "claude-opus-5-5",
            "max_tokens": 1024,
            "messages": [{"role": "user", "content": "Hello, Claude"}]
          }'
        ```
      </Tab>

      <Tab title="CLI">
        Обновите CLI `ant` до версии 2.0.0. Команда Homebrew и загрузки релизов остаются прежними.

        Go требует, чтобы путь модуля с мажорной версией 2 или выше заканчивался этой версией, поэтому путь модуля CLI теперь `github.com/anthropics/anthropic-cli/v2`. Если вы устанавливаете с помощью `go install`, добавьте `/v2` к пути:

        ```bash
        # До
        go install 'github.com/anthropics/anthropic-cli/cmd/ant@latest'

        # После
        go install 'github.com/anthropics/anthropic-cli/v2/cmd/ant@latest'
        ```

        Старый путь продолжает устанавливать последний релиз v1 без каких-либо ошибок или предупреждений.
      </Tab>

      <Tab title="Python">
        Обновите пакет `anthropic` до версии 2.0.0.
      </Tab>

      <Tab title="TypeScript">
        Обновите пакет `@anthropic-ai/sdk` до версии 1.0.0.

        Версии v1 пакетов `@anthropic-ai/bedrock-sdk`, `@anthropic-ai/vertex-sdk`, `@anthropic-ai/foundry-sdk`, `@anthropic-ai/aws-sdk` и `@anthropic-ai/google-cloud-sdk` требуют v1 пакета `@anthropic-ai/sdk`, а их более ранние версии требуют версию ниже 1. Если вы используете один из них, переведите его на v1 в рамках того же обновления. В противном случае ваш менеджер пакетов установит для него вторую, более старую копию `@anthropic-ai/sdk`.
      </Tab>

      <Tab title="C#">
        Обновите пакет `Anthropic` до версии 13.0.0.
      </Tab>

      <Tab title="Go">
        Обновитесь до версии 2.0.0 Go SDK, путь модуля которой — `github.com/anthropics/anthropic-sdk-go/v2`. Новая мажорная версия модуля Go имеет новый путь импорта, поэтому измените каждый импорт `github.com/anthropics/anthropic-sdk-go` и его пакетов, таких как `github.com/anthropics/anthropic-sdk-go/option`, чтобы он начинался с `github.com/anthropics/anthropic-sdk-go/v2`. Затем выполните `go get github.com/anthropics/anthropic-sdk-go/v2`.
      </Tab>

      <Tab title="Java">
        Обновите артефакт `com.anthropic:anthropic-java` до версии 3.0.0.
      </Tab>

      <Tab title="PHP">
        Выполните `composer require "anthropic-ai/sdk"`, чтобы обновить пакет до версии 1.0.0. Одна лишь команда `composer update` остаётся в рамках вашего текущего ограничения версии.
      </Tab>

      <Tab title="Ruby">
        Обновите gem `anthropic` до версии 2.0.0.
      </Tab>
    </Tabs>

    <Warning>
      В Amazon Bedrock версия `2026-10-21` доступна только для моделей Claude 4.7 и более поздних. Если вы вызываете в Bedrock более старую модель, указанную в разделе [Claude в Amazon Bedrock (Opus 4.6 и более ранние)](https://platform.claude.com/docs/ru/build-with-claude/claude-on-amazon-bedrock-legacy), оставайтесь на той версии SDK, которую используете сейчас, или, если вы задаёте версию API самостоятельно, продолжайте отправлять ту версию, которую отправляете сейчас. Чтобы перевести эти вызовы на `2026-10-21`, сначала переключите их на модель Claude 4.7 или более позднюю.
    </Warning>

    Выпустите обновление вместе с исправлениями из следующего шага.
  </Step>

  <Step title="Обновите код с учётом критических изменений">
    Просмотрите [критические изменения](https://platform.claude.com/docs/ru/api/migration-2026-10-21#breaking-changes) и обновите код для каждого из них, которое вас затрагивает. Также внесите [изменения кода, которые требуются новой версии SDK или CLI](https://platform.claude.com/docs/ru/api/migration-2026-10-21#sdk-changes).
  </Step>

  <Step title="Протестируйте с 2026-10-21">
    Протестируйте свою интеграцию с `2026-10-21` перед выпуском.
  </Step>
</Steps>

## Критические изменения

### Messages API

Эти изменения применяются к запросам к Messages API (`POST /v1/messages`), к [подсчёту токенов](https://platform.claude.com/docs/ru/build-with-claude/token-counting) и к каждому запросу в [Message Batch](https://platform.claude.com/docs/ru/build-with-claude/batch-processing), созданном с `2026-10-21`.

#### Блоки документов в сообщениях ассистента возвращают ошибку

Затрагивает вас, если вы отправляете блоки `document` непосредственно в сообщениях `assistant`.

В `2026-10-21` запрос, который помещает блок `document` непосредственно в сообщение `assistant`, возвращает ошибку 400. Вместо этого отправляйте документы в сообщениях `user`. Документ, вложенный в другой блок, например в результат инструмента веб-загрузки, который вернул Claude, по-прежнему принимается.

#### Цитаты в сообщениях пользователя возвращают ошибку

Затрагивает вас, если вы отправляете `citations` в блоках `text` в сообщениях `user`, в том числе внутри блоков `search_result`.

В `2026-10-21` запрос, который отправляет блок `text` с непустым массивом `citations` в сообщении `user`, возвращает ошибку 400. Удалите `citations` из этих блоков. Цитаты в блоках `text` в сообщениях `assistant`, например в предыдущих ответах Claude, которые вы отправляете обратно, по-прежнему принимаются, как и настройка `"citations": {"enabled": true}` для документов и результатов поиска.

#### Параметры сэмплирования удалены

Затрагивает вас, если вы отправляете `temperature`, `top_p` или `top_k` в запросах Messages или запросах Message Batch.

В `2026-10-21` запрос, который отправляет `temperature`, `top_p` или `top_k`, возвращает ошибку 400, даже при значении параметра по умолчанию.

Удалите эти три параметра из своих запросов.

Начиная с последних мажорных версий, в SDK и CLI этих трёх параметров больше нет.

Без этих параметров запрос выполняет сэмплирование с их значениями по умолчанию, включая `temperature`, равную 1.0, — так же, как запрос `2023-06-01`, в котором они не указаны. Модели, которые уже принимают только значения по умолчанию, такие как Claude 4.7 и более поздние модели, выполняют сэмплирование как прежде. На моделях, которые принимают другие значения, таких как Claude Sonnet 4.6, запрос, в котором `temperature` понижалась для более согласованного вывода, теряет этот эффект. Никакая другая настройка его не заменяет. Если запрос зависит от значения, отличного от значения по умолчанию, либо перестаньте отправлять этот параметр, либо оставьте этот запрос на `2023-06-01`.

### Admin API и Claude Enterprise Analytics API

Затрагивает вас, если ваш код читает поля ответов Admin API или Claude Enterprise Analytics API, указанные в следующих таблицах.

В `2026-10-21` ответы Admin API и [Claude Enterprise Analytics API](https://platform.claude.com/docs/ru/manage-claude/analytics-api) больше не содержат старых имён переименованных полей. Используйте вместо них новые имена.

Admin API:

| Эндпоинты                                                                                                                                                                                                                                                                                                                      | Старое имя     | Новое имя                                                                                                                                       |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| [Группы RBAC](https://platform.claude.com/docs/ru/api/beta/organization/rbac_groups/list): создание, получение списка, получение и обновление                                                                                                                                                                                  | `roles`        | `role_ids`                                                                                                                                      |
| [Участники групп RBAC](https://platform.claude.com/docs/ru/api/beta/organization/rbac_groups/members/list): получение списка и добавление, а также ответ на [удаление участника](https://platform.claude.com/docs/ru/api/beta/organization/rbac_groups/members/remove)                                                         | `group_id`     | `rbac_group_id`                                                                                                                                 |
| [Роли RBAC](https://platform.claude.com/docs/ru/api/beta/organization/rbac_roles/list): получение списка и получение                                                                                                                                                                                                           | `name`         | `display_name`                                                                                                                                  |
| «Rate limits» (ограничения скорости) [организации](https://platform.claude.com/docs/ru/api/organization/rate_limits/list) и [рабочего пространства](https://platform.claude.com/docs/ru/api/organization/workspaces/rate_limits/list): получение списка, а также ответ на установку ограничений скорости рабочего пространства | `group_type`   | `group.type`                                                                                                                                    |
| [Ключи API](https://platform.claude.com/docs/ru/api/organization/api_keys/list): получение списка, получение и обновление                                                                                                                                                                                                      | `workspace_id` | `scope` (другие значения; см. [`workspace_id` в ключах API](https://platform.claude.com/docs/ru/api/migration-2026-10-21#api-key-workspace-id)) |

Claude Enterprise Analytics API:

| Эндпоинты                                                                                                                                                                                                                                               | Старое имя    | Новое имя             |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------- |
| Отчёты по [использованию](https://platform.claude.com/docs/ru/api/beta/organization/analytics/user_usage_report/list) и [стоимости](https://platform.claude.com/docs/ru/api/beta/organization/analytics/user_cost_report/list) для каждого пользователя | `actor.email` | `actor.email_address` |
| [Сводки активности](https://platform.claude.com/docs/ru/api/beta/organization/analytics/summaries/list)                                                                                                                                                 | `summaries`   | `data`                |

Параметр запроса `group_type` в эндпоинтах получения списка ограничений скорости и фильтр `workspace_id` в эндпоинте получения списка ключей API не изменились.

#### `workspace_id` в ключах API

Затрагивает вас, если ваш код читает `workspace_id` в ключах API.

В `2023-06-01` поле `workspace_id` ключа API — это ID рабочего пространства, к которому привязан ключ, или `null` для ключа, привязанного к Default Workspace, и для ключа, который не привязан к одному рабочему пространству (ключ для всех рабочих пространств).

В `2026-10-21` поле `workspace_id` удалено. Вместо него читайте `scope`: для ключа, привязанного к рабочему пространству, включая Default Workspace, `scope.workspace_id` — это реальный ID этого рабочего пространства, а ключ для всех рабочих пространств имеет `scope`, равный `{"type": "organization"}`, без `workspace_id`.

Если ваш код рассматривал `workspace_id`, равный `null`, как Default Workspace, вместо этого сравнивайте `scope.workspace_id` с ID вашего Default Workspace. Чтобы найти этот ID, вызовите [List Workspaces](https://platform.claude.com/docs/ru/api/organization/workspaces/list) с `include_default=true` и возьмите рабочее пространство с именем `"Default"`.

## Изменения SDK и CLI

Более ранние версии SDK и CLI отправляли `anthropic-version: 2023-06-01` с каждым запросом. Версии, указанные в разделе [Переход на 2026-10-21](https://platform.claude.com/docs/ru/api/migration-2026-10-21#upgrade), отправляют `2026-10-21`. Изменения из раздела [Критические изменения](https://platform.claude.com/docs/ru/api/migration-2026-10-21#breaking-changes) применяются и к ним: удалённые параметры и старые имена полей также исчезли из типов SDK, а также из флагов и вывода CLI.

### Версия API в Amazon Bedrock и Google Cloud

Клиент SDK для Google Cloud's Agent Platform указывает версию в теле запроса, а не в заголовке. Он отправляет `anthropic_version: 2026-10-21`, тогда как более ранние версии отправляли `vertex-2023-10-16`, и не отправляет заголовок `anthropic-version`.

Клиент Amazon Bedrock делает то же самое. Он отправляет `anthropic_version: 2026-10-21`, тогда как более ранние версии отправляли `bedrock-2023-05-31`, и не отправляет заголовок `anthropic-version`. Модели старше Claude Opus 4.7 пока не поддерживают версию API `2026-10-21` в Bedrock, и запрос, в котором она указана, может получить ошибку 400. Если вы используете одну из них, пока оставайтесь на более ранней версии SDK или обновитесь и отправляйте `bedrock-2023-05-31` самостоятельно.

<Tabs>
  <Tab title="Python">
    Это относится к `AnthropicVertex`, `AsyncAnthropicVertex`, `AnthropicBedrock` и `AsyncAnthropicBedrock`.

    Чтобы отправить `bedrock-2023-05-31`, передавайте `extra_body={"anthropic_version": "bedrock-2023-05-31"}` с каждым запросом.
  </Tab>

  <Tab title="TypeScript">
    Это относится к `AnthropicVertex` и `AnthropicBedrock`. Если вы задаёте заголовок `anthropic-version` для клиента или для запроса, его значение попадает в тело.

    Чтобы отправить `bedrock-2023-05-31`, установите заголовок `anthropic-version` в значение `"bedrock-2023-05-31"` для клиента или для запроса.
  </Tab>

  <Tab title="C#">
    Это относится к `AnthropicVertexClient` и `AnthropicBedrockClient`. Если вы задаёте заголовок `anthropic-version` через `ClientOptions.ExtraHeaders`, его значение попадает в тело.

    Чтобы отправить `bedrock-2023-05-31`, вызовите `WithOptions` для клиента и установите `anthropic-version` в значение `bedrock-2023-05-31` в `ClientOptions.ExtraHeaders`.
  </Tab>

  <Tab title="Go">
    Это относится к пакетам `vertex` и `bedrock`. Если вы задаёте заголовок `anthropic-version` с помощью `option.WithHeader`, его значение попадает в тело. `vertex.DefaultVersion` и `bedrock.DefaultVersion` удалены.

    Чтобы отправить `bedrock-2023-05-31`, передайте `option.WithHeader("anthropic-version", "bedrock-2023-05-31")` клиенту или запросу.
  </Tab>

  <Tab title="Java">
    Это относится к `VertexBackend` и `BedrockBackend`. Если вы задаёте заголовок `anthropic-version` для клиента или для запроса, его значение попадает в тело.

    Чтобы отправить `bedrock-2023-05-31`, установите заголовок `anthropic-version` в значение `bedrock-2023-05-31` для клиента или для запроса.
  </Tab>

  <Tab title="PHP">
    Это относится к `Anthropic\Vertex\Client` и `Anthropic\Bedrock\Client`.

    Чтобы отправить `bedrock-2023-05-31`, передайте `'extraBodyParams' => ['anthropic_version' => 'bedrock-2023-05-31']` в `requestOptions`.
  </Tab>

  <Tab title="Ruby">
    Это относится к `Anthropic::VertexClient` и `Anthropic::BedrockClient`. Если вы задаёте заголовок `anthropic-version` через `extra_headers`, его значение попадает в тело. `Anthropic::VertexClient::DEFAULT_VERSION` и `Anthropic::BedrockClient::DEFAULT_VERSION` удалены.

    Чтобы отправить `bedrock-2023-05-31`, передайте `extra_headers: {"anthropic-version" => "bedrock-2023-05-31"}` в `request_options`.
  </Tab>
</Tabs>

### `MessageParam` — это объединение с отдельным типом для каждой роли

В более ранних версиях `MessageParam` был одним типом для всех ролей. Теперь у каждой роли есть собственный тип: `UserMessageParam`, `AssistantMessageParam` и `SystemMessageParam`. `BetaMessageParam` разделён таким же образом — на `BetaUserMessageParam`, `BetaAssistantMessageParam` и `BetaSystemMessageParam`. Запросы, которые отправляет SDK, содержат те же поля и значения, что и раньше.

<Tabs exclude="shell">
  <Tab title="Python">
    Сообщение, записанное как литерал словаря, например `{"role": "user", "content": "Hello"}`, не требует изменений.

    В v1 `anthropic.types.MessageParam` был одним `TypedDict`. В v2 это объединение трёх типов, а `anthropic.types.beta.BetaMessageParam` — объединение своих трёх типов. Оба имени по-прежнему работают в аннотациях, например `list[MessageParam]`.

    Вызов любого из этих имён теперь вызывает `TypeError`, и средство проверки типов помечает его. Записывайте сообщение как словарь:

    ```python
    # До
    message = MessageParam(role="user", content="Hello")

    # После
    message: MessageParam = {"role": "user", "content": "Hello"}
    ```

    Наследование от любого из этих имён также вызывает `TypeError`. Наследуйтесь от типа для роли, например `UserMessageParam`.

    Остальные изменения затрагивают только проверку типов. Словарь, у которого `role` — переменная, способная содержать более одной роли, не соответствует ни одному типу в объединении, поэтому создавайте словарь для одной роли за раз:

    ```python
    # До
    def to_message(role: Literal["user", "assistant"], text: str) -> MessageParam:
        return {"role": role, "content": text}


    # После
    def to_message(role: Literal["user", "assistant"], text: str) -> MessageParam:
        if role == "user":
            return {"role": "user", "content": text}
        return {"role": "assistant", "content": text}
    ```

    Ещё два изменения относятся только к `BetaMessageParam`:

    * `clear_at` и `output_config` — ключи `BetaSystemMessageParam`, поэтому сообщение пользователя или ассистента не может их содержать.
    * `content` необязателен в `BetaSystemMessageParam`, поэтому pyright сообщает о `message["content"]`. Читайте его с помощью `message.get("content")` или сначала проверьте, что `message["role"]` не равно `"system"`.
  </Tab>

  <Tab title="TypeScript">
    `MessageParam` был одним интерфейсом. Теперь это `UserMessageParam | AssistantMessageParam | SystemMessageParam`, а `BetaMessageParam` — такое же объединение своих трёх типов. Изменились только типы. Литерал сообщения, в котором указана роль, например `{ role: "user", content: "Hello, Claude" }`, проходит проверку типов как и раньше, поэтому большая часть кода не требует изменений.

    Системный тип отличается от двух других. Его `content` — это строка или текстовые блоки, а в `beta` также блоки `tool_addition` и `tool_removal`, поэтому блок изображения там больше не компилируется. В `beta` только он имеет `clear_at` и `output_config`, и его `content` необязателен.

    Код, который обрабатывает сообщение любой роли, должен проверять `role`, прежде чем заменять или добавлять блоки содержимого и прежде чем читать `clear_at` или `output_config`:

    ```typescript
    // До
    const copy: Anthropic.MessageParam = { ...message, content: blocks };

    // После
    const copy: Anthropic.MessageParam =
      message.role === "system" ? message : { ...message, content: blocks };
    ```

    `content` у `BetaMessageParam` может быть `undefined`:

    ```typescript
    // До
    const types =
      typeof message.content === "string" ? [] : message.content.map((block) => block.type);

    // После
    const types = Array.isArray(message.content) ? message.content.map((block) => block.type) : [];
    ```

    Тип `BetaMessageParam["content"]` тоже включает `undefined`. Для содержимого сообщения пользователя или ассистента используйте `BetaMessageContentParam`.

    Интерфейс не может расширять объединение, а класс не может его реализовывать. Используйте псевдоним типа или вместо этого укажите тип одной роли.

    ```typescript
    // До
    interface StoredMessage extends Anthropic.MessageParam {
      id: string;
    }

    // После
    type StoredMessage = Anthropic.MessageParam & { id: string };
    ```
  </Tab>

  <Tab title="C#">
    В v12 `MessageParam` и `BetaMessageParam` были классами, у которых вы задавали `Role` и `Content`. В v13 каждый из них — объединение трёх классов для своих ролей, а перечисления `Role` в `Anthropic.Models.Messages` и `Anthropic.Models.Beta.Messages` удалены.

    При создании сообщения указывайте класс для его роли и удаляйте `Role`. Каждый класс неявно преобразуется в объединение:

    ```csharp
    // До
    Messages = [new() { Role = Role.User, Content = "Hello, Claude" }],

    // После
    Messages = [new UserMessageParam { Content = "Hello, Claude" }],
    ```

    `new UserMessageParam("Hello, Claude")` тоже работает.

    Классы, содержащие `Content`, также изменились:

    * `MessageParamContent` теперь называется `MessageContentParam`, а `BetaMessageParamContent` — `BetaMessageContentParam`.
    * У системного сообщения есть собственный класс содержимого. `SystemMessageParamContent` содержит строку или список `TextBlockParam`, а `BetaSystemMessageParamContent` — строку или список `SystemMessageContentBlock`. `List<ContentBlockParam>` или `List<BetaContentBlockParam>` больше не преобразуется в него.
    * `ClearAt` и `OutputConfig` есть только у `BetaSystemMessageParam`.

    При чтении сообщения у объединения по-прежнему есть `Role` и `Content`, но задать их нельзя, поэтому выражение `with` применяется к классу для роли. `Role` теперь содержит `MessageParamRole` или `BetaMessageParamRole`. `BetaMessageParam.Content` может быть `null`, поскольку `Content` необязателен у `BetaSystemMessageParam`.

    ```csharp
    // До
    if (message.Role.Value() == Role.Assistant) { }

    // После
    if (message.Role.Value() == MessageParamRole.Assistant) { }
    ```

    `TryPickUser`, `TryPickAssistant`, `TryPickSystem`, `Switch` и `Match` дают вам класс для роли.
  </Tab>

  <Tab title="Go">
    В v1 `MessageParam` был одной структурой с полями `Role` и `Content`. В v2 это объединение: `OfUser` содержит `*UserMessageParam`, `OfAssistant` — `*AssistantMessageParam`, а `OfSystem` — `*SystemMessageParam`. `BetaMessageParam` изменяется таким же образом. SDK отправляет тот же JSON, что и раньше, за исключением порядка ключей в бета-версии системного сообщения.

    `NewUserMessage`, `NewAssistantMessage`, `NewBetaUserMessage` и методы `ToParam` у `Message` и `BetaMessage` работают как прежде, поэтому код, который создаёт сообщения с их помощью, не требует изменений.

    Литерал структуры указывает тип для своей роли. Не указывайте `Role`, поскольку каждый тип сериализует свою роль сам:

    ```go
    // До
    anthropic.MessageParam{
    	Role:    anthropic.MessageParamRoleAssistant,
    	Content: blocks,
    }

    // После
    anthropic.MessageParam{OfAssistant: &anthropic.AssistantMessageParam{
    	Content: blocks,
    }}
    ```

    Код, который читает сообщение, проверяет, какое поле задано:

    ```go
    // До
    if message.Role == anthropic.MessageParamRoleUser {
    	blocks = message.Content
    }

    // После
    if message.OfUser != nil {
    	blocks = message.OfUser.Content
    }
    ```

    * Типы `MessageParamRole` и `BetaMessageParamRole` и их константы удалены. `message.GetRole()` возвращает указатель на роль в виде `string` или `nil`, если ни одно поле не задано.
    * `ClearAt` и `OutputConfig` перенесены из `BetaMessageParam` в `BetaSystemMessageParam`. Имена типа `BetaMessageParamClearAt` и его констант теперь начинаются с `BetaSystemMessageParamClearAt`.
    * `SystemMessageParam.Content` — это `[]TextBlockParam`. `BetaSystemMessageParam.Content` — это `[]BetaSystemMessageParamContentUnion`, который содержит блоки `text`, `tool_addition` и `tool_removal`. `NewBetaSystemMessage` принимает блоки этого типа, поэтому `anthropic.NewBetaTextBlock("Be brief.")` превращается в `anthropic.BetaSystemMessageParamContentUnion{OfText: &anthropic.BetaTextBlockParam{Text: "Be brief."}}`.
    * Копия `MessageParam` указывает на то же сообщение, что и оригинал. Установка `duplicate.OfUser.Content` изменяет оба, тогда как установка `duplicate.Content` в v1 изменяла только копию.
    * `mcp.ToMessage` возвращает `*mcp.UnsupportedValueError` для роли, отличной от `user` или `assistant`. v1 копировал в сообщение любую роль.
  </Tab>

  <Tab title="Java">
    В v2 `MessageParam` был одним классом с `role` и `content`. В v3 это объединение трёх классов, а `MessageParam.Content` теперь — это `MessageContentParam` верхнего уровня. `BetaMessageParam` изменяется таким же образом, и его классы имеют те же имена с префиксом `Beta`. JSON, который отправляет SDK, остаётся прежним, за исключением того, что в бета-версии системного сообщения `role` теперь идёт перед `content`.

    `addUserMessage`, `addAssistantMessage` и `addSystemMessage` со `String`, `addMessage` с `Message` или `MessageParam`, а также `Message.toParam()` не изменились.

    `MessageParam.builder()` и `toBuilder()` удалены. Вызывайте фабричный метод для роли — `ofUser`, `ofAssistant` или `ofSystem`:

    ```java
    // До
    MessageParam message = MessageParam.builder()
        .role(MessageParam.Role.USER)
        .content("Hello, Claude")
        .build();

    // После
    MessageParam message = MessageParam.ofUser("Hello, Claude");
    ```

    Методы, принимающие список блоков содержимого, получили новые имена в билдерах `MessageCreateParams`, `StructuredMessageCreateParams`, `MessageCountTokensParams` и `BatchCreateParams.Request.Params`:

    | v2                                 | v2 beta                                       | v3                                        |
    | ---------------------------------- | --------------------------------------------- | ----------------------------------------- |
    | `addUserMessageOfBlockParams`      | `addUserMessageOfBetaContentBlockParams`      | `addUserMessageOfContentBlockParams`      |
    | `addAssistantMessageOfBlockParams` | `addAssistantMessageOfBetaContentBlockParams` | `addAssistantMessageOfContentBlockParams` |
    | `addSystemMessageOfBlockParams`    | `addSystemMessageOfBetaContentBlockParams`    | `addSystemMessageOfBlocks`                |

    В классе содержимого `BlockParams` (`BetaContentBlockParams` в бета-версии) становится `ContentBlockParams` в `ofBlockParams`, `blockParams()`, `isBlockParams()`, `asBlockParams()` и в методе посетителя `visitBlockParams`.

    У системного сообщения есть собственный класс содержимого, `SystemMessageParam.Content`, который теперь принимает `addSystemMessage`. Его блоки — `TextBlockParam`, а не `ContentBlockParam`. В бета-версии это `BetaSystemMessageParam.Content.SystemMessageContentBlock`, у которого есть `ofText`, `ofToolAddition` и `ofToolRemoval`.

    ```java
    // До
    builder.addSystemMessageOfBlockParams(List.of(ContentBlockParam.ofText(textBlock)));

    // После
    builder.addSystemMessageOfBlocks(List.of(textBlock));
    ```

    При чтении сообщения `role()` не изменился. `content()` возвращает `MessageContentParam` или, в бета-версии, `Optional<BetaMessageContentParam>`, где системное сообщение может не иметь содержимого. `_role()`, `_content()` и `_additionalProperties()` теперь находятся в классе для роли, который возвращают `asUser()`, `asAssistant()` или `asSystem()`.
  </Tab>

  <Tab title="PHP">
    Классы находятся в `Anthropic\Messages`, а бета-классы — в `Anthropic\Beta\Messages`. Сообщения, которые вы записываете как массивы, не изменились, и им по-прежнему нужен `'role'`.

    `MessageParam::with()` и `BetaMessageParam::with()` сохранились и возвращают класс, соответствующий `role`. Вызов с именованными аргументами не требует изменений. `role` теперь первый параметр, поэтому в позиционном вызове поменяйте местами `content` и `role` или вызовите `with()` у класса роли, который не принимает `role`. Для аргументов в старом порядке PHP выбрасывает `UnhandledMatchError`, о котором PHPStan не предупреждает, или `TypeError`, если `content` — список или `role` — вариант перечисления.

    ```php
    // До
    MessageParam::with('Hello, Claude', 'user');

    // После
    UserMessageParam::with('Hello, Claude');
    ```

    Ни один объект больше не является `MessageParam`: `instanceof MessageParam` возвращает false, а PHP выбрасывает `TypeError` там, где он указан в типе параметра или возвращаемого значения. Вместо этого указывайте три класса:

    ```php
    // До
    function send(MessageParam $message): void {}

    // После
    function send(UserMessageParam|AssistantMessageParam|SystemMessageParam $message): void {}
    ```

    * `MessageParam::fromArray()` и `(new MessageParam)->withContent()` выбрасывают «Call to undefined method». Вызывайте их у класса роли, который сам задаёт `role`.
    * `withRole()` теперь принимает только строку: PHP выбрасывает `TypeError` для варианта `Role`. Чтобы задать сообщению другую роль, создайте класс этой роли.
    * `clearAt` и `outputConfig` существуют только у `BetaSystemMessageParam`, а `BetaMessageParam::with()` отбрасывает их для двух других ролей. Перечисление `BetaMessageParam\ClearAt` теперь называется `BetaSystemMessageParam\ClearAt`.
    * `MessageParam\Content` теперь называется `MessageContentParam`, а `BetaMessageParam\Content` — `BetaMessageContentParam`. Их типы PHPStan тоже получили новое имя: `ContentShape` теперь называется `MessageContentParamShape`.
    * Массив, у которого `'role'` — вариант `Role`, по-прежнему работает, но PHPStan теперь сообщает о нём. Записывайте строку.
  </Tab>

  <Tab title="Ruby">
    Сообщения, которые вы записываете как хеши, не изменились.

    В v2 `Anthropic::MessageParam` — это объединение `Anthropic::UserMessageParam`, `Anthropic::AssistantMessageParam` и `Anthropic::SystemMessageParam`. Аналогично `Anthropic::Beta::BetaMessageParam` — объединение своих трёх классов.

    `Anthropic::MessageParam.new(role: :user, content: "Hello, Claude")` по-прежнему работает и возвращает экземпляр класса для этой роли. Вы также можете создать этот класс самостоятельно, без `role:`, как `Anthropic::UserMessageParam.new(content: "Hello, Claude")`. Для кода, который создаёт или проверяет эти экземпляры, изменились четыре вещи:

    * `MessageParam.new` принимает только ключевые аргументы, поэтому передавайте хеш как `MessageParam.new(**hash)`. Он вызывает `ArgumentError`, если `role:` отсутствует или не является одной из трёх ролей.
    * `message.is_a?(Anthropic::MessageParam)` возвращает `false`. Ветка `when Anthropic::MessageParam` и `messages.grep(Anthropic::MessageParam)` по-прежнему срабатывают.
    * У экземпляра, созданного с помощью `.new`, нет `:role` в его `to_h`, а `message[:role]` равно `nil`. `message.role` по-прежнему возвращает роль.
    * Только у `BetaSystemMessageParam` есть `clear_at` и `output_config`. У сообщения пользователя или ассистента они возвращали `nil`, а теперь вызывают `NoMethodError`.

    ```ruby
    # До
    typed = messages.select { _1.is_a?(Anthropic::MessageParam) }
    roles = typed.map { _1[:role] }

    # После
    typed = messages.grep(Anthropic::MessageParam)
    roles = typed.map(&:role)
    ```

    Модули перечислений `Role` сохранились. Следующие константы перемещены. Имена, начинающиеся с `Beta`, находятся в `Anthropic::Beta`, а остальные — в `Anthropic`:

    | Удалено                     | Используйте вместо этого                                                                 |
    | --------------------------- | ---------------------------------------------------------------------------------------- |
    | `MessageParam::Content`     | `MessageContentParam` или `SystemMessageParam::Content` для системного сообщения         |
    | `BetaMessageParam::Content` | `BetaMessageContentParam` или `BetaSystemMessageParam::Content` для системного сообщения |
    | `BetaMessageParam::ClearAt` | `BetaSystemMessageParam::ClearAt`                                                        |

    Если вы проверяете типы с помощью Sorbet, `MessageParam::OrHash` удалён, а `Anthropic::MessageParam` как тип больше не принимает экземпляр. Используйте `Anthropic::MessageParam::Variants` для трёх классов, у каждого из которых есть собственный `OrHash`. В RBS у значения с типом `Anthropic::MessageParam` нет `role` или `content`. Используйте псевдоним `Anthropic::Models::message_param`, который был хеш-формой сообщения, а теперь является объединением трёх классов. Бета-имена — `BetaMessageParam::Variants` и `Anthropic::Models::Beta::beta_message_param`.
  </Tab>
</Tabs>

### Перечисления с одним значением стали константами

Это изменение затрагивает SDK для C#, Go, Java, PHP и Ruby, а также один флаг CLI. В более ранних версиях обязательное поле, которое может содержать только одно значение, имело собственный тип «enum» (перечисление) с единственным членом. Теперь такие поля являются константами, а типы перечислений удалены. JSON, который SDK отправляет и читает, остаётся прежним.

<Tabs exclude="shell:cURL, python, typescript">
  <Tab title="CLI">
    `--type` стал необязательным в `ant beta:sessions:resources add`. `file` — единственное значение, которое `--type` может там принимать, поэтому v2 отправляет его за вас. Команды, которые по-прежнему передают `--type file`, продолжают работать, так что ничего менять не нужно.
  </Tab>

  <Tab title="C#">
    В v12 у такого свойства `required` было перечисление с единственным членом, например `BetaManagedAgentsTextBlockType.Text`. Почти все они являются свойством `Type` класса в `Anthropic.Models.Beta`: `Agents`, `DeploymentRuns`, `Deployments`, `Dreams`, `Environments`, `MemoryStores`, `Sessions`, `UserProfiles` и `Vaults`. В v13 эти свойства имеют тип `JsonElement`, который заполняет конструктор, как это уже было с `TextBlockParam.Type`.

    Необязательное свойство, например `BetaManagedAgentsGlobToolConfigParams.Type`, сохраняет своё перечисление. Два из этих перечислений получили новое имя:

    | v12                                         | v13                                       |
    | ------------------------------------------- | ----------------------------------------- |
    | `BetaManagedAgentsBashToolConfigParamsType` | `Anthropic.Models.Beta.Agents.Type`       |
    | `BetaPackagesType`                          | `Anthropic.Models.Beta.Environments.Type` |

    При создании объекта удалите это свойство:

    ```csharp
    // До
    new BetaManagedAgentsTextBlock
    {
        Type = BetaManagedAgentsTextBlockType.Text,
        Text = "Hello Claude!",
    };

    // После
    new BetaManagedAgentsTextBlock { Text = "Hello Claude!" };
    ```

    Класс, у которого осталось одно обязательное свойство, также получает конструктор, принимающий его, поэтому `new BetaManagedAgentsTextBlock("Hello Claude!")` тоже работает. Класс, у которого не осталось ни одного, создаётся с помощью `new BetaManagedAgentsAlwaysAllowPolicy()`.

    При чтении такого свойства сравнивайте его со строкой:

    ```csharp
    // До
    if (message.Type.Value() == BetaManagedAgentsAgentMessageEventType.AgentMessage) { }

    // После
    if (message.Type.GetString() == "agent.message") { }
    ```

    Чтобы различать варианты объединения, продолжайте использовать его методы `TryPick*`, `Switch` и `Match`, которые не изменились.
  </Tab>

  <Tab title="Go">
    Пример такого типа перечисления и его константы — `BetaManagedAgentsTextBlockType` и `BetaManagedAgentsTextBlockTypeText`. Почти все они являются полем `Type` структуры в `client.Beta`: Agents, Deployments, Deployment Runs, Dreams, Environments, Memory Stores, Sessions, User Profiles и Vaults. В v2 эти поля используют тип из пакета `shared/constant`, как это уже было с `TextBlockParam.Type`. Необязательное поле, например `BetaManagedAgentsBashToolConfigParams.Type`, сохраняет своё перечисление.

    В запросе удалите это поле. Если вы его опустите, оно сериализуется в своё единственное значение:

    ```go
    // До
    anthropic.BetaManagedAgentsTextBlockParam{
    	Type: anthropic.BetaManagedAgentsTextBlockTypeText,
    	Text: "Hello Claude!",
    }

    // После
    anthropic.BetaManagedAgentsTextBlockParam{
    	Text: "Hello Claude!",
    }
    ```

    Структура, единственным полем которой был этот `Type`, теперь имеет конструктор, например `NewBetaManagedAgentsAlwaysAllowPolicyParam()`. В качестве члена объединения также подходит указатель на пустую структуру: `OfAlwaysAllow: &anthropic.BetaManagedAgentsAlwaysAllowPolicyParam{}`.

    В ответе сравнивайте со строкой:

    ```go
    // До
    switch event.Type {
    case string(anthropic.BetaManagedAgentsAgentMessageEventTypeAgentMessage):
    }

    // После
    switch event.Type {
    case "agent.message":
    }
    ```

    Ваша переменная, поле или параметр, объявленные с одним из удалённых типов, получают новый тип поля, например `constant.AgentMessage`. `constant.ValueOf[constant.AgentMessage]()` возвращает его значение.

    Конструкторы объединений меняются вместе с полями. Эти пять теряют свой аргумент `type_`:

    * `BetaManagedAgentsEventParamsOfUserToolConfirmation`
    * `BetaManagedAgentsEventParamsOfUserDefineOutcome`
    * `BetaManagedAgentsDeploymentInitialEventParamsOfUserDefineOutcome`
    * `BetaManagedAgentsMultiagentRosterEntryParamsOfBetaManagedAgentsAgents`
    * `BetaManagedAgentsMultiagentRosterEntryParamsOfBetaManagedAgentsAdvisors`

    Эти четыре не принимали других аргументов, поэтому они удалены. Присвойте полю объединения указатель на пустую структуру, например `BetaManagedAgentsEventParamsUnion{OfUserInterrupt: &anthropic.BetaManagedAgentsUserInterruptEventParams{}}`:

    * `BetaManagedAgentsEventParamsOfUserInterrupt`
    * `BetaManagedAgentsMultiagentRosterEntryParamsOfBetaManagedAgentsMultiagentSelfs`
    * `BetaManagedAgentsCredentialNetworkingParamsOfUnrestricted`
    * `BetaOutputBehaviorParamOfCreateNew`
  </Tab>

  <Tab title="Java">
    Пример такого перечисления — вложенный класс `BetaManagedAgentsTextBlock.Type` с единственным членом `TEXT`. Почти все они являются полем `type` класса в `com.anthropic.models.beta`: `agents`, `deploymentruns`, `deployments`, `dreams`, `environments`, `memorystores`, `sessions`, `userprofiles` и `vaults`. В v3 эти поля имеют тип `JsonValue`, который заполняет builder, как это уже было у `TextBlockParam`. Необязательное поле, например `type` у `BetaManagedAgentsBashToolConfigParams`, сохраняет своё перечисление.

    При создании объекта удалите этот вызов:

    ```java
    // До
    BetaManagedAgentsTextBlock block = BetaManagedAgentsTextBlock.builder()
        .type(BetaManagedAgentsTextBlock.Type.TEXT)
        .text("Hello Claude!")
        .build();

    // После
    BetaManagedAgentsTextBlock block = BetaManagedAgentsTextBlock.builder()
        .text("Hello Claude!")
        .build();
    ```

    Класс, у которого осталось одно обязательное поле, также получает фабричный метод, принимающий его, поэтому `BetaManagedAgentsTextBlock.of("Hello Claude!")` тоже работает. Класс, у которого не осталось ни одного, теряет `of(type)`, а его объединения теряют перегрузку, принимавшую перечисление, например `ofAlwaysAllow(type)`. Создавайте его с помощью `BetaManagedAgentsAlwaysAllowPolicy.builder().build()`.

    При чтении `type()` больше нет, а `_type()` возвращает `com.anthropic.core.JsonValue`:

    ```java
    // До
    if (message.type().equals(BetaManagedAgentsAgentMessageEvent.Type.AGENT_MESSAGE)) {}

    // После
    if (message._type().equals(JsonValue.from("agent.message"))) {}
    ```

    Чтобы различать варианты объединения, продолжайте использовать его методы `is*()` и `as*()` и его visitor, которые не изменились.
  </Tab>

  <Tab title="PHP">
    Пример такого варианта перечисления — `Anthropic\Beta\Sessions\Events\ManagedAgentsTextBlock\Type::TEXT`. Почти все они являются полем `type` класса Managed Agents в `Anthropic\Beta`. Теперь эти свойства являются строкой с этим единственным значением по умолчанию, как это уже было с `type` у `Anthropic\Messages\TextBlockParam`. Необязательное свойство, например `type` у `Anthropic\Beta\Environments\BetaPackages`, сохраняет своё перечисление.

    `with()` больше не принимает `type`. Удалите его: PHP выбрасывает «Unknown named parameter» для оставшегося `type:`, а при позиционном вызове аргументы после него сдвигаются на одну позицию.

    ```php
    // До
    ManagedAgentsTextBlock::with(text: 'Hello Claude!', type: Type::TEXT);

    // После
    ManagedAgentsTextBlock::with(text: 'Hello Claude!');
    ```

    Там, где вы сравнивали с вариантом перечисления, сравнивайте со строкой:

    ```php
    // До
    $event->type === Type::AGENT_MESSAGE->value;

    // После
    $event->type === 'agent.message';
    ```

    * `withType()` и аргумент `type` у `$client->beta->sessions->resources->add()` теперь принимают только строку. В `add()` по умолчанию используется `'file'`, поэтому его можно опустить.
    * Запросы, которые вы пишете в виде массивов, не меняются, и в них по-прежнему нужен `'type'`.
  </Tab>

  <Tab title="Ruby">
    Пример такой константы перечисления — `Anthropic::Beta::Sessions::BetaManagedAgentsTextBlock::Type::TEXT`. Почти все они являются полем `type` класса Managed Agents в `Anthropic::Beta`. В v2 эти поля объявлены как константа, как это уже было с `type` у `Anthropic::TextBlockParam`. Необязательное поле, например `type` у `Anthropic::Beta::BetaManagedAgentsGlobToolConfigParams`, сохраняет своё перечисление.

    Замените удалённую константу её символом:

    ```ruby
    # До
    event.type == Anthropic::Beta::Sessions::BetaManagedAgentsAgentMessageEvent::Type::AGENT_MESSAGE

    # После
    event.type == :"agent.message"
    ```

    Запросы, которые вы пишете в виде хешей, не меняются, и в них по-прежнему нужен `type`:

    ```ruby
    client.beta.sessions.events.send_(
      session.id,
      events: [{type: "user.message", content: [{type: "text", text: "Hello Claude!"}]}]
    )
    ```

    При создании экземпляра модели `type:` теперь имеет значение по умолчанию, поэтому его можно опустить: `Anthropic::Beta::Sessions::BetaManagedAgentsTextBlock.new(text: "Hello Claude!")`. То же относится к ключевому аргументу `type:` у `client.beta.sessions.resources.add`.

    Если вы проверяете типы с помощью Sorbet, псевдонимы `Type::OrSymbol` и `Type::TaggedSymbol` этих модулей удалены вместе с ними, а поля имеют тип `Symbol`. `OrSymbol` также допускал `String`, поэтому `.new(type: "text")` больше не проходит проверку типов. Уберите ключевой аргумент или передайте `:text`. В RBS псевдоним `type_` каждого класса удалён, а поле является литералом, например `:text`.
  </Tab>
</Tabs>

### Клиентское сжатие удалено из tool runner

Это изменение затрагивает SDK для TypeScript и Ruby. «Compaction» (сжатие) на стороне клиента в «tool runner» (средство запуска инструментов) удалено в пользу сжатия на стороне сервера, которое суммирует разговор внутри API, а не с помощью дополнительного запроса от клиента.

<Tabs exclude="shell, python, csharp, go, java, php">
  <Tab title="TypeScript">
    Параметр `compactionControl` и модуль `@anthropic-ai/sdk/lib/tools/CompactionControl` удалены. Параметр перестал работать в v0.129.0, где его передача вызывала `AnthropicError`. Его нет в типе параметров, поэтому TypeScript сообщает о нём как о неизвестном свойстве.

    Чтобы по-прежнему выполнять сжатие автоматически при достижении порога токенов:

    ```typescript
    // До
    const runner = client.beta.messages.toolRunner({
      // ...
      compactionControl: { enabled: true, contextTokenThreshold: 100_000 }
    });

    // После
    const runner = client.beta.messages.toolRunner({
      // ...
      betas: ["compact-2026-01-12"],
      context_management: {
        edits: [{ type: "compact_20260112", trigger: { type: "input_tokens", value: 100_000 } }]
      }
    });
    ```

    Чтобы самостоятельно решать, когда сжимать разговор, вызывайте [`runner.compactBeforeNextTurn()`](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/helpers.md#compaction).
  </Tab>

  <Tab title="Ruby">
    Параметр `compaction_control:` удалён. Он перестал работать в v1.74.0, где его передача вызывала `ArgumentError`.

    Чтобы по-прежнему выполнять сжатие автоматически при достижении порога токенов:

    ```ruby
    # До
    runner = client.beta.messages.tool_runner(
      # ...
      compaction_control: {enabled: true, context_token_threshold: 100_000}
    )

    # После
    runner = client.beta.messages.tool_runner(
      # ...
      betas: ["compact-2026-01-12"],
      context_management: {
        edits: [{type: :compact_20260112, trigger: {type: :input_tokens, value: 100_000}}]
      }
    )
    ```

    Чтобы самостоятельно решать, когда сжимать разговор, вызывайте [`#compact_before_next_turn`](https://github.com/anthropics/anthropic-sdk-ruby/blob/main/helpers.md#compact_before_next_turn---compact-the-conversation) у runner.
  </Tab>
</Tabs>

Порог срабатывания должен составлять не менее 50 000 токенов. Другие параметры (`pause_after_compaction`, пользовательские `instructions`) описаны в разделе [сжатие](https://platform.claude.com/docs/ru/build-with-claude/compaction-threshold).

### Text Completions удалён

Устаревший Text Completions API удалён из SDK для TypeScript, Go, Java и Ruby, а также из CLI. Новые модели и функции его не поддерживают. Вместо него используйте [Messages API](https://platform.claude.com/docs/ru/api/messages).

<Tabs exclude="shell:cURL, python, csharp, php">
  <Tab title="CLI">
    Команда `ant completions create` удалена.

    ```bash
    # До
    ant completions create \
      --model "$MODEL" \
      --max-tokens-to-sample 1024 \
      --prompt $'\n\nHuman: Hello, Claude\n\nAssistant:'

    # После
    ant messages create \
      --model "$MODEL" \
      --max-tokens 1024 \
      --message '{role: user, content: "Hello, Claude"}'
    ```

    Текст ответа перемещается из поля `completion` в `content.0.text`, поэтому скрипт, который передавал `--transform completion`, теперь передаёт `--transform content.0.text`.

    `ant messages create` также принимает `--stream`, но его события имеют другую структуру: текст приходит в `delta.text` событий `content_block_delta`, поэтому `--transform content.0.text` не применяется к потоку.
  </Tab>

  <Tab title="TypeScript">
    `client.completions` удалён вместе с классом ресурса `Completions` и типами `Completion`, `CompletionCreateParams`, `CompletionCreateParamsNonStreaming` и `CompletionCreateParamsStreaming`. У `AnthropicBedrock` также больше нет свойства `completions`. Константы `HUMAN_PROMPT` и `AI_PROMPT`, которые использовались только в подсказках Text Completions, тоже удалены — как из экспортов, так и из статических свойств клиента.

    ```typescript
    // До
    const completion = await client.completions.create({
      model,
      max_tokens_to_sample: 1024,
      prompt: "\n\nHuman: Hello, Claude\n\nAssistant:"
    });
    console.log(completion.completion);

    // После
    const message = await client.messages.create({
      model,
      max_tokens: 1024,
      messages: [{ role: "user", content: "Hello, Claude" }]
    });
    console.log(message.content);
    ```

    `client.completions.create({ ..., stream: true })` превращается в `client.messages.create({ ..., stream: true })` или `client.messages.stream({ ... })`.
  </Tab>

  <Tab title="Go">
    `client.Completions` удалён вместе с `CompletionService`, `NewCompletionService`, `CompletionNewParams` и `Completion`. У `aws.Client` также больше нет поля `Completions`. `bedrock.DefaultEndpoints` больше не содержит `/v1/complete`.

    ```go
    // До
    completion, err := client.Completions.New(ctx, anthropic.CompletionNewParams{
    	Model:             model,
    	MaxTokensToSample: 1024,
    	Prompt:            "\n\nHuman: Hello, Claude\n\nAssistant:",
    })
    fmt.Println(completion.Completion)

    // После
    message, err := client.Messages.New(ctx, anthropic.MessageNewParams{
    	Model:     model,
    	MaxTokens: 1024,
    	Messages: []anthropic.MessageParam{
    		anthropic.NewUserMessage(anthropic.NewTextBlock("Hello, Claude")),
    	},
    })
    fmt.Println(message.Content[0].Text)
    ```

    `client.Completions.NewStreaming` превращается в `client.Messages.NewStreaming`.
  </Tab>

  <Tab title="Java">
    `client.completions()` удалён из `AnthropicClient` и `AnthropicClientAsync` вместе с `CompletionService`, `CompletionServiceAsync` и пакетом `com.anthropic.models.completions` (`CompletionCreateParams` и `Completion`).

    ```java
    // До
    CompletionCreateParams params = CompletionCreateParams.builder()
        .model(model)
        .maxTokensToSample(1024)
        .prompt("\n\nHuman: Hello, Claude\n\nAssistant:")
        .build();

    System.out.println(client.completions().create(params).completion());

    // После
    MessageCreateParams params = MessageCreateParams.builder()
        .model(model)
        .maxTokens(1024)
        .addUserMessage("Hello, Claude")
        .build();

    client.messages().create(params).content().stream()
        .flatMap(contentBlock -> contentBlock.text().stream())
        .forEach(textBlock -> System.out.println(textBlock.text()));
    ```

    `client.completions().createStreaming` превращается в `client.messages().createStreaming`.
  </Tab>

  <Tab title="Ruby">
    `client.completions` удалён вместе с `Anthropic::Resources::Completions`, `Anthropic::CompletionCreateParams` и `Anthropic::Completion`. У `Anthropic::BedrockClient` также больше нет метода чтения `completions`. В `Anthropic::BedrockMantleClient` и `Anthropic::GoogleCloudClient`, где `completions` вызывал `NotImplementedError`, этого метода больше не существует.

    ```ruby
    # До
    completion = client.completions.create(
      model: model,
      max_tokens_to_sample: 1024,
      prompt: "\n\nHuman: Hello, Claude\n\nAssistant:"
    )
    puts(completion.completion)

    # После
    message = client.messages.create(
      model: model,
      max_tokens: 1024,
      messages: [{role: "user", content: "Hello, Claude"}]
    )
    puts(message.content)
    ```

    `client.completions.create_streaming` превращается в `client.messages.stream`.
  </Tab>
</Tabs>

### `betas` удалён из не-бета методов Models

Не-бета методы Models больше не принимают `betas` (csharp, go: `Betas`; java: `.addBeta()`), а команды `ant models` больше не принимают `--beta`. Чтобы отправлять бета-заголовки, вызывайте те же методы у `client.beta.models` (csharp, go: `client.Beta.Models`; java: `client.beta().models()`; php: `$client->beta->models`) или используйте `ant beta:models` в CLI. В SDK эти методы возвращают `BetaModelInfo` (ruby: `Anthropic::Beta::BetaModelInfo`), тогда как не-бета методы возвращают `ModelInfo` (ruby: `Anthropic::ModelInfo`).

<Tabs exclude="shell:cURL">
  <Tab title="CLI">
    ```bash
    # До
    ant models list --beta "$BETA"

    # После
    ant beta:models list --beta "$BETA"
    ```
  </Tab>

  <Tab title="Python">
    `client.models.retrieve()` и `client.models.list()` больше не принимают `betas` (его передача вызывает `TypeError`, и средство проверки типов отмечает это), а у `anthropic.types.ModelListParams` больше нет ключа `betas`.

    ```python
    # До
    page = client.models.list(betas=[beta])

    # После
    page = client.beta.models.list(betas=[beta])
    ```
  </Tab>

  <Tab title="TypeScript">
    У `Anthropic.ModelRetrieveParams` и `Anthropic.ModelListParams` больше нет свойства `betas`.

    ```typescript
    // До
    const page = await client.models.list({ betas: [beta] });

    // После
    const page = await client.beta.models.list({ betas: [beta] });
    ```
  </Tab>

  <Tab title="C#">
    У `ModelRetrieveParams` и `ModelListParams` в `Anthropic.Models.Models` больше нет свойства `Betas`. Методы `client.Beta.Models` принимают одноимённые классы из `Anthropic.Models.Beta.Models`.

    ```csharp
    // До
    using Anthropic.Models.Models;

    var page = await client.Models.List(new ModelListParams { Betas = [beta] });

    // После
    using Anthropic.Models.Beta.Models;

    var page = await client.Beta.Models.List(new ModelListParams { Betas = [beta] });
    ```
  </Tab>

  <Tab title="Go">
    У `ModelGetParams` и `ModelListParams` больше нет поля `Betas`.

    ```go
    // До
    page, err := client.Models.List(ctx, anthropic.ModelListParams{
    	Betas: []anthropic.AnthropicBeta{beta},
    })

    // После
    page, err := client.Beta.Models.List(ctx, anthropic.BetaModelListParams{
    	Betas: []anthropic.AnthropicBeta{beta},
    })
    ```
  </Tab>

  <Tab title="Java">
    У `ModelRetrieveParams` и `ModelListParams` в `com.anthropic.models.models` больше нет `betas()`, а у их builder больше нет `betas` и `addBeta`. Методы `client.beta().models()` принимают одноимённые классы из `com.anthropic.models.beta.models`.

    ```java
    // До
    import com.anthropic.models.models.ModelListPage;
    import com.anthropic.models.models.ModelListParams;

    ModelListPage page = client.models().list(ModelListParams.builder().addBeta(beta).build());

    // После
    import com.anthropic.models.beta.models.ModelListPage;
    import com.anthropic.models.beta.models.ModelListParams;

    ModelListPage page = client.beta().models().list(ModelListParams.builder().addBeta(beta).build());
    ```
  </Tab>

  <Tab title="PHP">
    `$client->models->retrieve()` и `$client->models->list()` больше не принимают `betas` (его передача выбрасывает `Error: Unknown named parameter $betas`), а у `Anthropic\Models\ModelRetrieveParams` и `Anthropic\Models\ModelListParams` больше нет свойства `betas`.

    ```php
    // До
    $page = $client->models->list(betas: [$beta]);

    // После
    $page = $client->beta->models->list(betas: [$beta]);
    ```

    Если вы передаёте аргументы по позиции, `workspaceID` и `requestOptions` в обоих методах сдвигаются на одну позицию вперёд.
  </Tab>

  <Tab title="Ruby">
    `client.models.retrieve` и `client.models.list` больше не принимают `betas:`, а у `Anthropic::ModelRetrieveParams` и `Anthropic::ModelListParams` больше нет поля `betas`.

    ```ruby
    # До
    page = client.models.list(betas: [beta])

    # После
    page = client.beta.models.list(betas: [beta])
    ```

    Передача `betas:` в `client.models` не вызывает исключения, но больше не устанавливает заголовок `anthropic-beta`.
  </Tab>
</Tabs>

### Ключи API отправляются как `Authorization: Bearer`

SDK и CLI отправляют ваш ключ API как `Authorization: Bearer <key>` вместо заголовка `X-Api-Key`, поэтому измените любой «proxy» (прокси) или шлюз, который читает или устанавливает `X-Api-Key`, чтобы он использовал `Authorization`, или [отправляйте ключ в `X-Api-Key` самостоятельно](https://platform.claude.com/docs/ru/api/migration-2026-10-21#sdk-proxy-x-api-key). Claude API принимает ключ в любом из этих заголовков, поэтому программе, которая обращается к API напрямую, ничего менять не нужно.

```text wrap
# Before
X-Api-Key: <key>

# After
Authorization: Bearer <key>
```

<Tabs>
  <Tab title="CLI">
    Это относится к ключу в `ANTHROPIC_API_KEY` и к ключу, переданному через конвейер в `--api-key-stdin`.

    С `--debug` журнал запросов теперь показывает `Authorization: Bearer <REDACTED>` там, где раньше показывал `X-Api-Key: <REDACTED>`.
  </Tab>

  <Tab title="Python">
    `Authorization` — это заголовок, который уже использует `auth_token`.

    Это относится к аргументу `api_key` и переменной окружения `ANTHROPIC_API_KEY` у `Anthropic` и `AsyncAnthropic`, а также к `api_key` и `ANTHROPIC_AWS_API_KEY` у `AnthropicAWS`. `AnthropicFoundry` по-прежнему отправляет свой ключ как `x-api-key`, а `AnthropicBedrockMantle` уже отправлял bearer-токен.
  </Tab>

  <Tab title="TypeScript">
    `Authorization` — это заголовок, который уже использует параметр `authToken`.

    Это относится к параметру `apiKey`, переменной окружения `ANTHROPIC_API_KEY`, а также к `apiKey` и `ANTHROPIC_AWS_API_KEY` в `@anthropic-ai/aws-sdk`. `apiKey` в `@anthropic-ai/foundry-sdk` по-прежнему отправляется как `X-Api-Key`, а `apiKey` в `@anthropic-ai/bedrock-sdk` уже был bearer-токеном.

    «Middleware» (промежуточное ПО) или пользовательский `fetch`, который читает ключ из заголовка запроса `x-api-key`, должен вместо этого читать `authorization`, где ключ следует за `Bearer `.
  </Tab>

  <Tab title="C#">
    `Authorization` — это заголовок, который уже использует `AuthToken`.

    Это относится к `ApiKey` в `AnthropicClient` и `ClientOptions`, а также к переменной окружения `ANTHROPIC_API_KEY`. В выпуске `Anthropic.Aws`, зависящем от v13, это также относится к `ApiKey` в `AwsClientOptions` и к `ANTHROPIC_AWS_API_KEY`. `AnthropicFoundryApiKeyCredentials` по-прежнему отправляет свой ключ как `x-api-key`, а `ApiKey` в `MantleAwsClientOptions` уже был bearer-токеном.
  </Tab>

  <Tab title="Go">
    Это относится к `option.WithAPIKey`, переменной окружения `ANTHROPIC_API_KEY` и `APIKey` в `aws.ClientConfig` (или `ANTHROPIC_AWS_API_KEY`). `APIKey` в `foundry.ClientConfig` (или `ANTHROPIC_FOUNDRY_API_KEY`) по-прежнему отправляется как `X-Api-Key`, а `APIKey` в `bedrock.MantleClientConfig` уже был bearer-токеном.
  </Tab>

  <Tab title="Java">
    `Authorization` — это заголовок, который уже использует `authToken`.

    Это относится к `apiKey` в builder `AnthropicOkHttpClient`, `AnthropicOkHttpClientAsync` и `AnthropicBackend`, к переменной окружения `ANTHROPIC_API_KEY` и к системному свойству `anthropic.apiKey`. `apiKey` в builder `FoundryBackend` по-прежнему отправляется как `x-api-key`. `apiKey` в builder `AwsBackend`, `BedrockBackend` и `BedrockMantleBackend` уже был bearer-токеном.

    Перехватчик теперь видит ключ в `Authorization` вместо `X-Api-Key`.
  </Tab>

  <Tab title="PHP">
    `Authorization` — это заголовок, который уже использует `authToken`.

    Это относится к аргументу `apiKey` и переменной окружения `ANTHROPIC_API_KEY` у `Anthropic\Client`, а также к `apiKey` и `ANTHROPIC_AWS_API_KEY` у `Anthropic\Aws\Client`. `Anthropic\Foundry\Client` по-прежнему отправляет свой ключ как `x-api-key`, а `Anthropic\Bedrock\MantleClient` уже отправлял bearer-токен.
  </Tab>

  <Tab title="Ruby">
    `Authorization` — это заголовок, который уже использует `auth_token:`.

    Это относится к аргументу `api_key:` и переменной окружения `ANTHROPIC_API_KEY` у `Anthropic::Client`, а также к `api_key:` и `ANTHROPIC_AWS_API_KEY` у `Anthropic::AWSClient`. `Anthropic::BedrockMantleClient` уже отправлял bearer-токен.

    SDK удаляет `Authorization` при переходе по перенаправлению на другой источник, включая перенаправление с `http` на `https` на том же хосте. Теперь ключ в этом случае тоже удаляется.
  </Tab>
</Tabs>

#### Если прокси или шлюз читает `X-Api-Key`

<Tabs exclude="shell:cURL">
  <Tab title="CLI">
    Если `--base-url` или `ANTHROPIC_BASE_URL` направляет `ant` на прокси или шлюз, который читает `X-Api-Key`, измените его так, чтобы он читал ключ из `Authorization`. У `ant` нет флага или переменной окружения для добавления собственного заголовка, поэтому он не может отправить `X-Api-Key`.
  </Tab>

  <Tab title="Python">
    Верните ключ на прежнее место с помощью функции `auth` в HTTP-клиенте. Она выполняется для каждого запроса, который отправляет клиент, включая повторные попытки:

    ```python
    import httpx2
    from anthropic import Anthropic, DefaultHttpxClient


    def send_x_api_key(request: httpx2.Request) -> httpx2.Request:
        if request.headers.get("Authorization") == f"Bearer {api_key}":
            del request.headers["Authorization"]
            request.headers["X-Api-Key"] = api_key
        return request


    client = Anthropic(api_key=api_key, http_client=DefaultHttpxClient(auth=send_x_api_key))
    ```

    `AsyncAnthropic` принимает ту же функцию в `http_client=DefaultAsyncHttpxClient(auth=send_x_api_key)`.
  </Tab>

  <Tab title="TypeScript">
    Установите заголовок самостоятельно. `Authorization: null` также предотвращает отправку ключа в этом заголовке:

    ```typescript
    const client = new Anthropic({
      apiKey,
      defaultHeaders: { "X-Api-Key": apiKey, Authorization: null }
    });
    ```

    Если учётные данные добавляет прокси, а у вашего клиента их нет, v0 позволял указать это с помощью `"X-Api-Key": null` или `Authorization: null` в `defaultHeaders`. v1 принимает только `Authorization: null`.

    Опрашивающий процесс и обработчик заданий окружения получают собственный ключ, поэтому они не включают заголовки по умолчанию `X-Api-Key` и `Authorization` в свои запросы.
  </Tab>

  <Tab title="C#">
    Установите заголовок самостоятельно с помощью `ExtraHeaders`. Установка `ApiKey` и `AuthToken` в `null` также предотвращает отправку учётных данных, найденных в `ANTHROPIC_API_KEY` или `ANTHROPIC_AUTH_TOKEN`:

    ```csharp
    AnthropicClient client = new(
        new ClientOptions
        {
            ApiKey = null,
            AuthToken = null,
            ExtraHeaders = new Dictionary<string, string> { ["X-Api-Key"] = apiKey },
        }
    );
    ```
  </Tab>

  <Tab title="Go">
    Установите заголовок самостоятельно. `option.WithHeaderDel` также предотвращает отправку ключа, найденного в `ANTHROPIC_API_KEY`:

    ```go
    client := anthropic.NewClient(
    	option.WithHeader("X-Api-Key", apiKey),
    	option.WithHeaderDel("Authorization"),
    )
    ```

    `environments.WorkPoller` и `environments.EnvironmentWorker` получают собственный ключ, поэтому они не включают установленный вручную `X-Api-Key` в свои запросы.
  </Tab>

  <Tab title="Java">
    Установите заголовок самостоятельно вместо вызова `apiKey`:

    ```java
    AnthropicClient client = AnthropicOkHttpClient.builder()
        .putHeader("X-Api-Key", apiKey)
        .build();
    ```
  </Tab>

  <Tab title="PHP">
    Верните ключ на прежнее место с помощью middleware:

    ```php
    use Anthropic\Client;
    use Psr\Http\Message\RequestInterface;
    use Psr\Http\Message\ResponseInterface;

    $sendXApiKey = fn (RequestInterface $request, callable $next): ResponseInterface => $next(
        $request->withoutHeader('Authorization')->withHeader('X-Api-Key', $apiKey)
    );

    $client = new Client(apiKey: $apiKey, requestOptions: ['middleware' => [$sendXApiKey]]);
    ```

    Не используйте для этого `extraHeaders` клиента. Запрос, у которого есть собственные `extraHeaders`, заменяет ими заголовки клиента, а они есть у каждой конечной точки в `$client->beta`, которой нужен бета-заголовок.
  </Tab>

  <Tab title="Ruby">
    Верните ключ на прежнее место с помощью middleware:

    ```ruby
    send_x_api_key = lambda do |req, nxt|
      next nxt.call(req) unless req.headers["authorization"] == "Bearer #{api_key}"
      nxt.call(req.with(headers: {**req.headers.except("authorization"), "x-api-key" => api_key}))
    end

    client = Anthropic::Client.new(api_key: api_key, middleware: send_x_api_key)
    ```

    Первая строка оставляет запрос без изменений, если он не содержит ключа, например если он был перенаправлен на другой источник.

    `Anthropic::AWSClient` не принимает аргумент `middleware:`. Вместо этого передавайте middleware с каждым запросом как `request_options: {middleware: send_x_api_key}`.
  </Tab>
</Tabs>

#### Если вы устанавливали или удаляли `X-Api-Key` в запросе

Это изменение затрагивает SDK для Python, TypeScript, Go, PHP и Ruby.

Если вы удаляли `X-Api-Key`, чтобы запрос отправлял только токен аутентификации, удалите этот код, а не изменяйте его, потому что удаление `Authorization` удалит и токен. [Клиент хранит одни учётные данные](https://platform.claude.com/docs/ru/api/migration-2026-10-21#sdk-one-credential), поэтому убедитесь, что это именно токен: если в коде ничего не передано, а заданы и `ANTHROPIC_API_KEY`, и `ANTHROPIC_AUTH_TOKEN`, клиент использует ключ.

<Tabs exclude="shell, csharp, java">
  <Tab title="Python">
    Код, который передаёт `extra_headers={"X-Api-Key": omit}`, чтобы не отправлять ключ в запросе, больше этого не делает. Вместо этого передавайте `extra_headers={"Authorization": omit}`.

    `extra_headers={"X-Api-Key": other_key}` больше не заменяет ключ клиента: отправляются оба ключа. Чтобы отправить другой ключ с одним запросом, передайте `extra_headers={"Authorization": f"Bearer {other_key}"}`.
  </Tab>

  <Tab title="TypeScript">
    `headers: { "X-Api-Key": otherKey }` в параметрах запроса больше не заменяет ключ клиента: отправляются оба ключа. Чтобы отправить другой ключ с одним запросом, передайте ``headers: { Authorization: `Bearer $\{otherKey}` }``.
  </Tab>

  <Tab title="Go">
    `option.WithHeaderDel("X-Api-Key")` больше не предотвращает отправку ключа в запросе. Вместо этого удаляйте `Authorization`:

    ```go
    // До
    client.Messages.New(ctx, params, option.WithHeaderDel("X-Api-Key"))

    // После
    client.Messages.New(ctx, params, option.WithHeaderDel("Authorization"))
    ```

    `option.WithHeader("X-Api-Key", otherKey)` больше не заменяет ключ клиента: отправляются оба ключа. Чтобы отправить другой ключ с одним запросом, передайте `option.WithAPIKey(otherKey)`.
  </Tab>

  <Tab title="PHP">
    `'extraHeaders' => ['X-Api-Key' => null]` больше не предотвращает отправку ключа в запросе. Чтобы отправить запрос без учётных данных, установите вместо этого `Authorization` в `null` или удалите его в middleware, если вы делали это для всего клиента.

    `'extraHeaders' => ['X-Api-Key' => $otherKey]` больше не заменяет ключ клиента: отправляются оба ключа. Чтобы отправить другой ключ с одним запросом, установите `Authorization` в `"Bearer {$otherKey}"`.
  </Tab>

  <Tab title="Ruby">
    `extra_headers: {"x-api-key" => nil}` больше не предотвращает отправку ключа в запросе. Вместо этого установите `"authorization"` в `nil`. Чтобы отправить другой ключ с одним запросом, установите `"authorization"` в `"Bearer #{other_key}"`, а не `"x-api-key"`.
  </Tab>
</Tabs>

### Клиент хранит одни учётные данные

Ключ API и токен аутентификации теперь используют один заголовок, поэтому клиент SDK хранит одни учётные данные. Если в коде ничего не передано, клиент следует порядку [приоритета учётных данных](https://platform.claude.com/docs/ru/manage-claude/wif-reference#credential-precedence).

<Tabs exclude="shell">
  <Tab title="Python">
    v1 отправлял и ключ API, и токен аутентификации, если у клиента были оба, каждый в своём заголовке. Учётные данные — это одно из `api_key`, `auth_token`, `credentials`, `config` или `profile`.

    * **Передавайте не более одного.** Два или более в конструкторе или в одном вызове `copy()` или `with_options()` вызывают `ValueError`. `None` не учитывается. v1 вызывал `TypeError`, и только для двух из `credentials`, `config` и `profile`.
    * **Переданные вами данные — единственные.** Как и в v1, клиент не ищет другие в окружении или на диске.
    * **Если ничего не передано, используется только первое заданное из следующего:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, профиль, названный в `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, активный профиль на диске (тот, который назван в файле `active_config`, иначе `default`). Если заданы обе первые переменные, клиент один раз записывает предупреждение в журнал. v1 использовал активный профиль раньше переменных федерации, если была задана `ANTHROPIC_CONFIG_DIR` или существовал файл `active_config`; задайте `ANTHROPIC_PROFILE`, чтобы продолжить его использовать.
    * **`copy()` и `with_options()` заменяют.** Переданные вами учётные данные заменяют собственные данные клиента, какого бы вида ни были те и другие. Базовый URL и заголовки, полученные из конфигурации или профиля старых учётных данных, уходят вместе с ними, и используются те, что относятся к новым учётным данным. Базовый URL, который вы передали, сохраняется.

    ```python
    client = Anthropic(api_key=key, auth_token=token)

    # До: отправлялись `X-Api-Key: <key>` и `Authorization: Bearer <token>`
    # После: выбрасывается `ValueError`
    ```

    Клиенты платформ сохраняют собственные правила. `AnthropicAWS` принимает `auth_token` вместе с `api_key` без ошибки и отправляет ключ.

    Подробности — в строках документации `Anthropic.__init__` и `Anthropic.copy` в [`_client.py`](https://github.com/anthropics/anthropic-sdk-python/blob/main/src/anthropic/_client.py).

    Если вы полагались на отправку обоих, например токена для шлюза и ключа для API за ним, передайте токен как `auth_token` и задайте `X-Api-Key` в `default_headers`. Настройте шлюз так, чтобы он удалял свой заголовок `Authorization` перед пересылкой запроса. Claude API ожидает одни учётные данные на запрос.
  </Tab>

  <Tab title="TypeScript">
    В v0 клиент, у которого были и ключ API, и токен аутентификации, отправлял оба, каждый в своём заголовке. Учётные данные — это одно из `apiKey`, `authToken`, `credentials`, `config` или `profile`.

    * **Передавайте не более одного.** Два или более в `new Anthropic()` или в одном вызове `withOptions()` выбрасывают `TypeError`. `null` и `undefined` не учитываются.
    * **Переданные вами данные — единственные.** Клиент не ищет другие в окружении или на диске.
    * **Если ничего не передано, используется первое из следующего:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, профиль, названный в `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, активный профиль на диске (тот, который назван в файле `active_config`, иначе `default`). Если заданы обе первые переменные, клиент один раз записывает предупреждение в журнал. В v0 активный профиль шёл раньше переменных федерации. `ANTHROPIC_PROFILE`, указывающая на отсутствующий профиль, в v0 пропускалась, а теперь первый запрос выбрасывает `AnthropicError`. `loadConfig()` без аргумента следует тому же порядку и выбрасывает ту же ошибку.
    * **`withOptions` заменяет.** Переданные вами учётные данные заменяют данные копируемого клиента, поэтому `client.withOptions({ authToken })` больше не требует `apiKey: null` рядом.
    * **Клиент платформы принимает только учётные данные своей платформы.** Клиенты AWS, Bedrock и Foundry, а также `AnthropicVertex` выбрасывают `AnthropicError` для параметра учётных данных, с которым они не выполняют аутентификацию, как уже делал `AnthropicGoogleCloud`. В клиентах AWS и Bedrock `apiKey: null` теперь очищает ключ, поэтому клиент подписывает запросы учётными данными AWS. `AnthropicBedrock` хранит свой ключ в `client.apiKey`, тогда как v0 хранил его в `client.authToken`.

    ```typescript
    // До: отправлялся ключ API, а `credentials` игнорировался
    const client = new Anthropic({ apiKey, credentials });

    // После: строка выше выбрасывает TypeError
    const client = new Anthropic({ credentials });
    ```

    Комментарии документации к [`ClientOptions`](https://github.com/anthropics/anthropic-sdk-typescript/blob/main/src/client.ts) описывают поведение каждого параметра, а комментарий документации к конструктору каждого из этих клиентов платформ перечисляет параметры, которые он отклоняет.

    Если вы полагались на отправку обоих, например токена для шлюза и ключа для API за ним, задайте `X-Api-Key` в `defaultHeaders` и оставьте `authToken`. Настройте шлюз так, чтобы он удалял свой заголовок `Authorization` перед пересылкой запроса. Claude API ожидает одни учётные данные на запрос.
  </Tab>

  <Tab title="C#">
    В v12 клиент, у которого были и ключ API, и токен аутентификации, отправлял оба, каждый в своём заголовке. Учётные данные — это одно из `ApiKey`, `AuthToken` или `ClientOptions.Credentials`.

    * **Передача двух — ошибка.** Задание второго выбрасывает `ArgumentException`. `null` не учитывается, поэтому, чтобы заменить учётные данные в `ClientOptions`, которые вы создали сами, сначала задайте старым значение `null`.
    * **Переданные данные используются, а окружение игнорируется.** Никакие переменные окружения с учётными данными и профили на диске не читаются. Аналогично `AnthropicCredentials.Resolve(profile: "name")` теперь возвращает учётные данные этого профиля, даже если задана `ANTHROPIC_API_KEY` или `ANTHROPIC_AUTH_TOKEN`.
    * **Если ничего не передано, используется первое совпадение в окружении:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, затем активный профиль на диске. Пустая `ANTHROPIC_API_KEY` или `ANTHROPIC_AUTH_TOKEN` считается незаданной. Если заданы обе первые переменные, в stderr один раз выводится предупреждение. Клиент выполняет поиск при первом использовании, поэтому несуществующий `ANTHROPIC_PROFILE` теперь вызывает исключение при первом запросе, а не в конструкторе.
    * **`WithOptions` заменяет.** Учётные данные, переданные в модификаторе, заменяют данные клиента, какого бы вида они ни были, поэтому `AuthToken = token` больше не требует `ApiKey = null` рядом. Если ничего не передано, копия сохраняет учётные данные клиента, `BaseUrl` и `ExtraHeaders`, даже если модификатор возвращает новые `ClientOptions`.

    ```csharp
    // До: отправлялись оба, каждый в своём заголовке
    AnthropicClient client = new() { ApiKey = apiKey, AuthToken = token };

    // После: строка выше выбрасывает ArgumentException
    AnthropicClient client = new() { AuthToken = token };
    ```

    Подробности — в XML-документации к этим трём свойствам [`ClientOptions`](https://github.com/anthropics/anthropic-sdk-csharp/blob/main/src/Anthropic/Core/ClientOptions.cs).

    Клиенты облачных платформ сохраняют учётные данные, с которыми они были созданы. Клиенты Bedrock, Bedrock Mantle, Foundry, Google Cloud и AWS, а также `AnthropicVertexClient` определяют способ аутентификации при создании, и большинство из них использует для этого заголовок `Authorization`. Выпуски этих пакетов, зависящие от v13, игнорируют `ApiKey` или `AuthToken`, заданные через `WithOptions`. Чтобы использовать другой ключ с `AnthropicAwsClient`, создайте новый клиент с `ApiKey` в `AwsClientOptions`.

    Если вы полагались на отправку обоих, например токена для шлюза и ключа для API за ним, задайте `X-Api-Key` через `ExtraHeaders` и оставьте `AuthToken`. Настройте шлюз так, чтобы он удалял свой заголовок `Authorization` перед пересылкой запроса. Claude API ожидает одни учётные данные на запрос.
  </Tab>

  <Tab title="Go">
    В v1 клиент, у которого были и ключ API, и токен аутентификации, отправлял оба, каждый в своём заголовке. Учётные данные берутся из `option.WithAPIKey`, `option.WithAuthToken`, `option.WithConfig`, `option.WithProfile` или `option.WithFederationTokenProvider`.

    * **Передача двух из них в `anthropic.NewClient` — ошибка.** `NewClient` не возвращает ошибку, поэтому с ней завершается каждый запрос клиента. `NewClient` уже применяет `anthropic.DefaultClientOptions()`, поэтому не передавайте его результат дополнительно: учётные данные, найденные им в окружении, тогда считаются переданными вами.
    * **Один из них используется как есть.** Учётные данные не читаются ни из окружения, ни из профиля на диске. В v1 `ANTHROPIC_API_KEY` и `ANTHROPIC_AUTH_TOKEN` имели приоритет над последними тремя.
    * **Если ни один не передан, используется первое заданное из следующего,** в том же порядке, что и в v1: `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, активный профиль на диске. Если заданы обе первые переменные, SDK один раз записывает предупреждение в журнал.
    * **Один из них в запросе заменяет учётные данные клиента для этого запроса,** поэтому `option.WithAuthToken` больше не требует `option.WithHeaderDel("X-Api-Key")` рядом.

    ```go
    // До: ключ API отправлялся, и в журнал записывалось предупреждение
    client := anthropic.NewClient(
    	option.WithAPIKey(apiKey),
    	option.WithProfile("work"),
    )

    // После: каждый запрос клиента выше завершается ошибкой, поэтому передайте нужный
    client := anthropic.NewClient(option.WithAPIKey(apiKey))
    ```

    Предупреждения, которое записывал v1, больше нет, поэтому `option.WithConfigQuiet`, подавлявший его, теперь делает то же, что и `option.WithConfig`, и объявлен устаревшим.

    Подробности — в комментариях документации к `anthropic.NewClient` и `anthropic.DefaultClientOptions` в [`client.go`](https://github.com/anthropics/anthropic-sdk-go/blob/main/client.go).

    Если вы полагались на отправку обоих, например токена для шлюза и ключа для API за ним, задайте `X-Api-Key` через `option.WithHeader` и оставьте `option.WithAuthToken`. Настройте шлюз так, чтобы он удалял свой заголовок `Authorization` перед пересылкой запроса. Claude API ожидает одни учётные данные на запрос.

    `ANTHROPIC_CUSTOM_HEADERS` и `ANTHROPIC_WEBHOOK_SIGNING_KEY` теперь применяются к каждому клиенту, который создаёт `anthropic.NewClient`. В v1 они читались, только если ни окружение, ни профиль на диске не содержали учётных данных.
  </Tab>

  <Tab title="Java">
    В v2 клиент, у которого были и ключ API, и токен аутентификации, отправлял оба, каждый в своём заголовке. Учётные данные — это одно из `apiKey`, `authToken` или `configurationProvider` в построителях `AnthropicOkHttpClient`, `AnthropicOkHttpClientAsync` и `AnthropicBackend`.

    * **Задавайте не более одного.** Если в одном построителе задано два, `build()` выбрасывает `IllegalStateException` с их названиями. `null` или пустой `Optional` не учитываются.
    * **Заданные вами данные — единственные.** `fromEnv()`, вызванный до или после, не берёт учётные данные ни из окружения, ни из профиля на диске. В v2 ключ или токен, найденные `fromEnv()`, могли отправляться дополнительно или вместо них.
    * **Если ничего не задано, `fromEnv()` использует первое найденное из следующего:** `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, активный профиль на диске. Если заданы обе первые переменные, в `System.err` один раз выводится предупреждение. Системные свойства `anthropic.apiKey` и `anthropic.authToken` считаются частью окружения. Пустой ключ или токен, в переменной или системном свойстве, считается незаданным. В v2 `fromEnv()` использовал пустое значение как ключ или токен.

    ```java
    // До: отправлялись оба. В v3 build() выбрасывает IllegalStateException
    AnthropicClient client = AnthropicOkHttpClient.builder()
        .apiKey(apiKey)
        .authToken(authToken)
        .build();

    // После
    AnthropicClient client = AnthropicOkHttpClient.builder()
        .apiKey(apiKey)
        .build();
    ```

    Подробности — в документации `fromEnv()` для этих построителей.

    Если вы полагались на отправку обоих, например токена для шлюза и ключа для API за ним, задайте оба заголовка сами:

    ```java
    AnthropicClient client = AnthropicOkHttpClient.builder()
        .putHeader("Authorization", "Bearer " + gatewayToken)
        .putHeader("X-Api-Key", apiKey)
        .build();
    ```

    Настройте шлюз так, чтобы он удалял свой заголовок `Authorization` перед пересылкой запроса. Claude API ожидает одни учётные данные на запрос.
  </Tab>

  <Tab title="PHP">
    Более ранние версии отправляли и ключ API, и токен аутентификации, если у клиента были оба, каждый в своём заголовке. `Anthropic\Client` принимает одни учётные данные — из `apiKey`, `authToken` или `credentials`:

    * Передача более одного из них выбрасывает `\InvalidArgumentException`. Непереданным считается только `null`. Пустая строка считается переданной, поэтому `new Client(apiKey: '')` не отправляет учётных данных.
    * Если передано одно, оно используется, и учётные данные не читаются ни из окружения, ни из профиля на диске. При заданной `ANTHROPIC_API_KEY` вызов `new Client(authToken: $token)` отправляет токен. Более ранние версии отправляли вместе с ним ключ из окружения.
    * Если ничего не передано, используется первое заданное из следующего: `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, профиль, названный в `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, активный профиль на диске (тот, который назван в файле `active_config`, иначе `default`). Более ранние версии использовали активный профиль раньше переменных федерации и не использовали профиль, если файла `active_config` не было. Они также пропускали `ANTHROPIC_PROFILE`, указывающую на отсутствующий или недопустимый профиль. В этом случае `new Client()` теперь выбрасывает `Anthropic\Core\Exceptions\AnthropicException`. Если заданы и `ANTHROPIC_API_KEY`, и `ANTHROPIC_AUTH_TOKEN`, клиент отправляет ключ, а его свойство `authToken` пусто. Первый клиент, созданный таким образом, также записывает предупреждение через `error_log()` один раз за процесс, что на веб-сервере означает один раз за запрос: `Anthropic: ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN are both set. Using ANTHROPIC_API_KEY.` Чтобы это прекратить, удалите переменную, которую вы не используете.

    ```php
    // Раньше: ключ отправлялся как X-Api-Key, а токен — как Authorization.
    // Теперь: выбрасывается ошибка "Pass at most one of `apiKey`, `authToken`, or `credentials`. Received `apiKey`, `authToken`."
    $client = new Client(apiKey: $key, authToken: $token);
    ```

    Если вы полагались на отправку обоих, например токена для шлюза и ключа для API за ним, передайте токен как `authToken` и добавьте `X-Api-Key` в промежуточном обработчике, подобном описанному в разделе [Если прокси или шлюз читает `X-Api-Key`](https://platform.claude.com/docs/ru/api/migration-2026-10-21#sdk-proxy-x-api-key), без вызова `withoutHeader`. Настройте шлюз так, чтобы он удалял свой заголовок `Authorization` перед пересылкой запроса. Claude API ожидает одни учётные данные на запрос.
  </Tab>

  <Tab title="Ruby">
    Аргументы учётных данных `Anthropic::Client.new` — это `api_key:`, `auth_token:`, `credentials:` и `config:`. Аргумент `nil` считается непереданным. Клиенты платформ сохраняют собственные правила.

    * **Передано два или более:** `Anthropic::Client.new` вызывает `ArgumentError`. Более ранние версии вызывали ошибку только для `credentials:` вместе с `config:`, а в остальных случаях отправляли ключ, если он был, иначе токен.
    * **Передано одно:** клиент использует его и не переходит к учётным данным из окружения или из профиля на диске.
    * **Ничего не передано:** клиент использует первое найденное из следующего: `ANTHROPIC_API_KEY`, `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_PROFILE`, переменные федерации удостоверений рабочих нагрузок, активный профиль на диске. Порядок не изменился, но если заданы и `ANTHROPIC_API_KEY`, и `ANTHROPIC_AUTH_TOKEN`, `client.auth_token` теперь равен `nil`. Пустая `ANTHROPIC_API_KEY` или `ANTHROPIC_AUTH_TOKEN` теперь считается незаданной, тогда как в более ранних версиях пустая `ANTHROPIC_API_KEY` скрывала токен и всё, что шло после него.

    Если учётные данные не переданы и заданы и `ANTHROPIC_API_KEY`, и `ANTHROPIC_AUTH_TOKEN`, SDK также один раз за процесс выводит предупреждение в стандартный поток ошибок через `Kernel#warn`: `Anthropic: ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN are both set. Using ANTHROPIC_API_KEY.` Чтобы отключить его, удалите переменную, которую вы не используете.

    ```ruby
    # Раньше: отправлялся ключ, а токен игнорировался.
    # Теперь: ArgumentError, "Pass at most one of `api_key:`, `auth_token:`, `credentials:`, or `config:`. Received `api_key:`, `auth_token:`."
    Anthropic::Client.new(api_key: api_key, auth_token: auth_token)

    # Передайте только тот, который нужно отправить.
    Anthropic::Client.new(api_key: api_key)
    ```
  </Tab>
</Tabs>

### Изменения в одном SDK или CLI

Каждое из этих изменений затрагивает один SDK или CLI.

<Tabs exclude="shell:cURL, python, typescript, go, ruby">
  <Tab title="CLI">
    **`--api-key` и `--auth-token` удалены.** `ant` больше не принимает ключ API или токен аутентификации как значение флага, поскольку значение в командной строке видно в истории оболочки и в списках процессов. Оба флага выводят предупреждение об устаревании начиная с v1.27.0. Команда, которая всё ещё передаёт один из них, завершается с `flag provided but not defined`.

    | Удалено                | Используйте вместо этого                                    |
    | ---------------------- | ----------------------------------------------------------- |
    | `--api-key <key>`      | `ANTHROPIC_API_KEY`, `--api-key-stdin` или `ant auth login` |
    | `--auth-token <token>` | `ANTHROPIC_AUTH_TOKEN` или `--auth-token-stdin`             |

    ```bash
    # До
    ant --api-key "$KEY" models list

    # После: из переменных окружения
    export ANTHROPIC_API_KEY="$KEY"
    ant models list

    # После: из менеджера секретов
    op read op://vault/anthropic/api-key | ant --api-key-stdin models list
    ```

    `--api-key-stdin` и `--auth-token-stdin` читают весь стандартный ввод, поэтому команда, использующая один из них, берёт тело запроса из флагов.

    `ant auth status`, запрос при первом запуске `ant apply` и примечание о нескольких источниках аутентификации теперь называют эти учётные данные `ANTHROPIC_API_KEY` и `ANTHROPIC_AUTH_TOKEN`, тогда как раньше выводили `--api-key / ANTHROPIC_API_KEY` и `--auth-token / ANTHROPIC_AUTH_TOKEN`.
  </Tab>

  <Tab title="C#">
    **`Type` объединения — это перечисление.** В v12 свойство `Type` класса объединения, например `ContentBlock.Type` или `RawMessageStreamEvent.Type`, было `JsonElement`. В v13 это `ApiEnum<string, T>`, где `T` — новое перечисление с одним членом для каждого варианта, например `ContentBlockType`. Некоторые объединения различаются по `Name` или `Command`, например `BetaMemoryTool20250818Command.Command`, и эти свойства меняются так же. `Type` класса варианта, например `TextBlock.Type`, по-прежнему является `JsonElement`.

    ```csharp
    // До
    if (block.Type.GetString() == "tool_use") { }

    // После
    if (block.Type.Value() == ContentBlockType.ToolUse) { }
    ```

    `block.Type.Raw()` возвращает строку, в том числе ту, для которой в этой версии SDK нет члена перечисления.

    **`IChatClient` игнорирует параметры сэмплирования.** Адаптеры `IChatClient` (`AsIChatClient()`) теперь игнорируют `ChatOptions.Temperature`, `ChatOptions.TopK` и `ChatOptions.TopP`. См. [Параметры сэмплирования удалены](https://platform.claude.com/docs/ru/api/migration-2026-10-21#sampling-parameters).
  </Tab>

  <Tab title="Java">
    **Геттеры, которые теперь возвращают `Optional`.** `apiKey()` и `authToken()` в `AnthropicBackend` теперь возвращают `Optional<String>`, как уже делал `apiKey()` в `AwsBackend` и `BedrockMantleBackend`. В v2 каждый возвращал `String`, который был `null`, если у бэкенда не было учётных данных этого вида.

    ```java
    // До
    String apiKey = backend.apiKey();
    if (apiKey != null) {}

    // После
    Optional<String> apiKey = backend.apiKey();
    if (apiKey.isPresent()) {}
    ```

    Эти геттеры теперь тоже возвращают `Optional`. В v2 каждый возвращал само значение, которое было `null`, если его не было:

    * `apiKey()` и `awsCredentialsProvider()` в `BedrockBackend`
    * `filename()` и `mimeType()` в `McpResourceFile`
    * `detail()` в `CredentialSource`
    * `body()` в `HttpRequest`
    * `resource()` в `FoundryBackend`, который раньше назывался `getResource()`
    * `responseValidation()`, `timeout()`, `followRedirects()`, `fallbackState()` и `openTelemetry()` в `RequestOptions`, которые раньше назывались `getResponseValidation()`, `getTimeout()`, `getFollowRedirects()`, `getFallbackState()` и `getOpenTelemetry()`

    ```java
    // До
    String filename = file.filename();
    if (filename != null) {}
    String resource = backend.getResource();

    // После
    Optional<String> filename = file.filename();
    if (filename.isPresent()) {}
    Optional<String> resource = backend.resource();
    ```

    `getBaseUrl()` в `FoundryBackend` удалён. Вызывайте `baseUrl()`, который возвращает URL, на который отправляются запросы. Это заданный вами базовый URL или URL, построенный из ресурса, и он заканчивается на `/anthropic`.

    `getBaseUrl()` в `AnthropicBackend` тоже удалён. Вызывайте `baseUrl()`, который возвращает то же значение.

    **`HttpRequest` требует базовый URL.** Если вы создаёте `HttpRequest` сами, например в тесте перехватчика, задайте его базовый URL. Без него `build()` теперь выбрасывает `IllegalStateException`. В v2 он возвращал запрос, у которого `baseUrl()` был `null`. У запросов, которые создаёт SDK, он уже был.

    ```java
    // До
    HttpRequest request = HttpRequest.builder()
        .method(HttpMethod.GET)
        .build();

    // После
    HttpRequest request = HttpRequest.builder()
        .method(HttpMethod.GET)
        .baseUrl("https://api.anthropic.com")
        .build();
    ```

    `baseUrl()` по-прежнему возвращает `String`, который теперь никогда не бывает `null`. В построителе `baseUrl(Optional<String>)` удалён, а `baseUrl(String)` больше не принимает `null`.

    **Перехватчики видят `anthropic-version`.** Клиент теперь добавляет заголовок `anthropic-version` по умолчанию до запуска перехватчиков. В v2 бэкенд добавлял его после них. Если ваш перехватчик задаёт собственную версию, вызывайте `replaceHeaders`, поскольку `putHeader` теперь добавляет второе значение:

    ```java
    // До
    request.toBuilder().putHeader("anthropic-version", version).build();

    // После
    request.toBuilder().replaceHeaders("anthropic-version", version).build();
    ```
  </Tab>

  <Tab title="PHP">
    **Переданные вами варианты перечислений считываются обратно как их значения.** `with()` и сеттеры, такие как `withAllowedCallers()`, по-прежнему принимают вариант перечисления или его значение. Более ранние версии сохраняли вариант в том виде, в каком вы его передали. v1 сохраняет значение варианта, что уже объявлено в типах свойств. Объекты, которые SDK создаёт из ответа, не меняются, и JSON, который отправляет SDK, остаётся прежним. Если вы считываете свойство обратно и сравниваете его с вариантом, сравнение теперь даёт false без исключения, поэтому сравнивайте его со значением варианта:

    ```php
    $tool = CodeExecutionTool20250825::with(allowedCallers: [AllowedCaller::DIRECT]);

    // До
    in_array(AllowedCaller::DIRECT, $tool->allowedCallers, true);

    // После
    in_array(AllowedCaller::DIRECT->value, $tool->allowedCallers, true);
    ```
  </Tab>
</Tabs>

### Лицензия — Apache 2.0

Начиная с этих версий, SDK и CLI распространяются по лицензии Apache License, Version 2.0. Более ранние версии остаются под лицензией MIT. Изменения кода не требуются. Если вы отслеживаете лицензии своих зависимостей, обновите соответствующие записи.

* **TypeScript:** пакеты платформ (`@anthropic-ai/bedrock-sdk`, `@anthropic-ai/vertex-sdk`, `@anthropic-ai/foundry-sdk`, `@anthropic-ai/aws-sdk` и `@anthropic-ai/google-cloud-sdk`) меняют лицензию в собственных выпусках 1.0.0.
* **C#:** остальные пакеты (`Anthropic.Bedrock`, `Anthropic.Vertex`, `Anthropic.Foundry`, `Anthropic.Aws`, `Anthropic.GoogleCloud` и `Anthropic.Mcp`) меняют лицензию в собственных выпусках 1.0.0.
* **Java:** изменение распространяется на все артефакты `com.anthropic`.
