Anthropic SDK для Node: с нуля до прода за час
Если ты подключаешь Claude к Node-приложению — можешь либо звать API через fetch, либо взять официальный SDK. Я попробовал оба пути, и для прода однозначно SDK. В этой статье — что в нём есть, как его поставить и какие штуки сразу делают разработку приятнее.
Установка
npm install @anthropic-ai/sdkМинимальный код:
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
const response = await client.messages.create({
model: 'claude-sonnet-4-5',
max_tokens: 1024,
messages: [{ role: 'user', content: 'Привет' }],
});
console.log(response.content[0].text);Это всё. SDK сам берёт API-ключ из ANTHROPIC_API_KEY env var, если ты его не указываешь явно. Удобно для скриптов и Docker-образов.
Что внутри
SDK даёт несколько ключевых клиентов:
- messages — главный, для чата. Создание, streaming, работа с tool use.
- messages.batches — батчевая обработка. Отправляешь до 10к запросов, через 24 часа забираешь результаты дешевле в 2 раза.
- messages.countTokens — подсчёт токенов до отправки.
- files — загрузка файлов для Claude (документы, картинки) с возможностью переиспользования.
- models — список доступных моделей.
Streaming
SDK даёт удобный helper messages.stream:
const stream = client.messages.stream({
model: 'claude-sonnet-4-5',
max_tokens: 1024,
messages,
});
stream.on('text', (delta) => {
process.stdout.write(delta);
});
const final = await stream.finalMessage();
console.log('\nusage:', final.usage);Event-based API проще, чем парсить SSE руками. Но for await-итерация тоже доступна, если тебе так удобнее.
Tool use
Описываешь tools массивом, передаёшь в create. SDK сам кладёт описания в нужное место запроса.
const tools = [
{
name: 'get_weather',
description: 'Получить погоду в городе',
input_schema: {
type: 'object',
properties: {
city: { type: 'string', description: 'Название города' },
},
required: ['city'],
},
},
];
const response = await client.messages.create({
model: 'claude-sonnet-4-5',
max_tokens: 1024,
tools,
messages: [{ role: 'user', content: 'Какая погода в Самаре?' }],
});
// Если модель решила вызвать tool:
for (const block of response.content) {
if (block.type === 'tool_use') {
const result = await callMyTool(block.name, block.input);
// отправить результат назад в следующем запросе
}
}Дальше ты делаешь второй запрос с role: 'tool' content и идёшь по циклу, пока stop_reason не станет end_turn.
Helpers для tool use
В SDK есть messages.tool_runner — он автоматизирует цикл «вызвал tool — получил результат — вызвал снова».
const runner = client.messages.toolRunner({
model: 'claude-sonnet-4-5',
max_tokens: 4096,
tools,
toolHandlers: {
get_weather: async ({ city }) => {
const data = await fetchWeather(city);
return { temperature: data.temp, conditions: data.conditions };
},
},
messages: [{ role: 'user', content: 'Какая погода в Москве и Питере?' }],
});
const final = await runner.finalMessage();
console.log(final.content);Никакого цикла руками. SDK сам собирает все вызовы инструментов, прогоняет твой обработчик, склеивает диалог.
Ошибки
SDK генерирует типизированные исключения:
import Anthropic, {
APIError,
RateLimitError,
AuthenticationError
} from '@anthropic-ai/sdk';
try {
const response = await client.messages.create({ ... });
} catch (err) {
if (err instanceof RateLimitError) {
// 429 — backoff
} else if (err instanceof AuthenticationError) {
// 401 — ключ невалиден
} else if (err instanceof APIError) {
console.log(err.status, err.message);
}
}Полезно различать: на rate-limit ты ретраишь, на auth — алертишь и не ретраишь.
Авторетраи
SDK умеет сам ретраить запросы при сетевых ошибках и 429. По умолчанию 2 повтора с экспоненциальным backoff. Настраивается:
const client = new Anthropic({
maxRetries: 3,
timeout: 60_000, // мс
});Прокси и кастомный fetch
SDK работает на стандартном fetch, и можно подсунуть свой:
const client = new Anthropic({
fetch: (url, init) => {
// тут можно добавить логирование, кастомные хедеры, прокси
console.log('[anthropic]', url);
return fetch(url, init);
},
});У меня в проде через этот хук я логирую длительность каждого запроса и токены — спасает на отладке.
Vertex AI и AWS Bedrock
SDK поддерживает запуск Claude через Google Vertex AI и AWS Bedrock — те же методы, другие credentials. Полезно тем, у кого Anthropic недоступен напрямую, или кто хочет держать всё в своём облаке.
import { AnthropicVertex } from '@anthropic-ai/vertex-sdk';
const client = new AnthropicVertex({ region: 'us-central1', projectId: 'my-project' });Что я делаю в проекте
- Все вызовы Claude — через единый wrapper с logger'ом и retry-логикой.
- maxTokens конфигурится по типу задачи: чат — 1024, длинная статья — 4096, summary — 256.
- В каждом проде включаю prompt caching (см. отдельную статью).
- На стейдже — отдельный API-ключ с пониженным rate-limit, чтобы не сжигать прод.
Что в итоге
Anthropic SDK для Node — рабочий и достаточно полный. Streaming, tool use, batches, files, retries — всё в одном пакете, без необходимости писать обвязку. Поставил, прокинул ключ, написал десяток строк — и Claude в твоём приложении. Главное — не разбрасывайся вызовами по коду, заверни их в один сервис, добавь логирование и обработку ошибок, и в проде будет спокойно.