API · Картинки

Изображение во входе

Скриншот ошибки, макет, схема, фотография документа — всё это можно приложить к сообщению. Речь именно про вход: генерация изображений живёт в студии и через этот метод не проходит.

Формат OpenAI#

content становится массивом частей: текст и картинка рядом.

json
{
  "model": "anthropic/claude-sonnet-4.6",
  "messages": [
    {
      "role": "user",
      "content": [
        { "type": "text", "text": "Что не так в этой вёрстке?" },
        {
          "type": "image_url",
          "image_url": { "url": "data:image/png;base64,iVBORw0KGgo…" }
        }
      ]
    }
  ]
}

В url кладут либо data:-строку с base64, либо обычную ссылку https:// на картинку. Ссылку модель скачивает сама — значит, она должна быть доступна извне: адрес из локальной сети или из-за авторизации не откроется.

Подготовить base64#

bash
# macOS, Linux
B64=$(base64 -w0 screenshot.png)   # на macOS: base64 -i screenshot.png
curl https://nirastudio.org/v1/chat/completions \
  -H "Authorization: Bearer $NIRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"model\": \"anthropic/claude-sonnet-4.6\",
    \"messages\": [{ \"role\": \"user\", \"content\": [
      { \"type\": \"text\", \"text\": \"Опиши скриншот\" },
      { \"type\": \"image_url\", \"image_url\": { \"url\": \"data:image/png;base64,$B64\" } }
    ]}]
  }"
python
import base64, os
from openai import OpenAI

client = OpenAI(base_url="https://nirastudio.org/v1", api_key=os.environ["NIRA_API_KEY"])
b64 = base64.b64encode(open("screenshot.png", "rb").read()).decode()

resp = client.chat.completions.create(
    model="anthropic/claude-sonnet-4.6",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "Опиши скриншот"},
            {"type": "image_url",
             "image_url": {"url": f"data:image/png;base64,{b64}"}},
        ],
    }],
)
print(resp.choices[0].message.content)

Формат Anthropic#

В /v1/messages картинка описывается блоком image — base64 и тип лежат отдельными полями, префикса data: нет:

json
{
  "role": "user",
  "content": [
    { "type": "text", "text": "Что на схеме?" },
    {
      "type": "image",
      "source": { "type": "base64", "media_type": "image/png", "data": "iVBORw0KGgo…" }
    }
  ]
}

Что учесть#

  • Картинки принимает не каждая модель. Если модель текстовая — придёт 415, см. ошибки. Какие умеют — видно у модели в чате.
  • Форматы: PNG, JPEG, WebP, GIF (первый кадр). Векторные и PDF передавать бессмысленно — это не изображения для модели.
  • base64 раздувает файл примерно на треть, а тело запроса ограничено 32 МБ. Скриншот на 2–3 МБ проходит с запасом; фотографию с телефона стоит уменьшить.
  • Картинка тарифицируется как входные токены — по площади. Уменьшение картинки вдвое по каждой стороне даёт вчетверо меньше токенов.

Разрешение важнее размера файла

Модель всё равно масштабирует картинку под свою сетку. Отдавать 4K-скриншот, чтобы прочитать текст ошибки, — трата токенов: обрежьте нужный участок, распознавание от этого только выиграет.

А если нужно нарисовать#

Генерация и озвучка через API-шлюз не проходят: у них другая единица тарификации (картинка и секунда, а не токен). Они доступны в студии и списываются из того же баланса.