hubris
Vision: как отправить изображение в нейросеть через API

Vision: как отправить изображение в нейросеть через API

27 июня 2026 г. · Команда Hubris · 7 мин чтения

Чтобы отправить изображение в нейросеть через API, передайте его в user-сообщении частью типа image_url — публичной HTTPS-ссылкой или строкой base64. Запрос уходит на стандартный /v1/chat/completions и работает с официальными SDK OpenAI без доработок. Нужна лишь модель, принимающая изображения на вход: в каталоге Hubris таких больше полутора сотен — от GPT и Claude до Gemini и Qwen, с оплатой в рублях.

Формат запроса: image_url внутри messages

В обычном текстовом запросе поле content — строка. В мультимодальном оно становится массивом частей: текстовые блоки {"type": "text"} и изображения {"type": "image_url"} в свободном порядке. Минимальный запрос через curl выглядит так:

curl -s https://api.hubris.pw/v1/chat/completions \
  -H "Authorization: Bearer sk-gw-..." \
  -H "Content-Type: application/json" \
  -d '{
    "model": "anthropic/claude-haiku-4.5",
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "Что изображено на картинке?" },
          {
            "type": "image_url",
            "image_url": { "url": "https://example.com/photo.jpg" }
          }
        ]
      }
    ]
  }'

Ответ приходит в обычном формате chat completions: текст модели — в choices[0].message.content, расход токенов — в usage. Полная схема параметров — в справочнике POST /v1/chat/completions, подробности мультимодального ввода — в документации Vision.

В одном сообщении допускается несколько изображений — добавляйте части по одной. Модель увидит все картинки и сможет ссылаться на них в ответе: «на первом скриншоте..., на втором...».

Рамка изображения распадается на структурированные блоки данных

URL или base64 — и какие есть лимиты

Передать изображение можно двумя способами.

Публичная ссылка. Картинка по URL скачивается на стороне модели, поэтому ссылка должна открываться без авторизации. Типичный лимит размера — 5–20 МБ в зависимости от модели; поддерживаются JPEG, PNG, WebP и GIF.

Base64 data URL. Если файл не лежит в открытом доступе — пришёл от пользователя, сгенерирован на лету, хранится в закрытом хранилище, — закодируйте его в base64 и передайте прямо в запросе:

{
  "type": "image_url",
  "image_url": {
    "url": "data:image/jpeg;base64,/9j/4AAQSkZJRg..."
  }
}

Формат строки: data:image/<mime>;base64,<данные>. Учтите: base64 увеличивает объём примерно на треть, поэтому большие файлы стоит сжать перед отправкой. На количество токенов способ доставки не влияет — тарифицируется само изображение, а не длина JSON.

Часть моделей понимает необязательный параметр detail рядом с url: "low" — беглый взгляд в низком разрешении, "high" — внимательное чтение мелких деталей, "auto" — модель решает сама (значение по умолчанию).

Пример на Python: разбор скриншота

Понадобится аккаунт Hubris: регистрация — по коду из письма, без пароля; API-ключ создаётся в личном кабинете в разделе «Ключи»; баланс пополняется в разделе «Биллинг» — через СБП, банковской картой или по счёту для юридических лиц. Путь от регистрации до первого запроса по шагам описан в гайде о доступе к Claude API из России — он одинаков для всех моделей каталога.

Скрипт ниже читает скриншот с диска, кодирует его в base64 и просит модель разобрать состояние веб-формы:

import base64
from openai import OpenAI

client = OpenAI(
    base_url="https://api.hubris.pw/v1",
    api_key="sk-gw-...",  # ваш ключ из раздела «Ключи»
)

with open("screenshot.png", "rb") as f:
    encoded = base64.b64encode(f.read()).decode()

resp = client.chat.completions.create(
    model="openai/gpt-4o-mini",
    messages=[
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "Это скриншот веб-формы. Перечисли поля, "
                            "заполненные с ошибками, и текст сообщений интерфейса.",
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/png;base64,{encoded}",
                        "detail": "high",
                    },
                },
            ],
        }
    ],
)

print(resp.choices[0].message.content)
print(resp.usage.prompt_tokens, "входных токенов")

Тот же код подходит для фотографий: замените файл и текст вопроса — например, «что на фото и в каком состоянии объект». Отдельная библиотека для работы с изображениями не нужна: достаточно пакета openai и замены base_url.

OCR и разбор документов: практические кейсы

Мультимодальные модели уверенно читают текст с изображений, и это закрывает целый класс прикладных задач:

  • Распознавание сканов и фотографий документов. Модель возвращает текст со скана договора или снимка страницы — в том числе там, где классический OCR спотыкается о наклон, тень или нестандартный шрифт.
  • Извлечение полей из чеков и счетов. Попросите вернуть JSON с полями «сумма», «дата», «продавец» — и получите структуру, готовую к записи в базу. В связке со структурированным выводом схема ответа гарантирована.
  • Таблицы и диаграммы. Модель пересказывает график словами или переводит таблицу с картинки в markdown либо CSV.
  • Скриншоты интерфейсов. Проверка вёрстки, разбор сообщений об ошибках, описание шагов воспроизведения дефекта по картинке.

Для документов с мелким текстом ставьте detail: "high" и отправляйте изображение в исходном разрешении: сильное сжатие «съедает» мелкие символы, и качество распознавания заметно падает.

Страницы документов превращаются в потоки распознанных символов

Какие модели принимают изображения и сколько это стоит

Изображения на вход принимает любая модель, у которой в карточке (GET /v1/models) поле input_modalities содержит "image". В каталоге моделей есть фильтр по входным модальностям: отметьте «изображение» — останутся только подходящие варианты. На июнь 2026 года таких моделей в каталоге больше 160.

Картинка тарифицируется как дополнительные входные токены — обычно от нескольких сотен до пары тысяч на изображение в зависимости от модели и разрешения; точное число видно в usage.prompt_tokens ответа. Несколько ориентиров по ценам (актуальны на июнь 2026 года, точные значения — в каталоге):

МодельВход, ₽ за 1 млн токеновВыход, ₽ за 1 млн токенов
qwen/qwen3-vl-8b-instruct8,4953,05
openai/gpt-4o-mini15,9263,66
google/gemini-2.5-flash31,83265,27
anthropic/claude-haiku-4.5106,11530,53
openai/gpt-5.2185,691 485,48
anthropic/claude-sonnet-4.6318,321 591,59

Для первых экспериментов в каталоге есть и бесплатные модели с пометкой :free, принимающие изображения, — например, google/gemma-4-31b-it:free. Качество и стабильность у них скромнее платных, но проверить гипотезу хватит.

Частые вопросы

Сколько токенов расходует одна картинка?

Зависит от модели, разрешения и параметра detail. Маленькое изображение в detail: "low" — порядка сотни входных токенов, скриншот стандартного разрешения — несколько сотен, большой 2K-скриншот в "high" — до нескольких тысяч. Точный расход всегда виден в поле usage.prompt_tokens ответа.

Можно ли отправить несколько изображений в одном запросе?

Да. Добавьте в массив content несколько частей image_url — модель увидит все картинки и сможет сравнивать их между собой, например скриншоты «до» и «после».

Почему модель не видит картинку по ссылке?

Чаще всего ссылка недоступна снаружи: требует авторизацию, ведёт во внутреннюю сеть или отдаёт HTML вместо изображения. Картинка по URL скачивается на стороне модели анонимно, поэтому приватные файлы передавайте как base64 data URL.

Работает ли Vision в потоковом режиме?

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

Все модели из статьи доступны в Hubris — единый API, оплата в рублях.