Skip to content

Редактирование изображений

Редактируйте и комбинируйте изображения с помощью текстовых описаний. Загрузите одно или несколько изображений и опишите, что нужно сделать — ИИ выполнит редактирование.

Эндпоинт POST /v1/images/edits позволяет изменять изображения на основе текстовых инструкций. Поддерживает работу с несколькими изображениями одновременно (до 16 штук).

Поддерживаемые модели

МодельПровайдерОписание
gpt-image-1.5OpenAIНовейшая модель, высокое качество, до 10 изображений
gpt-image-1OpenAIGPT Image 1, до 10 изображений
gpt-image-1-miniOpenAIБыстрая и экономичная, до 10 изображений
qwen-image-editQwenТолько редактирование
seedream-4.5ByteDanceSeedream от ByteDance
gemini-3.1-flash-image-previewGoogleGemini 3.1 Flash
gemini-3-pro-image-previewGoogleGemini 3 Pro
gemini-2.5-flash-imageGoogleGemini 2.5 Flash
flux.2-klein-4bBlack Forest LabsКомпактная Flux модель
flux.2-maxBlack Forest LabsМаксимальное качество
flux.2-proBlack Forest LabsПрофессиональная
flux.2-flexBlack Forest LabsГибкая

Базовое использование

Запрос отправляется в формате multipart/form-data с изображением и текстовой инструкцией.

python
from openai import OpenAI

client = OpenAI(
    api_key="sk-aitunnel-xxx",
    base_url="https://api.aitunnel.ru/v1/",
)

response = client.images.edit(
    model="gpt-image-1",
    image=open("photo.png", "rb"),
    prompt="Добавь солнечные очки на лицо человека",
)

print(response.data[0].b64_json[:50])
typescript
import OpenAI from "openai";
import fs from "fs";

const client = new OpenAI({
  apiKey: "sk-aitunnel-xxx",
  baseURL: "https://api.aitunnel.ru/v1/",
});

const response = await client.images.edit({
  model: "gpt-image-1",
  image: fs.createReadStream("photo.png"),
  prompt: "Добавь солнечные очки на лицо человека",
});

console.log(response.data[0].b64_json?.slice(0, 50));
shell
curl https://api.aitunnel.ru/v1/images/edits \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -F model="gpt-image-1" \
  -F image="@photo.png" \
  -F prompt="Добавь солнечные очки на лицо человека"

Комбинирование нескольких изображений

Модели GPT Image поддерживают до 16 входных изображений. Это позволяет комбинировать элементы из разных фотографий в одно изображение.

Создание коллажа из нескольких фото

shell
curl https://api.aitunnel.ru/v1/images/edits \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -F model="gpt-image-1.5" \
  -F "image[]=@product1.png" \
  -F "image[]=@product2.png" \
  -F "image[]=@product3.png" \
  -F "image[]=@product4.png" \
  -F prompt="Красиво разложи эти четыре товара в подарочной корзине"

Комбинирование фона и объекта

shell
curl https://api.aitunnel.ru/v1/images/edits \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -F model="gpt-image-1.5" \
  -F "image[]=@person.png" \
  -F "image[]=@beach-background.png" \
  -F prompt="Помести человека с первого фото на фон пляжа со второго фото"

Комбинирование в Python

python
import requests

url = "https://api.aitunnel.ru/v1/images/edits"
headers = {"Authorization": "Bearer sk-aitunnel-xxx"}

files = [
    ("image[]", ("item1.png", open("item1.png", "rb"), "image/png")),
    ("image[]", ("item2.png", open("item2.png", "rb"), "image/png")),
    ("image[]", ("item3.png", open("item3.png", "rb"), "image/png")),
]

data = {
    "model": "gpt-image-1.5",
    "prompt": "Объедини эти три предмета в стильную композицию на белом фоне",
    "quality": "high",
    "size": "1536x1024",
}

response = requests.post(url, headers=headers, files=files, data=data)
result = response.json()
print(result["data"][0]["b64_json"][:50])

Использование маски

Вы можете указать маску — изображение с прозрачными областями, определяющими зону редактирования:

python
response = client.images.edit(
    model="gpt-image-1",
    image=open("photo.png", "rb"),
    mask=open("mask.png", "rb"),
    prompt="Замени фон на горный пейзаж",
)

Формат маски

Маска должна быть PNG-файлом с альфа-каналом. Прозрачные области обозначают зону, которую можно изменить.

Параметры запроса

ПараметрТипОбязательныйОписание
modelstringДаМодель для редактирования
imagefileДаОдно изображение (до 25 МБ)
image[]file[]НетНесколько изображений (до 16 штук для GPT Image)
promptstringДаТекстовое описание изменений (до 32000 символов)
maskfileНетМаска с зоной редактирования (PNG с альфа-каналом)
nintegerНетКоличество вариантов (1–10, по умолчанию 1)
sizestringНетРазмер: auto, 1024x1024, 1024x1536, 1536x1024
qualitystringНетКачество: low, medium, high, auto
backgroundstringНетФон: transparent, opaque, auto
output_formatstringНетФормат: png (по умолчанию), jpeg, webp
output_compressionnumberНетСжатие для jpeg/webp (0–100)
input_fidelitystringНетТочность к оригиналу: high или low
streambooleanНетСтриминг частичных результатов
image_configstring (JSON)НетНастройка изображения для Gemini, Flux, ByteDance (см. ниже)

Настройка image_config (Gemini, Flux, ByteDance)

Модели Gemini, Flux и ByteDance поддерживают параметр image_config для управления форматом результата. Передаётся как JSON-строка в multipart/form-data.

Соотношение сторон + разрешение (Gemini)

python
import requests

url = "https://api.aitunnel.ru/v1/images/edits"
headers = {"Authorization": "Bearer sk-aitunnel-xxx"}

with open("photo.png", "rb") as f:
    response = requests.post(
        url,
        headers=headers,
        files={"image": f},
        data={
            "model": "gemini-3-pro-image-preview",
            "prompt": "Замени фон на горный пейзаж",
            "image_config": '{"aspect_ratio": "16:9", "image_size": "4K"}',
        }
    )

result = response.json()
print(result["data"][0]["url"][:50])
javascript
import fs from "fs";

const formData = new FormData();
formData.append("model", "gemini-3-pro-image-preview");
formData.append("prompt", "Замени фон на горный пейзаж");
formData.append("image", new Blob([fs.readFileSync("photo.png")], { type: "image/png" }), "photo.png");
formData.append("image_config", JSON.stringify({ aspect_ratio: "16:9", image_size: "4K" }));

const response = await fetch("https://api.aitunnel.ru/v1/images/edits", {
  method: "POST",
  headers: { Authorization: "Bearer sk-aitunnel-xxx" },
  body: formData,
});

const result = await response.json();
console.log(result.data[0].url.slice(0, 50));
shell
curl https://api.aitunnel.ru/v1/images/edits \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -F model="gemini-3.1-flash-image-preview" \
  -F image="@photo.png" \
  -F prompt="Добавь закат на небо" \
  -F 'image_config={"aspect_ratio":"16:9","image_size":"4K"}'

Поддерживаемые значения aspect_ratio: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9 (расширенные 1:4, 4:1, 1:8, 8:1 только для gemini-3.1-flash-image-preview).

Поддерживаемые значения image_size: 1K, 2K, 4K0.5K только для gemini-3.1-flash-image-preview).

Размер для Flux

Flux принимает width и height вместо aspect_ratio:

python
import requests

url = "https://api.aitunnel.ru/v1/images/edits"
headers = {"Authorization": "Bearer sk-aitunnel-xxx"}

with open("photo.png", "rb") as f:
    response = requests.post(
        url,
        headers=headers,
        files={"image": f},
        data={
            "model": "flux.2-pro",
            "prompt": "Перерисуй в стиле аниме",
            "image_config": '{"width": 1344, "height": 768}',
        }
    )

result = response.json()
print(result["data"][0]["url"][:50])
javascript
import fs from "fs";

const formData = new FormData();
formData.append("model", "flux.2-pro");
formData.append("prompt", "Перерисуй в стиле аниме");
formData.append("image", new Blob([fs.readFileSync("photo.png")], { type: "image/png" }), "photo.png");
formData.append("image_config", JSON.stringify({ width: 1344, height: 768 }));

const response = await fetch("https://api.aitunnel.ru/v1/images/edits", {
  method: "POST",
  headers: { Authorization: "Bearer sk-aitunnel-xxx" },
  body: formData,
});

const result = await response.json();
console.log(result.data[0].url.slice(0, 50));
shell
curl https://api.aitunnel.ru/v1/images/edits \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -F model="flux.2-pro" \
  -F image="@photo.png" \
  -F prompt="Перерисуй в стиле аниме" \
  -F 'image_config={"width":1344,"height":768}'

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

json
{
  "created": 1234567890,
  "data": [
    {
      "b64_json": "iVBORw0KGgo..."
    }
  ],
  "quality": "high",
  "size": "1024x1024",
  "usage": {
    "input_tokens": 50,
    "output_tokens": 50,
    "total_tokens": 100,
    "input_tokens_details": {
      "text_tokens": 10,
      "image_tokens": 40
    }
  }
}

Примеры использования

Удаление объектов

python
from openai import OpenAI

client = OpenAI(
    api_key="sk-aitunnel-xxx",
    base_url="https://api.aitunnel.ru/v1/",
)

response = client.images.edit(
    model="gpt-image-1",
    image=open("street.png", "rb"),
    prompt="Удали все машины с улицы, оставь пустую дорогу",
)

print(response.data[0].b64_json[:50])
javascript
import OpenAI from "openai";
import fs from "fs";

const client = new OpenAI({
  apiKey: "sk-aitunnel-xxx",
  baseURL: "https://api.aitunnel.ru/v1/",
});

const response = await client.images.edit({
  model: "gpt-image-1",
  image: fs.createReadStream("street.png"),
  prompt: "Удали все машины с улицы, оставь пустую дорогу",
});

console.log(response.data[0].b64_json?.slice(0, 50));

Изменение стиля

python
from openai import OpenAI

client = OpenAI(
    api_key="sk-aitunnel-xxx",
    base_url="https://api.aitunnel.ru/v1/",
)

response = client.images.edit(
    model="gpt-image-1.5",
    image=open("photo.png", "rb"),
    prompt="Преврати фотографию в акварельную картину",
    extra_body={"quality": "high"},
)

print(response.data[0].b64_json[:50])
javascript
import OpenAI from "openai";
import fs from "fs";

const client = new OpenAI({
  apiKey: "sk-aitunnel-xxx",
  baseURL: "https://api.aitunnel.ru/v1/",
});

const response = await client.images.edit({
  model: "gpt-image-1.5",
  image: fs.createReadStream("photo.png"),
  prompt: "Преврати фотографию в акварельную картину",
  // @ts-ignore
  quality: "high",
});

console.log(response.data[0].b64_json?.slice(0, 50));

Прозрачный фон

python
import requests

url = "https://api.aitunnel.ru/v1/images/edits"
headers = {"Authorization": "Bearer sk-aitunnel-xxx"}

with open("product.png", "rb") as f:
    response = requests.post(
        url,
        headers=headers,
        files={"image": f},
        data={
            "model": "gpt-image-1.5",
            "prompt": "Удали фон, оставь только товар",
            "background": "transparent",
            "output_format": "png",
        }
    )

result = response.json()
print(result["data"][0]["b64_json"][:50])
javascript
import fs from "fs";

const formData = new FormData();
formData.append("model", "gpt-image-1.5");
formData.append("prompt", "Удали фон, оставь только товар");
formData.append("image", new Blob([fs.readFileSync("product.png")], { type: "image/png" }), "product.png");
formData.append("background", "transparent");
formData.append("output_format", "png");

const response = await fetch("https://api.aitunnel.ru/v1/images/edits", {
  method: "POST",
  headers: { Authorization: "Bearer sk-aitunnel-xxx" },
  body: formData,
});

const result = await response.json();
console.log(result.data[0].b64_json.slice(0, 50));
shell
curl https://api.aitunnel.ru/v1/images/edits \
  -H "Authorization: Bearer sk-aitunnel-xxx" \
  -F model="gpt-image-1.5" \
  -F image="@product.png" \
  -F prompt="Удали фон, оставь только товар" \
  -F background="transparent" \
  -F output_format="png"

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

  1. Чёткие инструкции: Чем конкретнее описание, тем лучше результат
  2. Несколько изображений: Используйте image[] для комбинирования элементов из разных фото
  3. Маска: Используйте маску для точного контроля области редактирования
  4. Качество: Параметр quality: "high" даёт лучший результат, но стоит дороже
  5. Размер файла: Максимальный размер одного изображения — 25 МБ
  6. Формат: Рекомендуется PNG для входных изображений

AITUNNEL