Первый запрос к 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 на
с заголовками 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 (об этом в следующем уроке).
// Установка 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 рядом