qwen-image-3.0-pro
Een model voor beeldgeneratie uit tekst, met de nadruk op complexe lay-outs, tekst in beeld en realistische details. Geschikt voor posters, storyboards, menu's en materiaal met een rijke compositie.
- Ailoot · Afbeeldingen
POST /v1/images/generationsqwen-image-3.0-pro - Ailoot · Afbeeldingen
POST /v1/images/generationsqwen-image - Ailoot · Afbeeldingen
POST /v1/images/generationsqwen-image-latest
Over het model
Deze beschrijving gaat over de mogelijkheden van het model. De via Ailoot beschikbare invoer, uitvoer en opties staan hieronder voor de geselecteerde methode.
Qwen-Image-3.0-Pro is een model van Alibaba voor het maken en bewerken van afbeeldingen waarin compositie, tekst en kleine details belangrijk zijn. De toepassingen omvatten rijke lay-outs, een afbeelding binnen een afbeelding, krantenopmaak, storyboards, menu's en werkbladen. De huidige Ailoot-kaart biedt beeldgeneratie op basis van een tekstuele opdracht. Alibaba biedt ook bewerking en het gebruik van referentieafbeeldingen; die bewerkingen vereisen afzonderlijke ondersteuning voor invoerafbeeldingen en worden niet aangeboden door de huidige methode van de kaart.
Tekst en details in het beeld
De fabrikant benadrukt lange opdrachten tot 4,5 duizend tokens, tekst in 12 talen en het gebruik van meerdere lettertypen. Dit beschrijft het vermogen om de opdracht te verwerken en is geen gepubliceerde omvang van het formele contextvenster. Tot de genoemde eigenschappen behoren het weergeven van kleine tekst van 10 pixels, huid- en haartexturen en kleine veranderingen in gezichtsuitdrukkingen. Die details zijn nuttig bij materiaal dat van dichtbij wordt bekeken.
Qwen-Image-3.0-Pro is ook bedoeld voor visuele concepten van webpagina's, games en livestreamschermen. Zo'n resultaat kan een illustratie, schermstructuur en opgemaakte tekst combineren. Het model maakt een afbeelding van de lay-out; een werkende toepassing vereist afzonderlijke implementatie.
Bewerking in de specificatie van Alibaba
Voor de bewerkingsmodus geeft Alibaba één tot drie afbeeldingen op. Binnen deze werkwijze kan een object worden gekoppeld aan het nummer van een referentie en kan de combinatie van het materiaal worden beschreven. Het toevoegen, verwijderen en verplaatsen van objecten en het veranderen van actie, stijl, details en tekst zijn voorzien. Een negatieve beschrijving helpt ongewenste elementen aan te geven.
De bewerkingsmodus van de fabrikant accepteert invoermateriaal in JPG, JPEG, PNG, BMP, TIFF, WEBP en GIF. Van een geanimeerde GIF wordt het eerste frame gebruikt. Elk bestand mag maximaal 10 MB zijn; de fabrikant beveelt afbeeldingen aan met zijden van 384 tot 3072 pixels. Dit zijn aanbevelingen voor de invoer, niet de afmetingen van het uiteindelijke resultaat.
De specificatie van de fabrikant voorziet in één tot zes uitvoerafbeeldingen in PNG per verzoek. Het oppervlak van het resultaat varieert van 262 144 tot 4 194 304 pixels, overeenkomend met vierkante afbeeldingen van 512 × 512 tot 2048 × 2048. Beeldverhoudingen van 1:8 tot 8:1 zijn toegestaan; bij een langgerekte compositie hangt de lengte van een zijde dus ook af van de gekozen beeldvorm. Een aanvullende herwerking van de opdracht vóór generatie is voorzien.
Ailoot · Afbeeldingen POST /v1/images/generations qwen-image-3.0-pro
qwen-image-3.0-proqwen-image-3.0-proqwen-imageqwen-image-latest
Aan de slag
Een model voor beeldgeneratie uit tekst, met de nadruk op complexe lay-outs, tekst in beeld en realistische details. Geschikt voor posters, storyboards, menu's en materiaal met een rijke compositie.
- Toegestane invoer
- Tekst
- Resultaten
- Afbeeldingen
Beschikbaar in Ailoot · invoer en methoden
Ailoot · Afbeeldingen POST /v1/images/generations
- Invoer
text- Uitvoer
image- Uitvoerformaat
- Afbeeldingsbestand
| Veld | Type | Vereiste | Waarden en limieten | Standaard |
|---|---|---|---|---|
Veldmodel | Typestring | VereisteVereist | Waarden en limieten qwen-image-3.0-pro | Standaard— |
Veldprompt | Typestring | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
Veldn | Typeinteger | VereisteOptioneel | Waarden en limieten Minimum: 1 | Standaard1 |
Veldresponse_format | Typestring | VereisteOptioneel | Waarden en limieten url, b64_json | Standaard— |
Veldstream | Typeboolean | VereisteOptioneel | Waarden en limieten | Standaardfalse |
Veldsize | Typestring | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
Veldpartial_images | Typeinteger | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
Veldimages[].image_url | Typestring | VereisteNiet ondersteund | Waarden en limieten Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Maximumaantal afbeeldingen per array: 3 Voorwaarden: Eén werkelijke URL per images[]-object. Het aantal array-items staat los van dit bladveld met een tekenreeks. Geldt wanneer: Alleen JSON images/edits; JSON images/generations verwerkt geen afbeeldingsreferenties. | Standaard— |
Veldimage | Typefile | VereisteOptioneel | Waarden en limieten Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Geldt wanneer: generatie via multipart/form-data | Standaard— |
Veldimage[] | Typefile[] | VereisteOptioneel | Waarden en limieten Maximumaantal items: 3 Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Geldt wanneer: generatie via multipart/form-data | Standaard— |
Combinaties van invoermaterialen
Tekst naar afbeelding · Vereist: prompt
reference_images_generation · Vereist: prompt
Methodeparameters en levenscyclus
| Parameter | Contract |
|---|---|
Parametermaterial_types | Contracttext |
Parameterrequired | Contractmodel, prompt |
Parameteroptional_controls | Contractnull |
Parametercontent_type | Contractapplication/json |
Levenscyclus: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · daadwerkelijk teruggegeven task_id of record in de mediabibliotheek
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.
Tarieven
Ailoot-methodetarieven
POST /v1/images/generations- Invoer
- US$ 0,003 per invoerafbeelding
- Uitvoer
- US$ 0,04 per 1K-afbeelding
- Uitvoer
- US$ 0,075 per 2K-afbeelding
Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. Zo werken reservering en afrekening →
Voorbeeldverzoeken
Ailoot · Afbeeldingen
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");
Resultaten ophalen en opslaan
Ailoot · Afbeeldingen
Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Alle voltooide resultaten bewaren
Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.
Sla elk gegevensitem op. Decodeer elke b64_json of haal elke teruggegeven ondertekende URL op. Kies een bestandsextensie op basis van de daadwerkelijke MIME/bytes.
Als het oorspronkelijke antwoord moet worden gecontroleerd
Als het resultaat van een afbeeldingsgeneratie of -bewerking gecontroleerd moet worden, bewaar dan de oorspronkelijke operation_id/X-Client-Request-ID en de teruggegeven resultaatinformatie. Haal bestaande eigen resultaten terug via de mediabibliotheek met daadwerkelijk teruggegeven task_id- of asset_id-waarden. Dien de generatie- of bewerkingsaanvraag niet opnieuw in en stel geen polling-URL samen op basis van operation_id.
Antwoordvelden
| Veld | Type |
|---|---|
Veldcreated | Typeinteger |
Velddata[].url | Typestring |
Velddata[].b64_json | Typebase64 string |
Veldusage | Typeobject |
Fouten en vervolgstappen
| Antwoord | Voorwaarde | Volgende stap |
|---|---|---|
Antwoord400 · invalid_request_error | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |
Antwoordserver_error | VoorwaardeDe teruggegeven respons geeft aan dat de bewerking of het resultaat gecontroleerd moet worden | Volgende stapBewaar de oorspronkelijk teruggegeven bewerkings-/taak-ID, aanvraagheaders en respons; blijf de oorspronkelijke bewerking uitlezen via de ondersteunde leesaanvragen. Dien de aanmaakaanvraag niet opnieuw in. |
Aliasnamen
Modelaliasnamen
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Aliasnamen voor methodepaden
Gebruik de hierboven getoonde methodepaden.
Gerelateerde aanroeper-ID’s
Ailoot · Afbeeldingen POST /v1/images/generations qwen-image
qwen-imageqwen-image-3.0-proqwen-imageqwen-image-latest
Aan de slag
Een model voor beeldgeneratie uit tekst, met de nadruk op complexe lay-outs, tekst in beeld en realistische details. Geschikt voor posters, storyboards, menu's en materiaal met een rijke compositie.
- Toegestane invoer
- Tekst
- Resultaten
- Afbeeldingen
Beschikbaar in Ailoot · invoer en methoden
Ailoot · Afbeeldingen POST /v1/images/generations
- Invoer
text- Uitvoer
image- Uitvoerformaat
- Afbeeldingsbestand
| Veld | Type | Vereiste | Waarden en limieten | Standaard |
|---|---|---|---|---|
Veldmodel | Typestring | VereisteVereist | Waarden en limieten qwen-image | Standaard— |
Veldprompt | Typestring | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
Veldn | Typeinteger | VereisteOptioneel | Waarden en limieten Minimum: 1 | Standaard1 |
Veldresponse_format | Typestring | VereisteOptioneel | Waarden en limieten url, b64_json | Standaard— |
Veldstream | Typeboolean | VereisteOptioneel | Waarden en limieten | Standaardfalse |
Veldsize | Typestring | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
Veldpartial_images | Typeinteger | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
Veldimages[].image_url | Typestring | VereisteNiet ondersteund | Waarden en limieten Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Maximumaantal afbeeldingen per array: 3 Voorwaarden: Eén werkelijke URL per images[]-object. Het aantal array-items staat los van dit bladveld met een tekenreeks. Geldt wanneer: Alleen JSON images/edits; JSON images/generations verwerkt geen afbeeldingsreferenties. | Standaard— |
Veldimage | Typefile | VereisteOptioneel | Waarden en limieten Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Geldt wanneer: generatie via multipart/form-data | Standaard— |
Veldimage[] | Typefile[] | VereisteOptioneel | Waarden en limieten Maximumaantal items: 3 Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Geldt wanneer: generatie via multipart/form-data | Standaard— |
Combinaties van invoermaterialen
Tekst naar afbeelding · Vereist: prompt
reference_images_generation · Vereist: prompt
Methodeparameters en levenscyclus
| Parameter | Contract |
|---|---|
Parametermaterial_types | Contracttext |
Parameterrequired | Contractmodel, prompt |
Parameteroptional_controls | Contractnull |
Parametercontent_type | Contractapplication/json |
Levenscyclus: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · daadwerkelijk teruggegeven task_id of record in de mediabibliotheek
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.
Tarieven
Ailoot-methodetarieven
POST /v1/images/generations- Invoer
- US$ 0,003 per invoerafbeelding
- Uitvoer
- US$ 0,04 per 1K-afbeelding
- Uitvoer
- US$ 0,075 per 2K-afbeelding
Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. Zo werken reservering en afrekening →
Voorbeeldverzoeken
Ailoot · Afbeeldingen
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");
Resultaten ophalen en opslaan
Ailoot · Afbeeldingen
Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Alle voltooide resultaten bewaren
Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.
Sla elk gegevensitem op. Decodeer elke b64_json of haal elke teruggegeven ondertekende URL op. Kies een bestandsextensie op basis van de daadwerkelijke MIME/bytes.
Als het oorspronkelijke antwoord moet worden gecontroleerd
Als het resultaat van een afbeeldingsgeneratie of -bewerking gecontroleerd moet worden, bewaar dan de oorspronkelijke operation_id/X-Client-Request-ID en de teruggegeven resultaatinformatie. Haal bestaande eigen resultaten terug via de mediabibliotheek met daadwerkelijk teruggegeven task_id- of asset_id-waarden. Dien de generatie- of bewerkingsaanvraag niet opnieuw in en stel geen polling-URL samen op basis van operation_id.
Antwoordvelden
| Veld | Type |
|---|---|
Veldcreated | Typeinteger |
Velddata[].url | Typestring |
Velddata[].b64_json | Typebase64 string |
Veldusage | Typeobject |
Fouten en vervolgstappen
| Antwoord | Voorwaarde | Volgende stap |
|---|---|---|
Antwoord400 · invalid_request_error | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |
Antwoordserver_error | VoorwaardeDe teruggegeven respons geeft aan dat de bewerking of het resultaat gecontroleerd moet worden | Volgende stapBewaar de oorspronkelijk teruggegeven bewerkings-/taak-ID, aanvraagheaders en respons; blijf de oorspronkelijke bewerking uitlezen via de ondersteunde leesaanvragen. Dien de aanmaakaanvraag niet opnieuw in. |
Aliasnamen
Modelaliasnamen
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Aliasnamen voor methodepaden
Gebruik de hierboven getoonde methodepaden.
Gerelateerde aanroeper-ID’s
Ailoot · Afbeeldingen POST /v1/images/generations qwen-image-latest
qwen-image-latestqwen-image-3.0-proqwen-imageqwen-image-latest
Aan de slag
Een model voor beeldgeneratie uit tekst, met de nadruk op complexe lay-outs, tekst in beeld en realistische details. Geschikt voor posters, storyboards, menu's en materiaal met een rijke compositie.
- Toegestane invoer
- Tekst
- Resultaten
- Afbeeldingen
Beschikbaar in Ailoot · invoer en methoden
Ailoot · Afbeeldingen POST /v1/images/generations
- Invoer
text- Uitvoer
image- Uitvoerformaat
- Afbeeldingsbestand
| Veld | Type | Vereiste | Waarden en limieten | Standaard |
|---|---|---|---|---|
Veldmodel | Typestring | VereisteVereist | Waarden en limieten qwen-image-latest | Standaard— |
Veldprompt | Typestring | VereisteVereist | Waarden en limieten Minimumlengte: 1 | Standaard— |
Veldn | Typeinteger | VereisteOptioneel | Waarden en limieten Minimum: 1 | Standaard1 |
Veldresponse_format | Typestring | VereisteOptioneel | Waarden en limieten url, b64_json | Standaard— |
Veldstream | Typeboolean | VereisteOptioneel | Waarden en limieten | Standaardfalse |
Veldsize | Typestring | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
Veldpartial_images | Typeinteger | VereisteOptioneel | Waarden en limieten Afhankelijk van het model | Standaard— |
Veldimages[].image_url | Typestring | VereisteNiet ondersteund | Waarden en limieten Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Maximumaantal afbeeldingen per array: 3 Voorwaarden: Eén werkelijke URL per images[]-object. Het aantal array-items staat los van dit bladveld met een tekenreeks. Geldt wanneer: Alleen JSON images/edits; JSON images/generations verwerkt geen afbeeldingsreferenties. | Standaard— |
Veldimage | Typefile | VereisteOptioneel | Waarden en limieten Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Geldt wanneer: generatie via multipart/form-data | Standaard— |
Veldimage[] | Typefile[] | VereisteOptioneel | Waarden en limieten Maximumaantal items: 3 Maximumaantal gedecodeerde bytes: 10.485.760 MIME-typen: image/png, image/jpeg Geldt wanneer: generatie via multipart/form-data | Standaard— |
Combinaties van invoermaterialen
Tekst naar afbeelding · Vereist: prompt
reference_images_generation · Vereist: prompt
Methodeparameters en levenscyclus
| Parameter | Contract |
|---|---|
Parametermaterial_types | Contracttext |
Parameterrequired | Contractmodel, prompt |
Parameteroptional_controls | Contractnull |
Parametercontent_type | Contractapplication/json |
Levenscyclus: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · daadwerkelijk teruggegeven task_id of record in de mediabibliotheek
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
De methodestructuren en ID’s zijn exact; de mogelijkheden van de leverancier staan los van toelating.
Tarieven
Ailoot-methodetarieven
POST /v1/images/generations- Invoer
- US$ 0,003 per invoerafbeelding
- Uitvoer
- US$ 0,04 per 1K-afbeelding
- Uitvoer
- US$ 0,075 per 2K-afbeelding
Ailoot reserveert vóór een verzoek een geschat bedrag. Na het resultaat worden de uiteindelijke kosten afgerekend op basis van het gemeten verbruik. Bij streaming gebeurt de afrekening op basis van de definitieve verbruiksregistratie. Zo werken reservering en afrekening →
Voorbeeldverzoeken
Ailoot · Afbeeldingen
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");
Resultaten ophalen en opslaan
Ailoot · Afbeeldingen
Download elke teruggegeven afbeelding of sla de Base64-inhoud ervan op
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Alle voltooide resultaten bewaren
Sla elke voltooide afbeelding op; haal elke teruggegeven URL op of decodeer de bijbehorende Base64-inhoud.
Sla elk gegevensitem op. Decodeer elke b64_json of haal elke teruggegeven ondertekende URL op. Kies een bestandsextensie op basis van de daadwerkelijke MIME/bytes.
Als het oorspronkelijke antwoord moet worden gecontroleerd
Als het resultaat van een afbeeldingsgeneratie of -bewerking gecontroleerd moet worden, bewaar dan de oorspronkelijke operation_id/X-Client-Request-ID en de teruggegeven resultaatinformatie. Haal bestaande eigen resultaten terug via de mediabibliotheek met daadwerkelijk teruggegeven task_id- of asset_id-waarden. Dien de generatie- of bewerkingsaanvraag niet opnieuw in en stel geen polling-URL samen op basis van operation_id.
Antwoordvelden
| Veld | Type |
|---|---|
Veldcreated | Typeinteger |
Velddata[].url | Typestring |
Velddata[].b64_json | Typebase64 string |
Veldusage | Typeobject |
Fouten en vervolgstappen
| Antwoord | Voorwaarde | Volgende stap |
|---|---|---|
Antwoord400 · invalid_request_error | VoorwaardeVerplichte velden, de materiaalrepresentatie of een parameterwaarde zijn ongeldig | Volgende stapCorrigeer de aangegeven velden vóór een nieuwe aanmaakaanvraag. |
Antwoordserver_error | VoorwaardeDe teruggegeven respons geeft aan dat de bewerking of het resultaat gecontroleerd moet worden | Volgende stapBewaar de oorspronkelijk teruggegeven bewerkings-/taak-ID, aanvraagheaders en respons; blijf de oorspronkelijke bewerking uitlezen via de ondersteunde leesaanvragen. Dien de aanmaakaanvraag niet opnieuw in. |
Aliasnamen
Modelaliasnamen
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Aliasnamen voor methodepaden
Gebruik de hierboven getoonde methodepaden.
Gerelateerde aanroeper-ID’s
FAQ · qwen-image-3.0-pro
- Welke invoer en resultaten zijn beschikbaar?
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- Welke velden gebruikt het verzoek?
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[]- Welke limieten gelden?
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