Python · Virtual Try-On API
Virtual Try-On API Python-ympäristössä
Pip-asennusta ei tarvita — Photta suosittelee requests-kirjastoa. Kolmenkymmenen rivin kääre sopii Django-, FastAPI- ja Celery-työntekijöihin ilman ylimääräistä vaivaa.
Yhdellä lauseella
Asenna `requests`, lataa `PHOTTA_API_KEY` env-muuttujasta, kirjoita `photta_request()`-kääre, joka lähettää `Authorization: Bearer photta_live_xxx` ja nostaa `PhottaError`-poikkeuksen virhetilanteissa. Tee POST osoitteeseen `/tryon/apparel` ja pollata `/tryon/apparel/:id` 3 sekunnin välein.
Päivitetty · 2026-04-19
Ensimmäinen pyyntösi
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)Mitä odottaa
Typical completion
1.5–4min
2K / 4K credits
5 / 7
Jewelry types
4
Close-up mannequins
built-in
Miten se toimii
Virtual Try-On API Python-ympäristössä
Viisi vaihetta, nolla Photta-kohtaista riippuvuutta.
- 01
Vaihe 1
Rekisteröidy ja generoi avain
Sama polku kuin muissakin kielissä: ai.photta.app → Developers → Generate API key. Avaimet alkavat `photta_live_` ja toimivat kaikissa palveluissa.
- 02
Vaihe 2
Lataa avain env-muuttujasta
Aseta `PHOTTA_API_KEY` ja lue se `os.environ`-kautta. FastAPIsissa tai Djangossa lataa se kerran asetuksiin käynnistyksen yhteydessä. Älä upota avainta koodiin.
- 03
Vaihe 3
Kirjoita requests-kääre
30 rivin `photta_request()`-funktio hoitaa URL-osoitteen, Authorization-otsakkeen, JSON-sarjallistamisen ja virhekoodit. Tämä on ainoa tarvitsemasi abstraktio.
- 04
Vaihe 4
Lähetä ja pollata
POST osoitteeseen `/tryon/apparel` saadaksesi tunnuksen, ja pollata 3 sekunnin välein. Celeryssä jaa pollaus eri tehtäviin, jotta työntekijä ei varaudu 4 minuutiksi yhteen tehtävään.
- 05
Vaihe 5
Tallenna lopputulos
Vastaus sisältää `output_url` ja `thumbnail_url`. Lataa tavut omaan objektitallennustilaasi (S3, GCS, Cloudflare R2), jotta tuotteesi ei ole sidottu Phottan CDN:ään.
Koodi alusta loppuun
Copy, paste, done.
Four snippets — install prerequisites, wrap the REST call, submit + poll, then handle the errors that actually happen in production.
# 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# 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 bodyimport 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)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:
raiseMiksi tämä muoto
Miksi requests on oikea valinta tänään
- 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
Mitä se ei tee
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
Muiden kehittäjien kysymyksiä
Questions other developers ask
Onko olemassa virallista Photta Python SDK:ta?+
Ei vielä. Python SDK on prioriteetti 10 maksavan API-asiakkaan jälkeen. Siihen asti suositeltu tapa on requests (synkroninen) tai httpx (asynkroninen) — molemmat toimivat tämän sivun kääreellä.
Mitä Python-versioita tuetaan?+
Python 3.9 ja uudemmat. Kääre käyttää tyyppivihjeitä ja f-merkkijonoja.requests itsessään tukee 3.8+, mutta 3.9+ on käytännön minimi moderneille Photta-projekteille.
Pitäisikö käyttää requests- vai httpx-kirjastoa?+
requests, jos teet muutamia peräkkäisiä kutsuja — se on yksinkertaisempi. httpx, jos tarvitset asynkronista rinnakkaisuutta tai HTTP/2-tukea. Kääre on lähes identtinen molemmissa.
Voinko käyttää sitä Djangossa?+
Kyllä. Laita kääre tiedostoon `services/photta.py` ja tuo se näkymään tai Celery-tehtävään. Älä kutsu API:a synkronisesti, jos työ on pitkä — lähetä työ näkymästä, palauta tunnus ja pollata taustatehtävässä.
Miten pollata Celery-työntekijästä?+
Lähetä työ yhdestä tehtävästä ja aikatauluta seurantatehtävä (`apply_async(countdown=3)`), joka pollata kerran ja aikatauluttaa itsensä uudelleen, kunnes työ on valmis. Tämä pitää työntekijät vapaina.
Miten API ilmoittaa virheistä?+
Muut kuin 2xx-vastaukset sisältävät JSON-rungon, jossa on `error`-objekti. Tämän sivun kääre nostaa `PhottaError`-poikkeuksen, joka sisältää kaikki tiedot, joten voit haarautua tilakoodin mukaan.
Python · Virtual Try-On API
Luo tili ja hanki API-avain
Asenna `requests`, lataa `PHOTTA_API_KEY` env-muuttujasta, kirjoita `photta_request()`-kääre, joka lähettää `Authorization: Bearer photta_live_xxx` ja nostaa `PhottaError`-poikkeuksen virhetilanteissa. Tee POST osoitteeseen `/tryon/apparel` ja pollata `/tryon/apparel/:id` 3 sekunnin välein.