modele

qwen-image-3.0-pro

Markdown · JSON

qwen-image-3.0-pro

Model do generowania obrazów na podstawie tekstu, ze szczególnym naciskiem na złożone kompozycje, napisy i realistyczne detale. Nadaje się do plakatów, storyboardów, menu i materiałów o rozbudowanej kompozycji.

O modelu

Ten opis przedstawia możliwości modelu. Dane wejściowe, wyniki i opcje dostępne w Ailoot podano poniżej dla wybranej metody.

Qwen-Image-3.0-Pro to model Alibaba do tworzenia i edycji obrazów, w których istotne są kompozycja, napisy i drobne szczegóły. Jego zastosowania obejmują rozbudowane układy graficzne, obrazy wewnątrz obrazów, skład gazetowy, storyboardy, menu i karty pracy. W obecnej karcie Ailoot przedstawiono tryb generowania obrazu na podstawie polecenia tekstowego. Alibaba przewiduje również edycję i pracę z obrazami referencyjnymi; operacje te wymagają osobnej obsługi obrazów wejściowych i nie są dostępne w aktualnej metodzie z tej karty.

Tekst i szczegóły na obrazie

Producent podkreśla obsługę długich poleceń do 4,5 tys. tokenów, napisów w 12 językach i pracy z wieloma krojami pisma. Jest to opisana możliwość przetwarzania polecenia, a nie opublikowany rozmiar formalnego okna kontekstu. Do deklarowanych cech należą odwzorowywanie drobnych napisów o rozmiarze 10 pikseli, faktury skóry i włosów oraz subtelnych zmian wyrazu twarzy. Takie szczegóły są przydatne podczas przygotowywania materiałów oglądanych z bliska.

Qwen-Image-3.0-Pro służy także do tworzenia koncepcji wizualnych stron internetowych, gier i ekranów transmisji na żywo. W takim wyniku można połączyć ilustrację, strukturę ekranu i opracowane graficznie napisy. Model tworzy obraz projektu; działająca aplikacja wymaga osobnej implementacji.

Edycja w specyfikacji Alibaba

Dla trybu edycji Alibaba wskazuje od jednego do trzech obrazów. W tym sposobie pracy producent pozwala powiązać obiekt z numerem obrazu referencyjnego i opisać połączenie materiałów. Przewidziano dodawanie, usuwanie i przemieszczanie obiektów oraz zmianę akcji, stylu, szczegółów i tekstu. Opis negatywny pomaga wskazać niepożądane elementy.

Materiały wejściowe w trybie edycji u producenta są przyjmowane w JPG, JPEG, PNG, BMP, TIFF, WEBP i GIF. W przypadku animowanego GIF używana jest pierwsza klatka. Rozmiar każdego pliku może sięgać 10 MB; producent zaleca obrazy o bokach od 384 do 3072 pikseli. Są to zalecenia dotyczące wejścia, a nie wymiary gotowego wyniku.

Specyfikacja producenta przewiduje od jednego do sześciu obrazów wyjściowych w PNG na żądanie. Zakres powierzchni wyniku wynosi od 262 144 do 4 194 304 pikseli, co odpowiada kwadratowym obrazom od 512 × 512 do 2048 × 2048. Dopuszczalne są proporcje od 1:8 do 8:1, dlatego przy wydłużonej kompozycji długość boku zależy także od wybranego kształtu kadru. Przewidziano dodatkowe przetworzenie polecenia przed generowaniem.

Ailoot · Obrazy POST /v1/images/generations qwen-image-3.0-pro

qwen-image-3.0-pro

Alibaba /qwen-image-3.0-pro
ID modelu
  • qwen-image-3.0-pro
  • qwen-image
  • qwen-image-latest

Start

Model do generowania obrazów na podstawie tekstu, ze szczególnym naciskiem na złożone kompozycje, napisy i realistyczne detale. Nadaje się do plakatów, storyboardów, menu i materiałów o rozbudowanej kompozycji.

Akceptowane dane wejściowe
Tekst
Wyniki
Obrazy

Dostępne w Ailoot · dane wejściowe i metody

Ailoot · Obrazy POST /v1/images/generations
Wejście
text
Wyjście
image
Format wyjściowy
Plik obrazu
PoleTypWymaganieWartości i limityDomyślnie
PolemodelTypstringWymaganieWymaganeWartości i limity
qwen-image-3.0-pro
Domyślnie—
PolepromptTypstringWymaganieWymaganeWartości i limity
Minimalna długość: 1
Domyślnie—
PolenTypintegerWymaganieOpcjonalneWartości i limity
Minimum: 1
Domyślnie1
Poleresponse_formatTypstringWymaganieOpcjonalneWartości i limity
url, b64_json
Domyślnie—
PolestreamTypbooleanWymaganieOpcjonalneWartości i limityDomyślniefalse
PolesizeTypstringWymaganieOpcjonalneWartości i limity
Zależy od modelu
Domyślnie—
Polepartial_imagesTypintegerWymaganieOpcjonalneWartości i limity
Zależy od modelu
Domyślnie—
Poleimages[].image_urlTypstringWymaganieNieobsługiwaneWartości i limity
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Maksymalna liczba obrazów w tablicy: 3
Warunki: Jeden rzeczywisty URL na obiekt images[]. Liczba elementów tablicy jest odrębna od tej końcowej wartości tekstowej.
Obowiązuje, gdy: Wyłącznie JSON images/edits; JSON images/generations nie parsuje referencji images.
Domyślnie—
PoleimageTypfileWymaganieOpcjonalneWartości i limity
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Obowiązuje, gdy: generowanie przez multipart/form-data
Domyślnie—
Poleimage[]Typfile[]WymaganieOpcjonalneWartości i limity
Maksymalna liczba elementów: 3
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Obowiązuje, gdy: generowanie przez multipart/form-data
Domyślnie—
Kombinacje materiałów wejściowych

Tekst na obraz · Wymagane: prompt

reference_images_generation · Wymagane: prompt

Parametry i cykl życia metody
ParametrKontrakt
Parametrmaterial_typesKontrakttext
ParametrrequiredKontraktmodel, prompt
Parametroptional_controlsKontraktnull
Parametrcontent_typeKontraktapplication/json

Cykl życia: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów

GET /v1/media/assets/{asset_id}/content

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.

Cennik

Stawki metod Ailoot

Ailoot ObrazyPOST /v1/images/generations
Wejście
0,003 USD za obraz wejściowy
Wyjście
0,04 USD za obraz o rozdzielczości 1K
Wyjście
0,075 USD za obraz o rozdzielczości 2K

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →

Przykładowe żądania

Ailoot · Obrazy

curlPython SDKNode.js SDK
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");

Odbieranie i zapisywanie wyników

Ailoot · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj każdy element danych. Zdekoduj każdą wartość b64_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.

Jeśli trzeba sprawdzić pierwotną odpowiedź

Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task_id lub asset_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation_id.

Pola odpowiedzi
PoleTyp
PolecreatedTypinteger
Poledata[].urlTypstring
Poledata[].b64_jsonTypbase64 string
PoleusageTypobject
Błędy i dalsze kroki
OdpowiedźWarunekNastępny krok
Odpowiedź400 · invalid_request_errorWarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametruNastępny krokPopraw wskazane pola przed nowym żądaniem utworzenia.
Odpowiedźserver_errorWarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzeniaNastępny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia.

Aliasy

Aliasy modelu

Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest

Aliasy ścieżek metod

Użyj ścieżek metod podanych powyżej.

Powiązane ID modeli

qwen-image-3.0-pro, qwen-image, qwen-image-latest

Ailoot · Obrazy POST /v1/images/generations qwen-image

qwen-image

Alibaba /qwen-image
ID modelu
  • qwen-image-3.0-pro
  • qwen-image
  • qwen-image-latest

Start

Model do generowania obrazów na podstawie tekstu, ze szczególnym naciskiem na złożone kompozycje, napisy i realistyczne detale. Nadaje się do plakatów, storyboardów, menu i materiałów o rozbudowanej kompozycji.

Akceptowane dane wejściowe
Tekst
Wyniki
Obrazy

Dostępne w Ailoot · dane wejściowe i metody

Ailoot · Obrazy POST /v1/images/generations
Wejście
text
Wyjście
image
Format wyjściowy
Plik obrazu
PoleTypWymaganieWartości i limityDomyślnie
PolemodelTypstringWymaganieWymaganeWartości i limity
qwen-image
Domyślnie—
PolepromptTypstringWymaganieWymaganeWartości i limity
Minimalna długość: 1
Domyślnie—
PolenTypintegerWymaganieOpcjonalneWartości i limity
Minimum: 1
Domyślnie1
Poleresponse_formatTypstringWymaganieOpcjonalneWartości i limity
url, b64_json
Domyślnie—
PolestreamTypbooleanWymaganieOpcjonalneWartości i limityDomyślniefalse
PolesizeTypstringWymaganieOpcjonalneWartości i limity
Zależy od modelu
Domyślnie—
Polepartial_imagesTypintegerWymaganieOpcjonalneWartości i limity
Zależy od modelu
Domyślnie—
Poleimages[].image_urlTypstringWymaganieNieobsługiwaneWartości i limity
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Maksymalna liczba obrazów w tablicy: 3
Warunki: Jeden rzeczywisty URL na obiekt images[]. Liczba elementów tablicy jest odrębna od tej końcowej wartości tekstowej.
Obowiązuje, gdy: Wyłącznie JSON images/edits; JSON images/generations nie parsuje referencji images.
Domyślnie—
PoleimageTypfileWymaganieOpcjonalneWartości i limity
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Obowiązuje, gdy: generowanie przez multipart/form-data
Domyślnie—
Poleimage[]Typfile[]WymaganieOpcjonalneWartości i limity
Maksymalna liczba elementów: 3
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Obowiązuje, gdy: generowanie przez multipart/form-data
Domyślnie—
Kombinacje materiałów wejściowych

Tekst na obraz · Wymagane: prompt

reference_images_generation · Wymagane: prompt

Parametry i cykl życia metody
ParametrKontrakt
Parametrmaterial_typesKontrakttext
ParametrrequiredKontraktmodel, prompt
Parametroptional_controlsKontraktnull
Parametrcontent_typeKontraktapplication/json

Cykl życia: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów

GET /v1/media/assets/{asset_id}/content

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.

Cennik

Stawki metod Ailoot

Ailoot ObrazyPOST /v1/images/generations
Wejście
0,003 USD za obraz wejściowy
Wyjście
0,04 USD za obraz o rozdzielczości 1K
Wyjście
0,075 USD za obraz o rozdzielczości 2K

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →

Przykładowe żądania

Ailoot · Obrazy

curlPython SDKNode.js SDK
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");

Odbieranie i zapisywanie wyników

Ailoot · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj każdy element danych. Zdekoduj każdą wartość b64_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.

Jeśli trzeba sprawdzić pierwotną odpowiedź

Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task_id lub asset_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation_id.

Pola odpowiedzi
PoleTyp
PolecreatedTypinteger
Poledata[].urlTypstring
Poledata[].b64_jsonTypbase64 string
PoleusageTypobject
Błędy i dalsze kroki
OdpowiedźWarunekNastępny krok
Odpowiedź400 · invalid_request_errorWarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametruNastępny krokPopraw wskazane pola przed nowym żądaniem utworzenia.
Odpowiedźserver_errorWarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzeniaNastępny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia.

Aliasy

Aliasy modelu

Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest

Aliasy ścieżek metod

Użyj ścieżek metod podanych powyżej.

Powiązane ID modeli

qwen-image-3.0-pro, qwen-image, qwen-image-latest

Ailoot · Obrazy POST /v1/images/generations qwen-image-latest

qwen-image-latest

Alibaba /qwen-image-latest
ID modelu
  • qwen-image-3.0-pro
  • qwen-image
  • qwen-image-latest

Start

Model do generowania obrazów na podstawie tekstu, ze szczególnym naciskiem na złożone kompozycje, napisy i realistyczne detale. Nadaje się do plakatów, storyboardów, menu i materiałów o rozbudowanej kompozycji.

Akceptowane dane wejściowe
Tekst
Wyniki
Obrazy

Dostępne w Ailoot · dane wejściowe i metody

Ailoot · Obrazy POST /v1/images/generations
Wejście
text
Wyjście
image
Format wyjściowy
Plik obrazu
PoleTypWymaganieWartości i limityDomyślnie
PolemodelTypstringWymaganieWymaganeWartości i limity
qwen-image-latest
Domyślnie—
PolepromptTypstringWymaganieWymaganeWartości i limity
Minimalna długość: 1
Domyślnie—
PolenTypintegerWymaganieOpcjonalneWartości i limity
Minimum: 1
Domyślnie1
Poleresponse_formatTypstringWymaganieOpcjonalneWartości i limity
url, b64_json
Domyślnie—
PolestreamTypbooleanWymaganieOpcjonalneWartości i limityDomyślniefalse
PolesizeTypstringWymaganieOpcjonalneWartości i limity
Zależy od modelu
Domyślnie—
Polepartial_imagesTypintegerWymaganieOpcjonalneWartości i limity
Zależy od modelu
Domyślnie—
Poleimages[].image_urlTypstringWymaganieNieobsługiwaneWartości i limity
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Maksymalna liczba obrazów w tablicy: 3
Warunki: Jeden rzeczywisty URL na obiekt images[]. Liczba elementów tablicy jest odrębna od tej końcowej wartości tekstowej.
Obowiązuje, gdy: Wyłącznie JSON images/edits; JSON images/generations nie parsuje referencji images.
Domyślnie—
PoleimageTypfileWymaganieOpcjonalneWartości i limity
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Obowiązuje, gdy: generowanie przez multipart/form-data
Domyślnie—
Poleimage[]Typfile[]WymaganieOpcjonalneWartości i limity
Maksymalna liczba elementów: 3
Maksymalna liczba zdekodowanych bajtów: 10 485 760
Typy MIME: image/png, image/jpeg
Obowiązuje, gdy: generowanie przez multipart/form-data
Domyślnie—
Kombinacje materiałów wejściowych

Tekst na obraz · Wymagane: prompt

reference_images_generation · Wymagane: prompt

Parametry i cykl życia metody
ParametrKontrakt
Parametrmaterial_typesKontrakttext
ParametrrequiredKontraktmodel, prompt
Parametroptional_controlsKontraktnull
Parametrcontent_typeKontraktapplication/json

Cykl życia: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · Rzeczywiście zwrócony task_id lub wpis w bibliotece multimediów

GET /v1/media/assets/{asset_id}/content

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Struktury metod i ID są dokładne; możliwości dostawcy są odrębne od dopuszczenia żądania.

Cennik

Stawki metod Ailoot

Ailoot ObrazyPOST /v1/images/generations
Wejście
0,003 USD za obraz wejściowy
Wyjście
0,04 USD za obraz o rozdzielczości 1K
Wyjście
0,075 USD za obraz o rozdzielczości 2K

Ailoot rezerwuje szacowaną kwotę przed żądaniem. Po otrzymaniu wyniku rozlicza ostateczną opłatę według zmierzonego użycia. Rozliczenie strumieniowania korzysta z końcowego rekordu użycia. Jak działają rezerwacja i rozliczenie →

Przykładowe żądania

Ailoot · Obrazy

curlPython SDKNode.js SDK
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");

Odbieranie i zapisywanie wyników

Ailoot · Obrazy

Pobierz każdy zwrócony obraz lub zapisz jego zawartość Base64

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Zachowaj wszystkie ukończone wyniki

Zapisz każdy ukończony obraz; pobierz każdy zwrócony URL lub zdekoduj zawartość Base64.

Zachowaj każdy element danych. Zdekoduj każdą wartość b64_json lub pobierz dane z każdego zwróconego podpisanego adresu URL. Dobierz rozszerzenie nazwy pliku na podstawie rzeczywistego typu MIME lub bajtów.

Jeśli trzeba sprawdzić pierwotną odpowiedź

Jeśli wynik generowania lub edycji obrazu wymaga sprawdzenia, zachowaj pierwotny operation_id/X-Client-Request-ID oraz zwrócone informacje o wyniku. Odzyskaj istniejące własne wyniki z biblioteki multimediów, używając rzeczywistych wartości task_id lub asset_id. Nie wysyłaj ponownie żądania generowania lub edycji ani nie twórz adresu URL do sprawdzania stanu na podstawie operation_id.

Pola odpowiedzi
PoleTyp
PolecreatedTypinteger
Poledata[].urlTypstring
Poledata[].b64_jsonTypbase64 string
PoleusageTypobject
Błędy i dalsze kroki
OdpowiedźWarunekNastępny krok
Odpowiedź400 · invalid_request_errorWarunekNieprawidłowe wymagane pola, sposób reprezentacji materiału lub wartość parametruNastępny krokPopraw wskazane pola przed nowym żądaniem utworzenia.
Odpowiedźserver_errorWarunekZwrócona odpowiedź wskazuje, że operacja lub wynik wymaga sprawdzeniaNastępny krokZachowaj pierwotnie zwrócony identyfikator operacji lub zadania, nagłówki żądania i odpowiedź; kontynuuj obsługiwane odczyty tej pierwotnej operacji. Nie wysyłaj ponownie żądania utworzenia.

Aliasy

Aliasy modelu

Ailoot qwen-image-3.0-pro, qwen-image, qwen-image-latest

Aliasy ścieżek metod

Użyj ścieżek metod podanych powyżej.

Powiązane ID modeli

qwen-image-3.0-pro, qwen-image, qwen-image-latest

FAQ · qwen-image-3.0-pro
Jakie dane wejściowe i wyniki są dostępne?

POST /v1/images/generations · qwen-image-3.0-pro: text → image

POST /v1/images/generations · qwen-image: text → image

POST /v1/images/generations · qwen-image-latest: text → image

Jakich pól używa żądanie?

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[]

Jakie limity obowiązują?

POST /v1/images/generations · qwen-image-3.0-pro: n.minimum: 1

POST /v1/images/generations · qwen-image: n.minimum: 1

POST /v1/images/generations · qwen-image-latest: n.minimum: 1

Więcej szczegółów

Połącz Ailoot z Claude Code, OpenCode, Hermes albo własną aplikacją.

Firma i jej portfel projektów

Firma i jej portfel projektów: miliony klientów; miesięczna sprzedaż liczona w miliardach.

Kupuj tokeny z rabatem.

Rabat subskrypcji do regularnej pracy. Kody promocyjne — do 50% na tokeny.

Subskrypcja
Wybierz plan z rabatem do regularnych żądań.
Kod promocyjny do 50%
Wpisz kod przy zakupie. Cena zostanie przeliczona według aktualnej promocji.
Koszty w historii
Model, tokeny i kwota są zapisywane dla każdego żądania.

Wybierz subskrypcję · Sprawdź ceny modeli

Połącz API z produktem, który sprzedajesz.

SaaS, aplikacje i boty na warunkach oferty i umowy licencyjnej Ailoot. Do odsprzedaży poproś o licencję resellerską.

Aplikacja komercyjna
Wbuduj generowanie tekstu, obrazów, wideo i dźwięku w płatne funkcje usługi.
Licencja resellerska
Prześlij opis projektu i schemat dostępu. Poproś o pisemne warunki używania i odsprzedaży.
Dokumenty na stronie
Oferta, umowa licencyjna i polityka przetwarzania danych są dostępne przed połączeniem.

Poproś o licencję resellerską · Oferta i umowa licencyjna