Перейти к основному содержанию
Модели с поддержкой vision принимают изображения вместе с текстом в одном запросе. Им можно дать картинку и попросить описать её, распознать текст (OCR), разобрать скриншот интерфейса, схему или график, прочитать таблицу с фото. Технически всё работает через тот же OpenAI-совместимый эндпоинт, что и обычный чат. Меняется только поле content: вместо строки в него передаётся массив частей — текстовые блоки {"type": "text"} и блоки с картинкой {"type": "image_url"}.
Берите модель, которая умеет vision: Claude (Sonnet / Opus), GPT, Gemini принимают изображения. DeepSeek работает только с текстом — см. Модели DeepSeek. Перед запросом проверьте бейджи возможностей на странице «Цены» основного сайта.

Картинка по публичной ссылке

Самый простой случай — изображение уже лежит в интернете по прямому URL.
Python (OpenAI SDK)
from openai import OpenAI

client = OpenAI(
    api_key="sk-ВАШ_КЛЮЧ",
    base_url="https://www.ruapi.ai/v1",
)

response = client.chat.completions.create(
    model="claude-opus-4-8",  # vision-модель; точные имена — на странице цен
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Что изображено на картинке? Опиши кратко."},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://upload.wikimedia.org/wikipedia/commons/3/3a/Cat03.jpg"
                    },
                },
            ],
        }
    ],
)

print(response.choices[0].message.content)

Локальный файл через base64

Если картинки нет в открытом доступе (скриншот, фото с диска), её кодируют в base64 и передают как data URI вида data:image/jpeg;base64,....
Python (OpenAI SDK)
import base64
from openai import OpenAI

client = OpenAI(
    api_key="sk-ВАШ_КЛЮЧ",
    base_url="https://www.ruapi.ai/v1",
)

# Кодируем локальный файл в base64
with open("screenshot.jpg", "rb") as f:
    b64 = base64.b64encode(f.read()).decode("utf-8")

data_uri = f"data:image/jpeg;base64,{b64}"

response = client.chat.completions.create(
    model="claude-opus-4-8",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Распознай весь текст на скриншоте."},
                {"type": "image_url", "image_url": {"url": data_uri}},
            ],
        }
    ],
)

print(response.choices[0].message.content)
Для PNG поменяйте префикс на data:image/png;base64,, для WebP — data:image/webp;base64,. MIME-тип должен совпадать с реальным форматом файла.

Подводные камни

Картинка считается как входные токены, и чем выше разрешение, тем дороже запрос. Если детали не нужны — уменьшите изображение перед отправкой (например, до 1024–1568 px по длинной стороне).
Строка base64 примерно на треть больше самого файла и целиком уходит в тело запроса. Для тяжёлых картинок надёжнее публичная ссылка, чем многомегабайтный data URI — иначе можно упереться в лимит размера запроса.
Обычно это jpeg, png, webp и gif. Экзотические форматы (HEIC, TIFF, SVG) лучше заранее перекодировать в один из перечисленных.

Что дальше