Картинка попадает к модели почти так же, как текст: вы кладёте в сообщение блок с изображением, а потом спрашиваете о его содержимом. Хороший результат или плохой, решают детали.
Как передать изображение
Способов два: закодировать файл в base64 и вставить в тело запроса или указать ссылку на публичный URL. Надёжнее base64, потому что он не зависит от того, отвечает ли чужой сервер в момент обработки запроса.
Пример на Python с SDK Anthropic:
import base64
import anthropic
client = anthropic.Anthropic(
api_key="ваш-ключ-codexkey",
base_url="https://api.codexkey.ru/v1",
)
with open("receipt.jpg", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
message = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/jpeg", "data": image_data}},
{"type": "text", "text": "Извлеки из чека сумму, дату и список товаров построчно"},
],
}],
)
Принимаются JPEG, PNG, GIF и WebP. PDF модель берёт отдельным типом блока, не как картинку. Это пригодится, когда нужно разобрать документ целиком, а не скриншот одной страницы.
Разрешение и цена
Изображение, как и текст, считается в токенах, но по другому правилу: цена растёт вместе с площадью картинки, а визуальная сложность на неё не влияет. Снимок с телефона в максимальном разрешении и тот же снимок, сжатый до размера, при котором текст ещё читается, стоят по-разному, а распознаются часто одинаково.
Вывод практический: перед отправкой уменьшайте картинку до размера, который нужен задаче. Чтобы прочитать текст с чека или скриншота, хватает стороны в тысячу с небольшим пикселей. Для мелкой печати разрешение лучше поднимать точечно, а не сразу для всей серии запросов.
Несколько изображений в одном запросе считаются по отдельности, и общая цена растёт линейно. На пачках в десятки картинок это быстро превращается в заметную статью расходов, так что оцените стоимость заранее калькулятором на сайте.
Где vision хорошо справляется с OCR
Структурированные данные с чеков, счетов и форм. Сумму, дату и номер документа модель находит, даже когда вёрстка на разных чеках не совпадает: она понимает контекст, а не ищет паттерн по фиксированным координатам.
Таблицы со скриншотов. Таблица читается глазом? Тогда модель, как правило, верно сопоставит строки и колонки и вернёт результат в JSON без дополнительной разметки.
С рукописным текстом хуже, чем с печатным. Зато разборчивый почерк модель распознаёт заметно лучше, чем классический OCR на фиксированных шаблонах символов.
Что работает плохо
Точные координаты объектов. Что на фото есть кнопка «Отправить», модель скажет, но пиксельные координаты этой кнопки назовёт часто неточно. Для автоматизации интерфейса, где нужен точный клик, опираться на координаты от модели рискованно.
Подсчёт объектов на переполненном кадре. На снимке с десятком похожих предметов модель регулярно ошибается в count на единицу-две, особенно если предметы частично перекрывают друг друга.
Мелкий текст на изображении низкого разрешения или при плохом свете. Выручает не более мощная модель, а более качественный скан или фото.
Сравнение двух похожих изображений на мелкие отличия. Модель склонна выдумывать различия там, где их нет, пока явно не попросить её быть консервативной и признавать неопределённость.
Как готовить изображения перед отправкой
Обрежьте лишние поля вокруг нужного участка: цена падает, а шум, который мог сбить модель с толку, уходит. На сканах текста со светлым фоном повышение контраста нередко улучшает точность сильнее, чем рост разрешения.
Если в документе несколько страниц, отправляйте их по одной и называйте номер страницы в тексте запроса. Склеивать их в одну длинную картинку не стоит: с очень вытянутыми изображениями модель справляется хуже, чем с набором кадров разумного размера.
Чем форматы Anthropic и OpenAI различаются
У Anthropic картинка занимает отдельный блок {"type": "image", "source": {...}} внутри массива content. У OpenAI форма другая: {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}}. Через codexkey работают оба варианта, каждый на своём наборе эндпоинтов. Менять приходится структуру блока, логика самого запроса остаётся прежней.
Коротко
Base64 надёжнее ссылок, а картинку лучше сжать под задачу, чем слать оригинал с телефона. Со структурированным OCR (чеки, формы, таблицы) vision справляется хорошо, с точными координатами и подсчётом объектов на переполненном кадре плохо. Для мелкого текста нужна не более сильная модель, а снимок получше.