EvolCode
треки/Claude — глубокий разбор·02 / 07
7 мин чтения

Первый запрос к Claude API

Чтобы Claude отвечал в твоём приложении, нужно сделать HTTP-запрос на api.anthropic.com или вызвать @anthropic-ai/sdk. Разберём оба варианта на минимальном примере, чтобы было видно — никакой магии, обычный POST с JSON.

Получаем ключ

Идёшь на console.anthropic.com → регистрация (можно через Google) → раздел «API Keys» → «Create Key». Ключ начинается с sk-ant-... и показывается ОДИН раз — копируй сразу в .env. Anthropic даёт небольшой бесплатный кредит при регистрации (хватит на пару тысяч запросов к Sonnet). Дальше нужно добавить карту в Billing — иначе после кредита аккаунт замораживается.

SDK или raw fetch

Anthropic поддерживает официальные SDK: @anthropic-ai/sdk для JS/TS, anthropic для Python. С SDK код короче и есть TypeScript-типы. Минусы: ещё одна зависимость в node_modules, и SDK иногда отстаёт от самых новых параметров API. Raw fetch — это просто POST на

$ https://api.anthropic.com/v1/messages

с заголовками x-api-key и anthropic-version. Разница в 5 строк кода, поэтому решай по вкусу.

Структура запроса

Тело запроса: model (имя модели), max_tokens (потолок длины ответа в токенах — обязательное поле, иначе 400), messages (массив {role, content}). Роли: user и assistant. Дополнительно: system (отдельное поле, не в messages) — задаёт «характер» Claude на всю беседу. Часто используют для инструкций вида «ты программист-наставник, отвечай на русском, без воды».

Структура ответа

Ответ — JSON с полями content (массив блоков), stop_reason, usage. content — это массив, потому что Claude может ответить смесью текста и tool_use-блоков (про tools — отдельный урок). Для простого текстового ответа берёшь content[0].text. stop_reason: "end_turn" = всё, Claude закончил. usage.input_tokens и usage.output_tokens — для подсчёта стоимости.

Многооборотный диалог

Claude не помнит прошлые запросы — каждый вызов API изолирован. Чтобы вести беседу, ТЫ хранишь массив messages и шлёшь его весь целиком на каждый новый ход: добавляешь новое сообщение пользователя, получаешь ответ ассистента, добавляешь в массив, шлёшь снова. С каждым ходом массив растёт — и вместе с ним растёт стоимость токенов на input. Для длинных бесед в продакшне используют prompt caching (об этом в следующем уроке).

примерjavascript
// Установка SDK: npm i @anthropic-ai/sdk
// .env: ANTHROPIC_API_KEY=sk-ant-...

// === ВАРИАНТ 1: SDK ===
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic();   // подхватит ANTHROPIC_API_KEY из env

const response = await client.messages.create({
  model: 'claude-sonnet-4-6',
  max_tokens: 1024,
  system: 'Ты дружелюбный наставник. Отвечай на русском, кратко.',
  messages: [
    { role: 'user', content: 'Объясни что такое API одним предложением.' },
  ],
});

console.log(response.content[0].text);
console.log('Использовано токенов:', response.usage);

// === ВАРИАНТ 2: raw fetch (без SDK) ===
const r = await fetch('https://api.anthropic.com/v1/messages', {
  method: 'POST',
  headers: {
    'x-api-key': process.env.ANTHROPIC_API_KEY,
    'anthropic-version': '2023-06-01',
    'content-type': 'application/json',
  },
  body: JSON.stringify({
    model: 'claude-sonnet-4-6',
    max_tokens: 1024,
    messages: [{ role: 'user', content: 'Привет' }],
  }),
});

const data = await r.json();
console.log(data.content[0].text);

// === МНОГООБОРОТНЫЙ ДИАЛОГ ===
const history = [
  { role: 'user', content: 'Меня зовут Алексей' },
  { role: 'assistant', content: 'Приятно познакомиться, Алексей!' },
  { role: 'user', content: 'Как меня зовут?' },   // ← Claude помнит, потому что мы шлём всю историю
];

const r2 = await client.messages.create({
  model: 'claude-sonnet-4-6',
  max_tokens: 256,
  messages: history,
});
// → "Тебя зовут Алексей"

Минимальный запрос к Claude — SDK и raw fetch рядом

главное
  • 01Ключ в .env как ANTHROPIC_API_KEY (без NEXT_PUBLIC_) и в .gitignore
  • 02Минимальный запрос: model + max_tokens + messages
  • 03system — отдельное поле, не в messages, задаёт характер на всю беседу
  • 04Ответ возвращается как массив content blocks; для текста — content[0].text
  • 05Claude НЕ помнит прошлые запросы — историю messages храните вы
  • 06usage в ответе показывает сколько токенов потратил запрос — для подсчёта стоимости
  • 07SDK даёт типы и удобство, raw fetch — на 5 строк меньше зависимостей
проверь себя
01Вы получили 400 Bad Request при первом запросе. Что чаще всего забывают?
02Куда положить инструкцию «отвечай на русском, без эмодзи»?
03Почему Claude вдруг «забыл» что вы говорили в прошлом запросе?
следующий урок: Токены, стоимость и prompt caching