qwen-image-3.0-pro
Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.
- Ailoot · Billeder
POST /v1/images/generationsqwen-image-3.0-pro - Ailoot · Billeder
POST /v1/images/generationsqwen-image - Ailoot · Billeder
POST /v1/images/generationsqwen-image-latest
Om modellen
Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.
Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.
Tekst og detaljer i billedet
Producenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.
Qwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.
Redigering i Alibabas specifikation
Til redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.
Producentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.
Producentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.
Ailoot · Billeder POST /v1/images/generations qwen-image-3.0-pro
qwen-image-3.0-proqwen-image-3.0-proqwen-imageqwen-image-latest
Start
Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.
- Accepterede input
- Tekst
- Resultater
- Billeder
Tilgængelig i Ailoot · input og metoder
Ailoot · Billeder POST /v1/images/generations
- Inputtyper
text- Outputtyper
image- Outputformat
- Billedfil
| Felt | Type | Krav | Værdier og grænser | Standard |
|---|---|---|---|---|
Feltmodel | Typestring | KravPåkrævet | Værdier og grænser qwen-image-3.0-pro | Standard— |
Feltprompt | Typestring | KravPåkrævet | Værdier og grænser Minimumslængde: 1 | Standard— |
Feltn | Typeinteger | KravValgfrit | Værdier og grænser Minimum: 1 | Standard1 |
Feltresponse_format | Typestring | KravValgfrit | Værdier og grænser url, b64_json | Standard— |
Feltstream | Typeboolean | KravValgfrit | Værdier og grænser | Standardfalse |
Feltsize | Typestring | KravValgfrit | Værdier og grænser Afhænger af modellen | Standard— |
Feltpartial_images | Typeinteger | KravValgfrit | Værdier og grænser Afhænger af modellen | Standard— |
Feltimages[].image_url | Typestring | KravIkke understøttet | Værdier og grænser Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Maksimalt antal billeder pr. array: 3 Betingelser: Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau. Gælder når: Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer. | Standard— |
Feltimage | Typefile | KravValgfrit | Værdier og grænser Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Gælder når: generering med multipart/form-data | Standard— |
Feltimage[] | Typefile[] | KravValgfrit | Værdier og grænser Maksimalt antal elementer: 3 Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Gælder når: generering med multipart/form-data | Standard— |
Kombinationer af inputmaterialer
Tekst til billede · Påkrævet: prompt
reference_images_generation · Påkrævet: prompt
Metodeparametre og livscyklus
| Parameter | Kontrakt |
|---|---|
Parametermaterial_types | Kontrakttext |
Parameterrequired | Kontraktmodel, prompt |
Parameteroptional_controls | Kontraktnull |
Parametercontent_type | Kontraktapplication/json |
Livscyklus: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · det faktisk returnerede task_id eller posten i mediebiblioteket
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.
Priser
Ailoot-metodetakster
POST /v1/images/generations- Input
- 0,003 US$ pr. inputbillede
- Output
- 0,04 US$ pr. 1K-billede
- Output
- 0,075 US$ pr. 2K-billede
Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. Sådan fungerer reservation og afregning →
Eksempelanmodninger
Ailoot · Billeder
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-image-3.0-pro", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'qwen-image-3.0-pro', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "qwen-image-3.0-pro", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
Hent og gem resultater
Ailoot · Billeder
Hent hvert returneret billede, eller gem dets Base64-indhold
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Behold alle færdige resultater
Gem hvert færdigt billede; hent hver returneret URL eller afkod dets Base64-indhold.
Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.
Hvis det oprindelige svar skal kontrolleres
Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id.
Svarfelter
| Felt | Type |
|---|---|
Feltcreated | Typeinteger |
Feltdata[].url | Typestring |
Feltdata[].b64_json | Typebase64 string |
Feltusage | Typeobject |
Fejl og næste trin
| Svar | Betingelse | Næste trin |
|---|---|---|
Svar400 · invalid_request_error | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |
Svarserver_error | BetingelseDet returnerede svar angiver, at operationen eller resultatet skal kontrolleres | Næste trinGem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen. |
Aliaser
Modelaliaser
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Aliaser for metodestier
Brug metodestierne vist ovenfor.
Relaterede kalder-ID’er
Ailoot · Billeder POST /v1/images/generations qwen-image
qwen-imageqwen-image-3.0-proqwen-imageqwen-image-latest
Start
Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.
- Accepterede input
- Tekst
- Resultater
- Billeder
Tilgængelig i Ailoot · input og metoder
Ailoot · Billeder POST /v1/images/generations
- Inputtyper
text- Outputtyper
image- Outputformat
- Billedfil
| Felt | Type | Krav | Værdier og grænser | Standard |
|---|---|---|---|---|
Feltmodel | Typestring | KravPåkrævet | Værdier og grænser qwen-image | Standard— |
Feltprompt | Typestring | KravPåkrævet | Værdier og grænser Minimumslængde: 1 | Standard— |
Feltn | Typeinteger | KravValgfrit | Værdier og grænser Minimum: 1 | Standard1 |
Feltresponse_format | Typestring | KravValgfrit | Værdier og grænser url, b64_json | Standard— |
Feltstream | Typeboolean | KravValgfrit | Værdier og grænser | Standardfalse |
Feltsize | Typestring | KravValgfrit | Værdier og grænser Afhænger af modellen | Standard— |
Feltpartial_images | Typeinteger | KravValgfrit | Værdier og grænser Afhænger af modellen | Standard— |
Feltimages[].image_url | Typestring | KravIkke understøttet | Værdier og grænser Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Maksimalt antal billeder pr. array: 3 Betingelser: Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau. Gælder når: Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer. | Standard— |
Feltimage | Typefile | KravValgfrit | Værdier og grænser Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Gælder når: generering med multipart/form-data | Standard— |
Feltimage[] | Typefile[] | KravValgfrit | Værdier og grænser Maksimalt antal elementer: 3 Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Gælder når: generering med multipart/form-data | Standard— |
Kombinationer af inputmaterialer
Tekst til billede · Påkrævet: prompt
reference_images_generation · Påkrævet: prompt
Metodeparametre og livscyklus
| Parameter | Kontrakt |
|---|---|
Parametermaterial_types | Kontrakttext |
Parameterrequired | Kontraktmodel, prompt |
Parameteroptional_controls | Kontraktnull |
Parametercontent_type | Kontraktapplication/json |
Livscyklus: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · det faktisk returnerede task_id eller posten i mediebiblioteket
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.
Priser
Ailoot-metodetakster
POST /v1/images/generations- Input
- 0,003 US$ pr. inputbillede
- Output
- 0,04 US$ pr. 1K-billede
- Output
- 0,075 US$ pr. 2K-billede
Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. Sådan fungerer reservation og afregning →
Eksempelanmodninger
Ailoot · Billeder
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-image", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'qwen-image', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "qwen-image", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
Hent og gem resultater
Ailoot · Billeder
Hent hvert returneret billede, eller gem dets Base64-indhold
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Behold alle færdige resultater
Gem hvert færdigt billede; hent hver returneret URL eller afkod dets Base64-indhold.
Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.
Hvis det oprindelige svar skal kontrolleres
Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id.
Svarfelter
| Felt | Type |
|---|---|
Feltcreated | Typeinteger |
Feltdata[].url | Typestring |
Feltdata[].b64_json | Typebase64 string |
Feltusage | Typeobject |
Fejl og næste trin
| Svar | Betingelse | Næste trin |
|---|---|---|
Svar400 · invalid_request_error | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |
Svarserver_error | BetingelseDet returnerede svar angiver, at operationen eller resultatet skal kontrolleres | Næste trinGem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen. |
Aliaser
Modelaliaser
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Aliaser for metodestier
Brug metodestierne vist ovenfor.
Relaterede kalder-ID’er
Ailoot · Billeder POST /v1/images/generations qwen-image-latest
qwen-image-latestqwen-image-3.0-proqwen-imageqwen-image-latest
Start
Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.
- Accepterede input
- Tekst
- Resultater
- Billeder
Tilgængelig i Ailoot · input og metoder
Ailoot · Billeder POST /v1/images/generations
- Inputtyper
text- Outputtyper
image- Outputformat
- Billedfil
| Felt | Type | Krav | Værdier og grænser | Standard |
|---|---|---|---|---|
Feltmodel | Typestring | KravPåkrævet | Værdier og grænser qwen-image-latest | Standard— |
Feltprompt | Typestring | KravPåkrævet | Værdier og grænser Minimumslængde: 1 | Standard— |
Feltn | Typeinteger | KravValgfrit | Værdier og grænser Minimum: 1 | Standard1 |
Feltresponse_format | Typestring | KravValgfrit | Værdier og grænser url, b64_json | Standard— |
Feltstream | Typeboolean | KravValgfrit | Værdier og grænser | Standardfalse |
Feltsize | Typestring | KravValgfrit | Værdier og grænser Afhænger af modellen | Standard— |
Feltpartial_images | Typeinteger | KravValgfrit | Værdier og grænser Afhænger af modellen | Standard— |
Feltimages[].image_url | Typestring | KravIkke understøttet | Værdier og grænser Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Maksimalt antal billeder pr. array: 3 Betingelser: Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau. Gælder når: Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer. | Standard— |
Feltimage | Typefile | KravValgfrit | Værdier og grænser Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Gælder når: generering med multipart/form-data | Standard— |
Feltimage[] | Typefile[] | KravValgfrit | Værdier og grænser Maksimalt antal elementer: 3 Maksimalt antal afkodede bytes: 10.485.760 MIME-typer: image/png, image/jpeg Gælder når: generering med multipart/form-data | Standard— |
Kombinationer af inputmaterialer
Tekst til billede · Påkrævet: prompt
reference_images_generation · Påkrævet: prompt
Metodeparametre og livscyklus
| Parameter | Kontrakt |
|---|---|
Parametermaterial_types | Kontrakttext |
Parameterrequired | Kontraktmodel, prompt |
Parameteroptional_controls | Kontraktnull |
Parametercontent_type | Kontraktapplication/json |
Livscyklus: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · det faktisk returnerede task_id eller posten i mediebiblioteket
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.
Priser
Ailoot-metodetakster
POST /v1/images/generations- Input
- 0,003 US$ pr. inputbillede
- Output
- 0,04 US$ pr. 1K-billede
- Output
- 0,075 US$ pr. 2K-billede
Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. Sådan fungerer reservation og afregning →
Eksempelanmodninger
Ailoot · Billeder
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "qwen-image-latest", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
-H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
--data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin
def save_images(items):
if not items: raise SystemExit("No completed images; retain the full response")
for index, item in enumerate(items):
encoded=item.get("b64_json")
uri=item.get("url", "")
if not encoded and uri.startswith("data:image/"):
header, separator, encoded=uri.partition(",")
if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
if encoded:
raw=base64.b64decode(encoded,validate=True)
elif uri:
uri=urljoin("https://api.ailoot.ai",uri)
parsed=urlsplit(uri)
if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
raise SystemExit("Invalid returned image URL")
owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
args=["curl","--fail-with-body","--silent","--show-error",uri]
if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
temporary=Path(f"image-{index}.bin")
subprocess.run(args+["-o",str(temporary)],check=True)
raw=temporary.read_bytes()
temporary.unlink()
else: raise SystemExit("Image has neither bytes nor URL")
if not raw: raise SystemExit("Empty image result")
ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
Path(f"image-{index}.{ext}").write_bytes(raw)
print("Every returned image saved; complete response metadata retained")
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'qwen-image-latest', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "qwen-image-latest", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
if(!encoded && uri.startsWith("data:image/")) {
const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
encoded=uri.slice(comma+1);
}
if(encoded) {
if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
raw=Buffer.from(encoded,"base64");
} else if(uri) {
const u=new URL(uri,"https://api.ailoot.ai");
if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
if(!response.ok) throw new Error("Image content download failed: "+response.status);
raw=Buffer.from(await response.arrayBuffer());
} else throw new Error("Image has neither bytes nor URL");
if(!raw.length) throw new Error("Empty image result");
const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
Hent og gem resultater
Ailoot · Billeder
Hent hvert returneret billede, eller gem dets Base64-indhold
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Behold alle færdige resultater
Gem hvert færdigt billede; hent hver returneret URL eller afkod dets Base64-indhold.
Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.
Hvis det oprindelige svar skal kontrolleres
Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id.
Svarfelter
| Felt | Type |
|---|---|
Feltcreated | Typeinteger |
Feltdata[].url | Typestring |
Feltdata[].b64_json | Typebase64 string |
Feltusage | Typeobject |
Fejl og næste trin
| Svar | Betingelse | Næste trin |
|---|---|---|
Svar400 · invalid_request_error | BetingelseUgyldige obligatoriske felter, materialerepræsentation eller parameterværdi | Næste trinRet de angivne felter før en ny oprettelsesanmodning. |
Svarserver_error | BetingelseDet returnerede svar angiver, at operationen eller resultatet skal kontrolleres | Næste trinGem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen. |
Aliaser
Modelaliaser
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Aliaser for metodestier
Brug metodestierne vist ovenfor.
Relaterede kalder-ID’er
FAQ · qwen-image-3.0-pro
- Hvilke input og resultater er tilgængelige?
POST /v1/images/generations·qwen-image-3.0-pro:text→imagePOST /v1/images/generations·qwen-image:text→imagePOST /v1/images/generations·qwen-image-latest:text→image- Hvilke felter bruger anmodningen?
POST /v1/images/generations·qwen-image-3.0-pro:model,prompt,n,response_format,stream,image,image[]POST /v1/images/generations·qwen-image:model,prompt,n,response_format,stream,image,image[]POST /v1/images/generations·qwen-image-latest:model,prompt,n,response_format,stream,image,image[]- Hvilke grænser gælder?
POST /v1/images/generations·qwen-image-3.0-pro:n.minimum:1POST /v1/images/generations·qwen-image:n.minimum:1POST /v1/images/generations·qwen-image-latest:n.minimum:1