lenec ru

← все посты

Anthropic SDK для Node: с нуля до прода за час

17K

Если ты подключаешь 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 в твоём приложении. Главное — не разбрасывайся вызовами по коду, заверни их в один сервис, добавь логирование и обработку ошибок, и в проде будет спокойно.

Комментарии 0

  • Будьте первым, кто оставит комментарий.

Войдите, чтобы оставить комментарий.