Pro API: generowanie i retusz obrazów
Jeden obraz kosztuje 1 kredyt, niezależnie od trybu. Generowanie na podstawie promptu oraz retusz dostarczonego obrazu przebiegają przez tę samą ścieżkę.
POST /images/quote przyjmuje to samo ciało żądania i zwraca cenę bez tworzenia czegokolwiek, zawsze
{ "cost": 1, ... } w tym przypadku. Istnieje dla symetrii z filmami, gdzie cena może się różnić.
Prześlij obraz
POST /images
{ "prompt": "portrait of a woman in a rainy street at night, neon reflections, cinematic",
"width": 832, "height": 1216 }| Pole | Typ | Domyślnie | Co robi |
|---|---|---|---|
prompt | string | wymagane | Scena. Angielski daje najdokładniejsze rezultaty. |
width, height | int | 1024 x 1024 | Rozmiar w pikselach. Dobre proporcje: 1024 x 1024 (kwadrat), 832 x 1216 (portret), 1216 x 832 (poziomy). |
mode | string | generowanie | edit, img2img lub inpaint, patrz niżej. Brak oznacza generowanie na podstawie promptu. |
image_b64 | string | Obraz źródłowy w base64 (PNG lub JPEG), wymagany przez wszystkie trzy tryby retuszu. Maksymalnie 12 MB po odkodowaniu. | |
mask_b64 | string | Maska w base64: wymagana przez inpaint, opcjonalna dla edit. Zamaluj obszary do retuszu na czerwono, w rozmiarze obrazu źródłowego. | |
lora | string | Wytrenowana postać na koncie: name zwracany przez GET /loras. Umieść jej trigger w prompcie. | |
lora2, lora2_strength | string, number | Druga postać i jej siła (0 do 1, domyślnie 1) dla sceny z dwiema osobami. | |
count | int | 1 | Liczba obrazów do wyrenderowania z jednego żądania, od 1 do 8. Każdy dostaje własny losowy seed; przy użyciu seed przyjmują wartości seed, seed+1, seed+2... To odpowiada selektorowi Obrazy na generację w aplikacji. |
seed | int | losowy | Seed renderowania, od 0 do 4294967295. Ten sam seed, ten sam prompt i te same ustawienia: ten sam render, z minimalnymi różnicami przy zmianie karty graficznej. Zachowanie seed i modyfikacja promptu daje wariację zachowującą kompozycję. |
steps | int | silnik | Zostaw puste. Silnik zna własną wartość. |
Odpowiedź:
{ "jobId": "test-79634842-4586-46d4-ad52-d9ea236ae00d", "seed": 178078967, "cost": 1 }seed jest zwracany w odpowiedzi, niezależnie od tego, czy go podałeś, czy został wylosowany: zachowaj go, aby
wyrenderować ten sam obraz ponownie lub jego wariację.
Żądanie kilku obrazów naraz
Przy count większym niż 1 jedno żądanie uruchamia kilka renderowań, każde z własnym seedem, a
odpowiedź je wymienia:
{ "count": 4, "requested": 4, "cost_total": 4,
"jobs": [ { "jobId": "...", "seed": 178078967, "cost": 1 }, { "jobId": "...", "seed": 903412, "cost": 1 } ],
"errors": [],
"jobId": "...", "seed": 178078967, "cost": 1 }Dwie rzeczy wymagają szczególnej uwagi.
jobId, seed i cost pierwszego renderowania są powtórzone na najwyższym poziomie. Wynika to z
tego, żeby klienci napisani przed obsługą wsadową nadal działali bez zmian, a nie dlatego, że pierwsze renderowanie
jest ważniejsze. Odpytuj każdy wpis w jobs, a nie tylko ten jeden.
I porównuj count z requested. Odmowa w trakcie przetwarzania, z powodu braku kredytów lub
przekroczenia dziennego limitu klucza, zatrzymuje wsad w miejscu: requested to to, o co prosiłeś,
count to ile faktycznie się uruchomiło, a errors wyjaśnia, dlaczego się zatrzymało. Klient, który zakłada,
że obie wartości są równe, po cichu traci renderowania.
POST /images/quote przyjmuje też count i wycenia cały wsad. Filmy nie mają count:
jedno żądanie, jeden klip.
Trzy tryby retuszu
Wszystkie trzy działają na tym samym silniku edycji opartym na instrukcjach, który zachowuje wygląd
obrazu źródłowego. Gdy dostarczasz obraz źródłowy, width i height są odczytywane z samego obrazu
i nie trzeba ich przesyłać.
mode | Wejście | Co robi silnik |
|---|---|---|
edit | image_b64 + prompt (+ opcjonalny mask_b64) | Stosuje instrukcję do całego obrazu ("add sunglasses", "make it snow"). Z maską zmiana koncentruje się wewnątrz czerwonego obszaru. |
inpaint | image_b64 + mask_b64 + prompt | Regeneruje tylko czerwony obszar maski zgodnie z instrukcją. Reszta jest rekompozytowana piksel po pikselu. |
img2img | image_b64 + prompt | Przetwarza cały obraz zgodnie z promptem, zachowując kompozycję i wygląd: wariacja. |
W trybie edit serwer sam wybiera najlepszy sposób obróbki, tak jak aplikacja:
- z maską: czyta polecenie i wybiera między zastąpieniem zawartości obszaru (inny przedmiot, inne ubranie, twarz: obszar jest rysowany od nowa według tego, co ma się w nim pojawić) a zmianą tego, co w nim jest (kolor, materiał, światło). Z
lorapostaci obszar jest zawsze rysowany od nowa, razem z twarzą; - bez maski, z
lorapostaci ("replace the woman with kara..."): serwer znajduje osobę na zdjęciu i rysuje ją od nowa jako postać; jeśli nikogo nie znajdzie, polecenie dotyczy całego obrazu, jak dotąd.
Ta sama cena w każdym przypadku (1 kredyt za obraz). Wybór widać w wyniku, nie w odpowiedzi.
IMG=$(base64 -w0 photo.png)
curl -s $B/images -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-d "{\"mode\":\"edit\",\"prompt\":\"add a red scarf, keep everything else identical\",\"image_b64\":\"$IMG\"}"Tworzenie obrazu z postaciami, przedmiotami i miejscem
Dodaj obiekt multiref do POST /images, a serwer obsadzi Twoje postacie (Postacie), Twoje przedmioty i zwierzęta oraz miejsce (Obiekty) razem na jednym obrazie, każde rozpoznawalne, tak jak ekran "Utwórz obraz" w aplikacji. Wywołuj każde z nich przez @Nazwa w prompcie, po angielsku.
{ "prompt": "@Mia hands a cup of coffee to @Tom on a sunny terrace, both smiling",
"multiref": {
"characters": [
{ "character_id": "chr_8f3a...", "name": "Mia", "view": 1 },
{ "character_id": "chr_21bc...", "name": "Tom", "lora": "tom_v1", "strength": 1.0, "lora_pass": 0.55 }
],
"subjects": [ { "subject_id": "sub_...", "name": "Mug" } ],
"location": { "subject_id": "sub_...", "name": "Terrace" }
},
"width": 1344, "height": 768, "seed": 42, "count": 1 }Pole multiref | Co robi |
|---|---|
characters[].character_id, name | Postać z GET /characters; name to słowo pisane po @ (litery, cyfry, _). |
characters[].view | Widok z jej sheetu, który ją przedstawia, od 1 do 5 (domyślnie 1, popiersie z przodu). |
characters[].sheet_id | Opcjonalnie: sheet do użycia (domyślnie najnowszy). |
characters[].lora | Opcjonalnie: jej LoRA obrazu, nazwa z listy image w GET /loras. Postać jest wtedy odgrywana przez swoją LoRA, a nie przez swój widok. |
characters[].strength | Siła LoRA, od 0 do 1,5 (domyślnie 1). |
characters[].lora_pass | Część obrazu przemalowywana przez jej przebieg LoRA, od 0,3 do 0,9 (domyślnie 0,55); przydatne przy kilku obiektach. |
characters[].description | Opcjonalnie, po angielsku: strój, wiek... |
subjects[] | Przedmioty i zwierzęta z /subjects: subject_id, name (domyślnie pierwsze słowo jego nazwy), description, image (który z jego obrazów, domyślnie 1). |
location | Miejsce z /subjects (subject_id, name) albo jednorazowe tło: background_b64 i background_description. |
count | 1 lub 2: obrazy są renderowane jeden po drugim. |
- Najwyżej 4 obiekty (postacie, przedmioty i zwierzęta). Bez LoRA, tylko z obrazów: najwyżej 4 referencje, łącznie z miejscem. Serwer wybiera metodę na podstawie referencji i umieszcza każdą z nich w kolejności
characters, a potemsubjects, od lewej do prawej. @Nazwa, która nie wskazuje żadnej referencji, jest odrzucana (unknown_mention); referencja nieobecna w prompcie i tak zostaje wysłana.- Cena: jeden przebieg kosztuje tyle co jeden obraz (1 kredyt). Prosty obraz to 1 przebieg; kilka postaci odgrywanych przez LoRA, 1 plus jeden przebieg na LoRA (najwyżej 4); tylko z obrazów, jeden przebieg na każdą referencję poza pierwszą; połączenie, jedno i drugie. Suma (przebiegi x
count) jest rezerwowana przy przesłaniu i pobierana jeden raz, przy obrazie końcowym: niepowodzenie lub anulowanie nic nie kosztuje.POST /images/quotez tym samym ciałem żądania podaje dokładną cenę, metodę i jej przebiegi, niczego nie uruchamiając. - Odpowiedź
202:{ "jobId": "mri_...", "seed", "cost", "method", "passes", "billed_passes" }(przycount2:jobsicost_total). Odpytywanie, pobieranie i anulowanie korzystają ze zwykłych ścieżek opisanych niżej; podczas renderowaniaprogresspodaje bieżący przebieg ("2/3"). Obraz powstaje w 1 do 3 minut. - Obraz końcowy pozostaje dostępny przez 1 godzinę, i przez 10 minut po pierwszym pobraniu. Nieudany przebieg daje
status: "failed"zreason: "render_failed"; anulowanie,reason: "cancelled". - Błędy:
invalid_count,invalid_view,invalid_lora_pass,invalid_subject_image,invalid_size,character_not_ready, a także błędy Multi-Ref (unknown_character,unknown_subject,unknown_lora,unknown_mention,multiref_too_many_references,invalid_strength...). Zobacz Limity i błędy.
Odpytywanie
GET /images/{jobId}
| Odpowiedź | Znaczenie |
|---|---|
{ "status": "pending", "phase": "IN_QUEUE" } | W kolejce |
{ "status": "pending", "phase": "IN_PROGRESS" } | Renderowanie |
{ "status": "completed", "cost": 1, "file_url": "/pro/v1/images/{jobId}/file", ... } | Gotowe, plik dostępny |
{ "status": "failed", "detail": "..." } | Niepowodzenie, nic nie jest naliczane |
Odpytuj co 3 sekundy, nie częściej: kolejka jest współdzielona.
Pobieranie
GET /images/{jobId}/file
Sam plik PNG jako treść odpowiedzi (Content-Type: image/png). Dostępny od razu po uzyskaniu statusu completed, a 404 media_unavailable gdy render zostanie usunięty. Pobierz go od razu, nie jest archiwizowany.
Anulowanie
POST /images/{jobId}/cancel
Anuluje renderowanie w kolejce lub w trakcie. Odpowiada { "ok": true }. Nic nie jest naliczane, a koszt zarezerwowany na dzienny limit klucza jest zwracany.