Возможности
Изображения
Передавай изображения вместе с текстом в одном массиве content. Модель читает их вместе — никакого отдельного vision-эндпойнта и никакого двухшагового потока.
Какие модели поддерживают vision
Все пять виртуальных id принимают image-блоки. Флаг возможности у каждой модели доступен через GET /v1/models как supports_vision — читай его в рантайме, если хочешь скрывать UI по фиче-флагу.
Базовый вызов с изображением
Собери user-сообщение как массив content. Порядок важен — сначала изображение, потом вопрос. Смешанный контент допустим в любом порядке, но модели приятнее «сначала контекст, потом вопрос».
# Encode an image and embed it as a base64 content block.
B64=$(base64 -w0 receipt.jpg 2>/dev/null || base64 receipt.jpg)
curl https://caicaini.com/v1/messages \
-H "Authorization: Bearer cai_api_YOUR_KEY" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"caicaini/sonnet\",
\"max_tokens\": 512,
\"messages\": [{
\"role\": \"user\",
\"content\": [
{\"type\": \"image\", \"source\": {\"type\": \"base64\", \"media_type\": \"image/jpeg\", \"data\": \"${B64}\"}},
{\"type\": \"text\", \"text\": \"Extract every line item with price into JSON.\"}
]
}]
}"Источники изображений
Принимаем два типа источников. Для прода надёжнее всего инлайновый base64: запрос самодостаточный — нет второго сетевого хопа и проблемы доступности хостинга в момент вызова.
base64— передавай сырые байты, закодированные стандартным base64, в полеdata.media_type— одно изimage/jpeg,image/png,image/webp,image/gif.url— изображение скачиваем мы на стороне сервера. URL должен бытьhttps://, отвечать 200 в течение 5 секунд и отдавать поддерживаемый MIME-тип. Приватные URL (подписанные ссылки на S3, presigned R2-ссылки) работают, пока подпись валидна на момент запроса.
url-источник
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/photos/receipt.jpg"
}
}Лимиты по размеру и количеству
- До 20 изображений за поворот. Сверху запрос отклоняется с типом
invalid_request_error. - Каждое изображение до 5 МБ сырого размера и 8000 × 8000 px. Очень большие мы понижаем до удобного модели разрешения на сервере, и уже после этого тарифицируем входные токены.
- Тело запроса целиком до 16 МБ. С учётом накладных base64 туда комфортно умещается около двух десятков фотографий.
Практические советы
- Обрезай ненужные поля перед отправкой. Меньшие, более чёткие изображения и стоят меньше, и читаются лучше.
- Для документов рендери каждую страницу PDF в PNG на клиенте.
application/pdfнапрямую мы пока не принимаем. - Управляй системной подсказкой — «Отвечай только валидным JSON. Не суммаризируй.» хорошо работает на задачах OCR-извлечения.
- Для vision-задач, чувствительных к латентности, сначала роутингуй на
caicaini/haikuи эскалируй наcaicaini/sonnetтолько при неуверенном результате. Для высокообъёмного вопрос-ответа по длинным документам пинуйcaicaini/kimi. См. Модели.