Source: https://ailoot.ai/models/fi/wan2-7-image-pro/
Canonical: https://ailoot.ai/models/fi/wan2-7-image-pro/
Language: fi

# wan2.7-image-pro

[Markdown](https://ailoot.ai/models/fi/wan2-7-image-pro/index.md) · [JSON](https://ailoot.ai/models/fi/wan2-7-image-pro/facts.json)

## [wan2.7-image-pro](https://ailoot.ai/models/fi/wan2-7-image-pro/)

Malli kuvien luomiseen tekstiohjeesta. Valmistaja tarjoaa väripaletin ohjausta ja enintään 4K-tarkkuuden tavallisessa tekstipohjaisessa kuvageneroinnissa.

- [**Ailoot · Kuvat** `POST /v1/images/generations` `wan2.7-image-pro`](https://ailoot.ai/models/fi/wan2-7-image-pro/#method-0)
- [**Ailoot · Kuvat** `POST /v1/images/generations` `wan-image`](https://ailoot.ai/models/fi/wan2-7-image-pro/#method-1)
- [**Ailoot · Kuvat** `POST /v1/images/generations` `wan-image-latest`](https://ailoot.ai/models/fi/wan2-7-image-pro/#method-2)

Tietoa mallista

Tämä kuvaus kattaa mallin ominaisuudet. Ailootissa saatavilla olevat syötteet, tulosteet ja asetukset luetellaan alla valitulle menetelmälle.

Wan2.7-Image-Pro on Alibaban malli kuvien luomiseen tekstistä. Ailootin nykyinen kortti julkaisee tekstisyötteen ja kuvatuloksen. Valmistaja tarjoaa myös muokkausta, referenssien yhdistämistä ja paikallisia muutoksia; ne vaativat erillisen kuvasyötetuen eivätkä ole kortin nykyisessä menetelmässä.

Valmistajan referenssitilaan voidaan antaa enintään yhdeksän lähtökuvaa ja kuvailla kunkin käytettävät elementit. Muokkauksessa malli säilyttää pääkohteen, muuttaa valitut yksityiskohdat tai koostaa uuden sommittelun eri aineistoista. Tarkemman ohjauksen tueksi yhdellä syötekuvalla voidaan merkitä enintään kaksi suorakulmaista aluetta.

#### Paletti ja monimutkainen tehtävä

Sarjojen ulkopuolella voidaan määrittää 3–10 värin paletti. Päättelytila on tavalliseen kuvien generointiin tekstistä ilman referenssejä tai sarjaa: malli analysoi kohtauskuvauksen ensin.

Alibaban määrittelyssä tavallinen tuloste sisältää yhdestä neljään kuvaa. Tarinasarjalle voidaan asettaa enintään 12 kuvan yläraja; malli valitsee todellisen määrän tehtävän mukaan. Sarja voi huomioida tekstin ja referenssit yhteisille hahmopiirteille ja yhtenäiselle tarinalle. Palettia ja päättelyä ei käytetä tässä tilassa.

#### Tarkkuus riippuu tilasta

4K on tuettu tavallisessa kuvien generoinnissa tekstistä ilman referenssejä tai sarjaa. Kuvamuokkaus ja sarjat rajautuvat 2K-tasoon. Merkinnät määrittävät pikselipinta-alan, eivät jokaisen sivun samaa pituutta. Kuvasuhde voi olla 1:8–8:1; esiasetetussa muokkauksessa se seuraa viimeistä referenssiä. Tulos tallennetaan PNG-muodossa.

Kuvasyötettä käyttävissä tiloissa Alibaba hyväksyy JPEG, JPG, läpinäkymätön PNG, BMP ja WEBP. Rajat ovat 20 Mt tiedostoa kohden, 240–8000 pikseliä jokaisella sivulla ja kuvasuhde 1:8–8:1. Tekstiohje tukee kiinaa ja englantia enintään 5000 merkkiin; ylittävä osa poistetaan. Negatiivinen kuvaus ja ohjeen laajennus eivät kuulu tähän versioon. Siemenarvo auttaa säilyttämään vaihtoehtojen samankaltaisuuden, mutta ei takaa tarkkaa toistoa.

**Ailoot · Kuvat** `POST /v1/images/generations` `wan2.7-image-pro`

[`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images)

Alibaba /`wan2.7-image-pro`

Mallin ID

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

### Aloitus

Malli kuvien luomiseen tekstiohjeesta. Valmistaja tarjoaa väripaletin ohjausta ja enintään 4K-tarkkuuden tavallisessa tekstipohjaisessa kuvageneroinnissa.

Hyväksytyt syötteet

Teksti

Tulokset

Kuvat

### Saatavilla Ailootissa · syötteet & menetelmät

**Ailoot · Kuvat** `POST /v1/images/generations`

Syötetyypit

`text`

Tulostyypit

`image`

Tulosteen muoto

Kuvatiedosto

| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
| --- | --- | --- | --- | --- |
| Kenttä`model` | Tyyppi`string` | VaatimusPakollinen | Arvot & rajat wan2.7-image-pro | Oletus— |
| Kenttä`prompt` | Tyyppi`string` | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
| Kenttä`n` | Tyyppi`integer` | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 | Oletus1 |
| Kenttä`response_format` | Tyyppi`string` | VaatimusValinnainen | Arvot & rajat url, b64\_json | Oletus— |
| Kenttä`stream` | Tyyppi`boolean` | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
| Kenttä`size` | Tyyppi`string` | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
| Kenttä`partial_images` | Tyyppi`integer` | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
| Kenttä`images[].image_url` | Tyyppi`string` | VaatimusEi tuettu | Arvot & rajat Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Kuvien enimmäismäärä taulukossa: 9 Ehdot: Yksi todellinen URL kutakin images\[\]-oliota kohden. Taulukon alkioiden määrä on eri asia kuin tämä merkkijonon sisältävä lehtisolmu. Sovelletaan, kun: Vain JSON images/edits; JSON images/generations ei jäsennä images-viitteitä. | Oletus— |
| Kenttä`image` | Tyyppi`file` | VaatimusValinnainen | Arvot & rajat Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Sovelletaan, kun: multipart/form-data-luontipyyntö | Oletus— |
| Kenttä`image[]` | Tyyppi`file[]` | VaatimusValinnainen | Arvot & rajat Kohteiden enimmäismäärä: 9 Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Sovelletaan, kun: multipart/form-data-luontipyyntö | Oletus— |

Syöteaineistojen yhdistelmät

**Tekstistä kuvaksi** · Pakollinen: prompt

**reference\_images\_generation** · Pakollinen: prompt

Menetelmän parametrit ja elinkaari

| Parametri | Sopimus |
| --- | --- |
| Parametri`material_types` | Sopimustext |
| Parametri`required` | Sopimusmodel, prompt |
| Parametri`optional_controls` | Sopimusnull |
| Parametri`content_type` | Sopimusapplication/json |

Elinkaari: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · todellisuudessa palautettu task\_id tai mediakirjaston tietue

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

`GET /v1/media/assets`

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

Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.

### Hinnoittelu

#### Ailoot-menetelmien hinnat

Tuloste

0,075 $ *1K-kuvaa kohden*

Tuloste

0,075 $ *2K-kuvaa kohden*

Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. [Varauksen ja lopullisen veloituksen toiminta →](https://ailoot.ai/docs/fi/billing/reserve/)

#### Viitehinnaston tiedot

Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.

wan2.7-image-pro

#### Hinnat asetusten mukaan

| Asetukset | Laskutusehdot | Veloitus |
| --- | --- | --- |
| Asetuksetwan2.7-image-pro · Oletusasetukset | LaskutusehdotOletuskokoonpano | Veloitus Syöte · Syöte **0,00 $** kutsua kohti Tuloste · Tuloste **0,16 $** kutsua kohti |

### Esimerkkipyynnöt

#### Ailoot · Kuvat

curlPython SDKNode.js SDK

```bash
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
```

```python
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])
```

```js
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");
```

### Vastaanota ja tallenna tulokset

#### Ailoot · Kuvat

Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

##### Säilytä kaikki valmistuneet tulokset

Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.

Tallenna jokainen data-alkio. Pura jokainen b64\_json-arvo tai lataa jokaisen palautetun allekirjoitetun URL-osoitteen sisältö. Valitse tiedostopääte todellisen MIME-tyypin tai tavusisällön perusteella.

##### Jos alkuperäinen vastaus on tarkistettava

Jos kuvan generoinnin tai muokkauksen tulos edellyttää tarkistusta, säilytä alkuperäinen operation\_id/X-Client-Request-ID ja palautetut tulostiedot. Hae olemassa olevat omistamasi tulokset mediakirjastosta käyttämällä todellisia task\_id- tai asset\_id-arvoja. Älä lähetä generointi- tai muokkauspyyntöä uudelleen äläkä muodosta tilakyselyn URL-osoitetta operation\_id-arvosta.

Vastauksen kentät

| Kenttä | Tyyppi |
| --- | --- |
| Kenttä`created` | Tyyppiinteger |
| Kenttä`data[].url` | Tyyppistring |
| Kenttä`data[].b64_json` | Tyyppibase64 string |
| Kenttä`usage` | Tyyppiobject |

Virheet ja seuraavat vaiheet

| Vastaus | Ehto | Seuraava vaihe |
| --- | --- | --- |
| Vastaus400 · `invalid_request_error` | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
| Vastaus`server_error` | EhtoPalautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta | Seuraava vaiheSäilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen. |

### Aliakset

#### Mallin aliakset

**Ailoot** [`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images), [`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images), [`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

#### Menetelmäpolkujen aliakset

Käytä yllä näytettyjä menetelmäpolkuja.

#### Liittyvät kutsujan ID:t

[`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images), [`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images), [`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

**Ailoot · Kuvat** `POST /v1/images/generations` `wan-image`

[`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images)

Alibaba /`wan-image`

Mallin ID

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

### Aloitus

Malli kuvien luomiseen tekstiohjeesta. Valmistaja tarjoaa väripaletin ohjausta ja enintään 4K-tarkkuuden tavallisessa tekstipohjaisessa kuvageneroinnissa.

Hyväksytyt syötteet

Teksti

Tulokset

Kuvat

### Saatavilla Ailootissa · syötteet & menetelmät

**Ailoot · Kuvat** `POST /v1/images/generations`

Syötetyypit

`text`

Tulostyypit

`image`

Tulosteen muoto

Kuvatiedosto

| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
| --- | --- | --- | --- | --- |
| Kenttä`model` | Tyyppi`string` | VaatimusPakollinen | Arvot & rajat wan-image | Oletus— |
| Kenttä`prompt` | Tyyppi`string` | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
| Kenttä`n` | Tyyppi`integer` | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 | Oletus1 |
| Kenttä`response_format` | Tyyppi`string` | VaatimusValinnainen | Arvot & rajat url, b64\_json | Oletus— |
| Kenttä`stream` | Tyyppi`boolean` | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
| Kenttä`size` | Tyyppi`string` | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
| Kenttä`partial_images` | Tyyppi`integer` | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
| Kenttä`images[].image_url` | Tyyppi`string` | VaatimusEi tuettu | Arvot & rajat Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Kuvien enimmäismäärä taulukossa: 9 Ehdot: Yksi todellinen URL kutakin images\[\]-oliota kohden. Taulukon alkioiden määrä on eri asia kuin tämä merkkijonon sisältävä lehtisolmu. Sovelletaan, kun: Vain JSON images/edits; JSON images/generations ei jäsennä images-viitteitä. | Oletus— |
| Kenttä`image` | Tyyppi`file` | VaatimusValinnainen | Arvot & rajat Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Sovelletaan, kun: multipart/form-data-luontipyyntö | Oletus— |
| Kenttä`image[]` | Tyyppi`file[]` | VaatimusValinnainen | Arvot & rajat Kohteiden enimmäismäärä: 9 Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Sovelletaan, kun: multipart/form-data-luontipyyntö | Oletus— |

Syöteaineistojen yhdistelmät

**Tekstistä kuvaksi** · Pakollinen: prompt

**reference\_images\_generation** · Pakollinen: prompt

Menetelmän parametrit ja elinkaari

| Parametri | Sopimus |
| --- | --- |
| Parametri`material_types` | Sopimustext |
| Parametri`required` | Sopimusmodel, prompt |
| Parametri`optional_controls` | Sopimusnull |
| Parametri`content_type` | Sopimusapplication/json |

Elinkaari: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · todellisuudessa palautettu task\_id tai mediakirjaston tietue

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

`GET /v1/media/assets`

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

Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.

### Hinnoittelu

#### Ailoot-menetelmien hinnat

Tuloste

0,075 $ *1K-kuvaa kohden*

Tuloste

0,075 $ *2K-kuvaa kohden*

Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. [Varauksen ja lopullisen veloituksen toiminta →](https://ailoot.ai/docs/fi/billing/reserve/)

#### Viitehinnaston tiedot

Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.

wan2.7-image-pro

#### Hinnat asetusten mukaan

| Asetukset | Laskutusehdot | Veloitus |
| --- | --- | --- |
| Asetuksetwan2.7-image-pro · Oletusasetukset | LaskutusehdotOletuskokoonpano | Veloitus Syöte · Syöte **0,00 $** kutsua kohti Tuloste · Tuloste **0,16 $** kutsua kohti |

### Esimerkkipyynnöt

#### Ailoot · Kuvat

curlPython SDKNode.js SDK

```bash
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
```

```python
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])
```

```js
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");
```

### Vastaanota ja tallenna tulokset

#### Ailoot · Kuvat

Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

##### Säilytä kaikki valmistuneet tulokset

Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.

Tallenna jokainen data-alkio. Pura jokainen b64\_json-arvo tai lataa jokaisen palautetun allekirjoitetun URL-osoitteen sisältö. Valitse tiedostopääte todellisen MIME-tyypin tai tavusisällön perusteella.

##### Jos alkuperäinen vastaus on tarkistettava

Jos kuvan generoinnin tai muokkauksen tulos edellyttää tarkistusta, säilytä alkuperäinen operation\_id/X-Client-Request-ID ja palautetut tulostiedot. Hae olemassa olevat omistamasi tulokset mediakirjastosta käyttämällä todellisia task\_id- tai asset\_id-arvoja. Älä lähetä generointi- tai muokkauspyyntöä uudelleen äläkä muodosta tilakyselyn URL-osoitetta operation\_id-arvosta.

Vastauksen kentät

| Kenttä | Tyyppi |
| --- | --- |
| Kenttä`created` | Tyyppiinteger |
| Kenttä`data[].url` | Tyyppistring |
| Kenttä`data[].b64_json` | Tyyppibase64 string |
| Kenttä`usage` | Tyyppiobject |

Virheet ja seuraavat vaiheet

| Vastaus | Ehto | Seuraava vaihe |
| --- | --- | --- |
| Vastaus400 · `invalid_request_error` | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
| Vastaus`server_error` | EhtoPalautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta | Seuraava vaiheSäilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen. |

### Aliakset

#### Mallin aliakset

**Ailoot** [`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images), [`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images), [`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

#### Menetelmäpolkujen aliakset

Käytä yllä näytettyjä menetelmäpolkuja.

#### Liittyvät kutsujan ID:t

[`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images), [`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images), [`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

**Ailoot · Kuvat** `POST /v1/images/generations` `wan-image-latest`

[`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

Alibaba /`wan-image-latest`

Mallin ID

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

### Aloitus

Malli kuvien luomiseen tekstiohjeesta. Valmistaja tarjoaa väripaletin ohjausta ja enintään 4K-tarkkuuden tavallisessa tekstipohjaisessa kuvageneroinnissa.

Hyväksytyt syötteet

Teksti

Tulokset

Kuvat

### Saatavilla Ailootissa · syötteet & menetelmät

**Ailoot · Kuvat** `POST /v1/images/generations`

Syötetyypit

`text`

Tulostyypit

`image`

Tulosteen muoto

Kuvatiedosto

| Kenttä | Tyyppi | Vaatimus | Arvot & rajat | Oletus |
| --- | --- | --- | --- | --- |
| Kenttä`model` | Tyyppi`string` | VaatimusPakollinen | Arvot & rajat wan-image-latest | Oletus— |
| Kenttä`prompt` | Tyyppi`string` | VaatimusPakollinen | Arvot & rajat Vähimmäispituus: 1 | Oletus— |
| Kenttä`n` | Tyyppi`integer` | VaatimusValinnainen | Arvot & rajat Vähimmäismäärä: 1 | Oletus1 |
| Kenttä`response_format` | Tyyppi`string` | VaatimusValinnainen | Arvot & rajat url, b64\_json | Oletus— |
| Kenttä`stream` | Tyyppi`boolean` | VaatimusValinnainen | Arvot & rajat | Oletusfalse |
| Kenttä`size` | Tyyppi`string` | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
| Kenttä`partial_images` | Tyyppi`integer` | VaatimusValinnainen | Arvot & rajat Riippuu mallista | Oletus— |
| Kenttä`images[].image_url` | Tyyppi`string` | VaatimusEi tuettu | Arvot & rajat Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Kuvien enimmäismäärä taulukossa: 9 Ehdot: Yksi todellinen URL kutakin images\[\]-oliota kohden. Taulukon alkioiden määrä on eri asia kuin tämä merkkijonon sisältävä lehtisolmu. Sovelletaan, kun: Vain JSON images/edits; JSON images/generations ei jäsennä images-viitteitä. | Oletus— |
| Kenttä`image` | Tyyppi`file` | VaatimusValinnainen | Arvot & rajat Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Sovelletaan, kun: multipart/form-data-luontipyyntö | Oletus— |
| Kenttä`image[]` | Tyyppi`file[]` | VaatimusValinnainen | Arvot & rajat Kohteiden enimmäismäärä: 9 Purettujen tavujen enimmäismäärä: 20 971 520 MIME-tyypit: image/png, image/jpeg Sovelletaan, kun: multipart/form-data-luontipyyntö | Oletus— |

Syöteaineistojen yhdistelmät

**Tekstistä kuvaksi** · Pakollinen: prompt

**reference\_images\_generation** · Pakollinen: prompt

Menetelmän parametrit ja elinkaari

| Parametri | Sopimus |
| --- | --- |
| Parametri`material_types` | Sopimustext |
| Parametri`required` | Sopimusmodel, prompt |
| Parametri`optional_controls` | Sopimusnull |
| Parametri`content_type` | Sopimusapplication/json |

Elinkaari: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · todellisuudessa palautettu task\_id tai mediakirjaston tietue

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

`GET /v1/media/assets`

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

Menetelmien rakenteet ja ID:t ovat täsmällisiä; toimittajan kyvykkyys on erillinen pyynnön hyväksymisestä.

### Hinnoittelu

#### Ailoot-menetelmien hinnat

Tuloste

0,075 $ *1K-kuvaa kohden*

Tuloste

0,075 $ *2K-kuvaa kohden*

Ailoot varaa arvioidun summan ennen pyyntöä. Tuloksen jälkeen lopullinen veloitus toteutetaan mitatun käytön perusteella. Suoratoiston veloituksessa käytetään lopullista käyttötietuetta. [Varauksen ja lopullisen veloituksen toiminta →](https://ailoot.ai/docs/fi/billing/reserve/)

#### Viitehinnaston tiedot

Mallitason viitehinnastot eivät muuta menetelmän valintaa, hinta-arvioita tai veloituksia. Käytössä olevat veloitukset käyttävät valitun Ailoot-menetelmän hintoja.

wan2.7-image-pro

#### Hinnat asetusten mukaan

| Asetukset | Laskutusehdot | Veloitus |
| --- | --- | --- |
| Asetuksetwan2.7-image-pro · Oletusasetukset | LaskutusehdotOletuskokoonpano | Veloitus Syöte · Syöte **0,00 $** kutsua kohti Tuloste · Tuloste **0,16 $** kutsua kohti |

### Esimerkkipyynnöt

#### Ailoot · Kuvat

curlPython SDKNode.js SDK

```bash
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
```

```python
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])
```

```js
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");
```

### Vastaanota ja tallenna tulokset

#### Ailoot · Kuvat

Lataa jokainen palautettu kuva tai tallenna sen Base64-sisältö

- `GET /v1/media/tasks/{task_id}`
- `GET /v1/media/assets/{asset_id}/content`
- `GET /v1/media/assets`
- `GET /v1/media/assets/{asset_id}`

##### Säilytä kaikki valmistuneet tulokset

Tallenna jokainen valmistunut kuva; nouda jokainen palautettu URL tai pura sen Base64-sisältö.

Tallenna jokainen data-alkio. Pura jokainen b64\_json-arvo tai lataa jokaisen palautetun allekirjoitetun URL-osoitteen sisältö. Valitse tiedostopääte todellisen MIME-tyypin tai tavusisällön perusteella.

##### Jos alkuperäinen vastaus on tarkistettava

Jos kuvan generoinnin tai muokkauksen tulos edellyttää tarkistusta, säilytä alkuperäinen operation\_id/X-Client-Request-ID ja palautetut tulostiedot. Hae olemassa olevat omistamasi tulokset mediakirjastosta käyttämällä todellisia task\_id- tai asset\_id-arvoja. Älä lähetä generointi- tai muokkauspyyntöä uudelleen äläkä muodosta tilakyselyn URL-osoitetta operation\_id-arvosta.

Vastauksen kentät

| Kenttä | Tyyppi |
| --- | --- |
| Kenttä`created` | Tyyppiinteger |
| Kenttä`data[].url` | Tyyppistring |
| Kenttä`data[].b64_json` | Tyyppibase64 string |
| Kenttä`usage` | Tyyppiobject |

Virheet ja seuraavat vaiheet

| Vastaus | Ehto | Seuraava vaihe |
| --- | --- | --- |
| Vastaus400 · `invalid_request_error` | EhtoVirheelliset pakolliset kentät, aineiston esitysmuoto tai parametrin arvo | Seuraava vaiheKorjaa ilmoitetut kentät ennen uutta luontipyyntöä. |
| Vastaus`server_error` | EhtoPalautettu vastaus ilmoittaa, että operaatio tai tulos edellyttää tarkistusta | Seuraava vaiheSäilytä alkuperäinen palautettu operaation tai tehtävän ID, pyynnön otsakkeet ja vastaus; jatka kyseisen alkuperäisen operaation tuettuja lukutoimintoja. Älä lähetä luontipyyntöä uudelleen. |

### Aliakset

#### Mallin aliakset

**Ailoot** [`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images), [`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images), [`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

#### Menetelmäpolkujen aliakset

Käytä yllä näytettyjä menetelmäpolkuja.

#### Liittyvät kutsujan ID:t

[`wan2.7-image-pro`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan2.7-image-pro&fmt=images), [`wan-image`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image&fmt=images), [`wan-image-latest`](https://ailoot.ai/models/fi/#m=wan2.7-image-pro&route=Core&caller=wan-image-latest&fmt=images)

FAQ · wan2.7-image-pro

Mitä syötteitä ja tuloksia on saatavilla?

`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`

Mitä kenttiä pyyntö käyttää?

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

Mitä rajoja sovelletaan?

`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`

Yhdistä Ailoot Claude Codeen, OpenCodeen, Hermesiin tai omaan sovellukseesi.

## Yritys ja sen projektisalkku

Yritys ja sen projektisalkku: miljoonia asiakkaita; kuukausittainen myynti miljardiluokassa.

## Osta tokenit alennuksella.

Tilausalennus säännölliseen käyttöön. Kampanjakoodit — jopa 50% tokeniostoista.

Tilaus

Valitse alennushintainen paketti säännöllisiä pyyntöjäsi varten.

Kampanjakoodi jopa 50%

Syötä koodi oston yhteydessä. Hinta lasketaan uudelleen voimassa olevan kampanjan mukaan.

Kulut historiassa

Malli, tokenit ja summa tallennetaan jokaiselle pyynnölle.

[Valitse tilaus](https://ailoot.ai/docs/fi/billing/subscriptions/) · [Katso mallihinnat](https://ailoot.ai/models/fi/)

## Yhdistä API tuotteeseen, jonka myyt.

SaaS, sovellukset ja botit Ailootin palveluehtojen ja lisenssisopimuksen mukaisesti. Pyydä edelleenmyyntiin jälleenmyyjälisenssi.

Kaupallinen sovellus

Lisää tekstin, kuvien, videoiden ja äänen luonti palvelusi maksullisiin ominaisuuksiin.

Jälleenmyyjälisenssi

Lähetä projektikuvaus ja pääsyn toteutustapa. Pyydä kirjalliset käyttö- ja jälleenmyyntiehdot.

Asiakirjat verkkosivustolla

Palveluehdot, lisenssisopimus ja tietojenkäsittelykäytäntö ovat saatavilla ennen yhdistämistä.

[Pyydä jälleenmyyjälisenssi](mailto:support@ailoot.ai) · [Palveluehdot ja lisenssisopimus](https://ailoot.ai/legal/offer?lang=fi)

## Ailoot · Yritys ja sen projektisalkku





Ailoot perustuu kertyneeseen toimintakokemukseen, laajaan asiakaskuntaan, vakaaseen palveluun ja jatkuvaan KPI-seurantaan.





Yritys ja sen projektisalkku: miljoonia asiakkaita; kuukausittainen myynti miljardiluokassa.





Ailoot hyödyntää tätä toimintakokemusta tarjotessaan API-yhteyden tekoälytoimintoihin asiakkaiden tuotteissa, agenteissa, sovelluksissa ja automaatioissa.
