Wdrożenie · Automatyzacja efektu ghost mannequin

Zautomatyzuj wycinanie manekina (ghost mannequin) w swoim katalogu

W jednym zdaniu

Pobierz deltę katalogu od ostatniego uruchomienia, wyślij POST z tablicą product_images (każdy element to URL zdjęcia plus opcjonalny back_image) z jednym parametrem style na endpoint /api/v1/ghost-mannequin/batch, odpytuj identyfikator batcha co 3 sekundy, aż każdy element osiągnie status completed lub failed, a następnie zaktualizuj każdy wiersz produktu o jego output_url. Liczba równoległych batchy jest ograniczona w zależności od planu.

  • Credits: 4 credits w 2K · 5 credits w 4K
  • Typowy czas: 1.5–4 min
  • Przetwarzanie: asynchroniczne, polling

Każda liczba na tej stronie pochodzi z dokumentacji API Photta · sprawdzono

Usuwaj manekina z każdego zdjęcia PDP bez angażowania grafika. Endpoint ghost-mannequin w Photta natywnie obsługuje przetwarzanie wsadowe — nocny cron przekształci feed z 50K SKU w katalog z niewidocznym manekinem w kilka godzin, a nie tygodni.

RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/ghost-mannequin \
  -H "Authorization: Bearer $PHOTTA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
  "back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
  "image_side": "front",
  "angle": "side",
  "style": "3d",
  "background_color": "white",
  "resolution": "2K",
  "aspect_ratio": "3:4",
  "user_instruction": "closed front, cream interior lining",
  "brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')

Jak to działa

Nocne uruchomienie dla całego katalogu

Pięć elementów niezbędnych do w pełni bezobsługowej automatyzacji.

  1. Krok 1

    Zmapuj swój katalog

    Ustal, które wiersze produktów wymagają zdjęcia ghost mannequin, które już je mają, a które należą do wykluczonych kategorii. Przechowuj znacznik czasu last_photographed_at, aby nocne zadanie przetwarzało wyłącznie deltę.

  2. Krok 2

    Wybierz 3D lub flat-lay dla każdej kategorii

    `3d` dla ubrań wymagających objętości — odzież wierzchnia, denim, krawiectwo. `flat_lay` dla akcesoriów i dzianin, które wyglądają lepiej sfotografowane na płasko. Zapisz styl przypisany do kategorii produktu, aby mechanizm tworzący wsad automatycznie wybierał właściwy wariant bez ręcznej konfiguracji.

  3. Krok 3

    Wyślij deltę w trybie wsadowym

    Wyślij POST na /api/v1/ghost-mannequin/batch z tablicą product_images — każdy element zawiera image, opcjonalny back_image oraz image_side — wraz ze zdefiniowanymi parametrami style, background_color i resolution dla całego batcha. Zachowaj własne mapowanie indeksu tablicy na ID produktu; odpowiedź zwraca identyfikator generowania dla każdego elementu w tej samej kolejności.

  4. Krok 4

    Odpytuj nadrzędny batch

    Endpoint batcha zwraca zagregowane liczniki (total, processing, completed, failed). Wykonuj polling co 3 sekundy, dopóki suma completed + failed nie zrówna się z total. Photta przetwarza elementy wewnątrz batcha równolegle, więc nie musisz odpytywać pojedynczych generowań.

  5. Krok 5

    Zapisz dane w swojej bazie

    Przejdź po status.data.items w kolejności — wsad zachowuje kolejność z Twojej tablicy — i zaktualizuj każdy wiersz produktu o właściwy output_url. Loguj błędy — prawie zawsze wynikają z uszkodzonego zdjęcia źródłowego w feedzie, które można poprawić i przesłać ponownie przy kolejnym uruchomieniu.

Trzy kroki w Python

Wyodrębnienie delty, wysyłka wsadowa, polling nadrzędny — minimalna działająca automatyzacja katalogu.

from datetime import datetime, timedelta

yesterday = datetime.utcnow() - timedelta(days=1)
rows = db.execute(
    "SELECT id, source_image_url FROM products WHERE updated_at > %s",
    (yesterday,),
).fetchall()
import os, requests

res = requests.post(
    "https://api.photta.app/api/v1/ghost-mannequin/batch",
    headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
    json={
      "product_images": [
        {
          "image": "https://cdn.yourstore.com/products/jacket-front.jpg",
          "back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
          "image_side": "front"
        },
        {
          "image": "https://cdn.yourstore.com/products/shirt-front.jpg",
          "image_side": "front"
        },
        {
          "image": "https://cdn.yourstore.com/products/trousers-front.jpg",
          "image_side": "front"
        }
      ],
      "style": "3d",
      "background_color": "white",
      "resolution": "2K",
      "aspect_ratio": "3:4",
      "user_instruction": "closed front, buttoned up",
      "brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
    },
)
data = res.json()["data"]  # data["id"], data["status"]
import os, time, requests

BASE = "https://api.photta.app/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"}
# data["items"] comes back in the order of the product_images you submitted.
batch_id = data["batch_id"]
for _ in range(240):  # 240 × 3s = 12 minutes
    status = requests.get(f"{BASE}/ghost-mannequin/batch/{batch_id}", headers=HEADERS).json()["data"]
    if status["completed"] + status["failed"] == status["total"]:
        break
    time.sleep(3)

for row, item in zip(rows, status["items"]):
    if item["status"] == "completed":
        db.execute(
            "UPDATE products SET ghost_image_url = %s WHERE id = %s",
            (item["output_url"], row.id),
        )

Pytania zadawane przez programistów

Uruchamianie ghost mannequin na pełną skalę katalogu

Jak duży może być pojedynczy batch?

Zgodnie z dokumentacją endpoint wsadowy przyjmuje do kilkuset elementów w jednym wywołaniu. W przypadku nocnego przetwarzania 50K SKU podziel deltę na batche po 100–200 elementów i wysyłaj je sekwencyjnie, aby bezpiecznie zmieścić się w limitach zapytań (rate limit) Twojego planu.

Czy jeden batch może łączyć warianty 3D i flat-lay?

Tak — style to pole definiowane per element, więc pojedynczy wsad może zawierać oba warianty. W praktyce większość zespołów i tak dzieli dane według kategorii, ponieważ logika zapisu jest prostsza, gdy każdy wiersz z danego batcha trafia do tej samej kolumny w bazie danych.

Co dzieje się z elementami, które zakończą się błędem?

Za elementy w batchu zakończone błędem automatycznie zwracane są credits, a finalny payload danego elementu zawiera pola error_code i error_message. Zaloguj te błędy i ponów próbę następnej nocy, dając zespołowi czas na poprawienie zdjęcia źródłowego lub oznaczenie wiersza jako trwale nieprawidłowe dane wejściowe.

Jak zmapować wyniki z powrotem na identyfikatory moich produktów?

Podczas wysyłania zachowaj własne mapowanie pozycji w tablicy na ID produktu: odpowiedź batcha zwraca identyfikatory generowania w dokładnie takiej samej kolejności jak w tablicy product_images, a status batcha wymienia elementy w tym samym porządku.

Czy mogę zaplanować to jako codzienny cron?

Tak — prosty codzienny cron, który pobiera deltę z ostatnich 24 godzin, dzieli ją na części, przesyła batche i zapisuje wyniki w Twojej bazie danych, to kluczowy wzorzec dla zespołów pracujących w skali całego katalogu. Zadbaj o idempotencję runnera, aby nieudaną noc można było bezpiecznie powtórzyć.

Wdróż efekt ghost mannequin w skali katalogu jeszcze dziś

Trzy funkcje w Python, jeden cron, 50K zdjęć. Pobierz klucz API i skieruj go na swój katalog.