Anthropic API из России: перенос кода и Claude Code на Zukko

Код на Anthropic SDK и Claude Code переезжают на шлюз сменой адреса и ключа. Разбираем, где не ошибиться с /v1, какие модели Claude доступны и как работает кэш.

6 мин · · разработка · IDE

Пользоваться Anthropic API из России мешает не код, а оплата: карту для консоли Anthropic здесь не привязать. Zukko принимает запросы в родном формате Anthropic, поэтому Anthropic SDK и Claude Code переезжают сменой адреса и ключа, а кэш промптов продолжает экономить деньги. Ниже — правки для Python, TypeScript и Claude Code, таблица моделей Claude и расчёт стоимости с кэшем.

Что остаётся прежним

Zukko — API-шлюз к моделям Claude, GPT, Gemini, DeepSeek, Qwen и GLM с одним ключом fetch_... и балансом в долларах. Для Anthropic-формата доступны:

  • POST https://api.zukko.pro/v1/messages — основной эндпоинт;
  • POST https://api.zukko.pro/v1/messages/count_tokens — подсчёт токенов до запроса.

Официальный Anthropic SDK остаётся тем же. Авторизация работает и через заголовок x-api-key (так его шлёт SDK), и через Authorization: Bearer. Заголовок anthropic-version: 2023-06-01 SDK ставит сам.

Anthropic API из России: правки в коде

Python

bash
import os

import anthropic

client = anthropic.Anthropic(
    base_url="https://api.zukko.pro",
    api_key=os.environ["ZUKKO_API_KEY"],  # ключ вида fetch_...
)

message = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Объясни, что такое идемпотентность, на примере"}],
)
for block in message.content:
    if block.type == "text":
        print(block.text)

Главная ловушка — адрес. base_url указывается без /v1: SDK сам добавляет путь /v1/messages. Если приписать /v1, запрос уйдёт на /v1/v1/messages и вернёт 404.

Ответ лучше разбирать по типам блоков, а не брать content[0].text: если у модели включены рассуждения, первым может прийти блок типа thinking.

TypeScript

bash
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({
  baseURL: "https://api.zukko.pro",
  apiKey: process.env.ZUKKO_API_KEY,
});

const message = await client.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Объясни, что такое идемпотентность" }],
});

for (const block of message.content) {
  if (block.type === "text") console.log(block.text);
}

Через переменные окружения

SDK читают адрес из ANTHROPIC_BASE_URL, а токен — из ANTHROPIC_AUTH_TOKEN (он уходит заголовком Authorization: Bearer). Тогда клиент создаётся без аргументов:

bash
export ANTHROPIC_BASE_URL=https://api.zukko.pro
export ANTHROPIC_AUTH_TOKEN=fetch_ваш_ключ
bash
client = anthropic.Anthropic()

Если в окружении остался старый ключ Anthropic вида sk-ant-..., удалите его, чтобы SDK не отправил в шлюз старый ключ вместе с новым токеном или вместо него.

Модели Claude: имена и цены

Идентификаторы моделей в Zukko совпадают с привычными именами Claude. Цены на 6 октября 2026, $ за 1M токенов:

МодельВход / выходКэш: чтение / записьЦена вендора вход / выходИндекс силы
claude-opus-5-50.4 / 20.038 / 0.4254 / 2058
claude-fable-5-13.48 / 17.40.3 / 3.66310 / 5053
claude-opus-50.425 / 2.1130.05 / 0.5385 / 25—
claude-sonnet-50.2 / 1.0130.025 / 0.252 / 10—
claude-sonnet-4-60.263 / 1.2750.038 / 0.3253 / 15—

У всех пяти контекст 1M токенов и приём картинок. Индекс силы — Intelligence Index от Artificial Analysis из каталога Zukko; для моделей без значения стоит прочерк. Если в вашем коде указана модель, которой нет в каталоге, запрос вернёт 404 model_not_found — замените её на одну из доступных. Актуальный список и цены — GET https://api.zukko.pro/v1/models или страница «Модели» в кабинете.

Через /v1/messages можно вызывать и модели других вендоров, например gpt-6.1-sol или deepseek-v4.1-flash: шлюз конвертирует формат. Код на Anthropic SDK при этом не меняется — только имя модели.

Кэш промптов работает в Anthropic-формате

Для Claude скидку за кэш даёт именно Anthropic-формат: шлюз видит, сколько входа пришло из кэша, и считает эти токены по цене чтения кэша. В OpenAI-формате (/v1/chat/completions) весь вход Claude идёт по цене входа. Поэтому если вы уже используете cache_control, оставайтесь на Anthropic SDK. Разница двух форматов на цифрах — в статье о кэше Claude в Messages и Chat Completions.

bash
LONG_INSTRUCTIONS = open("instructions.md", encoding="utf-8").read()

response = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    system=[{
        "type": "text",
        "text": LONG_INSTRUCTIONS,
        "cache_control": {"type": "ephemeral"},
    }],
    messages=[{"role": "user", "content": "Проверь этот договор на риски: ..."}],
)
u = response.usage
print("свежий вход:", u.input_tokens)
print("чтение кэша:", u.cache_read_input_tokens)
print("запись в кэш:", u.cache_creation_input_tokens)
print("выход:", u.output_tokens)

Слишком короткий префикс не кэшируется — минимальную длину задаёт Anthropic, она зависит от модели. Если cache_read_input_tokens на повторных запросах остаётся нулём, проверьте, не меняется ли начало промпта (дата, случайный идентификатор).

Расчёт: сколько даёт кэш на агентной сессии

Формула: стоимость = свежий вход × цена входа + чтение кэша × цена чтения + запись кэша × цена записи + выход × цена выхода.

Пример для claude-sonnet-5: за сессию агент отправил 1 000 000 входных токенов, из них 900 000 прочитаны из кэша, 50 000 записаны в кэш, 50 000 — свежий вход; выход — 100 000 токенов.

  • Свежий вход: 50 000 × $0.2 / 1M = $0.01
  • Чтение кэша: 900 000 × $0.025 / 1M = $0.0225
  • Запись кэша: 50 000 × $0.25 / 1M = $0.0125
  • Выход: 100 000 × $1.013 / 1M = $0.1013
  • Итого в Anthropic-формате: $0.1463

Та же сессия в OpenAI-формате, где весь вход Claude идёт по цене входа: 1 000 000 × $0.2 / 1M + $0.1013 = $0.2 + $0.1013 = $0.3013. Доля кэша в реальных сессиях бывает разной — смотрите свои цифры в usage.

Claude Code через Zukko

Claude Code сам добавляет /v1, поэтому адрес — без суффикса. Ключ передаётся через ANTHROPIC_AUTH_TOKEN:

bash
export ANTHROPIC_BASE_URL=https://api.zukko.pro
export ANTHROPIC_AUTH_TOKEN=fetch_ваш_ключ
export ANTHROPIC_MODEL=claude-sonnet-5
claude

Чтобы не экспортировать переменные в каждой сессии, их можно положить в блок env файла ~/.claude/settings.json — так описано в документации Claude Code:

bash
{
  "env": {
    "ANTHROPIC_BASE_URL": "https://api.zukko.pro",
    "ANTHROPIC_AUTH_TOKEN": "fetch_ваш_ключ",
    "ANTHROPIC_MODEL": "claude-sonnet-5"
  }
}

Claude Code работает в Anthropic-формате, так что кэш промптов в длинных сессиях учитывается по цене чтения кэша. Если при запуске Claude Code всё равно просит войти в аккаунт Anthropic, разберитесь по статье о запросе входа в Claude Code. Полная инструкция — в документации по Claude Code.

Подсчёт токенов до запроса

count_tokens работает так же, как у Anthropic, и помогает оценить цену длинного документа заранее:

bash
count = client.messages.count_tokens(
    model="claude-sonnet-5",
    messages=[{"role": "user", "content": LONG_INSTRUCTIONS}],
)
print(count.input_tokens, "токенов, вход ≈ $", count.input_tokens * 0.2 / 1_000_000)

Подробнее — в справочнике count_tokens.

Чек-лист переезда

  1. Создайте ключ на странице API-ключи, задайте дневной лимит и разрешённые модели.
  2. В SDK укажите base_url="https://api.zukko.pro" — без /v1.
  3. Подставьте ключ fetch_..., удалите из окружения старый ключ sk-ant-....
  4. Сверьте имена моделей с GET /v1/models.
  5. Разбирайте content по типам блоков.
  6. Для Claude Code задайте ANTHROPIC_BASE_URL, ANTHROPIC_AUTH_TOKEN и ANTHROPIC_MODEL.
  7. Проверьте в usage, что cache_read_input_tokens растёт на повторных запросах.

Баланс пополняется от $1: СБП и карта РФ в рублях по рыночному курсу, криптовалюта или зарубежная карта Mastercard EU с комиссией около 13%.

Частые вопросы

Почему для Anthropic SDK адрес без /v1, а для OpenAI SDK — с /v1?

Anthropic SDK и Claude Code сами добавляют /v1/messages к базовому адресу. OpenAI SDK добавляет только chat/completions, поэтому ему нужен адрес https://api.zukko.pro/v1.

Нужно ли менять ANTHROPIC_MODEL в Claude Code?

Желательно задать его явно, например claude-sonnet-5 для повседневной работы или claude-opus-5-5 для сложных задач. Какая модель лучше справляется с вашим проектом, проверьте на нескольких реальных задачах.

Работает ли кэш промптов так же, как у Anthropic?

Да, в Anthropic-формате: разметка cache_control та же, а в usage видно чтение и запись кэша. Чтение и запись тарифицируются по своим ценам из таблицы.

Что делать при ошибке 402?

Это нехватка баланса. Пополните его в кабинете — от $1, в том числе через СБП.

zukko

Платите в 25×
меньше

за Claude Code & ChatGPT

Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.

Anthropic API из России: SDK и Claude Code через шлюз · Zukko