Pro API: generer og retoucher billeder
Et billede koster 1 kredit, uanset tilstand. Generering fra en prompt og retouchering af et billede, du selv leverer, går begge gennem den samme rute.
POST /images/quote tager samme body og returnerer prisen uden at oprette noget, altid
{ "cost": 1, ... } her. Den findes for symmetriens skyld med videoer, hvor prisen varierer.
Send et billede
POST /images
{ "prompt": "portrait of a woman in a rainy street at night, neon reflections, cinematic",
"width": 832, "height": 1216 }| Felt | Type | Standard | Hvad det gør |
|---|---|---|---|
prompt | string | påkrævet | Scenen. Engelsk giver de mest præcise resultater. |
width, height | int | 1024 x 1024 | Pixelstørrelse. Gode formater: 1024 x 1024 (kvadrat), 832 x 1216 (portræt), 1216 x 832 (landskab). |
mode | string | generation | edit, img2img eller inpaint, se nedenfor. Fraværende betyder generering fra prompten. |
image_b64 | string | Kildebillede i base64 (PNG eller JPEG), kræves af alle tre retoucheringstilstande. Maks. 12 MB afkodet. | |
mask_b64 | string | Maske i base64: kræves af inpaint, valgfri for edit. Mal de områder, der skal retoucheres, i rødt, i samme størrelse som kildebilledet. | |
lora | string | En trænet karakter på kontoen: det name, som GET /loras returnerer. Sæt dens trigger i prompten. | |
lora2, lora2_strength | string, number | En anden karakter og dens styrke (0 til 1, standard 1) til en scene med to personer. | |
count | int | 1 | Hvor mange billeder der skal renderes fra denne ene anmodning, 1 til 8. Hvert får sit eget friske seed; med seed bruger de seed, seed+1, seed+2... Dette er appens Images per generation-vælger. |
seed | int | tilfældig | Seedet for renderingen, fra 0 til 4294967295. Samme seed, samme prompt og samme indstillinger giver samme rendering, med meget små forskelle hvis grafikkortet skifter. Beholder du seed og justerer prompten, får du en variation, der bevarer kompositionen. |
steps | int | motor | Lad feltet være tomt. Motoren kender selv sin værdi. |
Svaret:
{ "jobId": "test-79634842-4586-46d4-ad52-d9ea236ae00d", "seed": 178078967, "cost": 1 }seed returneres i svaret, uanset om du angav det, eller det blev trukket tilfældigt: gem det for at
rendere det samme billede igen eller en variation af det.
Anmode om flere på én gang
Med count over 1 starter én anmodning flere renderinger, hver med sit eget seed, og
svaret lister 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 }To ting du skal læse nøje.
jobId, seed og cost for den første rendering gentages på øverste niveau. Det er der
for at klienter skrevet før batch-understøttelse fortsat fungerer uændret, ikke fordi den første
er vigtigere. Poll hvert element i jobs, ikke kun det ene.
Og sammenlign count med requested. En afvisning undervejs, på grund af manglende kreditter eller
fordi nøglen har nået sit daglige loft, stopper batchen, hvor den er: requested er det, du bad om,
count er det, der rent faktisk startede, og errors fortæller, hvorfor det stoppede. En klient, der
antager, at de to er ens, mister lydløst renderinger.
POST /images/quote tager count med, og prissætter hele batchen. Videoer har ingen count:
én anmodning, ét klip.
De tre retoucheringstilstande
Alle tre kører på den samme instruktionsdrevne redigeringsmotor, som bevarer udseendet af
kildebilledet. Når du leverer et kildebillede, læses width og height fra billedet selv
og behøver ikke sendes med.
mode | Input | Hvad motoren gør |
|---|---|---|
edit | image_b64 + prompt (+ valgfri mask_b64) | Anvender instruktionen på hele billedet ("add sunglasses", "make it snow"). Med en maske koncentreres ændringen inden for det røde område. |
inpaint | image_b64 + mask_b64 + prompt | Regenererer kun maskens røde område i henhold til instruktionen. Resten rekomponeres pixel for pixel. |
img2img | image_b64 + prompt | Bearbejder hele billedet ud fra prompten, mens komposition og udtryk bevares: en variation. |
I edit vælger serveren selv den bedste måde at håndtere redigeringen på, som appen:
- med en maske: den læser instruktionen og vælger mellem at erstatte indholdet i området (et andet objekt, et andet stykke tøj, et ansigt: området tegnes igen ud fra det, der skal vises der) og at ændre det, der er der (farve, materiale, lys). Med en karakter-
lorategnes området altid igen, ansigtet medregnet; - uden maske, med en karakter-
lora("replace the woman with kara..."): serveren finder personen på billedet og tegner vedkommende igen som karakteren; finder den ingen, gælder instruktionen hele billedet, som før.
Samme pris i alle tilfælde (1 kredit pr. billede). Valget ses i resultatet, ikke 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\"}"Lav et billede med karakterer, objekter og en lokation
Tilføj et multiref-objekt til POST /images, så lader serveren dine karakterer (Karakterer), dine objekter og dyr og en lokation (Subjects) spille sammen i ét enkelt billede, hver enkelt genkendelig, ligesom appens "Create an image"-skærm. Kald hver af dem med @Navn i prompten, på engelsk.
{ "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 }Felt i multiref | Hvad det gør |
|---|---|
characters[].character_id, name | En karakter fra GET /characters; name er det ord, der skrives efter @ (bogstaver, cifre, _). |
characters[].view | Den vinkel i dens character sheet, der repræsenterer den, 1 til 5 (1, busten forfra, som standard). |
characters[].sheet_id | Valgfrit: den character sheet, der skal bruges (den nyeste som standard). |
characters[].lora | Valgfrit: dens billed-LoRA, et navn fra listen image i GET /loras. Karakteren spilles så af sin LoRA, ikke af sin vinkel. |
characters[].strength | LoRA-styrke, 0 til 1,5 (1 som standard). |
characters[].lora_pass | Den andel af billedet, som dens LoRA-gennemløb maler om, 0,3 til 0,9 (0,55 som standard); nyttigt med flere subjects. |
characters[].description | Valgfrit, på engelsk: outfit, alder... |
subjects[] | Objekter og dyr fra /subjects: subject_id, name (som standard det første ord i dets navn), description, image (hvilket af dets billeder, 1 som standard). |
location | En lokation fra /subjects (subject_id, name), eller en engangsbaggrund: background_b64 og background_description. |
count | 1 eller 2: billederne renderes det ene efter det andet. |
- Højst 4 subjects (karakterer, objekter og dyr). Uden LoRA, kun ud fra billeder: højst 4 referencer, lokationen medregnet. Serveren vælger metoden ud fra referencerne og placerer hver enkelt i rækkefølgen
charactersog dereftersubjects, fra venstre mod højre. - Et
@Navn, der ikke matcher nogen reference, afvises (unknown_mention); en reference, der mangler i prompten, sendes alligevel med. - Pris: ét gennemløb koster prisen for ét billede (1 kredit). Et simpelt billede er 1 gennemløb; flere karakterer spillet af en LoRA, 1 plus ét gennemløb pr. LoRA (højst 4); kun ud fra billeder, ét gennemløb pr. reference ud over den første; en blanding, begge dele. Totalen (gennemløb x
count) reserveres ved indsendelsen og opkræves én gang, ved det endelige billede: en fejl eller en annullering koster intet.POST /images/quotemed samme body giver den præcise pris, metoden og dens gennemløb, uden at starte noget. - Svar
202:{ "jobId": "mri_...", "seed", "cost", "method", "passes", "billed_passes" }(medcount2:jobsogcost_total). Polling, download og annullering bruger de sædvanlige ruter nedenfor; under renderingen angiverprogressdet igangværende gennemløb ("2/3"). Et billede tager 1 til 3 minutter. - Det endelige billede forbliver tilgængeligt i 1 time, og 10 minutter efter den første download. Et mislykket gennemløb giver
status: "failed"medreason: "render_failed"; en annullering,reason: "cancelled". - Fejl:
invalid_count,invalid_view,invalid_lora_pass,invalid_subject_image,invalid_size,character_not_ready, plus dem fra Multi-Ref (unknown_character,unknown_subject,unknown_lora,unknown_mention,multiref_too_many_references,invalid_strength...). Se Grænser og fejl.
Poll
GET /images/{jobId}
| Svar | Betydning |
|---|---|
{ "status": "pending", "phase": "IN_QUEUE" } | I kø |
{ "status": "pending", "phase": "IN_PROGRESS" } | Renderes |
{ "status": "completed", "cost": 1, "file_url": "/pro/v1/images/{jobId}/file", ... } | Færdig, fil klar |
{ "status": "failed", "detail": "..." } | Fejlet, og intet bliver opkrævet |
Poll hvert 3. sekund, ikke hurtigere: køen er delt.
Download
GET /images/{jobId}/file
Selve PNG-filen som response body (Content-Type: image/png). Tilgængelig så snart
status er completed, og 404 media_unavailable når renderingen er slettet. Download den
med det samme, den arkiveres ikke.
Annuller
POST /images/{jobId}/cancel
Annullerer en rendering i kø eller i gang. Svarer { "ok": true }. Intet opkræves, og omkostningen
reserveret mod nøglens daglige loft tilbagebetales.