Pro API: generera och retuschera bilder
En bild kostar 1 kredit, oavsett läge. Generering från en prompt och retuschering av en bild du tillhandahåller går båda genom samma rutt.
POST /images/quote tar samma body och svarar med priset utan att skapa något, alltid
{ "cost": 1, ... } här. Det finns för symmetrins skull med videor, där priset faktiskt varierar.
Skicka en bild
POST /images
{ "prompt": "portrait of a woman in a rainy street at night, neon reflections, cinematic",
"width": 832, "height": 1216 }| Fält | Typ | Standard | Vad det gör |
|---|---|---|---|
prompt | sträng | krävs | Scenen. Engelska ger de mest precisa resultaten. |
width, height | int | 1024 x 1024 | Pixelstorlek. Bra proportioner: 1024 x 1024 (kvadrat), 832 x 1216 (porträtt), 1216 x 832 (landskap). |
mode | sträng | generation | edit, img2img eller inpaint, se nedan. Saknas det genereras bilden från prompten. |
image_b64 | sträng | Källbild i base64 (PNG eller JPEG), krävs av alla tre retuscheringslägen. Max 12 MB avkodat. | |
mask_b64 | sträng | Mask i base64: krävs av inpaint, valfri för edit. Måla de områden du vill retuschera i rött, i källbildens storlek. | |
lora | sträng | En tränad karaktär på kontot: det name som returneras av GET /loras. Lägg dess trigger i prompten. | |
lora2, lora2_strength | sträng, tal | En andra karaktär och dess styrka (0 till 1, standard 1) för en scen med två personer. | |
count | int | 1 | Hur många bilder som ska renderas från denna förfrågan, 1 till 8. Var och en får sitt eget nya seed; med seed tar de seed, seed+1, seed+2... Det här är appens Images per generation-väljare. |
seed | int | slumpmässigt | Renderingens seed, från 0 till 4294967295. Samma seed, samma prompt och samma inställningar ger samma rendering, med mycket små skillnader om grafikkortet byts. Att behålla seed och justera prompten ger en variation som behåller kompositionen. |
steps | int | motorn | Lämna tomt. Motorn känner till sitt eget värde. |
Svaret:
{ "jobId": "test-79634842-4586-46d4-ad52-d9ea236ae00d", "seed": 178078967, "cost": 1 }seed returneras i svaret, oavsett om du angav det eller om det drogs slumpmässigt: spara det för att
rendera samma bild igen, eller en variation av den.
Be om flera på en gång
Med count över 1 startar en förfrågan flera renderingar, var och en med sitt eget seed, och
svaret listar dem:
{ "count": 4, "requested": 4, "cost_total": 4,
"jobs": [ { "jobId": "...", "seed": 178078967, "cost": 1 }, { "jobId": "...", "seed": 903412, "cost": 1 } ],
"errors": [],
"jobId": "...", "seed": 178078967, "cost": 1 }Två saker att läsa noggrant.
jobId, seed och cost för den första renderingen upprepas på toppnivån. Det finns där
för att klienter skrivna innan batcher stöds ska fortsätta fungera oförändrat, inte för att den
första spelar större roll. Polla varje post i jobs, inte bara den.
Och jämför count med requested. Ett avvisande mitt i processen, på grund av brist på
krediter eller för att nyckeln nådde sitt dagliga tak, stoppar batchen där den är: requested
är vad du bad om, count är vad som faktiskt startade, och errors förklarar varför det
stannade. En klient som antar att de två är lika tappar tyst renderingar.
POST /images/quote tar count också och prissätter hela batchen. Videor har ingen count:
en förfrågan, ett klipp.
De tre retuscheringslägena
Alla tre körs på samma instruktionsdrivna redigeringsmotor, som bevarar källbildens utseende.
När du tillhandahåller en källbild läses width och height från bilden själv och behöver
inte skickas med.
mode | Indata | Vad motorn gör |
|---|---|---|
edit | image_b64 + prompt (+ valfri mask_b64) | Tillämpar instruktionen på hela bilden ("add sunglasses", "make it snow"). Med en mask koncentreras ändringen till det röda området. |
inpaint | image_b64 + mask_b64 + prompt | Regenererar bara maskens röda område enligt instruktionen. Resten återkomponeras pixel för pixel. |
img2img | image_b64 + prompt | Bearbetar hela bilden utifrån prompten och bevarar dess komposition och utseende: en variation. |
I edit väljer servern själv det bästa sättet att hantera redigeringen, som appen:
- med en mask: den läser instruktionen och väljer mellan att ersätta det som finns i området (ett annat föremål, ett annat plagg, ett ansikte: området ritas om efter det som ska synas där) och att ändra det som finns där (färg, material, ljus). Med en karaktärs-
loraritas området alltid om, ansiktet inräknat; - utan mask, med en karaktärs-
lora("replace the woman with kara..."): servern hittar personen på fotot och ritar om den som karaktären; hittar den ingen gäller instruktionen hela bilden, som tidigare.
Samma pris i alla fall (1 kredit per bild). Valet syns i resultatet, inte i svaret.
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\"}"Skapa en bild med karaktärer, objekt och en plats
Lägg till ett multiref-objekt i POST /images så låter servern dina karaktärer (Karaktärer), dina objekt och djur och en plats (Subjekt) spela tillsammans i en enda bild, var och en igenkännbar, som appens "Create an image"-skärm. Anropa var och en med @Namn i prompten, på engelska.
{ "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 }Fält i multiref | Vad det gör |
|---|---|
characters[].character_id, name | En karaktär från GET /characters; name är ordet som skrivs efter @ (bokstäver, siffror, _). |
characters[].view | Den vy i dess character sheet som representerar den, 1 till 5 (1, bysten framifrån, som standard). |
characters[].sheet_id | Valfritt: den character sheet som ska användas (den senaste som standard). |
characters[].lora | Valfritt: dess bild-LoRA, ett namn från listan image i GET /loras. Karaktären spelas då av sin LoRA, inte av sin vy. |
characters[].strength | LoRA-styrka, 0 till 1,5 (1 som standard). |
characters[].lora_pass | Andelen av bilden som målas om av dess LoRA-omgång, 0,3 till 0,9 (0,55 som standard); användbart med flera subjekt. |
characters[].description | Valfritt, på engelska: outfit, ålder... |
subjects[] | Objekt och djur från /subjects: subject_id, name (som standard det första ordet i dess namn), description, image (vilken av dess bilder, 1 som standard). |
location | En plats från /subjects (subject_id, name), eller en tillfällig bakgrund: background_b64 och background_description. |
count | 1 eller 2: bilderna renderas en efter en. |
- Högst 4 subjekt (karaktärer, objekt och djur). Utan LoRA, enbart från bilder: högst 4 referenser, platsen inräknad. Servern väljer metoden utifrån referenserna och placerar var och en i ordningen
charactersoch sedansubjects, från vänster till höger. - Ett
@Namnsom inte matchar någon referens nekas (unknown_mention); en referens som saknas i prompten skickas ändå med. - Pris: en omgång kostar priset för en bild (1 kredit). En enkel bild är 1 omgång; flera karaktärer som spelas av en LoRA, 1 plus en omgång per LoRA (högst 4); enbart från bilder, en omgång per referens utöver den första; en blandning, båda. Totalen (omgångar x
count) reserveras när förfrågan skickas och debiteras en enda gång, vid den slutliga bilden: ett misslyckande eller ett avbrott kostar ingenting.POST /images/quotemed samma body ger det exakta priset, metoden och dess omgångar, utan att starta något. - Svar
202:{ "jobId": "mri_...", "seed", "cost", "method", "passes", "billed_passes" }(medcount2:jobsochcost_total). Polling, nedladdning och avbrytning går via de vanliga rutterna nedan; under renderingen angerprogressden pågående omgången ("2/3"). En bild tar 1 till 3 minuter. - Den slutliga bilden förblir tillgänglig i 1 timme, och 10 minuter efter sin första nedladdning. En misslyckad omgång ger
status: "failed"medreason: "render_failed"; ett avbrott,reason: "cancelled". - Fel:
invalid_count,invalid_view,invalid_lora_pass,invalid_subject_image,invalid_size,character_not_ready, samt de från Multi-Ref (unknown_character,unknown_subject,unknown_lora,unknown_mention,multiref_too_many_references,invalid_strength...). Se Begränsningar och fel.
Polla
GET /images/{jobId}
| Svar | Betydelse |
|---|---|
{ "status": "pending", "phase": "IN_QUEUE" } | I kö |
{ "status": "pending", "phase": "IN_PROGRESS" } | Renderar |
{ "status": "completed", "cost": 1, "file_url": "/pro/v1/images/{jobId}/file", ... } | Klar, fil redo |
{ "status": "failed", "detail": "..." } | Misslyckades, och inget debiteras |
Polla var 3:e sekund, inte snabbare: kön är delad.
Ladda ned
GET /images/{jobId}/file
PNG-filen i sig, som svarskropp (Content-Type: image/png). Tillgänglig så snart statusen
är completed, och 404 media_unavailable när renderingen är borta. Ladda ned den direkt,
den arkiveras inte.
Avbryt
POST /images/{jobId}/cancel
Avbryter en köad eller pågående rendering. Svarar { "ok": true }. Inget debiteras, och
kostnaden reserverad mot nyckelns dagliga tak återbetalas.