model

wan2.7-image-pro

Markdown · JSON

wan2.7-image-pro

Model pembuat gambar dari instruksi teks. Produsen menyediakan pengaturan palet warna dan resolusi hingga 4K untuk pembuatan gambar biasa dari teks.

Tentang model

Deskripsi ini mencakup kemampuan model. Masukan, keluaran, dan opsi yang tersedia di Ailoot tercantum di bawah untuk metode yang dipilih.

Wan2.7-Image-Pro adalah model Alibaba untuk membuat gambar dari teks. Kartu Ailoot saat ini memublikasikan masukan teks dan hasil berupa gambar. Produsen juga menyediakan penyuntingan, penggabungan referensi, dan perubahan lokal; cara-cara tersebut memerlukan dukungan gambar masukan tersendiri dan tidak tersedia pada metode dalam kartu saat ini.

Dalam mode dengan referensi pada layanan produsen, hingga sembilan gambar sumber dapat dikirim dengan deskripsi tentang unsur mana dari setiap gambar yang perlu digunakan. Saat menyunting, model mempertahankan objek utama, mengubah detail yang dipilih, atau menyusun komposisi baru dari beberapa materi. Untuk mengarahkan perubahan dengan lebih tepat, hingga dua area persegi panjang dapat ditandai pada satu gambar masukan.

Palet dan instruksi kompleks

Di luar seri berurutan, palet dengan 3–10 warna dapat ditentukan. Mode penalaran ditujukan untuk pembuatan gambar biasa dari teks tanpa referensi atau seri berurutan: model menganalisis deskripsi adegan terlebih dahulu.

Dalam spesifikasi Alibaba, keluaran biasa mencakup satu hingga empat gambar. Untuk seri cerita, batas atas dapat ditetapkan hingga 12; jumlah sebenarnya dipilih model berdasarkan instruksi. Seri dapat mempertimbangkan teks dan referensi untuk mempertahankan ciri karakter yang sama serta perkembangan cerita yang koheren. Palet dan penalaran tidak digunakan dalam mode ini.

Resolusi bergantung pada mode

Tingkat 4K didukung untuk pembuatan gambar biasa dari teks tanpa referensi atau seri berurutan. Penyuntingan berbasis gambar dan seri berurutan dibatasi pada tingkat 2K. Penamaan ini menentukan luas piksel, bukan panjang yang sama untuk setiap sisi. Format bingkai dapat dipilih dari 1:8 hingga 8:1; saat menyunting dengan resolusi yang telah ditentukan, rasio aspek mengikuti referensi terakhir. Hasil disimpan dalam PNG.

Untuk metode dengan gambar masukan, Alibaba menerima JPEG, JPG, PNG tanpa transparansi, BMP, dan WEBP. Batasnya adalah 20 MB per berkas, 240 hingga 8000 piksel untuk setiap sisi, dan rasio dari 1:8 hingga 8:1. Instruksi teks mendukung bahasa Tionghoa dan Inggris; panjang maksimum adalah 5000 karakter, dengan bagian yang melebihi batas dibuang. Deskripsi negatif dan perluasan instruksi tidak tersedia dalam versi ini. Nilai awal keacakan membantu mempertahankan kemiripan variasi, tetapi tidak menjamin pengulangan yang persis sama.

Ailoot · Gambar POST /v1/images/generations wan2.7-image-pro

wan2.7-image-pro

Alibaba /wan2.7-image-pro
ID model
  • wan2.7-image-pro
  • wan-image
  • wan-image-latest

Mulai

Model pembuat gambar dari instruksi teks. Produsen menyediakan pengaturan palet warna dan resolusi hingga 4K untuk pembuatan gambar biasa dari teks.

Masukan yang diterima
Teks
Hasil
Gambar

Tersedia di Ailoot · masukan & metode

Ailoot · Gambar POST /v1/images/generations
Masukan
text
Keluaran
image
Format keluaran
Berkas gambar
KolomJenisPersyaratanNilai & batasanBawaan
KolommodelJenisstringPersyaratanWajibNilai & batasan
wan2.7-image-pro
Bawaan—
KolompromptJenisstringPersyaratanWajibNilai & batasan
Panjang minimum: 1
Bawaan—
KolomnJenisintegerPersyaratanOpsionalNilai & batasan
Minimum: 1
Bawaan1
Kolomresponse_formatJenisstringPersyaratanOpsionalNilai & batasan
url, b64_json
Bawaan—
KolomstreamJenisbooleanPersyaratanOpsionalNilai & batasanBawaanfalse
KolomsizeJenisstringPersyaratanOpsionalNilai & batasan
Bergantung pada model
Bawaan—
Kolompartial_imagesJenisintegerPersyaratanOpsionalNilai & batasan
Bergantung pada model
Bawaan—
Kolomimages[].image_urlJenisstringPersyaratanTidak didukungNilai & batasan
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Gambar maksimum per larik: 9
Kondisi: Satu URL aktual per objek images[]. Jumlah item array berbeda dari nilai string ini.
Berlaku jika: Hanya JSON images/edits; JSON images/generations tidak mengurai referensi images.
Bawaan—
KolomimageJenisfilePersyaratanOpsionalNilai & batasan
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Berlaku jika: pembuatan dengan multipart/form-data
Bawaan—
Kolomimage[]Jenisfile[]PersyaratanOpsionalNilai & batasan
Item maksimum: 9
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Berlaku jika: pembuatan dengan multipart/form-data
Bawaan—
Kombinasi bahan masukan

Teks ke gambar · Wajib: prompt

reference_images_generation · Wajib: prompt

Parameter metode dan siklus hidup
ParameterKontrak
Parametermaterial_typesKontraktext
ParameterrequiredKontrakmodel, prompt
Parameteroptional_controlsKontraknull
Parametercontent_typeKontrakapplication/json

Siklus hidup: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · task_id aktual yang dikembalikan atau catatan pustaka media

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

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Struktur metode dan ID bersifat eksak; kemampuan pemasok terpisah dari penerimaan permintaan.

Paket

Tarif metode Ailoot

Ailoot GambarPOST /v1/images/generations
Keluaran
US$0,075 per gambar 1K
Keluaran
US$0,075 per gambar 2K

Ailoot mencadangkan perkiraan dana sebelum permintaan. Setelah hasil diterima, tagihan akhir diselesaikan berdasarkan penggunaan yang terukur. Penyelesaian tagihan streaming menggunakan catatan penggunaan akhir. Cara kerja cadangan dan penyelesaian tagihan →

Detail tarif referensi

Jadwal referensi tingkat model tidak mengubah pemilihan metode, estimasi harga, atau biaya. Biaya aktif menggunakan tarif metode Ailoot yang dipilih.

wan2.7-image-pro

Harga menurut konfigurasi

KonfigurasiKondisi penagihanBiaya
Konfigurasiwan2.7-image-pro · Konfigurasi bawaanKondisi penagihanKonfigurasi bawaanBiaya
Masukan · Masukan US$0,00 per pemanggilan
Keluaran · Keluaran US$0,16 per pemanggilan

Contoh permintaan

Ailoot · Gambar

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": "wan2.7-image-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': 'wan2.7-image-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": "wan2.7-image-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");

Terima dan simpan hasil

Ailoot · Gambar

Unduh setiap gambar yang dikembalikan atau simpan konten Base64-nya

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Simpan semua hasil yang selesai

Simpan setiap gambar yang selesai; ambil setiap URL yang dikembalikan atau dekode konten Base64-nya.

Simpan setiap item data. Dekodekan setiap b64_json atau ambil data dari setiap URL bertanda tangan yang dikembalikan. Pilih ekstensi nama file berdasarkan MIME/bytes aktual.

Jika respons asli perlu diperiksa

Jika hasil pembuatan atau penyuntingan gambar perlu diperiksa, simpan operation_id/X-Client-Request-ID asli dan informasi hasil yang dikembalikan. Pulihkan hasil milik Anda yang sudah ada melalui pustaka media menggunakan nilai task_id atau asset_id aktual. Jangan mengirim ulang permintaan pembuatan/penyuntingan atau membuat URL polling dari operation_id.

Kolom respons
KolomJenis
KolomcreatedJenisinteger
Kolomdata[].urlJenisstring
Kolomdata[].b64_jsonJenisbase64 string
KolomusageJenisobject
Kesalahan dan langkah berikutnya
ResponsKondisiLangkah berikutnya
Respons400 · invalid_request_errorKondisiBidang wajib, representasi materi, atau nilai parameter tidak validLangkah berikutnyaPerbaiki bidang yang ditunjukkan sebelum permintaan pembuatan baru.
Responsserver_errorKondisiRespons yang dikembalikan menyatakan bahwa operasi atau hasil perlu diperiksaLangkah berikutnyaSimpan ID operasi/tugas asli yang dikembalikan, header permintaan, dan respons; lanjutkan pembacaan yang didukung untuk operasi asli tersebut. Jangan kirim ulang permintaan pembuatan.

Alias

Alias model

Ailoot wan2.7-image-pro, wan-image, wan-image-latest

Alias jalur metode

Gunakan jalur metode yang ditampilkan di atas.

ID pemanggil terkait

wan2.7-image-pro, wan-image, wan-image-latest

Ailoot · Gambar POST /v1/images/generations wan-image

wan-image

Alibaba /wan-image
ID model
  • wan2.7-image-pro
  • wan-image
  • wan-image-latest

Mulai

Model pembuat gambar dari instruksi teks. Produsen menyediakan pengaturan palet warna dan resolusi hingga 4K untuk pembuatan gambar biasa dari teks.

Masukan yang diterima
Teks
Hasil
Gambar

Tersedia di Ailoot · masukan & metode

Ailoot · Gambar POST /v1/images/generations
Masukan
text
Keluaran
image
Format keluaran
Berkas gambar
KolomJenisPersyaratanNilai & batasanBawaan
KolommodelJenisstringPersyaratanWajibNilai & batasan
wan-image
Bawaan—
KolompromptJenisstringPersyaratanWajibNilai & batasan
Panjang minimum: 1
Bawaan—
KolomnJenisintegerPersyaratanOpsionalNilai & batasan
Minimum: 1
Bawaan1
Kolomresponse_formatJenisstringPersyaratanOpsionalNilai & batasan
url, b64_json
Bawaan—
KolomstreamJenisbooleanPersyaratanOpsionalNilai & batasanBawaanfalse
KolomsizeJenisstringPersyaratanOpsionalNilai & batasan
Bergantung pada model
Bawaan—
Kolompartial_imagesJenisintegerPersyaratanOpsionalNilai & batasan
Bergantung pada model
Bawaan—
Kolomimages[].image_urlJenisstringPersyaratanTidak didukungNilai & batasan
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Gambar maksimum per larik: 9
Kondisi: Satu URL aktual per objek images[]. Jumlah item array berbeda dari nilai string ini.
Berlaku jika: Hanya JSON images/edits; JSON images/generations tidak mengurai referensi images.
Bawaan—
KolomimageJenisfilePersyaratanOpsionalNilai & batasan
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Berlaku jika: pembuatan dengan multipart/form-data
Bawaan—
Kolomimage[]Jenisfile[]PersyaratanOpsionalNilai & batasan
Item maksimum: 9
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Berlaku jika: pembuatan dengan multipart/form-data
Bawaan—
Kombinasi bahan masukan

Teks ke gambar · Wajib: prompt

reference_images_generation · Wajib: prompt

Parameter metode dan siklus hidup
ParameterKontrak
Parametermaterial_typesKontraktext
ParameterrequiredKontrakmodel, prompt
Parameteroptional_controlsKontraknull
Parametercontent_typeKontrakapplication/json

Siklus hidup: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · task_id aktual yang dikembalikan atau catatan pustaka media

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

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Struktur metode dan ID bersifat eksak; kemampuan pemasok terpisah dari penerimaan permintaan.

Paket

Tarif metode Ailoot

Ailoot GambarPOST /v1/images/generations
Keluaran
US$0,075 per gambar 1K
Keluaran
US$0,075 per gambar 2K

Ailoot mencadangkan perkiraan dana sebelum permintaan. Setelah hasil diterima, tagihan akhir diselesaikan berdasarkan penggunaan yang terukur. Penyelesaian tagihan streaming menggunakan catatan penggunaan akhir. Cara kerja cadangan dan penyelesaian tagihan →

Detail tarif referensi

Jadwal referensi tingkat model tidak mengubah pemilihan metode, estimasi harga, atau biaya. Biaya aktif menggunakan tarif metode Ailoot yang dipilih.

wan2.7-image-pro

Harga menurut konfigurasi

KonfigurasiKondisi penagihanBiaya
Konfigurasiwan2.7-image-pro · Konfigurasi bawaanKondisi penagihanKonfigurasi bawaanBiaya
Masukan · Masukan US$0,00 per pemanggilan
Keluaran · Keluaran US$0,16 per pemanggilan

Contoh permintaan

Ailoot · Gambar

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": "wan-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': 'wan-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": "wan-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");

Terima dan simpan hasil

Ailoot · Gambar

Unduh setiap gambar yang dikembalikan atau simpan konten Base64-nya

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Simpan semua hasil yang selesai

Simpan setiap gambar yang selesai; ambil setiap URL yang dikembalikan atau dekode konten Base64-nya.

Simpan setiap item data. Dekodekan setiap b64_json atau ambil data dari setiap URL bertanda tangan yang dikembalikan. Pilih ekstensi nama file berdasarkan MIME/bytes aktual.

Jika respons asli perlu diperiksa

Jika hasil pembuatan atau penyuntingan gambar perlu diperiksa, simpan operation_id/X-Client-Request-ID asli dan informasi hasil yang dikembalikan. Pulihkan hasil milik Anda yang sudah ada melalui pustaka media menggunakan nilai task_id atau asset_id aktual. Jangan mengirim ulang permintaan pembuatan/penyuntingan atau membuat URL polling dari operation_id.

Kolom respons
KolomJenis
KolomcreatedJenisinteger
Kolomdata[].urlJenisstring
Kolomdata[].b64_jsonJenisbase64 string
KolomusageJenisobject
Kesalahan dan langkah berikutnya
ResponsKondisiLangkah berikutnya
Respons400 · invalid_request_errorKondisiBidang wajib, representasi materi, atau nilai parameter tidak validLangkah berikutnyaPerbaiki bidang yang ditunjukkan sebelum permintaan pembuatan baru.
Responsserver_errorKondisiRespons yang dikembalikan menyatakan bahwa operasi atau hasil perlu diperiksaLangkah berikutnyaSimpan ID operasi/tugas asli yang dikembalikan, header permintaan, dan respons; lanjutkan pembacaan yang didukung untuk operasi asli tersebut. Jangan kirim ulang permintaan pembuatan.

Alias

Alias model

Ailoot wan2.7-image-pro, wan-image, wan-image-latest

Alias jalur metode

Gunakan jalur metode yang ditampilkan di atas.

ID pemanggil terkait

wan2.7-image-pro, wan-image, wan-image-latest

Ailoot · Gambar POST /v1/images/generations wan-image-latest

wan-image-latest

Alibaba /wan-image-latest
ID model
  • wan2.7-image-pro
  • wan-image
  • wan-image-latest

Mulai

Model pembuat gambar dari instruksi teks. Produsen menyediakan pengaturan palet warna dan resolusi hingga 4K untuk pembuatan gambar biasa dari teks.

Masukan yang diterima
Teks
Hasil
Gambar

Tersedia di Ailoot · masukan & metode

Ailoot · Gambar POST /v1/images/generations
Masukan
text
Keluaran
image
Format keluaran
Berkas gambar
KolomJenisPersyaratanNilai & batasanBawaan
KolommodelJenisstringPersyaratanWajibNilai & batasan
wan-image-latest
Bawaan—
KolompromptJenisstringPersyaratanWajibNilai & batasan
Panjang minimum: 1
Bawaan—
KolomnJenisintegerPersyaratanOpsionalNilai & batasan
Minimum: 1
Bawaan1
Kolomresponse_formatJenisstringPersyaratanOpsionalNilai & batasan
url, b64_json
Bawaan—
KolomstreamJenisbooleanPersyaratanOpsionalNilai & batasanBawaanfalse
KolomsizeJenisstringPersyaratanOpsionalNilai & batasan
Bergantung pada model
Bawaan—
Kolompartial_imagesJenisintegerPersyaratanOpsionalNilai & batasan
Bergantung pada model
Bawaan—
Kolomimages[].image_urlJenisstringPersyaratanTidak didukungNilai & batasan
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Gambar maksimum per larik: 9
Kondisi: Satu URL aktual per objek images[]. Jumlah item array berbeda dari nilai string ini.
Berlaku jika: Hanya JSON images/edits; JSON images/generations tidak mengurai referensi images.
Bawaan—
KolomimageJenisfilePersyaratanOpsionalNilai & batasan
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Berlaku jika: pembuatan dengan multipart/form-data
Bawaan—
Kolomimage[]Jenisfile[]PersyaratanOpsionalNilai & batasan
Item maksimum: 9
Byte terdekode maksimum: 20.971.520
Jenis MIME: image/png, image/jpeg
Berlaku jika: pembuatan dengan multipart/form-data
Bawaan—
Kombinasi bahan masukan

Teks ke gambar · Wajib: prompt

reference_images_generation · Wajib: prompt

Parameter metode dan siklus hidup
ParameterKontrak
Parametermaterial_typesKontraktext
ParameterrequiredKontrakmodel, prompt
Parameteroptional_controlsKontraknull
Parametercontent_typeKontrakapplication/json

Siklus hidup: synchronous_result_then_owned_library

GET /v1/media/tasks/{task_id} · task_id aktual yang dikembalikan atau catatan pustaka media

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

GET /v1/media/assets

GET /v1/media/assets/{asset_id}

Struktur metode dan ID bersifat eksak; kemampuan pemasok terpisah dari penerimaan permintaan.

Paket

Tarif metode Ailoot

Ailoot GambarPOST /v1/images/generations
Keluaran
US$0,075 per gambar 1K
Keluaran
US$0,075 per gambar 2K

Ailoot mencadangkan perkiraan dana sebelum permintaan. Setelah hasil diterima, tagihan akhir diselesaikan berdasarkan penggunaan yang terukur. Penyelesaian tagihan streaming menggunakan catatan penggunaan akhir. Cara kerja cadangan dan penyelesaian tagihan →

Detail tarif referensi

Jadwal referensi tingkat model tidak mengubah pemilihan metode, estimasi harga, atau biaya. Biaya aktif menggunakan tarif metode Ailoot yang dipilih.

wan2.7-image-pro

Harga menurut konfigurasi

KonfigurasiKondisi penagihanBiaya
Konfigurasiwan2.7-image-pro · Konfigurasi bawaanKondisi penagihanKonfigurasi bawaanBiaya
Masukan · Masukan US$0,00 per pemanggilan
Keluaran · Keluaran US$0,16 per pemanggilan

Contoh permintaan

Ailoot · Gambar

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": "wan-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': 'wan-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": "wan-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");

Terima dan simpan hasil

Ailoot · Gambar

Unduh setiap gambar yang dikembalikan atau simpan konten Base64-nya

  • GET /v1/media/tasks/{task_id}
  • GET /v1/media/assets/{asset_id}/content
  • GET /v1/media/assets
  • GET /v1/media/assets/{asset_id}
Simpan semua hasil yang selesai

Simpan setiap gambar yang selesai; ambil setiap URL yang dikembalikan atau dekode konten Base64-nya.

Simpan setiap item data. Dekodekan setiap b64_json atau ambil data dari setiap URL bertanda tangan yang dikembalikan. Pilih ekstensi nama file berdasarkan MIME/bytes aktual.

Jika respons asli perlu diperiksa

Jika hasil pembuatan atau penyuntingan gambar perlu diperiksa, simpan operation_id/X-Client-Request-ID asli dan informasi hasil yang dikembalikan. Pulihkan hasil milik Anda yang sudah ada melalui pustaka media menggunakan nilai task_id atau asset_id aktual. Jangan mengirim ulang permintaan pembuatan/penyuntingan atau membuat URL polling dari operation_id.

Kolom respons
KolomJenis
KolomcreatedJenisinteger
Kolomdata[].urlJenisstring
Kolomdata[].b64_jsonJenisbase64 string
KolomusageJenisobject
Kesalahan dan langkah berikutnya
ResponsKondisiLangkah berikutnya
Respons400 · invalid_request_errorKondisiBidang wajib, representasi materi, atau nilai parameter tidak validLangkah berikutnyaPerbaiki bidang yang ditunjukkan sebelum permintaan pembuatan baru.
Responsserver_errorKondisiRespons yang dikembalikan menyatakan bahwa operasi atau hasil perlu diperiksaLangkah berikutnyaSimpan ID operasi/tugas asli yang dikembalikan, header permintaan, dan respons; lanjutkan pembacaan yang didukung untuk operasi asli tersebut. Jangan kirim ulang permintaan pembuatan.

Alias

Alias model

Ailoot wan2.7-image-pro, wan-image, wan-image-latest

Alias jalur metode

Gunakan jalur metode yang ditampilkan di atas.

ID pemanggil terkait

wan2.7-image-pro, wan-image, wan-image-latest

FAQ · wan2.7-image-pro
Input dan hasil apa yang tersedia?

POST /v1/images/generations · wan2.7-image-pro: text → image

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

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

Kolom apa yang digunakan permintaan?

POST /v1/images/generations · wan2.7-image-pro: model, prompt, n, response_format, stream, image, image[]

POST /v1/images/generations · wan-image: model, prompt, n, response_format, stream, image, image[]

POST /v1/images/generations · wan-image-latest: model, prompt, n, response_format, stream, image, image[]

Batasan apa yang berlaku?

POST /v1/images/generations · wan2.7-image-pro: n.minimum: 1

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

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

Rincian selengkapnya

Hubungkan Ailoot ke Claude Code, OpenCode, Hermes, atau aplikasi Anda.

Perusahaan dan portofolio proyeknya

Perusahaan dan portofolio proyeknya: jutaan pelanggan; penjualan miliaran setiap bulan.

Beli token dengan diskon.

Diskon langganan untuk pekerjaan rutin. Kode promo — hingga 50% untuk pembelian token.

Langganan
Pilih paket dengan diskon untuk permintaan rutin Anda.
Kode promo hingga 50%
Masukkan kode saat membeli. Harga dihitung ulang sesuai promosi aktif.
Biaya dalam riwayat
Model, token, dan jumlah tagihan disimpan untuk setiap permintaan.

Pilih langganan · Lihat harga model

Hubungkan API ke produk yang Anda jual.

SaaS, aplikasi, dan bot — sesuai penawaran dan perjanjian lisensi Ailoot. Untuk penjualan kembali, mintalah lisensi reseller.

Aplikasi komersial
Integrasikan pembuatan teks, gambar, video, dan suara dalam fitur berbayar layanan Anda.
Lisensi reseller
Kirim deskripsi proyek dan skema akses. Mintalah ketentuan penggunaan dan penjualan kembali secara tertulis.
Dokumen di situs
Penawaran, perjanjian lisensi, dan kebijakan pemrosesan data tersedia sebelum koneksi.

Minta lisensi reseller · Penawaran dan perjanjian lisensi