Caicaini
Начать

Возможности

Изображения

Передавай изображения вместе с текстом в одном массиве 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. См. Модели.