> Для получения чистого Markdown любой страницы добавьте .md к URL страницы.  
> Для полного индекса документации см. https://api.vega.chat/docs/llms.txt.  
> Для полного содержания документации см. https://api.vega.chat/docs/llms-full.txt.  
> Для интеграции AI‑клиентов (Claude Code, Cursor и др.) подключитесь к MCP‑серверу по адресу https://api.vega.chat/docs/_mcp/server.

# Генерация изображений

VEGA поддерживает генерацию изображений через эндпоинты [Chat Completions](/docs/api/api-reference/chat/send-chat-completion-request) и [Responses](/docs/api/reference/responses/overview). Поддерживаемые модели, их возможности и цены можно посмотреть, отфильтровав наш [список моделей по выводу изображений](/aimodels?output_modalities=image).

## Поиск моделей

Модели для генерации изображений можно найти несколькими способами:

### Через API

Используйте параметр запроса `output_modalities` в [Models API](/docs/api-reference/models/get-models), чтобы программно обнаружить модели генерации изображений:

```bash
# Вывести только модели генерации изображений
curl "https://api.vega.chat/api/v1/models?output_modalities=image"

# Вывести модели, поддерживающие как текст, так и изображения
curl "https://api.vega.chat/api/v1/models?output_modalities=text,image"
```

Смотрите [Models – Query Parameters](/docs/guides/overview/models#query-parameters) для полного списка поддерживаемых значений модальностей.

### На странице моделей

Перейдите на [страницу моделей](/models) и отфильтруйте по модальностям вывода, чтобы найти модели, способные генерировать изображения. Ищите модели, у которых в `output_modalities` указано `"image"`.

### В чат‑комнате

При использовании [чат‑комнаты](/chat) нажмите кнопку **Image**, чтобы автоматически отфильтровать и выбрать модели с возможностью генерации изображений. Если активной модели с поддержкой изображений нет, вам будет предложено добавить её.

## Использование API

Для генерации изображений отправьте запрос к эндпоинту `/api/v1/chat/completions` с параметром `modalities`. Значение зависит от возможностей модели:

* **Модели, выводящие и текст, и изображения** (например, Gemini): `modalities: ["image", "text"]`
* **Модели, выводящие только изображения** (например, Sourceful, Flux): `modalities: ["image"]`

### Базовая генерация изображений

```typescript title="TypeScript SDK"
import { OpenRouter } from '@openrouter/sdk';

const client = new OpenRouter({
  apiKey: '{{API_KEY_REF}}',
});

const result = await client.chat.send({
  model: '{{MODEL}}',
  messages: [
    {
      role: 'user',
      content: 'Generate a beautiful sunset over mountains',
    },
  ],
  modalities: ['image', 'text'],
  stream: false,
});

// Сгенерированное изображение будет в сообщении ассистента
if (result.choices) {
  const message = result.choices[0].message;
  if (message.images) {
    message.images.forEach((image, index) => {
      const imageUrl = image.imageUrl.url; // Base64 data URL
      console.log(`Generated image ${index + 1}: ${imageUrl.substring(0, 50)}...`);
    });
  }
}
```

```python
import requests
import json

url = "https://api.vega.chat/api/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {API_KEY_REF}",
    "Content-Type": "application/json"
}

payload = {
    "model": "{{MODEL}}",
    "messages": [
        {
            "role": "user",
            "content": "Generate a beautiful sunset over mountains"
        }
    ],
    "modalities": ["image", "text"]
}

response = requests.post(url, headers=headers, json=payload)
result = response.json()

# Сгенерированное изображение будет в сообщении ассистента
if result.get("choices"):
    message = result["choices"][0]["message"]
    if message.get("images"):
        for image in message["images"]:
            image_url = image["image_url"]["url"]  # Base64 data URL
            print(f"Generated image: {image_url[:50]}...")
```

```typescript title="TypeScript (fetch)"
const response = await fetch('https://api.vega.chat/api/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${API_KEY_REF}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: '{{MODEL}}',
    messages: [
      {
        role: 'user',
        content: 'Generate a beautiful sunset over mountains',
      },
    ],
    modalities: ['image', 'text'],
  }),
});

const result = await response.json();

// Сгенерированное изображение будет в сообщении ассистента
if (result.choices) {
  const message = result.choices[0].message;
  if (message.images) {
    message.images.forEach((image, index) => {
      const imageUrl = image.image_url.url; // Base64 data URL
      console.log(`Generated image ${index + 1}: ${imageUrl.substring(0, 50)}...`);
    });
  }
}
```

### Параметры конфигурации изображения

Некоторые модели генерации изображений поддерживают дополнительную настройку через параметр `image_config`.

#### Соотношение сторон

Установите `image_config.aspect_ratio`, чтобы запросить конкретные соотношения сторон для генерируемых изображений.

**Поддерживаемые соотношения сторон:**

* `1:1` → 1024×1024 (по умолчанию)
* `2:3` → 832×1248
* `3:2` → 1248×832
* `3:4` → 864×1184
* `4:3` → 1184×864
* `4:5` → 896×1152
* `5:4` → 1152×896
* `9:16` → 768×1344
* `16:9` → 1344×768
* `21:9` → 1536×672

**Соотношения сторон Azure MAI Image** (поддерживает [`microsoft/mai-image-2.5`](/models/microsoft/mai-image-2.5)):

* `1:1` → 1024×1024 (по умолчанию)
* `4:3` → 1024×768
* `3:4` → 768×1024
* `16:9` → 1365×768
* `9:16` → 768×1365
* `3:2` → 1152×768
* `2:3` → 768×1152

**Расширенные соотношения сторон** (поддерживает только [`google/gemini-3.1-flash-image-preview`](/models/google/gemini-3.1-flash-image-preview)):

* `1:4` → Высокий, узкий формат, идеален для прокручиваемых каруселей и вертикальных UI‑элементов
* `4:1` → Широкий, короткий формат для баннеров‑героев и горизонтальных макетов
* `1:8` → Очень высокий формат для заголовков‑уведомлений и узких вертикальных пространств
* `8:1` → Очень широкий формат для широкоформатных баннеров и панорамных макетов

#### Размер изображения

Установите `image_config.image_size`, чтобы управлять разрешением генерируемых изображений.

**Поддерживаемые размеры:**

* `1K` → Стандартное разрешение (по умолчанию)
* `2K` → Более высокое разрешение
* `4K` → Наивысшее разрешение
* `0.5K` → Низкое разрешение, оптимизировано для эффективности (поддерживается только [`google/gemini-3.1-flash-image-preview`](/models/google/gemini-3.1-flash-image-preview))

Вы можете комбинировать `aspect_ratio` и `image_size` в одном запросе:

```python
import requests
import json

url = "https://api.vega.chat/api/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {API_KEY_REF}",
    "Content-Type": "application/json"
}

payload = {
    "model": "{{MODEL}}",
    "messages": [
        {
            "role": "user",
            "content": "Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme"
        }
    ],
    "modalities": ["image", "text"],
    "image_config": {
        "aspect_ratio": "16:9",
        "image_size": "4K"
    }
}

response = requests.post(url, headers=headers, json=payload)
result = response.json()

if result.get("choices"):
    message = result["choices"][0]["message"]
    if message.get("images"):
        for image in message["images"]:
            image_url = image["image_url"]["url"]
            print(f"Generated image: {image_url[:50]}...")
```

```typescript
const response = await fetch('https://api.vega.chat/api/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${API_KEY_REF}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: '{{MODEL}}',
    messages: [
      {
        role: 'user',
        content: 'Create a picture of a nano banana dish in a fancy restaurant with a Gemini theme',
      },
    ],
    modalities: ['image', 'text'],
    image_config: {
      aspect_ratio: '16:9',
      image_size: '4K',
    },
  }),
});

const result = await response.json();

if (result.choices) {
  const message = result.choices[0].message;
  if (message.images) {
    message.images.forEach((image, index) => {
      const imageUrl = image.image_url.url;
      console.log(`Generated image ${index + 1}: ${imageUrl.substring(0, 50)}...`);
    });
  }
}
```

#### Strength (только Recraft)

Установите `image_config.strength`, чтобы контролировать степень отклонения выходного изображения от входного при генерации «image‑to‑image». Параметр применяется только при передаче входных изображений в `messages` и поддерживается только моделями Recraft.

* **Диапазон**: `0.0` – `1.0`
* **По умолчанию**: `0.2`
* Меньшие значения дают результат, ближе к входному изображению; большие — более креативное отклонение.

**Пример:**

```json
{
  "image_config": {
    "strength": 0.7
  }
}
```

#### Text Layout (только Recraft V3)

Используйте `image_config.text_layout`, чтобы разместить текст в определённых позициях на генерируемом изображении. Каждый элемент описывает текст и ограничивающий прямоугольник, заданный четырьмя угловыми точками в нормализованных координатах (0 – 1). Параметр поддерживается только Recraft V3 (`recraft/recraft-v3`) для запросов как text‑to‑image, так и image‑to‑image. Recraft V4 и V4 Pro не поддерживают `text_layout`.

Каждый элемент имеет:

* `text` (обязательно): строка текста
* `bbox` (обязательно): массив из 4 пар координат `[x, y]`, определяющих углы (верх‑лево, верх‑право, низ‑право, низ‑лево) в диапазоне 0‑1

**Пример:**

```json
{
  "image_config": {
    "text_layout": [
      {
        "text": "Hello",
        "bbox": [[0.3, 0.45], [0.6, 0.45], [0.6, 0.55], [0.3, 0.55]]
      },
      {
        "text": "World",
        "bbox": [[0.35, 0.6], [0.65, 0.6], [0.65, 0.7], [0.35, 0.7]]
      }
    ]
  }
}
```

#### Style (только Recraft V3)

Используйте `image_config.style`, чтобы применить к изображению определённый художественный стиль. Параметр поддерживается только Recraft V3 (`recraft/recraft-v3`). Recraft V4 и V4 Pro стили не поддерживают.

Смотрите [полный список доступных стилей](https://www.recraft.ai/docs/api-reference/styles#list-of-styles) в документации Recraft. Векторные стили не поддерживаются.

**Пример:**

```json
{
  "image_config": {
    "style": "Photorealism"
  }
}
```

#### RGB‑цвета (только Recraft)

Используйте `image_config.rgb_colors`, чтобы задать палитру цветов, влияющую на генерируемое изображение. Каждый цвет задаётся массивом `[r, g, b]` из трёх целых (0‑255). Параметр поддерживается моделями Recraft для запросов как text‑to‑image, так и image‑to‑image.

**Пример:**

```json
{
  "image_config": {
    "rgb_colors": [
      [255, 0, 0],
      [0, 128, 0]
    ]
  }
}
```

#### Фоновый RGB‑цвет (только Recraft)

Используйте `image_config.background_rgb_color`, чтобы задать конкретный цвет фона генерируемого изображения. Значение — массив `[r, g, b]` из трёх целых (0‑255). Параметр поддерживается моделями Recraft для запросов как text‑to‑image, так и image‑to‑image.

**Пример:**

```json
{
  "image_config": {
    "background_rgb_color": [0, 0, 255]
  }
}
```

Можно комбинировать `rgb_colors` и `background_rgb_color` в одном запросе:

```json
{
  "image_config": {
    "rgb_colors": [[255, 0, 0]],
    "background_rgb_color": [255, 255, 255]
  }
}
```

#### Font Inputs (только Sourceful)

Используйте `image_config.font_inputs`, чтобы отрисовать пользовательский текст определёнными шрифтами в генерируемых изображениях. Текст, который вы хотите отобразить, также должен присутствовать в вашем запросе для лучшего результата. Параметр поддерживается только моделями Sourceful (`sourceful/riverflow-v2-fast` и `sourceful/riverflow-v2-pro`).

Каждый ввод шрифта — объект с:

* `font_url` (обязательно): URL к файлу шрифта
* `text` (обязательно): Текст, который нужно отрисовать этим шрифтом

**Ограничения:**

* Максимум 2 шрифта в запросе
* Дополнительная стоимость: $0.03 за каждый шрифт

**Пример:**

```json
{
  "image_config": {
    "font_inputs": [
      {
        "font_url": "https://example.com/fonts/custom-font.ttf",
        "text": "Hello World"
      }
    ]
  }
}
```

**Советы для лучшего результата:**

* Включайте текст в запрос вместе с деталями о названии шрифта, цвете, размере и позиции
* Параметр `text` должен точно соответствовать тому, что указано в запросе — избегайте лишних слов или кавычек
* Используйте разрывы строк или двойные пробелы для разделения заголовков и подзаголовков при одинаковом шрифте
* Наилучший результат достигается с короткими, чёткими заголовками и подзаголовками

#### Super Resolution References (только Sourceful)

Используйте `image_config.super_resolution_references`, чтобы улучшить низкокачественные элементы входного изображения с помощью высококачественных референсных изображений. Выходное изображение будет того же размера, что и входное, поэтому используйте более крупные входные изображения для лучшего результата. Параметр поддерживается только моделями Sourceful (`sourceful/riverflow-v2-fast` и `sourceful/riverflow-v2-pro`) при генерации image‑to‑image (т.е. когда в `messages` передаются изображения).

**Ограничения:**

* Максимум 4 URL‑референса в запросе
* Работает только с запросами image‑to‑image (игнорируется, если в `messages` нет изображений)
* Дополнительная стоимость: 20 ₽ за каждый референс

**Пример:**

```json
{
  "image_config": {
    "super_resolution_references": [
      "https://example.com/reference1.jpg",
      "https://example.com/reference2.jpg"
    ]
  }
}
```

**Советы для лучшего результата:**

* Предоставьте входное изображение, где нужные элементы присутствуют, но имеют низкое качество
* Используйте более крупные входные изображения для лучшего качества вывода (вывод совпадает с размером входа)
* Выбирайте высококачественные референсные изображения, демонстрирующие желаемый вид улучшенных элементов

### Потоковая генерация изображений

Генерация изображений также работает с потоковыми ответами:

```python
import requests
import json

url = "https://api.vega.chat/api/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {API_KEY_REF}",
    "Content-Type": "application/json"
}

payload = {
    "model": "{{MODEL}}",
    "messages": [
        {
            "role": "user",
            "content": "Create an image of a futuristic city"
        }
    ],
    "modalities": ["image", "text"],
    "stream": True
}

response = requests.post(url, headers=headers, json=payload, stream=True)

for line in response.iter_lines():
    if line:
        line = line.decode('utf-8')
        if line.startswith('data: '):
            data = line[6:]
            if data != '[DONE]':
                try:
                    chunk = json.loads(data)
                    if chunk.get("choices"):
                        delta = chunk["choices"][0].get("delta", {})
                        if delta.get("images"):
                            for image in delta["images"]:
                                print(f"Generated image: {image['image_url']['url'][:50]}...")
                except json.JSONDecodeError:
                    continue
```

```typescript
const response = await fetch('https://api.vega.chat/api/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${API_KEY_REF}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: '{{MODEL}}',
    messages: [
      {
        role: 'user',
        content: 'Create an image of a futuristic city',
      },
    ],
    modalities: ['image', 'text'],
    stream: true,
  }),
});

const reader = response.body?.getReader();
const decoder = new TextDecoder();

while (true) {
  const { done, value } = await reader.read();
  if (done) break;

  const chunk = decoder.decode(value);
  const lines = chunk.split('\n');

  for (const line of lines) {
    if (line.startsWith('data: ')) {
      const data = line.slice(6);
      if (data !== '[DONE]') {
        try {
          const parsed = JSON.parse(data);
          if (parsed.choices) {
            const delta = parsed.choices[0].delta;
            if (delta?.images) {
              delta.images.forEach((image, index) => {
                console.log(`Generated image ${index + 1}: ${image.image_url.url.substring(0, 50)}...`);
              });
            }
          }
        } catch (e) {
          // Пропустить некорректный JSON
        }
      }
    }
  }
}
```

## Формат ответа

При генерации изображений сообщение ассистента содержит поле `images` с сгенерированными изображениями:

```json
{
  "choices": [
    {
      "message": {
        "role": "assistant",
        "content": "I've generated a beautiful sunset image for you.",
        "images": [
          {
            "type": "image_url",
            "image_url": {
              "url": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA..."
            }
          }
        ]
      }
    }
  ]
}
```

### Формат изображения

* **Формат**: изображения возвращаются в виде base64‑закодированных data‑URL
* **Типы**: обычно PNG (`data:image/png;base64,`)
* **Несколько изображений**: некоторые модели могут генерировать несколько изображений в одном ответе
* **Размер**: размеры зависят от возможностей модели

## Совместимость моделей

Не все модели поддерживают генерацию изображений. Чтобы воспользоваться этой функцией:

1. **Проверьте модальности вывода**: убедитесь, что у модели в `output_modalities` присутствует `"image"`
2. **Установите параметр modalities**: используйте `["image", "text"]` для моделей, выводящих и то, и другое, или `["image"]` для моделей, выводящих только изображения
3. **Выберите совместимые модели**. Примеры:
   * `google/gemini-3.1-flash-image-preview` (поддерживает расширенные соотношения сторон и разрешение 0.5K)
   * `google/gemini-2.5-flash-image`
   * `black-forest-labs/flux.2-pro`
   * `black-forest-labs/flux.2-flex`
   * `sourceful/riverflow-v2-standard-preview`
   * Другие модели с возможностью генерации изображений

## Лучшие практики

* **Чёткие запросы**: предоставляйте детальные описания для лучшего качества изображений
* **Выбор модели**: используйте модели, специально предназначенные для генерации изображений
* **Обработка ошибок**: проверяйте наличие поля `images` в ответе перед дальнейшей обработкой
* **Ограничения по скорости**: генерация изображений может иметь другие лимиты, чем генерация текста
* **Хранение**: продумайте, как будете сохранять и обрабатывать base64‑данные изображений

## Устранение неполадок

**Нет изображений в ответе?**

* Убедитесь, что модель поддерживает генерацию изображений (`output_modalities` включает `"image"`)
* Проверьте, что параметр `modalities` установлен правильно: `["image", "text"]` для моделей, выводящих и то, и другое, или `["image"]` для моделей, выводящих только изображения
* Убедитесь, что ваш запрос действительно запрашивает генерацию изображения

**Модель не найдена?**

* Используйте [страницу моделей](/models), чтобы найти доступные модели генерации изображений
* Отфильтруйте по модальностям вывода, чтобы увидеть совместимые модели