# Отредактировать изображение

`POST /v1/images/edits`

> OpenAI-совместимое редактирование картинок: принимает и multipart/form-data (как `client.images.edit()` в SDK — файлы `image`, опционально `mask`), и application/json с base64-картинками (то же тело, что у generations с полем `image`). Суммарный размер файлов — не больше 20 МБ. Модель должна иметь capability `image_input`, иначе 400 `unsupported_capability`; биллинг и rate-limit — как у /v1/images/generations (списание после успеха, 60 запросов в минуту).

Авторизация: заголовок `Authorization: Bearer <API-ключ>` (ключ sk-aiagg-… из личного кабинета). Base URL: `https://api.trackly.one/v1`.

Веб-версия: https://ai.trackly.one/developers/docs/reference/images-edits · Индекс документации: https://ai.trackly.one/llms.txt

## Тело запроса (ImageGenerationRequest)

Content-Type: `multipart/form-data`, `application/json`.

JSON-вариант — то же тело, что у /v1/images/generations, с непустым полем `image` (base64 или URL). Multipart-вариант (как `client.images.edit()` в SDK): файлы в полях `image` (можно несколько, принимается и `image[]`) и опционально `mask`, остальные поля — обычные form-поля. Суммарный размер файлов — до 20 МБ.

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `image` | `array<ImageInput> \| null` | нет | — |
| `mask` | `ImageInput \| null` | нет | — |
| `model` | `string` | да | — |
| `n` | `integer` | нет | По умолчанию: 1 |
| `prompt` | `string` | да | — |
| `quality` | `string \| null` | нет | — |
| `reference_images` | `array<ImageInput> \| null` | нет | — |
| `response_format` | `"b64_json" \| "url"` | нет | По умолчанию: "b64_json" |
| `size` | `string \| null` | нет | — |

## Схема ImageInput

Картинка, которую юзер передал во входе запроса.

Два варианта `type`:
  - `url`     — внешний URL, провайдер (или мы) скачаем по запросу.
  - `base64`  — уже сырые байты в base64 (без data:image/...; префикса).

`mime_type` обязателен для base64 (нужен Gemini для inline_data),
для url — опционально (можно определить из ответа).

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `data` | `string` | да | Длина 1–∞ символов |
| `mime_type` | `string \| null` | нет | image/png, image/jpeg, image/webp |
| `type` | `"url" \| "base64"` | да | — |

## Схема ImageGenerationResponse

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `created` | `integer` | нет | — |
| `data` | `array<ImageData>` | да | — |
| `usage` | `ImageUsage \| null` | нет | — |

## Схема ImageData

Одна сгенерированная картинка.

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `b64_json` | `string \| null` | нет | — |
| `revised_prompt` | `string \| null` | нет | — |
| `url` | `string \| null` | нет | — |

## Схема ImageUsage

Usage для image-моделей. gpt-image даёт полный breakdown,
gemini — только total_tokens, imagen — все нули.

| Поле | Тип | Обязательное | Описание |
| --- | --- | --- | --- |
| `input_tokens` | `integer` | нет | По умолчанию: 0 |
| `output_tokens` | `integer` | нет | По умолчанию: 0 |
| `total_tokens` | `integer` | нет | По умолчанию: 0 |

## Ответы

| Код | Описание | Схема |
| --- | --- | --- |
| 200 | Успешный ответ | `ImageGenerationResponse` |

## Пример запроса

```bash
curl https://api.trackly.one/v1/images/edits \
  -H "Authorization: Bearer $TRACKLY_API_KEY" \
  -F model="google/gemini-2.5-flash-image" \
  -F image="@photo.png" \
  -F prompt="Замени фон на заснеженные горы, свет оставь тёплым"
```

```python
import base64

from openai import OpenAI

client = OpenAI(
    api_key="sk-aiagg-...",
    base_url="https://api.trackly.one/v1",
)

resp = client.images.edit(
    model="google/gemini-2.5-flash-image",
    image=open("photo.png", "rb"),
    prompt="Замени фон на заснеженные горы, свет оставь тёплым",
)
with open("photo-edited.png", "wb") as f:
    f.write(base64.b64decode(resp.data[0].b64_json))
```

```javascript
import fs from "node:fs";
import OpenAI, { toFile } from "openai";

const client = new OpenAI({
  apiKey: "sk-aiagg-...",
  baseURL: "https://api.trackly.one/v1",
});

const resp = await client.images.edit({
  model: "google/gemini-2.5-flash-image",
  image: await toFile(fs.createReadStream("photo.png"), "photo.png"),
  prompt: "Замени фон на заснеженные горы, свет оставь тёплым",
});
fs.writeFileSync(
  "photo-edited.png",
  Buffer.from(resp.data[0].b64_json, "base64"),
);
```

## Пример ответа

```json
{
  "created": 1752396003,
  "data": [
    {
      "b64_json": "iVBORw0KGgoAAAANSUhEUgAAB9A…"
    }
  ],
  "usage": {
    "input_tokens": 322,
    "output_tokens": 1290,
    "total_tokens": 1612
  }
}
```
