К основному содержимому

Claude API (Anthropic): подключение и интеграция с VPS

AI-агенты на VDS · 19.04.2026 · 6 мин чтения
Иллюстрация к статье «Claude API (Anthropic): подключение и интеграция с VPS»

Claude API: AI от Anthropic

Anthropic Claude — сильный конкурент ChatGPT с контекстным окном до 200K токенов. Claude 3.5 Sonnet часто превосходит GPT-4o в задачах анализа кода и следования инструкциям.

Получение ключа

Зарегистрируйтесь на console.anthropic.com. Первые $5 кредитов предоставляются бесплатно.

Первый запрос (cURL)

curl https://api.anthropic.com/v1/messages   -H "x-api-key: $ANTHROPIC_API_KEY"   -H "anthropic-version: 2023-06-01"   -H "content-type: application/json"   -d '{
    "model": "claude-3-5-haiku-20241022",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Как настроить Nginx на Ubuntu?"}]
  }'

Python SDK

pip install anthropic
import anthropic, os
client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])
message = client.messages.create(
    model="claude-3-5-haiku-20241022",
    max_tokens=1024,
    system="Ты технический эксперт по Linux и веб-хостингу.",
    messages=[{"role": "user", "content": "Объясни разницу между Apache и Nginx."}]
)
print(message.content[0].text)

PHP интеграция

<?php
function askClaude(string $prompt, string $system = ''): string {
    $data = [
        'model'      => 'claude-3-5-haiku-20241022',
        'max_tokens' => 1024,
        'messages'   => [['role' => 'user', 'content' => $prompt]],
    ];
    if ($system) $data['system'] = $system;
    $ch = curl_init('https://api.anthropic.com/v1/messages');
    curl_setopt_array($ch, [
        CURLOPT_POST           => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER     => [
            'x-api-key: ' . $_ENV['ANTHROPIC_API_KEY'],
            'anthropic-version: 2023-06-01',
            'content-type: application/json',
        ],
        CURLOPT_POSTFIELDS => json_encode($data),
    ]);
    $r = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $r['content'][0]['text'] ?? '';
}
echo askClaude('Напиши мета-описание для хостинга', 'Ты SEO-специалист.');

Vision: анализ изображений

import anthropic, base64
client = anthropic.Anthropic()
with open("screenshot.png", "rb") as f:
    img_data = base64.b64encode(f.read()).decode("utf-8")
msg = client.messages.create(
    model="claude-3-5-sonnet-20241022",
    max_tokens=1024,
    messages=[{"role": "user", "content": [
        {"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": img_data}},
        {"type": "text", "text": "Опиши интерфейс на скриншоте."}
    ]}]
)
print(msg.content[0].text)

Claude vs ChatGPT

КритерийClaude 3.5 SonnetGPT-4o
Контекст200K токенов128K токенов
Анализ кодаЛучшеХорошее
Output (1M)$15$10
Совет: Claude 3 Haiku ($0.25/$1.25 за 1M) — быстрый и дешевый для чатботов с высокой нагрузкой.

Частые ошибки и коды ответа API

{
  "type": "error",
  "error": {
    "type": "authentication_error",
    "message": "invalid x-api-key"
  }
}
HTTP-код / тип ошибкиПричинаРешение
401 authentication_errorКлюч API неверный, отозван или передан не в том заголовкеПроверить заголовок x-api-key, перевыпустить ключ в консоли при необходимости
429 rate_limit_errorПревышен лимит запросов или токенов в минуту для аккаунтаРеализовать экспоненциальную задержку между повторами и учитывать заголовки лимитов в ответе
529 overloaded_errorВременная перегрузка на стороне API, не связанная с вашим аккаунтомПовторить запрос с задержкой — это не ошибка клиента, а временная недоступность сервиса
400 invalid_request_errorНекорректный формат запроса — например, отсутствует обязательное поле max_tokensСверить тело запроса со схемой API, проверить типы полей в JSON

Потоковый вывод (streaming)

import anthropic
client = anthropic.Anthropic()
with client.messages.stream(
    model="claude-3-5-haiku-20241022",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Перечисли шаги установки Nginx"}]
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)

Стриминг полезен для чат-интерфейсов: пользователь видит текст по мере генерации, а не ждёт весь ответ целиком. Без стриминга запрос с длинным ответом может ощущаться зависшим на несколько секунд.

SDK против прямых HTTP-запросов

СпособКогда использоватьСложность
Официальный SDK (Python/TypeScript)Основная разработка, нужна поддержка стриминга и повторов из коробкиНизкая, есть готовые обработчики ошибок
Прямые HTTP-запросы (curl, любой язык)Нет SDK под нужный язык, либо нужна максимальная прозрачность запросаСредняя, обработку ошибок и ретраи пишете сами
Сторонние обёртки (LiteLLM и аналоги)Нужна абстракция над несколькими провайдерами AI сразуНизкая, но добавляет ещё одну зависимость в проект

Когда Claude API не подходит

  • Нужна работа полностью офлайн или без передачи данных за периметр компании — здесь потребуется локальная модель, а не облачный API
  • Задача — простая классификация с фиксированным набором меток на большом потоке данных — специализированная ML-модель может быть на порядок дешевле и быстрее, чем вызов LLM на каждый объект
  • Бюджет проекта не закладывает оплату за токены, а нагрузка непредсказуемо большая — расходы на API могут вырасти быстрее, чем ожидалось, без жёстких лимитов на стороне приложения
  • Требуется гарантированная задержка ответа в единицы миллисекунд — облачный API добавляет сетевой round-trip, которого нет у модели, запущенной локально

Проверка, что интеграция работает

# Быстрая проверка ключа и доступности API
curl -s https://api.anthropic.com/v1/messages \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-3-5-haiku-20241022","max_tokens":10,"messages":[{"role":"user","content":"ping"}]}' \
  -o /dev/null -w '%{http_code}\n'
  1. Выполните тестовый запрос и убедитесь, что код ответа 200, а не 401/403 — это подтверждает, что ключ действителен
  2. Проверьте, что поле content в ответе непустое и содержит осмысленный текст, а не ошибку, завёрнутую в JSON
  3. Замерьте время ответа для типичного запроса вашего приложения — если оно заметно больше нескольких секунд, проверьте, не блокирует ли код синхронное ожидание там, где нужен стриминг
  4. Настройте логирование кода ошибки и типа ошибки (error.type) отдельно от текста сообщения — это упрощает алертинг при массовых сбоях

Сравнение Claude с другими LLM API по цене и возможностям — в статье сравнение AI API, а безопасную работу AI-агентов с доступом к внешним системам разбирает материал безопасность AI-агентов.

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

Нужен ли отдельный сервер для работы с Claude API, или подключение возможно с обычного хостинга?

Claude API — это обычный HTTPS-эндпоинт, поэтому жёсткой привязки к VPS нет: подойдёт любая площадка, способная выполнять исходящие запросы и хранить переменные окружения. VPS даёт больше контроля над фоновыми процессами, очередями и логированием, что удобно для нагруженных интеграций, но для простого скрипта или сайта хватает и обычного хостинга с поддержкой PHP или Python.

Как обезопасить ключ API, чтобы он не попал в чужие руки?

Ключ нужно хранить в переменных окружения или отдельном файле конфигурации вне репозитория, а не прямо в коде страницы или фронтенде — иначе любой посетитель сайта увидит его в исходниках браузера. Запросы к модели всегда выполняются на стороне сервера, доступ к файлу с ключом стоит ограничить правами на уровне операционной системы, а при подозрении на утечку ключ перевыпускают в консоли.

Почему ответ модели иногда обрывается на середине фразы?

Чаще всего причина — слишком маленькое значение max_tokens, заданное в запросе: модель останавливается, как только исчерпывает отведённый лимит токенов на ответ, даже если мысль не закончена. Решение — увеличить лимит под длину ожидаемого ответа и проверять поле stop_reason в ответе API, которое показывает, остановка произошла по лимиту или по завершении мысли естественным образом.

Насколько сложно перейти на Claude API, если проект уже написан под ChatGPT?

Структура запроса у обеих моделей похожа: системная инструкция, список сообщений и параметр длины ответа, поэтому базовая логика переносится без глубокой переработки. Отличаются названия полей, формат ответа и обработка изображений, так что потребуется переписать слой интеграции — функцию отправки запроса и разбора ответа, а бизнес-логику приложения вокруг этого слоя менять обычно не нужно.

Статья помогла?
← Назад в базу знаний Задать вопрос поддержке