pimenov.ai

База знаний

Anthropic SDK и Claude Agent SDK

Anthropic SDK для Python и TypeScript и Claude Agent SDK: Messages API, tool use, structured outputs, MCP, prompt caching, батчи и обработка ошибок. Практические рецепты для агентов.

Опубликовано Обновлено
🗓️
Актуальность: проверено 10 сентября 2026 года по официальной документации Anthropic. Актуализированы Messages API, текущая линейка моделей, prompt caching, Message Batches и позиционирование Claude Agent SDK.

В примерах используется claude-sonnet-5. На дату проверки доступны Claude Fable 5.1, Opus 5, Sonnet 5 и Haiku 4.5. Имена моделей, лимиты и цены меняются, поэтому храните model ID в конфигурации и сверяйте его со страницей Models overview.

Anthropic SDK — официальные клиентские библиотеки для прямой работы с Claude API. Через Messages API можно генерировать текст, обрабатывать изображения и документы, получать потоковые ответы, вызывать инструменты, запрашивать структурированный вывод и отправлять пакетные задания. Claude Agent SDK решает другую задачу: запускает готовый агентный цикл Claude Code в Python- или TypeScript-приложении.

📌
Для кого: разработчики, которые интегрируют Claude в продукт, автоматизируют обработку данных или создают агентов. Для базового сценария достаточно знания Python или TypeScript и понимания REST API.

Как выбрать подходящий инструмент

ИнструментЧто даётКогда выбирать
Anthropic Client SDKПрямой доступ к Messages API и другим API AnthropicНужен собственный цикл приложения и полный контроль над инструментами
Claude Agent SDKГотовый агентный цикл, встроенные инструменты, контекст и разрешения Claude CodeАгент должен работать с файлами, командами и кодовой базой
Claude Code CLIИнтерактивная работа из терминалаРазработка и разовые задачи без встраивания в приложение
Managed AgentsРазмещённые Anthropic долгие или асинхронные агенты с управляемой инфраструктуройНе хочется самостоятельно обслуживать среду выполнения и сессии

Claude Agent SDK доступен как библиотека для Python и TypeScript. Если нужен прямой вызов Claude API, используйте Client SDK и реализуйте цикл инструментов самостоятельно.


Установка и авторизация

Python

pip install anthropic

TypeScript

npm install @anthropic-ai/sdk

Клиент по умолчанию читает ключ из переменной окружения ANTHROPIC_API_KEY:

export ANTHROPIC_API_KEY=sk-ant-...
from anthropic import Anthropic

client = Anthropic()
import Anthropic from '@anthropic-ai/sdk';

const client = new Anthropic();
⚠️
Безопасность: не храните API-ключ в исходном коде и не отправляйте его в клиентское браузерное приложение. Используйте переменные окружения или менеджер секретов. Если применяете .env, добавьте его в .gitignore.

Текущая линейка моделей

На 10 сентября 2026 года официальный обзор показывает четыре основные модели:

МодельAPI IDТипичная задачаКонтекстМаксимальный вывод
Claude Fable 5.1claude-fable-5-1Требовательное рассуждение и длинные агентные задачи1 млн токенов128 тыс. токенов
Claude Opus 5claude-opus-5Сложная агентная разработка и корпоративные задачи1 млн токенов128 тыс. токенов
Claude Sonnet 5claude-sonnet-5Баланс скорости и качества1 млн токенов128 тыс. токенов
Claude Haiku 4.5claude-haiku-4-5-20251001Быстрые массовые операции200 тыс. токенов64 тыс. токенов

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

💡
Практика: вынесите model ID в конфигурацию. Возможности и лимиты выбранной модели можно также получать программно через Models API.

Messages API: минимальный рабочий вызов

Messages API принимает историю сообщений и генерирует следующий ответ ассистента. Системную инструкцию передают в верхнеуровневом поле system; отдельной роли system среди входных сообщений нет.

from anthropic import Anthropic

client = Anthropic()

response = client.messages.create(
    model='claude-sonnet-5',
    max_tokens=1024,
    system='Ты — технический ассистент. Отвечай кратко и по делу.',
    messages=[
        {
            'role': 'user',
            'content': 'Объясни разницу между REST и GraphQL',
        }
    ],
)

for block in response.content:
    if block.type == 'text':
        print(block.text)

Потоковый ответ

На уровне API поток включается параметром stream: true. В Python SDK потоковый интерфейс выглядит так:

with client.messages.stream(
    model='claude-sonnet-5',
    max_tokens=1024,
    messages=[
        {'role': 'user', 'content': 'Составь план архитектуры API'}
    ],
) as stream:
    for text in stream.text_stream:
        print(text, end='', flush=True)

Изображения и документы

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

import base64

with open('diagram.png', 'rb') as file:
    image_data = base64.standard_b64encode(file.read()).decode()

response = client.messages.create(
    model='claude-sonnet-5',
    max_tokens=1024,
    messages=[
        {
            'role': 'user',
            'content': [
                {
                    'type': 'image',
                    'source': {
                        'type': 'base64',
                        'media_type': 'image/png',
                        'data': image_data,
                    },
                },
                {
                    'type': 'text',
                    'text': 'Опиши архитектуру на диаграмме и найди слабые места.',
                },
            ],
        }
    ],
)

Для больших файлов отдельно проверьте Files API и поддерживаемый тип документа для выбранной модели. Ограничения на размер, число страниц и формат могут меняться.


Вызов собственных инструментов

Tool use позволяет модели запросить выполнение функции вашего приложения. Модель формирует блок tool_use, а функцию выполняет ваш код. Результат возвращается отдельным блоком tool_result.

tools = [
    {
        'name': 'search_knowledge_base',
        'description': 'Найти документы во внутренней базе знаний по запросу пользователя',
        'input_schema': {
            'type': 'object',
            'properties': {
                'query': {
                    'type': 'string',
                    'description': 'Поисковый запрос',
                },
                'limit': {
                    'type': 'integer',
                    'description': 'Максимальное число результатов',
                    'default': 5,
                },
            },
            'required': ['query'],
        },
    }
]

messages = [
    {'role': 'user', 'content': 'Найди правила оформления отпуска'}
]

response = client.messages.create(
    model='claude-sonnet-5',
    max_tokens=1024,
    tools=tools,
    messages=messages,
)

Продолжение цикла можно оформить так:

import json

allowed_tool_names = {item['name'] for item in tools}
max_iterations = 10

for _ in range(max_iterations):
    if response.stop_reason != 'tool_use':
        break

    messages.append({
        'role': 'assistant',
        'content': response.content,
    })

    tool_results = []
    for block in response.content:
        if block.type != 'tool_use':
            continue
        if block.name not in allowed_tool_names:
            raise ValueError(f'Unknown tool: {block.name}')

        result = execute_function(block.name, block.input)
        tool_results.append({
            'type': 'tool_result',
            'tool_use_id': block.id,
            'content': json.dumps(result, ensure_ascii=False),
        })

    if not tool_results:
        break

    messages.append({'role': 'user', 'content': tool_results})
    response = client.messages.create(
        model='claude-sonnet-5',
        max_tokens=1024,
        tools=tools,
        messages=messages,
    )
⚠️
Граница доверия: проверяйте имя инструмента и входные параметры до исполнения. Для операций с файлами, платежами, учётными записями и инфраструктурой добавьте разрешения, журналирование и подтверждение пользователя. Ограничивайте число итераций агентного цикла.

Структурированный JSON

Если приложению нужен ответ по заданной схеме, передайте JSON Schema через output_config.format:

import json

response = client.messages.create(
    model='claude-sonnet-5',
    max_tokens=1024,
    output_config={
        'format': {
            'type': 'json_schema',
            'schema': {
                'type': 'object',
                'properties': {
                    'persons': {
                        'type': 'array',
                        'items': {'type': 'string'},
                    },
                    'companies': {
                        'type': 'array',
                        'items': {'type': 'string'},
                    },
                    'dates': {
                        'type': 'array',
                        'items': {'type': 'string'},
                    },
                },
                'required': ['persons', 'companies', 'dates'],
                'additionalProperties': False,
            },
        }
    },
    messages=[
        {'role': 'user', 'content': text_to_analyze}
    ],
)

entities = json.loads(next(
    block.text for block in response.content if block.type == 'text'
))

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


Prompt caching: кэширование повторяющегося контекста

Prompt caching сохраняет префикс запроса: определения инструментов, системные инструкции и сообщения до контрольной точки. Это снижает задержку и стоимость повторной обработки одинакового большого контекста.

Есть два режима:

  • автоматический: cache_control задаётся на уровне запроса, а контрольная точка перемещается по мере роста диалога;
  • явный: cache_control ставится на конкретный блок в конце стабильного префикса.

По умолчанию используется тип ephemeral со сроком жизни 5 минут. Для сценариев с большими паузами доступен TTL 1h; запись такого кэша стоит дороже.

response = client.messages.create(
    model='claude-sonnet-5',
    max_tokens=1024,
    system=[
        {
            'type': 'text',
            'text': '<большой постоянный контекст>',
            'cache_control': {'type': 'ephemeral'},
        }
    ],
    messages=[
        {'role': 'user', 'content': 'Ответь по этому контексту'}
    ],
)

print(response.usage.cache_creation_input_tokens)
print(response.usage.cache_read_input_tokens)

Автоматический режим включается так:

response = client.messages.create(
    model='claude-sonnet-5',
    max_tokens=1024,
    cache_control={'type': 'ephemeral'},
    system='Постоянная системная инструкция',
    messages=messages,
)

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

У API есть окно обратного поиска в 20 блоков и до четырёх контрольных точек. Минимальная длина кэшируемого префикса зависит от модели и платформы; для Sonnet 5 она составляет 1024 токена. Если cache_creation_input_tokens и cache_read_input_tokens равны нулю, проверьте длину префикса и точное совпадение блоков.


Message Batches: массовая асинхронная обработка

Message Batches API подходит для суммаризации, перевода, классификации, извлечения данных и массовых проверок, которым не нужен немедленный ответ. Пакетная обработка стоит на 50% дешевле стандартных вызовов Messages API.

Ограничения на дату проверки:

  • до 100 000 запросов или 256 MB в одном batch, в зависимости от того, какой предел достигнут раньше;
  • большинство пакетов завершается менее чем за час, предельное окно обработки составляет 24 часа;
  • результаты доступны 29 дней после создания;
  • custom_id должен быть уникальным и содержать от 1 до 64 букв, цифр, дефисов или подчёркиваний;
  • результаты могут приходить не в порядке исходных запросов;
  • внутри batch не поддерживаются stream: true, Fast mode и max_tokens: 0;
  • для каждого элемента batch значение max_tokens должно быть не меньше 1.
from anthropic import Anthropic
from anthropic.types.message_create_params import MessageCreateParamsNonStreaming
from anthropic.types.messages.batch_create_params import Request

client = Anthropic()

batch = client.messages.batches.create(
    requests=[
        Request(
            custom_id='post-1',
            params=MessageCreateParamsNonStreaming(
                model='claude-sonnet-5',
                max_tokens=1024,
                messages=[
                    {
                        'role': 'user',
                        'content': 'Суммаризируй текст...',
                    }
                ],
            ),
        ),
        Request(
            custom_id='post-2',
            params=MessageCreateParamsNonStreaming(
                model='claude-sonnet-5',
                max_tokens=1024,
                messages=[
                    {
                        'role': 'user',
                        'content': 'Извлеки ключевые факты...',
                    }
                ],
            ),
        ),
    ]
)

print(batch.id, batch.processing_status)

После завершения обрабатывайте каждую запись по custom_id и типу результата: succeeded, errored, canceled или expired.

for entry in client.messages.batches.results(batch.id):
    print(entry.custom_id, entry.result.type)
💡
Перед большим batch: сначала отправьте один запрос той же формы через обычный Messages API. Валидация отдельных элементов batch выполняется асинхронно, поэтому такая проверка помогает обнаружить ошибку до постановки тысяч запросов в очередь.

Prompt caching можно сочетать с batch. Попадания в кэш при параллельной асинхронной обработке предоставляются на основе доступности, поэтому для общего контекста имеет смысл рассмотреть TTL 1h и одинаковые контрольные точки во всех запросах.


MCP и внешние инструменты

Model Context Protocol, или MCP, стандартизирует подключение внешних инструментов и источников данных. В экосистеме Claude MCP упоминается как интеграция API и как возможность Agent SDK.

ВариантГде выполняется циклКогда подходит
MCP через Claude APIЗапрос отправляется в Messages API с конфигурацией удалённого сервераНужен удалённый инструмент внутри API-вызова
Собственный MCP-клиент или Agent SDKСоединением, разрешениями и результатами управляет ваше приложениеНужны локальные серверы, собственная политика доступа или более сложная оркестрация

MCP-интерфейсы и beta-заголовки меняются. Перед реализацией сверяйте формат запроса с актуальной документацией Anthropic для выбранной интеграции.

⚖️
Компромисс: MCP упрощает унификацию интеграций, но добавляет ещё одну границу доверия. Ограничивайте доступные инструменты, проверяйте параметры, защищайте токены и предусматривайте отказ внешнего сервера.

Claude Agent SDK

Claude Agent SDK запускает в приложении тот же агентный цикл и механизмы управления контекстом, которые использует Claude Code. SDK предоставляет встроенные инструменты для чтения и изменения файлов, выполнения команд и веб-поиска, а также hooks, дочерних агентов, MCP, разрешения и возобновляемые сессии.

Выбирайте Agent SDK, когда задача требует самостоятельного планирования нескольких шагов и работы со средой. Для обычного чат-бота или строго управляемого бизнес-процесса часто проще использовать Client SDK и собственный цикл инструментов.

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

Для долгих асинхронных агентов, где Anthropic управляет средой и сессиями, документация предлагает отдельно рассматривать Managed Agents. Это другой продукт, а не режим Claude Agent SDK.


Ошибки, таймауты и повторные попытки

Обрабатывайте как минимум четыре класса сбоев:

  • сетевые ошибки и таймауты;
  • ограничение частоты запросов;
  • ошибки запроса, которые нельзя исправить повтором;
  • временные серверные ошибки и перегрузку.

Параметры ретраев, таймаутов и названия исключений зависят от версии SDK. Общая схема выглядит так:

import anthropic

client = anthropic.Anthropic(
    max_retries=5,
    timeout=30.0,
)

try:
    response = client.messages.create(
        model='claude-sonnet-5',
        max_tokens=1024,
        messages=[{'role': 'user', 'content': 'Привет'}],
    )
except anthropic.RateLimitError:
    # Поставить запрос в очередь или повторить позже с backoff
    ...
except anthropic.APIStatusError as error:
    print(error.status_code, error.response)
except anthropic.APIConnectionError:
    # Проверить сеть и политику повторов
    ...

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


Полезные сценарии

Ответы по внутренней базе знаний

Исходные данные: документы компании и поисковый инструмент. Приложение передаёт модели вопрос, модель вызывает поиск, а найденные фрагменты возвращаются через tool_result.

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

Извлечение данных из документов

Исходные данные: текст или поддерживаемый документ и JSON Schema. Приложение запрашивает структурированный вывод, проверяет обязательные поля и сохраняет результат.

Наблюдаемый результат: строка из ответа разбирается как JSON и проходит проверку схемы. Для юридически или финансово значимых документов добавьте проверку человеком.

Массовая обработка контента

Исходные данные: набор независимых текстов, для которых немедленный ответ не требуется. Каждый запрос получает уникальный custom_id и отправляется через Message Batches API.

Наблюдаемый результат: ответы сопоставляются с исходными задачами по custom_id; ошибки и истёкшие запросы попадают в отдельную очередь повторной обработки.

Агент для работы с репозиторием

Исходные данные: изолированная рабочая копия проекта, тестовая команда и ограниченный набор разрешений. Claude Agent SDK анализирует файлы, предлагает или вносит изменения и запускает проверку.

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


Как проверить интеграцию

Минимальная проверка Client SDK:

  1. Установите SDK и задайте ANTHROPIC_API_KEY.
  2. Отправьте короткий Messages API-запрос.
  3. Проверьте, что ответ содержит текстовый блок.
  4. Запишите response.id, используемую модель, stop_reason и поля usage.
  5. Повторите тест с заведомо неверным параметром и убедитесь, что приложение регистрирует ошибку.

Для инструментов дополнительно проверьте:

  • неизвестное имя инструмента отклоняется приложением;
  • параметры валидируются до выполнения;
  • несколько параллельных tool_use возвращаются одним пользовательским сообщением с соответствующими tool_result;
  • цикл останавливается по лимиту итераций;
  • опасное действие требует отдельного разрешения.

Для prompt caching смотрите cache_creation_input_tokens на первом запросе и cache_read_input_tokens на повторном запросе с тем же префиксом. Для batch проверяйте финальный статус и число элементов во всех категориях результатов.

📌
Примеры в этом материале сверены с документацией, но не заявлены как результат запуска в конкретном окружении. Перед производственным использованием закрепите версии зависимостей и выполните собственные интеграционные тесты.

Чеклист перед запуском

API-ключ хранится вне исходного кода
Model ID вынесен в конфигурацию и существует в Models API
Для интерактивного интерфейса включён потоковый ответ
Входные параметры инструментов валидируются до выполнения
Агентный цикл ограничен по числу шагов, времени и стоимости
Опасные действия требуют разрешения
Для структурированного результата задана схема и проверяется JSON
Повторы запросов ограничены и используют backoff
Для batch каждый элемент имеет уникальный custom_id
Результаты batch сопоставляются по custom_id, а не по порядку
Кэшируемый префикс стабилен и превышает минимум выбранной модели
Логи не содержат ключей, токенов и чувствительных данных
Есть наблюдаемая проверка результата: ответ, JSON, diff, тест или статус batch

Официальные ссылки

Следующий шаг

Claude Code — кодинг-агент от Anthropic

Связанные материалы

Если вы выбираете архитектуру приложения на Claude или определяете границы доступа агента, полезно заранее разобрать цикл инструментов, модель угроз и способ проверки результата.

Если захотите обсудить, как это применить у себя или в команде — пишите в Telegram @pimenov