AI · 7 мин чтения

Claude API: первый запрос и три сценария автоматизации

Claude API даёт доступ к моделям Claude по HTTP-запросу или через официальный SDK для Python и TypeScript, без интерфейса чата и без ручного копирования промптов в браузере. Беру его для рутинных задач, где нужен не диалог с моделью, а конкретный результат внутри существующего скрипта: разобрать письмо, собрать отчёт по данным, проверить текст перед публикацией. Дальше три рабочих сценария с кодом на Python и подходом к расчёту стоимости каждого запроса.

Что нужно для первого запроса к Claude API

Ключ выдаётся в консоли Anthropic после регистрации аккаунта разработчика, доступ платный: под запросы кладёте баланс на счёт, а стоимость списывается по факту использованных токенов. Дальше два шага: поставить SDK и сохранить ключ в переменной окружения, в коде он светиться не должен, особенно если репозиторий когда-нибудь станет публичным.

pip install anthropic
export ANTHROPIC_API_KEY="sk-ant-ваш-ключ"

Первый запрос выглядит так:

import anthropic

client = anthropic.Anthropic()

message = client.messages.create(
    model="claude-sonnet-5",
    max_tokens=1024,
    system="Отвечай кратко, по делу, на русском языке.",
    messages=[
        {"role": "user", "content": "Собери три идеи заголовков для статьи про Claude API"}
    ]
)

print(message.content[0].text)
print(message.usage.input_tokens, message.usage.output_tokens)

Ответ приходит объектом message: текст лежит в message.content, это список блоков, для простого ответа там один блок с полем text. В message.usage лежит число входных и выходных токенов, эти цифры дальше нужны для расчёта стоимости. Модель указываю явно строкой вида claude-sonnet‑5, id моделей у Anthropic со временем меняются, актуальный список смотрю в документации перед тем, как разворачивать скрипт в проде.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Автоматизация №1: разбор входящих писем через Claude API

Задача с практики: на почту продаж прилетает несколько сотен писем в неделю, часть это заказы, часть жалобы, часть спам и рассылки. Разбирать руками долго, а простой фильтр по ключевым словам ошибается на нестандартных формулировках. Прогоняю каждое письмо через Claude API с принудительным вызовом инструмента: модель обязана вернуть не текст, а объект по заданной схеме, поэтому парсить ответ регулярками не приходится.

tool_choice с типом tool жёстко заставляет модель ответить через конкретный инструмент, а не рассуждать текстом, это и держит результат в предсказуемом формате.

import anthropic

client = anthropic.Anthropic()

tools = [
    {
        "name": "extract_email_data",
        "description": "Извлекает категорию, срочность и краткое содержание письма клиента",
        "input_schema": {
            "type": "object",
            "properties": {
                "category": {"type": "string", "enum": ["заказ", "жалоба", "вопрос", "спам"]},
                "urgency": {"type": "string", "enum": ["высокая", "средняя", "низкая"]},
                "summary": {"type": "string"}
            },
            "required": ["category", "urgency", "summary"]
        }
    }
]

def classify_email(email_text):
    message = client.messages.create(
        model="claude-sonnet-5",
        max_tokens=512,
        tools=tools,
        tool_choice={"type": "tool", "name": "extract_email_data"},
        messages=[{"role": "user", "content": f"Письмо от клиента:\n\n{email_text}"}]
    )
    tool_call = next(block for block in message.content if block.type == "tool_use")
    return tool_call.input, message.usage

Функцию для стоимости запроса пишу один раз и переиспользую в каждом сценарии:

def request_cost(usage, price_input_per_mtok, price_output_per_mtok):
    input_cost = usage.input_tokens / 1_000_000 * price_input_per_mtok
    output_cost = usage.output_tokens / 1_000_000 * price_output_per_mtok
    return round(input_cost + output_cost, 6)

Ставки для input и output токенов у моделей разные и меняются при обновлении линейки, актуальные цифры смотрю в консоли Anthropic перед тем, как считать бюджет на автоматизацию, а не полагаюсь на цифры из старых статей. Для писем на пару абзацев расход некритичный, вопрос скорее в объёме потока писем за месяц, а не в цене одного запроса.

Автоматизация №2: сборка отчёта из разрозненных данных

Другой сценарий: раз в неделю нужен текстовый отчёт по продажам из выгрузки CSV, например из админки интернет-магазина. Вместо того чтобы вручную читать таблицу и писать выводы, отдаю сырые строки модели и прошу собрать итог с трендом, а готовый текст отправляю в Telegram.

import csv
import anthropic
import requests

client = anthropic.Anthropic()

def load_sales(path):
    with open(path, newline="", encoding="utf-8") as f:
        return list(csv.DictReader(f))

def build_report(rows):
    data_text = "\n".join(
        f"{r['date']}: {r['orders']} заказов, {r['revenue']} руб выручки" for r in rows
    )
    message = client.messages.create(
        model="claude-sonnet-5",
        max_tokens=800,
        system="Ты аналитик. Пиши отчёт по продажам кратко, с выводами и трендом, на русском.",
        messages=[{
            "role": "user",
            "content": f"Данные по продажам за неделю:\n\n{data_text}\n\nСобери отчёт: итоги, тренд, что заметно."
        }]
    )
    return message.content[0].text, message.usage

def send_to_telegram(text, bot_token, chat_id):
    url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
    requests.post(url, data={"chat_id": chat_id, "text": text})

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

Автоматизация №3: проверка текстов перед публикацией

Похожим способом проверяю черновики статей перед публикацией: отдаю текст и стайлгайд, прошу вернуть список проблем со ссылкой на цитату и уровнем критичности. Ручная вычитка каждой статьи на несколько экранов текста съедает время, а модель находит несостыковки и нарушения стиля за один проход.

import anthropic

client = anthropic.Anthropic()

tools = [
    {
        "name": "report_issues",
        "description": "Возвращает список найденных проблем в тексте статьи",
        "input_schema": {
            "type": "object",
            "properties": {
                "issues": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "quote": {"type": "string"},
                            "problem": {"type": "string"},
                            "severity": {"type": "string", "enum": ["критично", "желательно исправить"]}
                        },
                        "required": ["quote", "problem", "severity"]
                    }
                }
            },
            "required": ["issues"]
        }
    }
]

def check_article(text, style_guide):
    message = client.messages.create(
        model="claude-sonnet-5",
        max_tokens=1500,
        system=f"Проверяй текст на соответствие стайлгайду:\n{style_guide}",
        tools=tools,
        tool_choice={"type": "tool", "name": "report_issues"},
        messages=[{"role": "user", "content": text}]
    )
    tool_call = next(block for block in message.content if block.type == "tool_use")
    return tool_call.input["issues"], message.usage

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

Как считать стоимость запросов к Claude API

Точная стоимость запроса складывается из двух чисел, которые API возвращает в message.usage: input_tokens и output_tokens, каждое умножается на свою ставку. Ставки на входные и выходные токены отличаются в разы и зависят от модели, поэтому подставлять их в формулу нужно из актуального прайса в консоли Anthropic на момент запуска, а не из статьи, написанной полгода назад.

Для потока однотипных задач, где результат не нужен мгновенно, у Anthropic есть Batch API: отправляете пачку запросов, ответ приходит не сразу, а с задержкой, зато обходится дешевле поштучных вызовов. Для ночной обработки накопившихся писем или для разовой проверки архива статей такой вариант обычно подходит лучше, чем гонять всё синхронно.

Когда автоматизацию на Claude API отдать разработчику

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

Если письма или отчёты содержат персональные данные клиентов, результат разбора храню в базе на сервере в России, а не в гугл-таблице или зарубежном сервисе, требование о локализации персональных данных из 152-ФЗ распространяется и на такие сценарии.

Если нужен вариант без написания и поддержки кода, такие сценарии собираю через автоматизацию в n8n: узел HTTP-запроса к Claude API, узел разбора ответа, узел отправки в Telegram или CRM, без сервера, который нужно администрировать самому. Собственную интеграцию под конкретный процесс оцениваю от 50 000 ₽, точная сумма зависит от количества источников данных и того, куда результат должен попасть на выходе. Автоматизация в n8n стоит от 25 000 ₽.

Условия и возможности Claude меняются, поэтому перед запуском я уточняю их у самого сервиса.

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

Нужен ли отдельный сервер для таких скриптов?

Нет, если запросы разовые или по расписанию раз в день-два, обычного планировщика вроде cron на хостинге достаточно. Отдельный сервер имеет смысл, когда скрипт должен постоянно слушать входящие события, например вебхуки от почтового сервиса, и отвечать почти мгновенно, тогда добавляется расход на аренду сервера и его обслуживание.

Как заранее прикинуть стоимость запроса, не отправляя его?

Входные токены считаются заранее: у API есть отдельный метод подсчёта токенов, он принимает тот же набор входных данных, что и создание сообщения, включая системный промпт, инструменты, изображения и PDF, и возвращает поле input_tokens. Это оценка: фактическое число входных токенов при создании сообщения может немного отличаться. Выходные токены заранее неизвестны, их сверху ограничивает max_tokens, дальше умножаете и то и другое на актуальную ставку из консоли Anthropic.

Что делать, если Claude вернул обычный текст вместо строгого JSON?

Обычно это значит, что tool_choice не зафиксирован жёстко на конкретном инструменте. Если в запросе передан tools, но tool_choice оставлен по умолчанию, модель сама решает, вызывать инструмент или отвечать текстом. Фиксирую tool_choice на нужном инструменте явно, как в примерах выше, тогда ответ всегда приходит структурой, а не текстом для парсинга регулярками.

Можно ли подключить Claude API к сайту на Tilda или WordPress без переделки сайта?

Да, сайт трогать не обязательно. Скрипт с обращением к Claude API работает отдельно: читает письма или данные, обрабатывает их и результат отправляет туда, где он нужен, будь то Telegram, CRM или таблица в базе. Для Tilda это может быть отдельный PHP-обработчик формы на хостинге, который перед сохранением заявки прогоняет текст через API, для WordPress похожий обработчик ставится в теме или плагине, без замены движка сайта.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно