HiAPI
Блог

Руководство

Как изменить стиль изображения с помощью AI: руководство по переносу стиля image-to-image через API hiapi

Sep 4, 2026
Как изменить стиль изображения с помощью AI: руководство по переносу стиля image-to-image через API hiapi

Сменить стиль фотографии с помощью AI — превратить случайный снимок в кадр из анимации, студийное фото продукта или акварельную иллюстрацию — это не какой-то особый эндпоинт «переноса стиля». Это обычный вызов image-to-image: вы отправляете исходное изображение и текстовую инструкцию с указанием целевого стиля, а модель возвращает новое изображение. Именно то, как вы напишете эту инструкцию, а не какой-то настраиваемый параметр, решает, получите ли вы чистую смену стиля или частичную перегенерацию. Это руководство описывает механику запросов к унифицированному API задач hiapi, шаблоны промптов, которые не дают смене стиля превратиться в новое изображение, и то, как выбрать между двумя проверенными моделями image-to-image в зависимости от желаемой степени творческой свободы.

Что вам понадобится

  1. API-ключ hiapi — получите его в своей панели управления. Он передаётся в заголовке Authorization: Bearer sk-... каждого запроса.
  2. Публично доступный URL исходного изображения. Серверы hiapi сами загружают изображение, поэтому пути localhost или приватные бакеты без подписанного URL не подойдут. Предподписанные URL S3/R2/GCS работают.

Каждый идентификатор модели и поле ниже были повторно проверены на работающем API перед публикацией, включая принудительную проверку ошибок для подтверждения текущих значений перечислений.

Почему при смене стиля нужна «оговорка о сохранении»

Ни одна из двух моделей в этом руководстве не предоставляет числовой параметр интенсивности или силы — если отправить его (strength: 0.5), он будет сразу отклонён с ошибкой additional properties 'strength' not allowed. Интенсивность стиля полностью управляется формулировкой промпта, а это значит, что такая инструкция, как "make this a Studio Ghibli anime frame", сообщает модели только что добавить, но не говорит, что должно остаться неизменным — идентичность субъекта, поза и композиция могут быть свободно переосмыслены моделью.

Решение — всегда писать в промпте два предложения:

  1. Целевой стиль, выраженный через конкретную визуальную отсылку (медиум, художественное направление, определённый вид — «anime cel-shading», «1970s film photography», «clean studio product shot on white»), а не через расплывчатое прилагательное вроде «cooler».
  2. Явная оговорка о сохранении — назовите то, что не должно меняться: «keep the same subject, pose, and composition», «keep the text and logo unchanged», «keep the camera angle».

Такой промпт, как "Restyle this photo as a woodblock print. Keep the subject's pose, framing, and the position of every object in the scene.", даёт модели в одной инструкции и цель, и ограничение, что является главным рычагом для получения смены стиля, а не перегенерации.

Минимальный рабочий пример: curl

Этот пример использует seedream-5.0-pro/image-to-image, которая хорошо меняет стиль и имеет строгую, полностью проверенную схему:

curl -s -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer sk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedream-5.0-pro/image-to-image",
    "input": {
      "prompt": "Restyle this portrait as a watercolor painting with visible brush texture and soft bleeding edges. Keep the subject'\''s pose, expression, and framing exactly as in the source.",
      "image_urls": ["https://your-bucket.example.com/portrait.jpg"],
      "aspect_ratio": "3:4",
      "resolution": "2K"
    }
  }'

aspect_ratio обязателен и берётся из фиксированного перечисления — в настоящее время 1:1, 4:3, 3:4, 16:9, 9:16, 2:3, 3:2, 21:9. У этого эндпоинта нет опции «соответствовать исходному изображению», поэтому выберите значение, ближайшее к реальному соотношению сторон исходника (вертикальное фото → 3:4 или 9:16, а не 16:9), чтобы модель не добавляла поля или не обрезала композицию для подгонки.

После успешного создания возвращается идентификатор задачи в data.taskId:

{ "data": { "taskId": "<your-task-id>" } }

Опрашивайте до достижения терминального состояния:

curl -s https://api.hiapi.ai/v1/tasks/YOUR_TASK_ID \
  -H "Authorization: Bearer sk-YOUR_KEY"

data.status в конечном итоге станет success (вывод в data.output[0].url) или fail (подробности в data.error).

Полный скрипт Python: создание, опрос, скачивание

Используется только стандартная библиотека:

import json
import time
import urllib.request

API = "https://api.hiapi.ai/v1/tasks"
KEY = "sk-YOUR_KEY"


def call(url, payload=None):
    req = urllib.request.Request(
        url,
        data=json.dumps(payload).encode() if payload is not None else None,
        headers={
            "Authorization": f"Bearer {KEY}",
            "Content-Type": "application/json",
        },
        method="POST" if payload is not None else "GET",
    )
    with urllib.request.urlopen(req) as resp:
        return json.load(resp)


# 1. Create the restyle task
create = call(API, {
    "model": "seedream-5.0-pro/image-to-image",
    "input": {
        "prompt": (
            "Restyle this street photo as a 1980s film-grain photograph with warm, "
            "faded colors. Keep the same subject, pose, and every object in the "
            "same position in the frame."
        ),
        "image_urls": ["https://your-bucket.example.com/street.jpg"],
        "aspect_ratio": "16:9",
        "resolution": "2K",
    },
})
task_id = create["data"]["taskId"]
print("task created:", task_id)

# 2. Poll until terminal state
while True:
    task = call(f"{API}/{task_id}")["data"]
    if task["status"] == "success":
        break
    if task["status"] == "fail":
        err = task.get("error") or {}
        raise RuntimeError(f"task failed: {err.get('code')} {err.get('message')}")
    time.sleep(5)

# 3. Download immediately -- output URLs expire
image_url = task["output"][0]["url"]
urllib.request.urlretrieve(image_url, "restyled.png")
print("saved restyled.png")

Выбор модели в зависимости от желаемой творческой свободы

Обе модели были повторно проверены онлайн, и обе не принимают параметр strength, но они различаются в том, насколько вы можете контролировать влияние исходного изображения:

seedream-5.0-pro/image-to-image grok-imagine-quality/image-to-image
Референсные изображения 1–10 публичных URL 1–3 публичных URL
resolution 1K / 2K (заглавные) 1k / 2k (строчные) — необязательно
Контроль композиции Фиксированное перечисление aspect_ratio из 8 значений, без автосоответствия aspect_ratio: "auto" следует за входным кадром
Лучше всего подходит для Точная смена стиля по одному референсу, когда вы уже знаете целевое соотношение Быстрая смена стиля, когда нужно, чтобы вывод унаследовал точную композицию исходника без ручного выбора соотношения

Если ваша оговорка о сохранении включает «same framing», а вы не хотите вручную вычислять соотношение сторон исходника, использование grok-imagine-quality/image-to-image с aspect_ratio: "auto" — более прямой путь: подставьте её в запрос выше, image_urls до 3 штук, resolution в нижнем регистре 2k.

Замечания для продакшена

На сервере предпочитайте обратный вызов, а не опрос. Добавьте объект callback при запросе, и hiapi отправит POST один раз в терминальном состоянии, без необходимости опроса:

{
  "model": "seedream-5.0-pro/image-to-image",
  "input": { "...": "..." },
  "callback": { "url": "https://your-server.example.com/hiapi-hook", "when": "final" }
}

Рассматривайте полезную нагрузку обратного вызова как сигнал, а не как источник истины — извлеките из неё идентификатор задачи и перед действием самостоятельно повторно получите GET /v1/tasks/<id>. Для скриптов и ноутбуков достаточно опроса каждые 5 секунд.

Сделайте повторные попытки идемпотентными. При создании задачи сохраните собственное сопоставление исходное изображение → taskId. Если ваш процесс упадёт посреди опроса, после перезапуска следует повторно связать сохранённый taskId, а не отправлять задачу заново — повторная отправка создаёт вторую оплачиваемую задачу.

Ошибки, с которыми вы реально столкнётесь:

  • 401 permission_denied — неверный или отсутствующий ключ. Заголовок должен быть строго Authorization: Bearer sk-....
  • 400 INVALID_REQUEST — нарушение схемы, например aspect_ratio: value must be one of '1:1', '4:3', ... или additional properties 'strength' not allowed. Схемы обеих моделей строгие — не переносите параметры между семействами моделей.
  • image_urls must be an array — передан простой строковый литерал вместо списка, даже если референсное изображение всего одно.

Связанные материалы

Часто задаваемые вопросы

Есть ли ползунок интенсивности или силы для переноса стиля? Нет. Ни одна из двух моделей в этом руководстве не принимает поле strength — при отправке оно отклоняется как неопознанное свойство. Интенсивность стиля полностью контролируется конкретностью и силой описания стиля в промпте.

Как не дать модели изменить позу или идентичность моего субъекта? Добавьте в промпт явную оговорку о сохранении, перечислив то, что должно оставаться неизменным — позу, выражение, композицию, положение объектов. Когда ограничение выражено явно, а не подразумевается, модель меняет стиль более консервативно.

Могу ли я автоматически сохранить точное соотношение сторон исходного изображения? Да, в grok-imagine-quality/image-to-image — установите aspect_ratio: "auto". В seedream-5.0-pro/image-to-image автопараметра нет; выберите из её фиксированного перечисления значение, ближайшее к реальному соотношению сторон исходника.

Должны ли мои исходные изображения быть публичными URL? Они должны быть доступны серверам hiapi по HTTPS. Предподписанные URL приватных бакетов подходят; localhost или неаутентифицированные и недоступные пути — нет.

Могу ли я параллельно сгенерировать несколько вариантов стиля из одной фотографии? Да — каждый вариант — это отдельная задача. Отправьте несколько вызовов POST /v1/tasks с одинаковыми image_urls и разными инструкциями по стилю, затем опрашивайте каждый taskId отдельно или используйте обратные вызовы.

В чём разница между сменой стиля и вписыванием или удалением объектов? Смена стиля меняет способ отрисовки всего изображения, сохраняя содержимое; вписывание/удаление объектов меняет определённые области, сохраняя стиль отрисовки. Это разные режимы промптов на одном и том же классе эндпоинтов image-to-image — если вам на самом деле нужно вписывание и удаление объектов, обратитесь к руководству по вписыванию и удалению объектов.

Похожие статьи

Все статьи →

Начните работать с постоянными артефактами ИИ

Получите API-ключ и вызывайте модели изображений, видео и аудио через один API на основе tasks.

Читать документацию API