qwen-image-3.0-pro
Vaizdų generavimo pagal tekstą modelis, daugiausia dėmesio skiriantis sudėtingiems maketams, užrašams ir tikroviškoms detalėms. Tinka plakatams, kadruotėms, meniu ir medžiagai su tankia kompozicija.
- Ailoot · Vaizdai
POST /v1/images/generationsqwen-image-3.0-pro - Ailoot · Vaizdai
POST /v1/images/generationsqwen-image - Ailoot · Vaizdai
POST /v1/images/generationsqwen-image-latest
Apie modelį
Šis aprašas apima modelio galimybes. Pasirinktam metodui Ailoot prieinamos įvestys, išvestys ir parinktys nurodytos toliau.
Qwen-Image-3.0-Pro — Alibaba modelis vaizdams kurti ir redaguoti, kai svarbi kompozicija, užrašai ir smulkios detalės. Tarp jo krypčių — tankūs maketai, vaizdas vaizde, laikraščių maketavimas, kadruotės, meniu ir mokomieji lapai. Dabartinėje Ailoot kortelėje pateiktas vaizdo generavimo pagal tekstinę užduotį režimas. Alibaba taip pat numato redagavimą ir darbą su pavyzdiniais vaizdais; šioms operacijoms reikia atskiro įvesties vaizdų palaikymo, o dabartinis kortelės metodas jų nepateikia.
Tekstas ir detalės vaizde
Gamintojas pabrėžia ilgas užduotis iki 4,5 tūkst. tokenų, užrašus 12 kalbų ir darbą su keliais šriftais. Tai aprašyta užduoties apdorojimo galimybė, o ne paskelbtas formalaus konteksto lango dydis. Tarp deklaruojamų savybių — smulkių 10 pikselių dydžio užrašų, odos ir plaukų tekstūros bei nedidelių veido išraiškos pokyčių perteikimas. Tokios detalės naudingos rengiant medžiagą, į kurią žiūrima iš arti.
Qwen-Image-3.0-Pro taip pat skirtas žiniatinklio puslapių, žaidimų ir tiesioginių transliacijų ekranų vizualinėms koncepcijoms. Tokiame rezultate galima sujungti iliustraciją, ekrano struktūrą ir apipavidalintus užrašus. Modelis sukuria maketo vaizdą; veikiančiai programai reikia atskiro įgyvendinimo.
Redagavimas Alibaba specifikacijoje
Redagavimo režimui Alibaba nurodo nuo vieno iki trijų vaizdų. Šiuo būdu gamintojas leidžia susieti objektą su pavyzdinio vaizdo numeriu ir aprašyti medžiagos derinį. Numatytas objektų pridėjimas, pašalinimas ir perkėlimas, veiksmo, stiliaus, detalių ir teksto keitimas. Neigiamas aprašymas padeda nurodyti nepageidaujamus elementus.
Gamintojo redagavimo režimas priima JPG, JPEG, PNG, BMP, TIFF, WEBP ir GIF įvesties medžiagą. Animaciniam GIF naudojamas pirmasis kadras. Kiekvieno failo dydis — iki 10 MB; gamintojas rekomenduoja vaizdus, kurių kraštinės — nuo 384 iki 3072 pikselių. Tai rekomendacijos įvesčiai, o ne galutinio rezultato matmenys.
Gamintojo specifikacijoje numatyta nuo vieno iki šešių išvesties vaizdų PNG formatu vienai užklausai. Rezultato ploto diapazonas — nuo 262 144 iki 4 194 304 pikselių, atitinkantis kvadratinius vaizdus nuo 512 × 512 iki 2048 × 2048. Leidžiami kraštinių santykiai nuo 1:8 iki 8:1, todėl ištęstos kompozicijos kraštinės ilgis priklauso ir nuo pasirinktos kadro formos. Numatyta papildomai perdirbti užduotį prieš generavimą.
Ailoot · Vaizdai POST /v1/images/generations qwen-image-3.0-pro
qwen-image-3.0-proqwen-image-3.0-proqwen-imageqwen-image-latest
Pradžia
Vaizdų generavimo pagal tekstą modelis, daugiausia dėmesio skiriantis sudėtingiems maketams, užrašams ir tikroviškoms detalėms. Tinka plakatams, kadruotėms, meniu ir medžiagai su tankia kompozicija.
- Leidžiamos įvestys
- Tekstas
- Rezultatai
- Vaizdai
Prieinama Ailoot · įvestys ir metodai
Ailoot · Vaizdai POST /v1/images/generations
- Įvestis
text- Išvestis
image- Išvesties formatas
- Vaizdo failas
| Laukas | Tipas | Reikalavimas | Reikšmės ir ribos | Numatyta |
|---|---|---|---|---|
Laukasmodel | Tipasstring | ReikalavimasPrivaloma | Reikšmės ir ribos qwen-image-3.0-pro | Numatyta— |
Laukasprompt | Tipasstring | ReikalavimasPrivaloma | Reikšmės ir ribos Mažiausias ilgis: 1 | Numatyta— |
Laukasn | Tipasinteger | ReikalavimasNeprivaloma | Reikšmės ir ribos Mažiausia reikšmė: 1 | Numatyta1 |
Laukasresponse_format | Tipasstring | ReikalavimasNeprivaloma | Reikšmės ir ribos url, b64_json | Numatyta— |
Laukasstream | Tipasboolean | ReikalavimasNeprivaloma | Reikšmės ir ribos | Numatytafalse |
Laukassize | Tipasstring | ReikalavimasNeprivaloma | Reikšmės ir ribos Priklauso nuo modelio | Numatyta— |
Laukaspartial_images | Tipasinteger | ReikalavimasNeprivaloma | Reikšmės ir ribos Priklauso nuo modelio | Numatyta— |
Laukasimages[].image_url | Tipasstring | ReikalavimasNepalaikoma | Reikšmės ir ribos Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Didžiausias vaizdų skaičius masyve: 3 Sąlygos: Vienas tikras URL kiekviename images[] objekte. Masyvo elementų skaičius nesutapatinamas su šiuo galiniu eilutės tipo lauku. Taikoma, kai: Tik JSON images/edits; JSON images/generations neanalizuoja per images pateiktų paveikslėlių nuorodų. | Numatyta— |
Laukasimage | Tipasfile | ReikalavimasNeprivaloma | Reikšmės ir ribos Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Taikoma, kai: generavimas naudojant multipart/form-data | Numatyta— |
Laukasimage[] | Tipasfile[] | ReikalavimasNeprivaloma | Reikšmės ir ribos Didžiausias elementų skaičius: 3 Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Taikoma, kai: generavimas naudojant multipart/form-data | Numatyta— |
Įvesties medžiagos deriniai
Iš teksto į vaizdą · Privaloma: prompt
reference_images_generation · Privaloma: prompt
Metodo parametrai ir gyvavimo ciklas
| Parametras | Specifikacija |
|---|---|
Parametrasmaterial_types | Specifikacijatext |
Parametrasrequired | Specifikacijamodel, prompt |
Parametrasoptional_controls | Specifikacijanull |
Parametrascontent_type | Specifikacijaapplication/json |
Gyvavimo ciklas: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · faktiškai grąžinta task_id reikšmė arba medijos bibliotekos įrašas
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Metodų struktūros ir ID yra tikslūs; tiekėjo galimybės yra atskirtos nuo užklausos priėmimo.
Planai
Ailoot metodų įkainiai
POST /v1/images/generations- Įvestis
- 0,003 USD už įvesties vaizdą
- Išvestis
- 0,04 USD už 1K vaizdą
- Išvestis
- 0,075 USD už 2K vaizdą
Ailoot prieš užklausą rezervuoja numatomą sumą. Gavus rezultatą, galutinis mokestis nuskaitomas pagal išmatuotą naudojimą. Srautinio atsakymo atsiskaitymui naudojamas galutinis naudojimo įrašas. Kaip veikia rezervavimas ir atsiskaitymas →
Užklausų pavyzdžiai
Ailoot · Vaizdai
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");
Gauti ir išsaugoti rezultatus
Ailoot · Vaizdai
Atsisiųskite kiekvieną grąžintą vaizdą arba išsaugokite jo Base64 turinį
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Išsaugoti visus baigtus rezultatus
Išsaugokite kiekvieną baigtą vaizdą; gaukite turinį iš kiekvieno grąžinto URL arba dekoduokite jo Base64 turinį.
Išsaugokite kiekvieną duomenų elementą. Iškoduokite kiekvieną b64_json arba atsisiųskite turinį pagal kiekvieną grąžintą pasirašytą URL. Failo plėtinį pasirinkite pagal faktinį MIME tipą ir baitus.
Jei reikia patikrinti pradinį atsakymą
Jei vaizdo generavimo ar redagavimo rezultatą reikia patikrinti, išsaugokite pradinį operation_id/X-Client-Request-ID ir grąžintą informaciją apie rezultatą. Atkurkite prieigą prie esamų jums priklausančių rezultatų per medijos biblioteką, naudodami faktines task_id arba asset_id reikšmes. Pakartotinai neteikite generavimo ar redagavimo užklausos ir nekurkite būsenos tikrinimo URL iš operation_id.
Atsakymo laukai
| Laukas | Tipas |
|---|---|
Laukascreated | Tipasinteger |
Laukasdata[].url | Tipasstring |
Laukasdata[].b64_json | Tipasbase64 string |
Laukasusage | Tipasobject |
Klaidos ir tolesni veiksmai
| Atsakymas | Sąlyga | Kitas žingsnis |
|---|---|---|
Atsakymas400 · invalid_request_error | SąlygaNetinkami privalomi laukai, medžiagos pateikimo forma arba parametro reikšmė | Kitas žingsnisPrieš naują kūrimo užklausą pataisykite nurodytus laukus. |
Atsakymasserver_error | SąlygaGrąžintame atsakyme nurodoma, kad operaciją arba rezultatą reikia patikrinti | Kitas žingsnisIšsaugokite pradinį grąžintą operacijos ar užduoties ID, užklausos antraštes ir atsakymą; toliau tikrinkite tos pačios pradinės operacijos duomenis palaikomais būdais. Kūrimo užklausos pakartotinai neteikite. |
Pseudonimai
Modelių pseudonimai
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Metodų kelių pseudonimai
Naudokite aukščiau nurodytus metodų kelius.
Susiję ID iškvietimui
Ailoot · Vaizdai POST /v1/images/generations qwen-image
qwen-imageqwen-image-3.0-proqwen-imageqwen-image-latest
Pradžia
Vaizdų generavimo pagal tekstą modelis, daugiausia dėmesio skiriantis sudėtingiems maketams, užrašams ir tikroviškoms detalėms. Tinka plakatams, kadruotėms, meniu ir medžiagai su tankia kompozicija.
- Leidžiamos įvestys
- Tekstas
- Rezultatai
- Vaizdai
Prieinama Ailoot · įvestys ir metodai
Ailoot · Vaizdai POST /v1/images/generations
- Įvestis
text- Išvestis
image- Išvesties formatas
- Vaizdo failas
| Laukas | Tipas | Reikalavimas | Reikšmės ir ribos | Numatyta |
|---|---|---|---|---|
Laukasmodel | Tipasstring | ReikalavimasPrivaloma | Reikšmės ir ribos qwen-image | Numatyta— |
Laukasprompt | Tipasstring | ReikalavimasPrivaloma | Reikšmės ir ribos Mažiausias ilgis: 1 | Numatyta— |
Laukasn | Tipasinteger | ReikalavimasNeprivaloma | Reikšmės ir ribos Mažiausia reikšmė: 1 | Numatyta1 |
Laukasresponse_format | Tipasstring | ReikalavimasNeprivaloma | Reikšmės ir ribos url, b64_json | Numatyta— |
Laukasstream | Tipasboolean | ReikalavimasNeprivaloma | Reikšmės ir ribos | Numatytafalse |
Laukassize | Tipasstring | ReikalavimasNeprivaloma | Reikšmės ir ribos Priklauso nuo modelio | Numatyta— |
Laukaspartial_images | Tipasinteger | ReikalavimasNeprivaloma | Reikšmės ir ribos Priklauso nuo modelio | Numatyta— |
Laukasimages[].image_url | Tipasstring | ReikalavimasNepalaikoma | Reikšmės ir ribos Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Didžiausias vaizdų skaičius masyve: 3 Sąlygos: Vienas tikras URL kiekviename images[] objekte. Masyvo elementų skaičius nesutapatinamas su šiuo galiniu eilutės tipo lauku. Taikoma, kai: Tik JSON images/edits; JSON images/generations neanalizuoja per images pateiktų paveikslėlių nuorodų. | Numatyta— |
Laukasimage | Tipasfile | ReikalavimasNeprivaloma | Reikšmės ir ribos Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Taikoma, kai: generavimas naudojant multipart/form-data | Numatyta— |
Laukasimage[] | Tipasfile[] | ReikalavimasNeprivaloma | Reikšmės ir ribos Didžiausias elementų skaičius: 3 Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Taikoma, kai: generavimas naudojant multipart/form-data | Numatyta— |
Įvesties medžiagos deriniai
Iš teksto į vaizdą · Privaloma: prompt
reference_images_generation · Privaloma: prompt
Metodo parametrai ir gyvavimo ciklas
| Parametras | Specifikacija |
|---|---|
Parametrasmaterial_types | Specifikacijatext |
Parametrasrequired | Specifikacijamodel, prompt |
Parametrasoptional_controls | Specifikacijanull |
Parametrascontent_type | Specifikacijaapplication/json |
Gyvavimo ciklas: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · faktiškai grąžinta task_id reikšmė arba medijos bibliotekos įrašas
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Metodų struktūros ir ID yra tikslūs; tiekėjo galimybės yra atskirtos nuo užklausos priėmimo.
Planai
Ailoot metodų įkainiai
POST /v1/images/generations- Įvestis
- 0,003 USD už įvesties vaizdą
- Išvestis
- 0,04 USD už 1K vaizdą
- Išvestis
- 0,075 USD už 2K vaizdą
Ailoot prieš užklausą rezervuoja numatomą sumą. Gavus rezultatą, galutinis mokestis nuskaitomas pagal išmatuotą naudojimą. Srautinio atsakymo atsiskaitymui naudojamas galutinis naudojimo įrašas. Kaip veikia rezervavimas ir atsiskaitymas →
Užklausų pavyzdžiai
Ailoot · Vaizdai
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");
Gauti ir išsaugoti rezultatus
Ailoot · Vaizdai
Atsisiųskite kiekvieną grąžintą vaizdą arba išsaugokite jo Base64 turinį
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Išsaugoti visus baigtus rezultatus
Išsaugokite kiekvieną baigtą vaizdą; gaukite turinį iš kiekvieno grąžinto URL arba dekoduokite jo Base64 turinį.
Išsaugokite kiekvieną duomenų elementą. Iškoduokite kiekvieną b64_json arba atsisiųskite turinį pagal kiekvieną grąžintą pasirašytą URL. Failo plėtinį pasirinkite pagal faktinį MIME tipą ir baitus.
Jei reikia patikrinti pradinį atsakymą
Jei vaizdo generavimo ar redagavimo rezultatą reikia patikrinti, išsaugokite pradinį operation_id/X-Client-Request-ID ir grąžintą informaciją apie rezultatą. Atkurkite prieigą prie esamų jums priklausančių rezultatų per medijos biblioteką, naudodami faktines task_id arba asset_id reikšmes. Pakartotinai neteikite generavimo ar redagavimo užklausos ir nekurkite būsenos tikrinimo URL iš operation_id.
Atsakymo laukai
| Laukas | Tipas |
|---|---|
Laukascreated | Tipasinteger |
Laukasdata[].url | Tipasstring |
Laukasdata[].b64_json | Tipasbase64 string |
Laukasusage | Tipasobject |
Klaidos ir tolesni veiksmai
| Atsakymas | Sąlyga | Kitas žingsnis |
|---|---|---|
Atsakymas400 · invalid_request_error | SąlygaNetinkami privalomi laukai, medžiagos pateikimo forma arba parametro reikšmė | Kitas žingsnisPrieš naują kūrimo užklausą pataisykite nurodytus laukus. |
Atsakymasserver_error | SąlygaGrąžintame atsakyme nurodoma, kad operaciją arba rezultatą reikia patikrinti | Kitas žingsnisIšsaugokite pradinį grąžintą operacijos ar užduoties ID, užklausos antraštes ir atsakymą; toliau tikrinkite tos pačios pradinės operacijos duomenis palaikomais būdais. Kūrimo užklausos pakartotinai neteikite. |
Pseudonimai
Modelių pseudonimai
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Metodų kelių pseudonimai
Naudokite aukščiau nurodytus metodų kelius.
Susiję ID iškvietimui
Ailoot · Vaizdai POST /v1/images/generations qwen-image-latest
qwen-image-latestqwen-image-3.0-proqwen-imageqwen-image-latest
Pradžia
Vaizdų generavimo pagal tekstą modelis, daugiausia dėmesio skiriantis sudėtingiems maketams, užrašams ir tikroviškoms detalėms. Tinka plakatams, kadruotėms, meniu ir medžiagai su tankia kompozicija.
- Leidžiamos įvestys
- Tekstas
- Rezultatai
- Vaizdai
Prieinama Ailoot · įvestys ir metodai
Ailoot · Vaizdai POST /v1/images/generations
- Įvestis
text- Išvestis
image- Išvesties formatas
- Vaizdo failas
| Laukas | Tipas | Reikalavimas | Reikšmės ir ribos | Numatyta |
|---|---|---|---|---|
Laukasmodel | Tipasstring | ReikalavimasPrivaloma | Reikšmės ir ribos qwen-image-latest | Numatyta— |
Laukasprompt | Tipasstring | ReikalavimasPrivaloma | Reikšmės ir ribos Mažiausias ilgis: 1 | Numatyta— |
Laukasn | Tipasinteger | ReikalavimasNeprivaloma | Reikšmės ir ribos Mažiausia reikšmė: 1 | Numatyta1 |
Laukasresponse_format | Tipasstring | ReikalavimasNeprivaloma | Reikšmės ir ribos url, b64_json | Numatyta— |
Laukasstream | Tipasboolean | ReikalavimasNeprivaloma | Reikšmės ir ribos | Numatytafalse |
Laukassize | Tipasstring | ReikalavimasNeprivaloma | Reikšmės ir ribos Priklauso nuo modelio | Numatyta— |
Laukaspartial_images | Tipasinteger | ReikalavimasNeprivaloma | Reikšmės ir ribos Priklauso nuo modelio | Numatyta— |
Laukasimages[].image_url | Tipasstring | ReikalavimasNepalaikoma | Reikšmės ir ribos Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Didžiausias vaizdų skaičius masyve: 3 Sąlygos: Vienas tikras URL kiekviename images[] objekte. Masyvo elementų skaičius nesutapatinamas su šiuo galiniu eilutės tipo lauku. Taikoma, kai: Tik JSON images/edits; JSON images/generations neanalizuoja per images pateiktų paveikslėlių nuorodų. | Numatyta— |
Laukasimage | Tipasfile | ReikalavimasNeprivaloma | Reikšmės ir ribos Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Taikoma, kai: generavimas naudojant multipart/form-data | Numatyta— |
Laukasimage[] | Tipasfile[] | ReikalavimasNeprivaloma | Reikšmės ir ribos Didžiausias elementų skaičius: 3 Didžiausias dekoduotų baitų skaičius: 10 485 760 MIME tipai: image/png, image/jpeg Taikoma, kai: generavimas naudojant multipart/form-data | Numatyta— |
Įvesties medžiagos deriniai
Iš teksto į vaizdą · Privaloma: prompt
reference_images_generation · Privaloma: prompt
Metodo parametrai ir gyvavimo ciklas
| Parametras | Specifikacija |
|---|---|
Parametrasmaterial_types | Specifikacijatext |
Parametrasrequired | Specifikacijamodel, prompt |
Parametrasoptional_controls | Specifikacijanull |
Parametrascontent_type | Specifikacijaapplication/json |
Gyvavimo ciklas: synchronous_result_then_owned_library
GET /v1/media/tasks/{task_id} · faktiškai grąžinta task_id reikšmė arba medijos bibliotekos įrašas
GET /v1/media/assets/{asset_id}/content
GET /v1/media/assets
GET /v1/media/assets/{asset_id}
Metodų struktūros ir ID yra tikslūs; tiekėjo galimybės yra atskirtos nuo užklausos priėmimo.
Planai
Ailoot metodų įkainiai
POST /v1/images/generations- Įvestis
- 0,003 USD už įvesties vaizdą
- Išvestis
- 0,04 USD už 1K vaizdą
- Išvestis
- 0,075 USD už 2K vaizdą
Ailoot prieš užklausą rezervuoja numatomą sumą. Gavus rezultatą, galutinis mokestis nuskaitomas pagal išmatuotą naudojimą. Srautinio atsakymo atsiskaitymui naudojamas galutinis naudojimo įrašas. Kaip veikia rezervavimas ir atsiskaitymas →
Užklausų pavyzdžiai
Ailoot · Vaizdai
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");
Gauti ir išsaugoti rezultatus
Ailoot · Vaizdai
Atsisiųskite kiekvieną grąžintą vaizdą arba išsaugokite jo Base64 turinį
GET /v1/media/tasks/{task_id}GET /v1/media/assets/{asset_id}/contentGET /v1/media/assetsGET /v1/media/assets/{asset_id}
Išsaugoti visus baigtus rezultatus
Išsaugokite kiekvieną baigtą vaizdą; gaukite turinį iš kiekvieno grąžinto URL arba dekoduokite jo Base64 turinį.
Išsaugokite kiekvieną duomenų elementą. Iškoduokite kiekvieną b64_json arba atsisiųskite turinį pagal kiekvieną grąžintą pasirašytą URL. Failo plėtinį pasirinkite pagal faktinį MIME tipą ir baitus.
Jei reikia patikrinti pradinį atsakymą
Jei vaizdo generavimo ar redagavimo rezultatą reikia patikrinti, išsaugokite pradinį operation_id/X-Client-Request-ID ir grąžintą informaciją apie rezultatą. Atkurkite prieigą prie esamų jums priklausančių rezultatų per medijos biblioteką, naudodami faktines task_id arba asset_id reikšmes. Pakartotinai neteikite generavimo ar redagavimo užklausos ir nekurkite būsenos tikrinimo URL iš operation_id.
Atsakymo laukai
| Laukas | Tipas |
|---|---|
Laukascreated | Tipasinteger |
Laukasdata[].url | Tipasstring |
Laukasdata[].b64_json | Tipasbase64 string |
Laukasusage | Tipasobject |
Klaidos ir tolesni veiksmai
| Atsakymas | Sąlyga | Kitas žingsnis |
|---|---|---|
Atsakymas400 · invalid_request_error | SąlygaNetinkami privalomi laukai, medžiagos pateikimo forma arba parametro reikšmė | Kitas žingsnisPrieš naują kūrimo užklausą pataisykite nurodytus laukus. |
Atsakymasserver_error | SąlygaGrąžintame atsakyme nurodoma, kad operaciją arba rezultatą reikia patikrinti | Kitas žingsnisIšsaugokite pradinį grąžintą operacijos ar užduoties ID, užklausos antraštes ir atsakymą; toliau tikrinkite tos pačios pradinės operacijos duomenis palaikomais būdais. Kūrimo užklausos pakartotinai neteikite. |
Pseudonimai
Modelių pseudonimai
Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest
Metodų kelių pseudonimai
Naudokite aukščiau nurodytus metodų kelius.
Susiję ID iškvietimui
FAQ · qwen-image-3.0-pro
- Kokios įvestys ir rezultatai prieinami?
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- Kokius laukus naudoja užklausa?
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[]- Kokie apribojimai taikomi?
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