Изображение во входе
Скриншот ошибки, макет, схема, фотография документа — всё это можно приложить к сообщению. Речь именно про вход: генерация изображений живёт в студии и через этот метод не проходит.
Формат OpenAI#
content становится массивом частей: текст и картинка рядом.
{
"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#
# 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\" } }
]}]
}"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: нет:
{
"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-шлюз не проходят: у них другая единица тарификации (картинка и секунда, а не токен). Они доступны в студии и списываются из того же баланса.