Редактирование изображений
Редактируйте и комбинируйте изображения с помощью текстовых описаний. Загрузите одно или несколько изображений и опишите, что нужно сделать — ИИ выполнит редактирование.
Эндпоинт POST /v1/images/edits позволяет изменять изображения на основе текстовых инструкций. Поддерживает работу с несколькими изображениями одновременно (до 16 штук).
Поддерживаемые модели
| Модель | Провайдер | Описание |
|---|---|---|
gpt-image-1.5 | OpenAI | Новейшая модель, высокое качество, до 10 изображений |
gpt-image-1 | OpenAI | GPT Image 1, до 10 изображений |
gpt-image-1-mini | OpenAI | Быстрая и экономичная, до 10 изображений |
qwen-image-edit | Qwen | Только редактирование |
seedream-4.5 | ByteDance | Seedream от ByteDance |
gemini-3.1-flash-image-preview | Gemini 3.1 Flash | |
gemini-3-pro-image-preview | Gemini 3 Pro | |
gemini-2.5-flash-image | Gemini 2.5 Flash | |
flux.2-klein-4b | Black Forest Labs | Компактная Flux модель |
flux.2-max | Black Forest Labs | Максимальное качество |
flux.2-pro | Black Forest Labs | Профессиональная |
flux.2-flex | Black Forest Labs | Гибкая |
Базовое использование
Запрос отправляется в формате multipart/form-data с изображением и текстовой инструкцией.
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])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));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 входных изображений. Это позволяет комбинировать элементы из разных фотографий в одно изображение.
Создание коллажа из нескольких фото
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="Красиво разложи эти четыре товара в подарочной корзине"Комбинирование фона и объекта
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
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])Использование маски
Вы можете указать маску — изображение с прозрачными областями, определяющими зону редактирования:
response = client.images.edit(
model="gpt-image-1",
image=open("photo.png", "rb"),
mask=open("mask.png", "rb"),
prompt="Замени фон на горный пейзаж",
)Формат маски
Маска должна быть PNG-файлом с альфа-каналом. Прозрачные области обозначают зону, которую можно изменить.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
model | string | Да | Модель для редактирования |
image | file | Да | Одно изображение (до 25 МБ) |
image[] | file[] | Нет | Несколько изображений (до 16 штук для GPT Image) |
prompt | string | Да | Текстовое описание изменений (до 32000 символов) |
mask | file | Нет | Маска с зоной редактирования (PNG с альфа-каналом) |
n | integer | Нет | Количество вариантов (1–10, по умолчанию 1) |
size | string | Нет | Размер: auto, 1024x1024, 1024x1536, 1536x1024 |
quality | string | Нет | Качество: low, medium, high, auto |
background | string | Нет | Фон: transparent, opaque, auto |
output_format | string | Нет | Формат: png (по умолчанию), jpeg, webp |
output_compression | number | Нет | Сжатие для jpeg/webp (0–100) |
input_fidelity | string | Нет | Точность к оригиналу: high или low |
stream | boolean | Нет | Стриминг частичных результатов |
image_config | string (JSON) | Нет | Настройка изображения для Gemini, Flux, ByteDance (см. ниже) |
Настройка image_config (Gemini, Flux, ByteDance)
Модели Gemini, Flux и ByteDance поддерживают параметр image_config для управления форматом результата. Передаётся как JSON-строка в multipart/form-data.
Соотношение сторон + разрешение (Gemini)
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])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));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, 4K (и 0.5K только для gemini-3.1-flash-image-preview).
Размер для Flux
Flux принимает width и height вместо aspect_ratio:
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])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));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}'Формат ответа
{
"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
}
}
}Примеры использования
Удаление объектов
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])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));Изменение стиля
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])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));Прозрачный фон
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])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));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"Лучшие практики
- Чёткие инструкции: Чем конкретнее описание, тем лучше результат
- Несколько изображений: Используйте
image[]для комбинирования элементов из разных фото - Маска: Используйте маску для точного контроля области редактирования
- Качество: Параметр
quality: "high"даёт лучший результат, но стоит дороже - Размер файла: Максимальный размер одного изображения — 25 МБ
- Формат: Рекомендуется PNG для входных изображений