Python · Sanal Giyim Deneme API'si

Python ile Sanal Giyim Deneme API'si

Herhangi bir pip install photta gerekmez — Photta dokümanları resmi olarak requests kütüphanesini önerir. Otuz satırlık bir wrapper; Django, FastAPI, Celery worker'ları ve Lambda handler'larına başka bir işleme gerek kalmadan entegre olur.

Tek cümlede

`requests` kütüphanesini kurun, `PHOTTA_API_KEY` değerini env'den yükleyin, `Authorization: Bearer photta_live_xxx` gönderen ve 2xx olmayan yanıtlarda tipleştirilmiş bir `PhottaError` fırlatan bir `photta_request()` wrapper'ı yazın, ardından `/tryon/apparel` adresine POST yapın ve `data.status == 'completed'` olana kadar her 3 saniyede bir `/tryon/apparel/:id` adresini sorgulayın — genellikle 1.5 ile 4 dakika sürer.

Güncellendi · 2026-04-19

İlk isteğiniz

PythonNode.jscURLcURL
import time
from photta import photta_request, PhottaError

# 1. Submit the job
created = photta_request("POST", "/tryon/apparel", json={
    "product_type": "dress",
    "product_images": ["https://example.com/dress.jpg"],
    "mannequin_id": "mnq_athena_ts",
    "pose_id": "pose_standing_front",
    "resolution": "2K",
    "aspect_ratio": "3:4",
})
generation_id = created["data"]["id"]

# 2. Poll every 3 seconds. Upper bound: 120 attempts ≈ 6 minutes,
# comfortably above the documented 1.5–4 minute window.
for _ in range(120):
    result = photta_request("GET", f"/tryon/apparel/{generation_id}")
    status = result["data"]["status"]
    if status == "completed":
        print("Result:", result["data"]["output_url"])
        break
    if status == "failed":
        raise RuntimeError(result["data"]["error_message"])
    time.sleep(3)

Neler beklenmeli

Typical completion

1.5–4min

2K / 4K credits

5 / 7

Jewelry types

4

Close-up mannequins

built-in

Nasıl çalışır

Python ile Sanal Giyim Deneme API'si

Beş adım, sıfır Photta-özel bağımlılık — requests her şeyi kapsar.

  1. 01

    Adım 1

    Kaydolun ve bir anahtar oluşturun

    Diğer her dille aynı yol: ai.photta.app → Geliştiriciler → API anahtarı oluştur. Anahtarlar `photta_live_` ile başlar ve her Photta yeteneğinde çalışır.

  2. 02

    Adım 2

    Anahtarı env'den yükleyin

    Ortamda `PHOTTA_API_KEY` değerini ayarlayın ve `os.environ` üzerinden okuyun. FastAPI veya Django'da, önyükleme sırasında bir ayarlar modülüne bir kez yükleyin. Anahtarı kaynak koda veya genel Git geçmişine gömmeyin.

  3. 03

    Adım 3

    Bir requests wrapper'ı yazın

    Otuz satırlık bir `photta_request()` fonksiyonu; temel URL'yi, Authorization header'ını, JSON serileştirmesini ve hata çevirisini halleder. Python SDK'sı gelene kadar ihtiyacınız olan tek soyutlama budur.

  4. 04

    Adım 4

    Gönderin ve poll edin

    Generation ID almak için `/tryon/apparel` adresine POST yapın, ardından 3 saniyelik aralıklarla `/tryon/apparel/:id` adresini sorgulayın. Celery veya RQ'da, 4 dakikalık bir işin bir worker'ı meşgul etmemesi için poll döngüsünü görevlere bölün.

  5. 05

    Adım 5

    Sonucu kalıcı hale getirin

    Tamamlanan payload `output_url` ve `thumbnail_url` içerir. Byte'ları kendi nesne depolama alanınıza (S3, GCS, Cloudflare R2) indirin; böylece ürününüz uzun vadeli görüntüleme için Photta'nın CDN'ine bağlı kalmaz.

Uçtan uca kod

Copy, paste, done.

Four snippets — install prerequisites, wrap the REST call, submit + poll, then handle the errors that actually happen in production.

01Use the battle-tested requests library
bash
# Photta doesn't ship an official Python SDK yet — requests is the
# recommended path in the docs. Standard library urllib works too if
# you need zero dependencies.
pip install requests

# Store your API key in env (dotenv optional but convenient)
echo "PHOTTA_API_KEY=photta_live_xxxxx" >> .env
02A 30-line client wrapper you can drop into any project
python
# photta.py
import os
import requests

PHOTTA_BASE_URL = "https://ai.photta.app/api/v1"

class PhottaError(Exception):
    def __init__(self, status: int, code: str, message: str, retry_after: int | None = None):
        super().__init__(message)
        self.status = status
        self.code = code
        self.retry_after = retry_after

def photta_request(method: str, path: str, **kwargs):
    headers = {
        "Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}",
        "Content-Type": "application/json",
        **kwargs.pop("headers", {}),
    }
    response = requests.request(method, f"{PHOTTA_BASE_URL}{path}", headers=headers, **kwargs)
    body = response.json()
    if not response.ok:
        err = body.get("error", {})
        raise PhottaError(
            status=response.status_code,
            code=err.get("code", "unknown"),
            message=err.get("message", response.reason),
            retry_after=err.get("retry_after"),
        )
    return body
03Submit a try-on and poll until the result is ready
python
import time
from photta import photta_request, PhottaError

# 1. Submit the job
created = photta_request("POST", "/tryon/apparel", json={
    "product_type": "dress",
    "product_images": ["https://example.com/dress.jpg"],
    "mannequin_id": "mnq_athena_ts",
    "pose_id": "pose_standing_front",
    "resolution": "2K",
    "aspect_ratio": "3:4",
})
generation_id = created["data"]["id"]

# 2. Poll every 3 seconds. Upper bound: 120 attempts ≈ 6 minutes,
# comfortably above the documented 1.5–4 minute window.
for _ in range(120):
    result = photta_request("GET", f"/tryon/apparel/{generation_id}")
    status = result["data"]["status"]
    if status == "completed":
        print("Result:", result["data"]["output_url"])
        break
    if status == "failed":
        raise RuntimeError(result["data"]["error_message"])
    time.sleep(3)
04Handle 402 credit exhaustion and 429 rate limits
python
from photta import photta_request, PhottaError
import time

try:
    photta_request("POST", "/tryon/apparel", json={ ... })
except PhottaError as err:
    if err.status == 402:
        # Out of credits — err.code == "insufficient_credits"
        raise
    elif err.status == 429:
        # Rate-limited. Honour the Retry-After header.
        time.sleep(err.retry_after or 30)
        # then retry…
    elif err.status >= 500:
        # Server-side — retry with exponential backoff.
        raise
    else:
        raise

Neden bu yapı

Neden bugün için requests doğru seçimdir

  • Zero Photta-specific dependencies — `requests` is already in most Python projects
  • Works anywhere Python runs: Django, FastAPI, Flask, Celery workers, Lambda, scripts
  • The client wrapper is ~30 lines — paste it into `photta.py` and move on
  • Pairs naturally with asyncio via `httpx` if you need parallel submission

Neleri yapmaz

Honest caveats

  • No official @photta/python SDK yet — REST + requests is the documented pattern
  • No async fetch helper shipped; swap `requests` for `httpx` when you need concurrency
  • Bearer token auth only — no OAuth client credentials yet

Diğer geliştiricilerin sorduğu sorular

Questions other developers ask

Resmi bir Photta Python SDK'sı var mı?+

Henüz değil. Photta yol haritası, on ödeme yapan API müşterisi olduğunda Python SDK'sına öncelik vermektedir. O zamana kadar desteklenen entegrasyon yolu; requests kütüphanesi (senkron) veya httpx (asenkron) üzerinden ham REST'tir — her ikisi de resmi dokümanlarda mevcuttur ve bu sayfadaki otuz satırlık wrapper ile çalışır.

Hangi Python sürümleri destekleniyor?+

Python 3.9 ve sonrası. Wrapper; tip ipuçlarını, f-string'leri ve 3.10+ sürümlerinde sorunsuz çalışan `str | None` sözdizimini kullanır. 3.9'da `str | None` yerine `Optional[str]` kullanın. requests kütüphanesinin kendisi 3.8+ sürümlerini destekler ancak modern Photta projeleri için pratik minimum 3.9+'dır.

requests mi yoksa httpx mi kullanmalıyım?+

Birkaç ardışık çağrı yapıyorsanız requests — daha basittir ve çoğu kod tabanında zaten mevcuttur. Asenkron eşzamanlılığa (paralel gönderimler, toplu doldurmalar) veya HTTP/2'ye ihtiyacınız varsa httpx. Her iki durumda da wrapper küçüktür; `requests.request` yerine `httpx.Client().request` yazın, kodun geri kalanı aynı kalır.

Django içinden çağırabilir miyim?+

Evet. Wrapper'ı `services/photta.py` içine koyun, bir view veya Celery görevinden import edin. İş uzun sürüyorsa, senkron bir request handler içinde API'yi çağırmayın — view içinden gönderin, generation ID'yi döndürün ve bir arka plan görevinden veya Channels consumer'ından poll edin.

Bir Celery worker'ından nasıl polling yaparım?+

İşi bir görevden gönderin, ardından bir kez poll eden ve iş tamamlanana veya maksimum deneme eşiğine ulaşana kadar kendini yeniden programlayan (`apply_async(countdown=3)` üzerinden) bir takip görevi planlayın. Bu, worker'ları boşta tutar ve autoscaler'ları bozan uzun süreli görevlerden kaçınır.

API hataları nasıl bildirir?+

2xx olmayan yanıtlar bir `error` nesnesi içeren bir JSON gövdesi taşır: `type`, `code`, `message`, ayrıca 400'lerde `param` ve 429'larda `retry_after`. Bu sayfadaki wrapper, bunların tümünü taşıyan bir `PhottaError` fırlatır; böylece çağıran taraflar gövdeyi ayrıştırmadan durum koduna göre dallanabilir.

Python · Sanal Giyim Deneme API'si

Hesap oluşturun ve bir API anahtarı alın

`requests` kütüphanesini kurun, `PHOTTA_API_KEY` değerini env'den yükleyin, `Authorization: Bearer photta_live_xxx` gönderen ve 2xx olmayan yanıtlarda tipleştirilmiş bir `PhottaError` fırlatan bir `photta_request()` wrapper'ı yazın, ardından `/tryon/apparel` adresine POST yapın ve `data.status == 'completed'` olana kadar her 3 saniyede bir `/tryon/apparel/:id` adresini sorgulayın — genellikle 1.5 ile 4 dakika sürer.

Python için Sanal Giyim Deneme API'si — Photta | Photta