Byg · Automatisering af Ghost Mannequin

Automatiser udtræk af ghost mannequin til dit katalog

I én sætning

Hent katalogets delta siden din sidste kørsel, lav et POST-kald med et product_images-array (hvert element en billed-URL plus valgfrit back_image) med én style til /api/v1/ghost-mannequin/batch, lav polling på batch-ID'et hvert 3 sekund, indtil hvert element er completed eller failed, og opdater derefter hver produktrække med dens output_url. Antallet af samtidige batches er begrænset pr. abonnement.

  • Credits: 4 credits ved 2K · 5 credits ved 4K
  • Typisk tid: 1.5–4 min
  • Behandling: async, polling

Hvert tal på denne side stammer fra Photta API-dokumentationen · tjekket

Fjern ginen fra hvert eneste PDP-foto uden at involvere en designer. Phottas ghost-mannequin-endpoint batcher helt naturligt — et natligt cron-job forvandler et feed på 50K-SKU'er til et usynlig gine-katalog på timer frem for uger.

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')

Sådan virker det

Natlig kørsel på tværs af hele kataloget

Fem dele, du skal bruge til en automatisering, der kører uden opsyn.

  1. Trin 1

    Kortlæg dit katalog

    Få overblik over, hvilke produktrækker der kræver et ghost mannequin-billede, hvilke der allerede har et, og hvilke der har begrænsede kategorier. Gem et last_photographed_at-tidsstempel, så det natlige job kun behandler deltaet.

  2. Trin 2

    Vælg 3D eller flat-lay pr. kategori

    `3d` til tøj, der kræver volumen — overtøj, denim, skræddersyet tøj. `flat_lay` til accessories og strikvarer, der tager sig bedre ud fotograferet fladt. Gem stilen pr. produktkategori, så batch-builderen vælger den rigtige uden manuel tilpasning.

  3. Trin 3

    Send deltaet som batch

    Kald POST /api/v1/ghost-mannequin/batch med et product_images-array — hvert element indeholder image, valgfrit back_image og image_side — plus én style, background_color og resolution for hele batchen. Bevar dit eget map fra array-position til produkt-ID; svaret returnerer ét generations-ID pr. element i samme rækkefølge.

  4. Trin 4

    Lav polling på overordnet batch

    Batch-endpointet returnerer aggregerede tællere (total, processing, completed, failed). Lav polling hvert 3 sekund, indtil completed + failed er lig med total. Photta behandler elementer parallelt inde i batchen, så du behøver ikke lave polling på individuelle generationer.

  5. Trin 5

    Gem i din database

    Iterer gennem status.data.items i rækkefølge — batchen bevarer din array-rækkefølge — og opdater hver produktrække med dens output_url. Log fejl — de skyldes næsten altid et dårligt kildebillede i dit feed, som du kan rette og gensende ved næste kørsel.

Tre trin i Python

Delta-udtræk, batch-afsendelse, overordnet polling — den minimale levedygtige katalogautomatisering.

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),
        )

Spørgsmål udviklere stiller

Kørsel af ghost mannequin i katalogskala

Hvor stor må en enkelt batch være?

Batch-endpointet accepterer op til et par hundrede elementer pr. kald ifølge dokumentationen. Ved en natlig kørsel på 50K-SKU'er bør du opdele deltaet i batches på 100–200 og afvikle dem sekventielt, så du holder dig behageligt under abonnementets rate limit.

Kan en batch blande 3D og flat-lay?

Ja — style er et felt pr. element, så en enkelt batch kan indeholde begge dele. I praksis opdeler de fleste teams alligevel efter kategori, fordi den efterfølgende persistenslogik er enklere, når hver række i en batch lander i den samme databasekolonne.

Hvad sker der med fejlede elementer?

Fejlede elementer i en batch refunderer automatisk deres credits og indeholder en error_code + error_message i det endelige element-payload. Log fejlene, og prøv igen den følgende nat, efter dit team har haft mulighed for at rette kildebilledet eller markere rækken som permanent ugyldigt input.

Hvordan mapper jeg resultaterne tilbage til mine produkt-ID'er?

Bevar dit eget map fra array-position til produkt-ID ved afsendelse: batch-svaret returnerer ét generations-ID pr. element i samme rækkefølge som product_images, og batch-statussen lister også elementerne i denne rækkefølge.

Kan jeg planlægge dette som et dagligt cron-job?

Ja — et simpelt dagligt cron-job, der henter deltaet for de seneste 24 timer, opdeler det i bidder, indsender batches og skriver resultaterne til din database, er et bærende mønster for teams med store produktkataloger. Sørg for, at kørslen er idempotent, så en mislykket natkørsel kan genafspilles sikkert.

Udrul ghost mannequin i katalogstørrelse i aften

Tre Python-funktioner, ét cron-job, 50K fotos. Hent en API-nøgle og ret den mod dit katalog.