Интеграция Claude API в мобильное приложение
Claude API от Anthropic — альтернатива OpenAI с несколькими техническими отличиями, которые важны для мобильной разработки. Большой контекстный окон (200k токенов у claude-3-5-sonnet), нативная поддержка vision в том же Messages API, отличная работа с русским языком. Интеграция в мобильное приложение следует тем же принципам безопасности, что и любой LLM API.
Безопасная работа с ключами
Anthropic API key — sk-ant-.... Правило одно: только на backend. Мобильный клиент общается с вашим proxy-сервером, который добавляет x-api-key заголовок и передаёт запрос в api.anthropic.com.
Архитектура proxy: любой backend — Laravel, FastAPI, Cloudflare Worker. Минимальная реализация на Cloudflare Worker занимает ~30 строк и обрабатывает и обычные запросы, и streaming. Холодный старт Workers — 5–10 ms, что не добавляет заметной latency.
На стороне мобильного клиента: JWT-аутентификация пользователя на вашем proxy. Proxy проверяет токен, применяет rate limiting (например, 20 запросов/минуту на пользователя) и логирует input_tokens/output_tokens для аналитики расходов.
Messages API: ключевые отличия от OpenAI
Anthropic Messages API отличается от OpenAI Chat Completions несколькими деталями:
- Системный промпт — отдельное поле
system, не элемент массиваmessages. Это важно: правильнее держать системный контекст вsystem, не вmessages[0]сrole: "system". - Роли: только
userиassistant(нетsystemв messages). - Нет
function_callingв старом стиле — естьtoolsсinput_schemaв JSON Schema формате.
{
"model": "claude-haiku-4-5",
"max_tokens": 1024,
"system": "Ты помощник в мобильном приложении ...",
"messages": [
{"role": "user", "content": "Объясни этот документ"},
{"role": "assistant", "content": "Конечно, ..."},
{"role": "user", "content": "А что значит пункт 3?"}
]
}
Streaming на мобиле
Claude API поддерживает SSE-streaming с "stream": true. Формат чуть отличается от OpenAI:
Событие content_block_delta несёт delta.text — это токен. Событие message_stop — конец потока. На iOS парсим через URLSessionDataDelegate, аналогично ChatGPT. На Android — OkHttp EventSource.
Дельта-события приходят часто (каждые 10–50 ms при активной генерации). Буферизировать перед обновлением UI: обновляем @Published var streamText не при каждом событии, а через Throttle publisher (iOS) или distinctUntilChanged + debounce (Android Flow).
Vision: анализ изображений
Claude 3+ нативно поддерживает изображения в messages. Формат:
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "<base64>"
}
},
{"type": "text", "text": "Что изображено на фото?"}
]
}
На мобиле: сжимать изображение перед отправкой. JPEG качество 70, максимальный размер 1568×1568 (ограничение API). Оригинальный RAW с камеры — 10–15 MB — передавать нецелесообразно: дороже по токенам, медленнее. Resize + compress через UIGraphicsImageRenderer (iOS) или Bitmap.createScaledBitmap + compress(Bitmap.CompressFormat.JPEG, 70, out) (Android).
Управление диалогом
Claude хорошо держит длинный контекст — 200k токенов. Но для мобильного чата это оверкилл и дорого. На практике — скользящее окно последних 20 сообщений достаточно для большинства задач.
Для специализированных приложений (юридический ассистент, медицинский справочник) — RAG (Retrieval Augmented Generation): хранить документы в векторной БД на backend, при каждом запросе дополнять system промпт релевантными фрагментами. Это не увеличивает размер истории, но даёт доступ к большой базе знаний.
Обработка ошибок Anthropic API
529 Overloaded — серверы перегружены, экспоненциальный backoff. 400 с error.type = "invalid_request_error" — обычно превышен max_tokens или неверный формат content. 401 — неверный ключ на proxy. Все ошибки логировать с request ID (x-request-id заголовок ответа) — нужен для обращения в Anthropic поддержку.
Кейс: юридический ассистент для B2B-приложения. claude-3-5-sonnet-20241022, анализ договоров. Пользователь фотографирует страницу договора, ассистент выделяет ключевые условия и риски. Изображение resize до 1200px по длинной стороне, JPEG 80. Средний запрос: 2400 input tokens (изображение ~1800 + текст 600) + 800 output. Streaming — первые слова появляются через 350 ms. Пользователи не замечают задержку при streaming по сравнению с «пустым экраном 4 секунды» без него.
Сроки
Базовая интеграция с streaming, контекстом диалога и backend-proxy — 3–5 рабочих дней. С поддержкой изображений и RAG — 1–2 недели. Стоимость рассчитывается индивидуально.







