> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ruapi.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Работа с изображениями (vision)

> Как отправить картинку в LLM через RuAPI: пример на Python с image_url, публичная ссылка и base64, какие модели и форматы поддерживаются.

Модели с поддержкой vision принимают изображения вместе с текстом в одном запросе. Им можно дать картинку и попросить описать её, распознать текст (OCR), разобрать скриншот интерфейса, схему или график, прочитать таблицу с фото.

Технически всё работает через тот же OpenAI-совместимый эндпоинт, что и обычный чат. Меняется только поле `content`: вместо строки в него передаётся **массив частей** — текстовые блоки `{"type": "text"}` и блоки с картинкой `{"type": "image_url"}`.

<Tip>
  Берите модель, которая **умеет vision**: [Claude](/ru/claude-api) (Sonnet / Opus), [GPT](/ru/gpt-api), [Gemini](/ru/gemini-api) и [GLM](/ru/glm-api) (GLM-5V) принимают изображения. DeepSeek работает только с текстом — см. [Модели DeepSeek](/ru/deepseek-api). Перед запросом проверьте бейджи возможностей на странице **«Цены»** на [www.ruapi.ai](https://www.ruapi.ai).
</Tip>

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

Самый простой случай — изображение уже лежит в интернете по прямому URL.

```python Python (OpenAI SDK) theme={null}
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 Python (OpenAI SDK) theme={null}
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)
```

<Note>
  Для PNG поменяйте префикс на `data:image/png;base64,`, для WebP — `data:image/webp;base64,`. MIME-тип должен совпадать с реальным форматом файла.
</Note>

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

<AccordionGroup>
  <Accordion title="Большие изображения = больше токенов">
    Картинка считается как входные токены, и чем выше разрешение, тем дороже запрос. Если детали не нужны — уменьшите изображение перед отправкой (например, до 1024–1568 px по длинной стороне).
  </Accordion>

  <Accordion title="Огромный base64 раздувает запрос">
    Строка base64 примерно на треть больше самого файла и целиком уходит в тело запроса. Для тяжёлых картинок надёжнее публичная ссылка, чем многомегабайтный data URI — иначе можно упереться в лимит размера запроса.
  </Accordion>

  <Accordion title="Поддерживаемые форматы">
    Обычно это `jpeg`, `png`, `webp` и `gif`. Экзотические форматы (HEIC, TIFF, SVG) лучше заранее перекодировать в один из перечисленных.
  </Accordion>
</AccordionGroup>

## Что дальше

* [Быстрый старт](/ru/quickstart) — регистрация, ключ и первый запрос
* [Ошибки и их решение](/ru/errors) — что делать при 400 / 413 / 415 и других кодах
