{
  "aboutHtml": "<p>Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.</p><h4>Tekst og detaljer i billedet</h4><p>Producenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.</p><p>Qwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.</p><h4>Redigering i Alibabas specifikation</h4><p>Til redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.</p><p>Producentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.</p><p>Producentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.</p>",
  "aboutText": "Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.\n\n### Tekst og detaljer i billedet\n\nProducenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.\n\nQwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.\n\n### Redigering i Alibabas specifikation\n\nTil redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.\n\nProducentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.\n\nProducentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "ab7a7f5ffe64a2b2e23fc2a09113f9be482609d0b1360e5c2d2c4091202ac7c7",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "da",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">Al</span><h2 id=\"sheet-title\">qwen-image-3.0-pro</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Luk\">×</button></div><div class=\"idline\"><span>Alibaba /</span><code>qwen-image-3.0-pro</code><button type=\"button\" id=\"copy-id\">Kopiér ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Modelkortets afsnit\"><button type=\"button\" data-card-jump=\"overview\">Start</button><button type=\"button\" data-card-jump=\"methods\">Input og metoder</button><button type=\"button\" data-card-jump=\"pricing\">Priser</button><button type=\"button\" data-card-jump=\"examples\">Eksempler</button><button type=\"button\" data-card-jump=\"results\">Resultater</button><button type=\"button\" data-card-jump=\"aliases\">Aliaser</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-metoder\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Core|images|/v1/images/generations|qwen-image-3.0-pro\">Billeder</button></div><div class=\"idline\"><label for=\"card-model-id\">Model-ID</label><select class=\"sel\" id=\"card-model-id\" style=\"min-width:0;max-width:100%\"><option value=\"Core|images|/v1/images/generations|qwen-image-3.0-pro\" selected>qwen-image-3.0-pro</option><option value=\"Core|images|/v1/images/generations|qwen-image\">qwen-image</option><option value=\"Core|images|/v1/images/generations|qwen-image-latest\">qwen-image-latest</option></select></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Start</h3><p class=\"mdesc-full\">Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.</p><dl class=\"card-io\" data-card-io><div><dt>Accepterede input</dt><dd>Tekst</dd></div><div><dt>Resultater</dt><dd>Billeder</dd></div></dl><details class=\"card-about\"><summary>Om modellen</summary><p class=\"note-s\" data-model-method-boundary>Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.</p><div class=\"mabout\" id=\"m-about\"><p>Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.</p><h4>Tekst og detaljer i billedet</h4><p>Producenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.</p><p>Qwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.</p><h4>Redigering i Alibabas specifikation</h4><p>Til redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.</p><p>Producentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.</p><p>Producentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Tilgængelig i Ailoot · input og metoder</h3><details class=\"card-method\" open><summary><b>Ailoot · Billeder</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Inputtyper</dt><dd><code>text</code></dd></div><div><dt>Outputtyper</dt><dd><code>image</code></dd></div><div><dt>Outputformat</dt><dd>Billedfil</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Felt</th><th>Type</th><th>Krav</th><th>Værdier og grænser</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>qwen-image-3.0-pro</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Minimumslængde: 1</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">n</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Minimum: 1</div></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>1</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>url, b64_json</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>false</td></tr><tr data-parameter-availability=\"model_dependent\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">size</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div class=\"note-s\">Afhænger af modellen</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"model_dependent\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">partial_images</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div class=\"note-s\">Afhænger af modellen</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"different_method\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">images[].image_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Ikke understøttet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Maksimalt antal billeder pr. array: 3</div><div>Betingelser: Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.</div><div>Gælder når: Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer.</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">image</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>file</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Gælder når: generering med multipart/form-data</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">image[]</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>file[]</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal elementer: 3</div><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Gælder når: generering med multipart/form-data</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Kombinationer af inputmaterialer</summary><p class=\"note-s\"><b>Tekst til billede</b> · Påkrævet: prompt</p><p class=\"note-s\"><b>reference_images_generation</b> · Påkrævet: prompt</p></details><details class=\"note-s\" data-method-contract><summary>Metodeparametre og livscyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Kontrakt</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>text</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>model, prompt</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>optional_controls</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>null</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>application/json</td></tr></tbody></table></div><p>Livscyklus: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · det faktisk returnerede task_id eller posten i mediebiblioteket</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Priser</h3><h4>Ailoot-metodetakster</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> Billeder</b><code>POST /v1/images/generations</code></header><dl><div><dt>Input</dt><dd>0,003 US$ <em>pr. inputbillede</em></dd></div><div><dt>Output</dt><dd>0,04 US$ <em>pr. 1K-billede</em></dd></div><div><dt>Output</dt><dd>0,075 US$ <em>pr. 2K-billede</em></dd></div></dl></section><p class=\"note-s\">Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. <a href=\"/docs/da/billing/reserve/\">Sådan fungerer reservation og afregning →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Eksempelanmodninger</h3><h4>Ailoot · Billeder</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodevarianter\"><button class=\"cg-tab\" id=\"model-code-44-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-44-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-44-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-44-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK</button><button class=\"cg-tab\" id=\"model-code-44-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-44-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Node.js SDK</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiér kode\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-44-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-44-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: &quot;${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}&quot;\nexport AILOOT_PROMPT_FILE\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;qwen-image-3.0-pro&quot;, &quot;prompt&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_PROMPT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 brief&quot;)\np[&#39;prompt&#39;]=f.read_text(encoding=&quot;utf-8&quot;)\nif not p[&#39;prompt&#39;].strip():raise SystemExit(&quot;Brief must contain text&quot;)\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\nsave_images(json.loads(Path(&quot;result.json&quot;).read_text())[&quot;data&quot;])\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-44-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-44-tab-1\" hidden><pre data-lang=\"python\"><code>from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\n\nf=Path(os.environ[&quot;AILOOT_PROMPT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Set your actual UTF-8 image brief file&quot;)\nrequest={&#39;model&#39;: &#39;qwen-image-3.0-pro&#39;, &#39;prompt&#39;: &#39;&#39;}\nrequest[&quot;prompt&quot;]=f.read_text(encoding=&quot;utf-8&quot;)\nclient=OpenAI(base_url=&quot;https://api.ailoot.ai/v1&quot;,api_key=os.environ[&quot;AILOOT_API_KEY&quot;],max_retries=0)\nresult=client.images.generate(**request)\nPath(&quot;sdk-result.txt&quot;).write_text(str(result),encoding=&quot;utf-8&quot;)\nsave_images([{&quot;b64_json&quot;:getattr(item,&quot;b64_json&quot;,None),&quot;url&quot;:getattr(item,&quot;url&quot;,None)} for item in result.data])\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-44-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-44-tab-2\" hidden><pre data-lang=\"js\"><code>import OpenAI from &quot;openai&quot;;\nimport { readFileSync, writeFileSync } from &quot;node:fs&quot;;\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(&quot;Set your actual Ailoot API key&quot;);\nconst client=new OpenAI({baseURL:&quot;https://api.ailoot.ai/v1&quot;,apiKey:key,maxRetries:0});\nconst request={&quot;model&quot;: &quot;qwen-image-3.0-pro&quot;, &quot;prompt&quot;: &quot;&quot;};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(&quot;Set your actual UTF-8 image brief file&quot;);\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,&quot;utf8&quot;);\nconst result=await client.images.generate(request);\nwriteFileSync(&quot;sdk-result.json&quot;,JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(&quot;No completed images&quot;);\nfor(let index=0;index&lt;result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||&quot;&quot;,raw;\n  if(!encoded &amp;&amp; uri.startsWith(&quot;data:image/&quot;)) {\n    const comma=uri.indexOf(&quot;,&quot;);if(comma&lt;0 || !uri.slice(0,comma).includes(&quot;;base64&quot;)) throw new Error(&quot;Unsupported image data URI&quot;);\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(&quot;Invalid Base64&quot;);\n    raw=Buffer.from(encoded,&quot;base64&quot;);\n  } else if(uri) {\n    const u=new URL(uri,&quot;https://api.ailoot.ai&quot;);\n    if(u.protocol!==&quot;https:&quot; || u.username || u.password) throw new Error(&quot;Invalid returned URL&quot;);\n    const owned=u.origin===&quot;https://api.ailoot.ai&quot; &amp;&amp; u.pathname.startsWith(&quot;/v1/media/assets/&quot;) &amp;&amp; u.pathname.endsWith(&quot;/content&quot;);\n    const response=await fetch(u,{headers:owned?{Authorization:&quot;Bearer &quot;+key}:{},redirect:&quot;manual&quot;});\n    if(!response.ok) throw new Error(&quot;Image content download failed: &quot;+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(&quot;Image has neither bytes nor URL&quot;);\n  if(!raw.length) throw new Error(&quot;Empty image result&quot;);\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?&quot;png&quot;:raw[0]===255&amp;&amp;raw[1]===216?&quot;jpg&quot;:raw.toString(&quot;ascii&quot;,0,4)===&quot;RIFF&quot;&amp;&amp;raw.toString(&quot;ascii&quot;,8,12)===&quot;WEBP&quot;?&quot;webp&quot;:raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;svg&quot;)||raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;?xml&quot;)?&quot;svg&quot;:&quot;bin&quot;;\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(&quot;Every returned image saved; sdk-result.json retains complete metadata&quot;);\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Hent og gem resultater</h3><h4>Ailoot · Billeder</h4><p class=\"note-s\">Hent hvert returneret billede, eller gem dets Base64-indhold</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Behold alle færdige resultater</h5><p class=\"note-s\">Gem hvert færdigt billede; hent hver returneret URL eller afkod dets Base64-indhold.</p><p class=\"note-s\">Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Hvis det oprindelige svar skal kontrolleres</h5><p class=\"note-s\">Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id.</p></div><details class=\"card-about\" data-output-fields><summary>Svarfelter</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Felt</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>base64 string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fejl og næste trin</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Svar</th><th>Betingelse</th><th>Næste trin</th></tr></thead><tbody><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Ret de angivne felter før en ny oprettelsesanmodning.</td></tr><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span><code>server_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliaser</h3><h4>Modelaliaser</h4><p class=\"note-s\"><span data-model-alias-route=\"Core\"><b>Ailoot</b> <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-3.0-pro&amp;fmt=images\"><code>qwen-image-3.0-pro</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image&amp;fmt=images\"><code>qwen-image</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-latest&amp;fmt=images\"><code>qwen-image-latest</code></a></span></p><h4>Aliaser for metodestier</h4><p class=\"note-s\">Brug metodestierne vist ovenfor.</p><h4>Relaterede kalder-ID’er</h4><p class=\"note-s\"><a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-3.0-pro&amp;fmt=images\"><code>qwen-image-3.0-pro</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image&amp;fmt=images\"><code>qwen-image</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-latest&amp;fmt=images\"><code>qwen-image-latest</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "qwen-image-3.0-pro",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "qwen-image-3.0-pro",
        "route_label": "Core"
      },
      "method_key": "Core|images|/v1/images/generations|qwen-image-3.0-pro",
      "ordinal": 0,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Save every data item. Decode each b64_json or fetch every returned signed URL. Select a filename extension from the actual MIME/bytes.",
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres",
                "http_status": null,
                "recovery": "Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.",
                "type": "server_error"
              }
            ],
            "hints": [
              "Qwen defaultsize1024*1024; Wan defaultsize1K. Wan2.7 Pro4K is supported only without reference inputs.",
              "Explicit dimensions must be positive, at most4096 peraxis, within8:1..1:8 aspect, and the exact model/input area range.",
              "The Alibaba image adapter rejects mask input and streaming before sending the request.",
              "For this generation method, actual image references are supported as multipart image files. JSONimages[].image_url is read only on images/edits; the leaf value is a string."
            ],
            "ignored_fields": [
              "quality",
              "background",
              "style",
              "output_format",
              "output_compression",
              "moderation",
              "input_fidelity",
              "partial_images without streaming"
            ],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "ignored_reference_field": "JSONgeneration images[] is not parsed; images[].image_url belongs to a separately supported JSONedit profile.",
                "mask": false,
                "mode": "text_to_image",
                "reference_images": false,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt"
                ]
              },
              {
                "content_type": "multipart/form-data",
                "mask": false,
                "maximum_decoded_bytes_per_image": 10485760,
                "maximum_reference_images": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "minimum_reference_images": 0,
                "mode": "reference_images_generation",
                "optional_file_fields": [
                  "image",
                  "image[]",
                  "image[index]"
                ],
                "reference_images": true,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt",
                  "actual PNG/JPEG file references"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_image",
              "reference_images_generation_via_multipart"
            ],
            "outputs": {
              "all_results": "Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameter_conditions": {
              "size": {
                "aspect_ratio_range": [
                  "1:8",
                  "8:1"
                ],
                "default": "1024*1024",
                "max_area_4k_condition": "WanPro and no inputimages",
                "max_dimension": 4096,
                "maximum_area": 4194304,
                "minimum_area": 262144
              }
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "qwen-image-3.0-pro"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": 1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "url",
                  "b64_json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "size",
                "required": false,
                "type": "string"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "partial_images",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "different_method",
                "conditions": "Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.",
                "decoded_max_bytes": 10485760,
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_images_per_array": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "images[].image_url",
                "required": false,
                "type": "string",
                "when": "Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer."
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image",
                "required": false,
                "type": "file",
                "when": "generering med multipart/form-data"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "maximum_items": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image[]",
                "required": false,
                "type": "file[]",
                "when": "generering med multipart/form-data"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "images[].file_id",
              "mask.file_id",
              "mask",
              "stream=true",
              "mask input is rejected by this Alibaba adapter"
            ]
          },
          "hints": [
            "Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "det faktisk returnerede task_id eller posten i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "operation_modes": [
            "images"
          ],
          "output": {
            "family": [
              "image"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: \"${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}\"\nexport AILOOT_PROMPT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"qwen-image-3.0-pro\", \"prompt\": \"\"}')\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 brief\")\np['prompt']=f.read_text(encoding=\"utf-8\")\nif not p['prompt'].strip():raise SystemExit(\"Brief must contain text\")\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "Create and save every image",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Set your actual UTF-8 image brief file\")\nrequest={'model': 'qwen-image-3.0-pro', 'prompt': ''}\nrequest[\"prompt\"]=f.read_text(encoding=\"utf-8\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · save all image outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"qwen-image-3.0-pro\", \"prompt\": \"\"};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(\"Set your actual UTF-8 image brief file\");\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,\"utf8\");\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  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\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · save all image outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Billeder",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 0.003,
                "amount_unit": "usd_per_display_unit",
                "key": "image_input",
                "label": "per input image",
                "side": "in"
              },
              {
                "amount": 0.04,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_1k",
                "label": "per 1K image",
                "side": "out"
              },
              {
                "amount": 0.075,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_2k",
                "label": "per 2K image",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "qwen-image-3.0-pro",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "conditional",
        "units": [
          {
            "key": "image_input",
            "label": "per input image",
            "side": "in",
            "usd": 0.003
          },
          {
            "key": "image_output_1k",
            "label": "per 1K image",
            "side": "out",
            "usd": 0.04
          },
          {
            "key": "image_output_2k",
            "label": "per 2K image",
            "side": "out",
            "usd": 0.075
          }
        ]
      }
    },
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">Al</span><h2 id=\"sheet-title\">qwen-image-3.0-pro</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Luk\">×</button></div><div class=\"idline\"><span>Alibaba /</span><code>qwen-image</code><button type=\"button\" id=\"copy-id\">Kopiér ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Modelkortets afsnit\"><button type=\"button\" data-card-jump=\"overview\">Start</button><button type=\"button\" data-card-jump=\"methods\">Input og metoder</button><button type=\"button\" data-card-jump=\"pricing\">Priser</button><button type=\"button\" data-card-jump=\"examples\">Eksempler</button><button type=\"button\" data-card-jump=\"results\">Resultater</button><button type=\"button\" data-card-jump=\"aliases\">Aliaser</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-metoder\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Core|images|/v1/images/generations|qwen-image\">Billeder</button></div><div class=\"idline\"><label for=\"card-model-id\">Model-ID</label><select class=\"sel\" id=\"card-model-id\" style=\"min-width:0;max-width:100%\"><option value=\"Core|images|/v1/images/generations|qwen-image-3.0-pro\">qwen-image-3.0-pro</option><option value=\"Core|images|/v1/images/generations|qwen-image\" selected>qwen-image</option><option value=\"Core|images|/v1/images/generations|qwen-image-latest\">qwen-image-latest</option></select></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Start</h3><p class=\"mdesc-full\">Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.</p><dl class=\"card-io\" data-card-io><div><dt>Accepterede input</dt><dd>Tekst</dd></div><div><dt>Resultater</dt><dd>Billeder</dd></div></dl><details class=\"card-about\"><summary>Om modellen</summary><p class=\"note-s\" data-model-method-boundary>Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.</p><div class=\"mabout\" id=\"m-about\"><p>Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.</p><h4>Tekst og detaljer i billedet</h4><p>Producenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.</p><p>Qwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.</p><h4>Redigering i Alibabas specifikation</h4><p>Til redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.</p><p>Producentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.</p><p>Producentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Tilgængelig i Ailoot · input og metoder</h3><details class=\"card-method\" open><summary><b>Ailoot · Billeder</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Inputtyper</dt><dd><code>text</code></dd></div><div><dt>Outputtyper</dt><dd><code>image</code></dd></div><div><dt>Outputformat</dt><dd>Billedfil</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Felt</th><th>Type</th><th>Krav</th><th>Værdier og grænser</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>qwen-image</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Minimumslængde: 1</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">n</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Minimum: 1</div></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>1</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>url, b64_json</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>false</td></tr><tr data-parameter-availability=\"model_dependent\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">size</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div class=\"note-s\">Afhænger af modellen</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"model_dependent\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">partial_images</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div class=\"note-s\">Afhænger af modellen</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"different_method\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">images[].image_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Ikke understøttet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Maksimalt antal billeder pr. array: 3</div><div>Betingelser: Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.</div><div>Gælder når: Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer.</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">image</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>file</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Gælder når: generering med multipart/form-data</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">image[]</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>file[]</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal elementer: 3</div><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Gælder når: generering med multipart/form-data</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Kombinationer af inputmaterialer</summary><p class=\"note-s\"><b>Tekst til billede</b> · Påkrævet: prompt</p><p class=\"note-s\"><b>reference_images_generation</b> · Påkrævet: prompt</p></details><details class=\"note-s\" data-method-contract><summary>Metodeparametre og livscyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Kontrakt</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>text</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>model, prompt</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>optional_controls</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>null</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>application/json</td></tr></tbody></table></div><p>Livscyklus: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · det faktisk returnerede task_id eller posten i mediebiblioteket</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Priser</h3><h4>Ailoot-metodetakster</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> Billeder</b><code>POST /v1/images/generations</code></header><dl><div><dt>Input</dt><dd>0,003 US$ <em>pr. inputbillede</em></dd></div><div><dt>Output</dt><dd>0,04 US$ <em>pr. 1K-billede</em></dd></div><div><dt>Output</dt><dd>0,075 US$ <em>pr. 2K-billede</em></dd></div></dl></section><p class=\"note-s\">Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. <a href=\"/docs/da/billing/reserve/\">Sådan fungerer reservation og afregning →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Eksempelanmodninger</h3><h4>Ailoot · Billeder</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodevarianter\"><button class=\"cg-tab\" id=\"model-code-45-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-45-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-45-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-45-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK</button><button class=\"cg-tab\" id=\"model-code-45-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-45-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Node.js SDK</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiér kode\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-45-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-45-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: &quot;${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}&quot;\nexport AILOOT_PROMPT_FILE\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;qwen-image&quot;, &quot;prompt&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_PROMPT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 brief&quot;)\np[&#39;prompt&#39;]=f.read_text(encoding=&quot;utf-8&quot;)\nif not p[&#39;prompt&#39;].strip():raise SystemExit(&quot;Brief must contain text&quot;)\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\nsave_images(json.loads(Path(&quot;result.json&quot;).read_text())[&quot;data&quot;])\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-45-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-45-tab-1\" hidden><pre data-lang=\"python\"><code>from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\n\nf=Path(os.environ[&quot;AILOOT_PROMPT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Set your actual UTF-8 image brief file&quot;)\nrequest={&#39;model&#39;: &#39;qwen-image&#39;, &#39;prompt&#39;: &#39;&#39;}\nrequest[&quot;prompt&quot;]=f.read_text(encoding=&quot;utf-8&quot;)\nclient=OpenAI(base_url=&quot;https://api.ailoot.ai/v1&quot;,api_key=os.environ[&quot;AILOOT_API_KEY&quot;],max_retries=0)\nresult=client.images.generate(**request)\nPath(&quot;sdk-result.txt&quot;).write_text(str(result),encoding=&quot;utf-8&quot;)\nsave_images([{&quot;b64_json&quot;:getattr(item,&quot;b64_json&quot;,None),&quot;url&quot;:getattr(item,&quot;url&quot;,None)} for item in result.data])\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-45-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-45-tab-2\" hidden><pre data-lang=\"js\"><code>import OpenAI from &quot;openai&quot;;\nimport { readFileSync, writeFileSync } from &quot;node:fs&quot;;\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(&quot;Set your actual Ailoot API key&quot;);\nconst client=new OpenAI({baseURL:&quot;https://api.ailoot.ai/v1&quot;,apiKey:key,maxRetries:0});\nconst request={&quot;model&quot;: &quot;qwen-image&quot;, &quot;prompt&quot;: &quot;&quot;};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(&quot;Set your actual UTF-8 image brief file&quot;);\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,&quot;utf8&quot;);\nconst result=await client.images.generate(request);\nwriteFileSync(&quot;sdk-result.json&quot;,JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(&quot;No completed images&quot;);\nfor(let index=0;index&lt;result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||&quot;&quot;,raw;\n  if(!encoded &amp;&amp; uri.startsWith(&quot;data:image/&quot;)) {\n    const comma=uri.indexOf(&quot;,&quot;);if(comma&lt;0 || !uri.slice(0,comma).includes(&quot;;base64&quot;)) throw new Error(&quot;Unsupported image data URI&quot;);\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(&quot;Invalid Base64&quot;);\n    raw=Buffer.from(encoded,&quot;base64&quot;);\n  } else if(uri) {\n    const u=new URL(uri,&quot;https://api.ailoot.ai&quot;);\n    if(u.protocol!==&quot;https:&quot; || u.username || u.password) throw new Error(&quot;Invalid returned URL&quot;);\n    const owned=u.origin===&quot;https://api.ailoot.ai&quot; &amp;&amp; u.pathname.startsWith(&quot;/v1/media/assets/&quot;) &amp;&amp; u.pathname.endsWith(&quot;/content&quot;);\n    const response=await fetch(u,{headers:owned?{Authorization:&quot;Bearer &quot;+key}:{},redirect:&quot;manual&quot;});\n    if(!response.ok) throw new Error(&quot;Image content download failed: &quot;+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(&quot;Image has neither bytes nor URL&quot;);\n  if(!raw.length) throw new Error(&quot;Empty image result&quot;);\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?&quot;png&quot;:raw[0]===255&amp;&amp;raw[1]===216?&quot;jpg&quot;:raw.toString(&quot;ascii&quot;,0,4)===&quot;RIFF&quot;&amp;&amp;raw.toString(&quot;ascii&quot;,8,12)===&quot;WEBP&quot;?&quot;webp&quot;:raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;svg&quot;)||raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;?xml&quot;)?&quot;svg&quot;:&quot;bin&quot;;\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(&quot;Every returned image saved; sdk-result.json retains complete metadata&quot;);\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Hent og gem resultater</h3><h4>Ailoot · Billeder</h4><p class=\"note-s\">Hent hvert returneret billede, eller gem dets Base64-indhold</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Behold alle færdige resultater</h5><p class=\"note-s\">Gem hvert færdigt billede; hent hver returneret URL eller afkod dets Base64-indhold.</p><p class=\"note-s\">Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Hvis det oprindelige svar skal kontrolleres</h5><p class=\"note-s\">Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id.</p></div><details class=\"card-about\" data-output-fields><summary>Svarfelter</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Felt</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>base64 string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fejl og næste trin</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Svar</th><th>Betingelse</th><th>Næste trin</th></tr></thead><tbody><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Ret de angivne felter før en ny oprettelsesanmodning.</td></tr><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span><code>server_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliaser</h3><h4>Modelaliaser</h4><p class=\"note-s\"><span data-model-alias-route=\"Core\"><b>Ailoot</b> <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-3.0-pro&amp;fmt=images\"><code>qwen-image-3.0-pro</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image&amp;fmt=images\"><code>qwen-image</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-latest&amp;fmt=images\"><code>qwen-image-latest</code></a></span></p><h4>Aliaser for metodestier</h4><p class=\"note-s\">Brug metodestierne vist ovenfor.</p><h4>Relaterede kalder-ID’er</h4><p class=\"note-s\"><a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-3.0-pro&amp;fmt=images\"><code>qwen-image-3.0-pro</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image&amp;fmt=images\"><code>qwen-image</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-latest&amp;fmt=images\"><code>qwen-image-latest</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "qwen-image",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "qwen-image",
        "route_label": "Core"
      },
      "method_key": "Core|images|/v1/images/generations|qwen-image",
      "ordinal": 1,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Save every data item. Decode each b64_json or fetch every returned signed URL. Select a filename extension from the actual MIME/bytes.",
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres",
                "http_status": null,
                "recovery": "Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.",
                "type": "server_error"
              }
            ],
            "hints": [
              "Qwen defaultsize1024*1024; Wan defaultsize1K. Wan2.7 Pro4K is supported only without reference inputs.",
              "Explicit dimensions must be positive, at most4096 peraxis, within8:1..1:8 aspect, and the exact model/input area range.",
              "The Alibaba image adapter rejects mask input and streaming before sending the request.",
              "For this generation method, actual image references are supported as multipart image files. JSONimages[].image_url is read only on images/edits; the leaf value is a string."
            ],
            "ignored_fields": [
              "quality",
              "background",
              "style",
              "output_format",
              "output_compression",
              "moderation",
              "input_fidelity",
              "partial_images without streaming"
            ],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "ignored_reference_field": "JSONgeneration images[] is not parsed; images[].image_url belongs to a separately supported JSONedit profile.",
                "mask": false,
                "mode": "text_to_image",
                "reference_images": false,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt"
                ]
              },
              {
                "content_type": "multipart/form-data",
                "mask": false,
                "maximum_decoded_bytes_per_image": 10485760,
                "maximum_reference_images": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "minimum_reference_images": 0,
                "mode": "reference_images_generation",
                "optional_file_fields": [
                  "image",
                  "image[]",
                  "image[index]"
                ],
                "reference_images": true,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt",
                  "actual PNG/JPEG file references"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_image",
              "reference_images_generation_via_multipart"
            ],
            "outputs": {
              "all_results": "Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameter_conditions": {
              "size": {
                "aspect_ratio_range": [
                  "1:8",
                  "8:1"
                ],
                "default": "1024*1024",
                "max_area_4k_condition": "WanPro and no inputimages",
                "max_dimension": 4096,
                "maximum_area": 4194304,
                "minimum_area": 262144
              }
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "qwen-image"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": 1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "url",
                  "b64_json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "size",
                "required": false,
                "type": "string"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "partial_images",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "different_method",
                "conditions": "Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.",
                "decoded_max_bytes": 10485760,
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_images_per_array": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "images[].image_url",
                "required": false,
                "type": "string",
                "when": "Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer."
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image",
                "required": false,
                "type": "file",
                "when": "generering med multipart/form-data"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "maximum_items": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image[]",
                "required": false,
                "type": "file[]",
                "when": "generering med multipart/form-data"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "images[].file_id",
              "mask.file_id",
              "mask",
              "stream=true",
              "mask input is rejected by this Alibaba adapter"
            ]
          },
          "hints": [
            "Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "det faktisk returnerede task_id eller posten i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "operation_modes": [
            "images"
          ],
          "output": {
            "family": [
              "image"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: \"${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}\"\nexport AILOOT_PROMPT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"qwen-image\", \"prompt\": \"\"}')\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 brief\")\np['prompt']=f.read_text(encoding=\"utf-8\")\nif not p['prompt'].strip():raise SystemExit(\"Brief must contain text\")\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "Create and save every image",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Set your actual UTF-8 image brief file\")\nrequest={'model': 'qwen-image', 'prompt': ''}\nrequest[\"prompt\"]=f.read_text(encoding=\"utf-8\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · save all image outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"qwen-image\", \"prompt\": \"\"};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(\"Set your actual UTF-8 image brief file\");\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,\"utf8\");\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  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\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · save all image outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Billeder",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 0.003,
                "amount_unit": "usd_per_display_unit",
                "key": "image_input",
                "label": "per input image",
                "side": "in"
              },
              {
                "amount": 0.04,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_1k",
                "label": "per 1K image",
                "side": "out"
              },
              {
                "amount": 0.075,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_2k",
                "label": "per 2K image",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "qwen-image",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "conditional",
        "units": [
          {
            "key": "image_input",
            "label": "per input image",
            "side": "in",
            "usd": 0.003
          },
          {
            "key": "image_output_1k",
            "label": "per 1K image",
            "side": "out",
            "usd": 0.04
          },
          {
            "key": "image_output_2k",
            "label": "per 2K image",
            "side": "out",
            "usd": 0.075
          }
        ]
      }
    },
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">Al</span><h2 id=\"sheet-title\">qwen-image-3.0-pro</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Luk\">×</button></div><div class=\"idline\"><span>Alibaba /</span><code>qwen-image-latest</code><button type=\"button\" id=\"copy-id\">Kopiér ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Modelkortets afsnit\"><button type=\"button\" data-card-jump=\"overview\">Start</button><button type=\"button\" data-card-jump=\"methods\">Input og metoder</button><button type=\"button\" data-card-jump=\"pricing\">Priser</button><button type=\"button\" data-card-jump=\"examples\">Eksempler</button><button type=\"button\" data-card-jump=\"results\">Resultater</button><button type=\"button\" data-card-jump=\"aliases\">Aliaser</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API-metoder\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Core|images|/v1/images/generations|qwen-image-latest\">Billeder</button></div><div class=\"idline\"><label for=\"card-model-id\">Model-ID</label><select class=\"sel\" id=\"card-model-id\" style=\"min-width:0;max-width:100%\"><option value=\"Core|images|/v1/images/generations|qwen-image-3.0-pro\">qwen-image-3.0-pro</option><option value=\"Core|images|/v1/images/generations|qwen-image\">qwen-image</option><option value=\"Core|images|/v1/images/generations|qwen-image-latest\" selected>qwen-image-latest</option></select></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Start</h3><p class=\"mdesc-full\">Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.</p><dl class=\"card-io\" data-card-io><div><dt>Accepterede input</dt><dd>Tekst</dd></div><div><dt>Resultater</dt><dd>Billeder</dd></div></dl><details class=\"card-about\"><summary>Om modellen</summary><p class=\"note-s\" data-model-method-boundary>Denne beskrivelse dækker modellens funktioner. Tilgængelige input, output og indstillinger i Ailoot står nedenfor for den valgte metode.</p><div class=\"mabout\" id=\"m-about\"><p>Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.</p><h4>Tekst og detaljer i billedet</h4><p>Producenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.</p><p>Qwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.</p><h4>Redigering i Alibabas specifikation</h4><p>Til redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.</p><p>Producentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.</p><p>Producentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Tilgængelig i Ailoot · input og metoder</h3><details class=\"card-method\" open><summary><b>Ailoot · Billeder</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Inputtyper</dt><dd><code>text</code></dd></div><div><dt>Outputtyper</dt><dd><code>image</code></dd></div><div><dt>Outputformat</dt><dd>Billedfil</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Felt</th><th>Type</th><th>Krav</th><th>Værdier og grænser</th><th>Standard</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>qwen-image-latest</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Påkrævet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Minimumslængde: 1</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">n</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Minimum: 1</div></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>1</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">response_format</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>url, b64_json</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">stream</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>boolean</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span></td><td data-cell-label=\"Standard\" data-default=\"known\"><span class=\"card-cell-label\">Standard</span>false</td></tr><tr data-parameter-availability=\"model_dependent\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">size</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div class=\"note-s\">Afhænger af modellen</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"model_dependent\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">partial_images</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>integer</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div class=\"note-s\">Afhænger af modellen</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"different_method\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">images[].image_url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>string</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Ikke understøttet</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Maksimalt antal billeder pr. array: 3</div><div>Betingelser: Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.</div><div>Gælder når: Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer.</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">image</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>file</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Gælder når: generering med multipart/form-data</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">image[]</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span><code>file[]</code></td><td data-cell-label=\"Krav\"><span class=\"card-cell-label\">Krav</span>Valgfrit</td><td data-cell-label=\"Værdier og grænser\"><span class=\"card-cell-label\">Værdier og grænser</span><div>Maksimalt antal elementer: 3</div><div>Maksimalt antal afkodede bytes: 10.485.760</div><div>MIME-typer: image/png, image/jpeg</div><div>Gælder når: generering med multipart/form-data</div></td><td data-cell-label=\"Standard\" data-default=\"unspecified\"><span class=\"card-cell-label\">Standard</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Kombinationer af inputmaterialer</summary><p class=\"note-s\"><b>Tekst til billede</b> · Påkrævet: prompt</p><p class=\"note-s\"><b>reference_images_generation</b> · Påkrævet: prompt</p></details><details class=\"note-s\" data-method-contract><summary>Metodeparametre og livscyklus</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Parameter</th><th>Kontrakt</th></tr></thead><tbody><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>material_types</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>text</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>required</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>model, prompt</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>optional_controls</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>null</td></tr><tr><th data-cell-label=\"Parameter\" scope=\"row\"><span class=\"card-cell-label\">Parameter</span><code>content_type</code></th><td data-cell-label=\"Kontrakt\"><span class=\"card-cell-label\">Kontrakt</span>application/json</td></tr></tbody></table></div><p>Livscyklus: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · det faktisk returnerede task_id eller posten i mediebiblioteket</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Priser</h3><h4>Ailoot-metodetakster</h4><section class=\"meth\" data-route=\"Core\"><header><b><span class=\"alias\">Ailoot</span> Billeder</b><code>POST /v1/images/generations</code></header><dl><div><dt>Input</dt><dd>0,003 US$ <em>pr. inputbillede</em></dd></div><div><dt>Output</dt><dd>0,04 US$ <em>pr. 1K-billede</em></dd></div><div><dt>Output</dt><dd>0,075 US$ <em>pr. 2K-billede</em></dd></div></dl></section><p class=\"note-s\">Ailoot reserverer et estimeret beløb før en anmodning. Efter resultatet afregnes det endelige beløb ud fra det målte forbrug. Ved streaming bruges den endelige forbrugsregistrering til afregningen. <a href=\"/docs/da/billing/reserve/\">Sådan fungerer reservation og afregning →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Eksempelanmodninger</h3><h4>Ailoot · Billeder</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Kodevarianter\"><button class=\"cg-tab\" id=\"model-code-46-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-46-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-46-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-46-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK</button><button class=\"cg-tab\" id=\"model-code-46-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-46-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Node.js SDK</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Kopiér kode\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-46-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-46-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: &quot;${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}&quot;\nexport AILOOT_PROMPT_FILE\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;qwen-image-latest&quot;, &quot;prompt&quot;: &quot;&quot;}&#39;)\nf=Path(os.environ[&quot;AILOOT_PROMPT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Choose your actual UTF-8 brief&quot;)\np[&#39;prompt&#39;]=f.read_text(encoding=&quot;utf-8&quot;)\nif not p[&#39;prompt&#39;].strip():raise SystemExit(&quot;Brief must contain text&quot;)\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\nsave_images(json.loads(Path(&quot;result.json&quot;).read_text())[&quot;data&quot;])\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-46-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-46-tab-1\" hidden><pre data-lang=\"python\"><code>from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\n\nf=Path(os.environ[&quot;AILOOT_PROMPT_FILE&quot;])\nif not f.is_file():raise SystemExit(&quot;Set your actual UTF-8 image brief file&quot;)\nrequest={&#39;model&#39;: &#39;qwen-image-latest&#39;, &#39;prompt&#39;: &#39;&#39;}\nrequest[&quot;prompt&quot;]=f.read_text(encoding=&quot;utf-8&quot;)\nclient=OpenAI(base_url=&quot;https://api.ailoot.ai/v1&quot;,api_key=os.environ[&quot;AILOOT_API_KEY&quot;],max_retries=0)\nresult=client.images.generate(**request)\nPath(&quot;sdk-result.txt&quot;).write_text(str(result),encoding=&quot;utf-8&quot;)\nsave_images([{&quot;b64_json&quot;:getattr(item,&quot;b64_json&quot;,None),&quot;url&quot;:getattr(item,&quot;url&quot;,None)} for item in result.data])\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-46-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-46-tab-2\" hidden><pre data-lang=\"js\"><code>import OpenAI from &quot;openai&quot;;\nimport { readFileSync, writeFileSync } from &quot;node:fs&quot;;\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(&quot;Set your actual Ailoot API key&quot;);\nconst client=new OpenAI({baseURL:&quot;https://api.ailoot.ai/v1&quot;,apiKey:key,maxRetries:0});\nconst request={&quot;model&quot;: &quot;qwen-image-latest&quot;, &quot;prompt&quot;: &quot;&quot;};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(&quot;Set your actual UTF-8 image brief file&quot;);\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,&quot;utf8&quot;);\nconst result=await client.images.generate(request);\nwriteFileSync(&quot;sdk-result.json&quot;,JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(&quot;No completed images&quot;);\nfor(let index=0;index&lt;result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||&quot;&quot;,raw;\n  if(!encoded &amp;&amp; uri.startsWith(&quot;data:image/&quot;)) {\n    const comma=uri.indexOf(&quot;,&quot;);if(comma&lt;0 || !uri.slice(0,comma).includes(&quot;;base64&quot;)) throw new Error(&quot;Unsupported image data URI&quot;);\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(&quot;Invalid Base64&quot;);\n    raw=Buffer.from(encoded,&quot;base64&quot;);\n  } else if(uri) {\n    const u=new URL(uri,&quot;https://api.ailoot.ai&quot;);\n    if(u.protocol!==&quot;https:&quot; || u.username || u.password) throw new Error(&quot;Invalid returned URL&quot;);\n    const owned=u.origin===&quot;https://api.ailoot.ai&quot; &amp;&amp; u.pathname.startsWith(&quot;/v1/media/assets/&quot;) &amp;&amp; u.pathname.endsWith(&quot;/content&quot;);\n    const response=await fetch(u,{headers:owned?{Authorization:&quot;Bearer &quot;+key}:{},redirect:&quot;manual&quot;});\n    if(!response.ok) throw new Error(&quot;Image content download failed: &quot;+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(&quot;Image has neither bytes nor URL&quot;);\n  if(!raw.length) throw new Error(&quot;Empty image result&quot;);\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?&quot;png&quot;:raw[0]===255&amp;&amp;raw[1]===216?&quot;jpg&quot;:raw.toString(&quot;ascii&quot;,0,4)===&quot;RIFF&quot;&amp;&amp;raw.toString(&quot;ascii&quot;,8,12)===&quot;WEBP&quot;?&quot;webp&quot;:raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;svg&quot;)||raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;?xml&quot;)?&quot;svg&quot;:&quot;bin&quot;;\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(&quot;Every returned image saved; sdk-result.json retains complete metadata&quot;);\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Hent og gem resultater</h3><h4>Ailoot · Billeder</h4><p class=\"note-s\">Hent hvert returneret billede, eller gem dets Base64-indhold</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Behold alle færdige resultater</h5><p class=\"note-s\">Gem hvert færdigt billede; hent hver returneret URL eller afkod dets Base64-indhold.</p><p class=\"note-s\">Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Hvis det oprindelige svar skal kontrolleres</h5><p class=\"note-s\">Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id.</p></div><details class=\"card-about\" data-output-fields><summary>Svarfelter</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Felt</th><th>Type</th></tr></thead><tbody><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>integer</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>base64 string</td></tr><tr><th data-cell-label=\"Felt\" scope=\"row\"><span class=\"card-cell-label\">Felt</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Type\" data-field-type><span class=\"card-cell-label\">Type</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Fejl og næste trin</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Svar</th><th>Betingelse</th><th>Næste trin</th></tr></thead><tbody><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Ret de angivne felter før en ny oprettelsesanmodning.</td></tr><tr><th data-cell-label=\"Svar\" scope=\"row\"><span class=\"card-cell-label\">Svar</span><code>server_error</code></th><td data-cell-label=\"Betingelse\"><span class=\"card-cell-label\">Betingelse</span>Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres</td><td data-cell-label=\"Næste trin\"><span class=\"card-cell-label\">Næste trin</span>Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Aliaser</h3><h4>Modelaliaser</h4><p class=\"note-s\"><span data-model-alias-route=\"Core\"><b>Ailoot</b> <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-3.0-pro&amp;fmt=images\"><code>qwen-image-3.0-pro</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image&amp;fmt=images\"><code>qwen-image</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-latest&amp;fmt=images\"><code>qwen-image-latest</code></a></span></p><h4>Aliaser for metodestier</h4><p class=\"note-s\">Brug metodestierne vist ovenfor.</p><h4>Relaterede kalder-ID’er</h4><p class=\"note-s\"><a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-3.0-pro&amp;fmt=images\"><code>qwen-image-3.0-pro</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image&amp;fmt=images\"><code>qwen-image</code></a>, <a href=\"#m=qwen-image-3.0-pro&amp;route=Core&amp;caller=qwen-image-latest&amp;fmt=images\"><code>qwen-image-latest</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "qwen-image-latest",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "qwen-image-latest",
        "route_label": "Core"
      },
      "method_key": "Core|images|/v1/images/generations|qwen-image-latest",
      "ordinal": 2,
      "rawMethod": {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Save every data item. Decode each b64_json or fetch every returned signed URL. Select a filename extension from the actual MIME/bytes.",
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres",
                "http_status": null,
                "recovery": "Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.",
                "type": "server_error"
              }
            ],
            "hints": [
              "Qwen defaultsize1024*1024; Wan defaultsize1K. Wan2.7 Pro4K is supported only without reference inputs.",
              "Explicit dimensions must be positive, at most4096 peraxis, within8:1..1:8 aspect, and the exact model/input area range.",
              "The Alibaba image adapter rejects mask input and streaming before sending the request.",
              "For this generation method, actual image references are supported as multipart image files. JSONimages[].image_url is read only on images/edits; the leaf value is a string."
            ],
            "ignored_fields": [
              "quality",
              "background",
              "style",
              "output_format",
              "output_compression",
              "moderation",
              "input_fidelity",
              "partial_images without streaming"
            ],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "ignored_reference_field": "JSONgeneration images[] is not parsed; images[].image_url belongs to a separately supported JSONedit profile.",
                "mask": false,
                "mode": "text_to_image",
                "reference_images": false,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt"
                ]
              },
              {
                "content_type": "multipart/form-data",
                "mask": false,
                "maximum_decoded_bytes_per_image": 10485760,
                "maximum_reference_images": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "minimum_reference_images": 0,
                "mode": "reference_images_generation",
                "optional_file_fields": [
                  "image",
                  "image[]",
                  "image[index]"
                ],
                "reference_images": true,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt",
                  "actual PNG/JPEG file references"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_image",
              "reference_images_generation_via_multipart"
            ],
            "outputs": {
              "all_results": "Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameter_conditions": {
              "size": {
                "aspect_ratio_range": [
                  "1:8",
                  "8:1"
                ],
                "default": "1024*1024",
                "max_area_4k_condition": "WanPro and no inputimages",
                "max_dimension": 4096,
                "maximum_area": 4194304,
                "minimum_area": 262144
              }
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "qwen-image-latest"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": 1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "url",
                  "b64_json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "size",
                "required": false,
                "type": "string"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "partial_images",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "different_method",
                "conditions": "Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.",
                "decoded_max_bytes": 10485760,
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_images_per_array": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "images[].image_url",
                "required": false,
                "type": "string",
                "when": "Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer."
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image",
                "required": false,
                "type": "file",
                "when": "generering med multipart/form-data"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "maximum_items": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image[]",
                "required": false,
                "type": "file[]",
                "when": "generering med multipart/form-data"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "images[].file_id",
              "mask.file_id",
              "mask",
              "stream=true",
              "mask input is rejected by this Alibaba adapter"
            ]
          },
          "hints": [
            "Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "det faktisk returnerede task_id eller posten i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "operation_modes": [
            "images"
          ],
          "output": {
            "family": [
              "image"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: \"${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}\"\nexport AILOOT_PROMPT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"qwen-image-latest\", \"prompt\": \"\"}')\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 brief\")\np['prompt']=f.read_text(encoding=\"utf-8\")\nif not p['prompt'].strip():raise SystemExit(\"Brief must contain text\")\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "Create and save every image",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Set your actual UTF-8 image brief file\")\nrequest={'model': 'qwen-image-latest', 'prompt': ''}\nrequest[\"prompt\"]=f.read_text(encoding=\"utf-8\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · save all image outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"qwen-image-latest\", \"prompt\": \"\"};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(\"Set your actual UTF-8 image brief file\");\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,\"utf8\");\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  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\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · save all image outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Billeder",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 0.003,
                "amount_unit": "usd_per_display_unit",
                "key": "image_input",
                "label": "per input image",
                "side": "in"
              },
              {
                "amount": 0.04,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_1k",
                "label": "per 1K image",
                "side": "out"
              },
              {
                "amount": 0.075,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_2k",
                "label": "per 2K image",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "qwen-image-latest",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "conditional",
        "units": [
          {
            "key": "image_input",
            "label": "per input image",
            "side": "in",
            "usd": 0.003
          },
          {
            "key": "image_output_1k",
            "label": "per 1K image",
            "side": "out",
            "usd": 0.04
          },
          {
            "key": "image_output_2k",
            "label": "per 2K image",
            "side": "out",
            "usd": 0.075
          }
        ]
      }
    }
  ],
  "model_id": "qwen-image-3.0-pro",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "37cae7b6873f219551726c812d8131b2fb66763cb99717133c64b8406201e2aa",
    "input_html_sha256": "2a1c5f27b0b5699810c6724ae3af919b4a23de232060cd92eb4f1b9d84f8dca4",
    "private_audit_sha256": "b835095aa28a04ed96c097eed3ed598610ed4033cea6f12e843be76b59544b0c",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/da/qwen-image-3-0-pro/",
    "description": "Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.",
    "locale": "da",
    "md_url": "https://ailoot.ai/models/da/qwen-image-3-0-pro/index.md",
    "title": "qwen-image-3.0-pro — Ailoot",
    "url": "https://ailoot.ai/models/da/qwen-image-3-0-pro/"
  },
  "rawModel": {
    "about": "Qwen-Image-3.0-Pro er en model fra Alibaba til at skabe og redigere billeder, hvor komposition, tekster og små detaljer er vigtige. Blandt anvendelserne er tætte layouts, billeder i billeder, avislayout, storyboards, menuer og arbejdsark til undervisning. Det aktuelle Ailoot-kort viser billedgenerering ud fra en tekstinstruktion. Alibaba beskriver også redigering og arbejde med referencebilleder; disse operationer kræver særskilt understøttelse af inputbilleder og er ikke repræsenteret af kortets aktuelle metode.\n\n### Tekst og detaljer i billedet\n\nProducenten fremhæver lange instruktioner på op til 4,5 tusind tokens, tekster på 12 sprog og arbejde med flere skrifttyper. Det er en beskrevet mulighed for behandling af instruktionen, ikke en offentliggjort størrelse på det formelle kontekstvindue. Blandt de angivne egenskaber er gengivelse af små tekster på 10 pixels, hud- og hårstruktur samt små ændringer i ansigtsudtryk. Sådanne detaljer er nyttige til materiale, der skal ses tæt på.\n\nQwen-Image-3.0-Pro er også beregnet til visuelle koncepter til websider, spil og skærmbilleder til livestreams. Resultatet kan kombinere illustration, skærmstruktur og formaterede tekster. Modellen skaber et billede af layoutet; en fungerende applikation kræver en særskilt implementering.\n\n### Redigering i Alibabas specifikation\n\nTil redigering angiver Alibaba fra ét til tre billeder. I denne arbejdsmåde kan et objekt knyttes til en references nummer, og kombinationen af materialer beskrives. Der er mulighed for at tilføje, slette og flytte objekter samt ændre handling, stil, detaljer og tekst. En negativ beskrivelse hjælper med at angive uønskede elementer.\n\nProducentens redigeringstilstand accepterer inputmateriale i JPG, JPEG, PNG, BMP, TIFF, WEBP og GIF. For animeret GIF bruges første frame. Hver fil kan være op til 10 MB; producenten anbefaler billeder med sider fra 384 til 3072 pixels. Det er anbefalinger til input, ikke det færdige resultats dimensioner.\n\nProducentens specifikation beskriver fra ét til seks outputbilleder i PNG pr. forespørgsel. Resultatets areal kan være fra 262 144 til 4 194 304 pixels, svarende til kvadratiske billeder fra 512 × 512 til 2048 × 2048. Billedformater fra 1:8 til 8:1 accepteres, så ved en aflang komposition afhænger sidelængden også af den valgte billedform. Yderligere bearbejdning af instruktionen før generering er mulig.",
    "alias_of": null,
    "aliases": [
      "qwen-image",
      "qwen-image-latest"
    ],
    "author": "Alibaba",
    "ctx": null,
    "formats": [
      "images"
    ],
    "id": "qwen-image-3.0-pro",
    "input": [
      "text"
    ],
    "kind": "image",
    "max_out": null,
    "methods": [
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Save every data item. Decode each b64_json or fetch every returned signed URL. Select a filename extension from the actual MIME/bytes.",
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres",
                "http_status": null,
                "recovery": "Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.",
                "type": "server_error"
              }
            ],
            "hints": [
              "Qwen defaultsize1024*1024; Wan defaultsize1K. Wan2.7 Pro4K is supported only without reference inputs.",
              "Explicit dimensions must be positive, at most4096 peraxis, within8:1..1:8 aspect, and the exact model/input area range.",
              "The Alibaba image adapter rejects mask input and streaming before sending the request.",
              "For this generation method, actual image references are supported as multipart image files. JSONimages[].image_url is read only on images/edits; the leaf value is a string."
            ],
            "ignored_fields": [
              "quality",
              "background",
              "style",
              "output_format",
              "output_compression",
              "moderation",
              "input_fidelity",
              "partial_images without streaming"
            ],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "ignored_reference_field": "JSONgeneration images[] is not parsed; images[].image_url belongs to a separately supported JSONedit profile.",
                "mask": false,
                "mode": "text_to_image",
                "reference_images": false,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt"
                ]
              },
              {
                "content_type": "multipart/form-data",
                "mask": false,
                "maximum_decoded_bytes_per_image": 10485760,
                "maximum_reference_images": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "minimum_reference_images": 0,
                "mode": "reference_images_generation",
                "optional_file_fields": [
                  "image",
                  "image[]",
                  "image[index]"
                ],
                "reference_images": true,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt",
                  "actual PNG/JPEG file references"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_image",
              "reference_images_generation_via_multipart"
            ],
            "outputs": {
              "all_results": "Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameter_conditions": {
              "size": {
                "aspect_ratio_range": [
                  "1:8",
                  "8:1"
                ],
                "default": "1024*1024",
                "max_area_4k_condition": "WanPro and no inputimages",
                "max_dimension": 4096,
                "maximum_area": 4194304,
                "minimum_area": 262144
              }
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "qwen-image-3.0-pro"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": 1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "url",
                  "b64_json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "size",
                "required": false,
                "type": "string"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "partial_images",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "different_method",
                "conditions": "Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.",
                "decoded_max_bytes": 10485760,
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_images_per_array": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "images[].image_url",
                "required": false,
                "type": "string",
                "when": "Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer."
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image",
                "required": false,
                "type": "file",
                "when": "generering med multipart/form-data"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "maximum_items": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image[]",
                "required": false,
                "type": "file[]",
                "when": "generering med multipart/form-data"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "images[].file_id",
              "mask.file_id",
              "mask",
              "stream=true",
              "mask input is rejected by this Alibaba adapter"
            ]
          },
          "hints": [
            "Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "det faktisk returnerede task_id eller posten i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "operation_modes": [
            "images"
          ],
          "output": {
            "family": [
              "image"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: \"${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}\"\nexport AILOOT_PROMPT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"qwen-image-3.0-pro\", \"prompt\": \"\"}')\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 brief\")\np['prompt']=f.read_text(encoding=\"utf-8\")\nif not p['prompt'].strip():raise SystemExit(\"Brief must contain text\")\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "Create and save every image",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Set your actual UTF-8 image brief file\")\nrequest={'model': 'qwen-image-3.0-pro', 'prompt': ''}\nrequest[\"prompt\"]=f.read_text(encoding=\"utf-8\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · save all image outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"qwen-image-3.0-pro\", \"prompt\": \"\"};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(\"Set your actual UTF-8 image brief file\");\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,\"utf8\");\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  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\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · save all image outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Billeder",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 0.003,
                "amount_unit": "usd_per_display_unit",
                "key": "image_input",
                "label": "per input image",
                "side": "in"
              },
              {
                "amount": 0.04,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_1k",
                "label": "per 1K image",
                "side": "out"
              },
              {
                "amount": 0.075,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_2k",
                "label": "per 2K image",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "qwen-image-3.0-pro",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "conditional",
        "units": [
          {
            "key": "image_input",
            "label": "per input image",
            "side": "in",
            "usd": 0.003
          },
          {
            "key": "image_output_1k",
            "label": "per 1K image",
            "side": "out",
            "usd": 0.04
          },
          {
            "key": "image_output_2k",
            "label": "per 2K image",
            "side": "out",
            "usd": 0.075
          }
        ]
      },
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Save every data item. Decode each b64_json or fetch every returned signed URL. Select a filename extension from the actual MIME/bytes.",
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres",
                "http_status": null,
                "recovery": "Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.",
                "type": "server_error"
              }
            ],
            "hints": [
              "Qwen defaultsize1024*1024; Wan defaultsize1K. Wan2.7 Pro4K is supported only without reference inputs.",
              "Explicit dimensions must be positive, at most4096 peraxis, within8:1..1:8 aspect, and the exact model/input area range.",
              "The Alibaba image adapter rejects mask input and streaming before sending the request.",
              "For this generation method, actual image references are supported as multipart image files. JSONimages[].image_url is read only on images/edits; the leaf value is a string."
            ],
            "ignored_fields": [
              "quality",
              "background",
              "style",
              "output_format",
              "output_compression",
              "moderation",
              "input_fidelity",
              "partial_images without streaming"
            ],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "ignored_reference_field": "JSONgeneration images[] is not parsed; images[].image_url belongs to a separately supported JSONedit profile.",
                "mask": false,
                "mode": "text_to_image",
                "reference_images": false,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt"
                ]
              },
              {
                "content_type": "multipart/form-data",
                "mask": false,
                "maximum_decoded_bytes_per_image": 10485760,
                "maximum_reference_images": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "minimum_reference_images": 0,
                "mode": "reference_images_generation",
                "optional_file_fields": [
                  "image",
                  "image[]",
                  "image[index]"
                ],
                "reference_images": true,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt",
                  "actual PNG/JPEG file references"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_image",
              "reference_images_generation_via_multipart"
            ],
            "outputs": {
              "all_results": "Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameter_conditions": {
              "size": {
                "aspect_ratio_range": [
                  "1:8",
                  "8:1"
                ],
                "default": "1024*1024",
                "max_area_4k_condition": "WanPro and no inputimages",
                "max_dimension": 4096,
                "maximum_area": 4194304,
                "minimum_area": 262144
              }
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "qwen-image"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": 1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "url",
                  "b64_json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "size",
                "required": false,
                "type": "string"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "partial_images",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "different_method",
                "conditions": "Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.",
                "decoded_max_bytes": 10485760,
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_images_per_array": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "images[].image_url",
                "required": false,
                "type": "string",
                "when": "Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer."
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image",
                "required": false,
                "type": "file",
                "when": "generering med multipart/form-data"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "maximum_items": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image[]",
                "required": false,
                "type": "file[]",
                "when": "generering med multipart/form-data"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "images[].file_id",
              "mask.file_id",
              "mask",
              "stream=true",
              "mask input is rejected by this Alibaba adapter"
            ]
          },
          "hints": [
            "Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "det faktisk returnerede task_id eller posten i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "operation_modes": [
            "images"
          ],
          "output": {
            "family": [
              "image"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: \"${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}\"\nexport AILOOT_PROMPT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"qwen-image\", \"prompt\": \"\"}')\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 brief\")\np['prompt']=f.read_text(encoding=\"utf-8\")\nif not p['prompt'].strip():raise SystemExit(\"Brief must contain text\")\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "Create and save every image",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Set your actual UTF-8 image brief file\")\nrequest={'model': 'qwen-image', 'prompt': ''}\nrequest[\"prompt\"]=f.read_text(encoding=\"utf-8\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · save all image outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"qwen-image\", \"prompt\": \"\"};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(\"Set your actual UTF-8 image brief file\");\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,\"utf8\");\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  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\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · save all image outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Billeder",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 0.003,
                "amount_unit": "usd_per_display_unit",
                "key": "image_input",
                "label": "per input image",
                "side": "in"
              },
              {
                "amount": 0.04,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_1k",
                "label": "per 1K image",
                "side": "out"
              },
              {
                "amount": 0.075,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_2k",
                "label": "per 2K image",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "qwen-image",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "conditional",
        "units": [
          {
            "key": "image_input",
            "label": "per input image",
            "side": "in",
            "usd": 0.003
          },
          {
            "key": "image_output_1k",
            "label": "per 1K image",
            "side": "out",
            "usd": 0.04
          },
          {
            "key": "image_output_2k",
            "label": "per 2K image",
            "side": "out",
            "usd": 0.075
          }
        ]
      },
      {
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "cache_write_5m": null,
        "conditional_meter": null,
        "contract": {
          "data": {
            "all_results": "Save every data item. Decode each b64_json or fetch every returned signed URL. Select a filename extension from the actual MIME/bytes.",
            "errors": [
              {
                "code": null,
                "condition": "Ugyldige obligatoriske felter, materialerepræsentation eller parameterværdi",
                "http_status": 400,
                "recovery": "Ret de angivne felter før en ny oprettelsesanmodning.",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "Det returnerede svar angiver, at operationen eller resultatet skal kontrolleres",
                "http_status": null,
                "recovery": "Gem det oprindeligt returnerede operations-/opgave-ID, anmodningens headere og svaret; fortsæt med de understøttede læseanmodninger for den oprindelige operation. Send ikke oprettelsesanmodningen igen.",
                "type": "server_error"
              }
            ],
            "hints": [
              "Qwen defaultsize1024*1024; Wan defaultsize1K. Wan2.7 Pro4K is supported only without reference inputs.",
              "Explicit dimensions must be positive, at most4096 peraxis, within8:1..1:8 aspect, and the exact model/input area range.",
              "The Alibaba image adapter rejects mask input and streaming before sending the request.",
              "For this generation method, actual image references are supported as multipart image files. JSONimages[].image_url is read only on images/edits; the leaf value is a string."
            ],
            "ignored_fields": [
              "quality",
              "background",
              "style",
              "output_format",
              "output_compression",
              "moderation",
              "input_fidelity",
              "partial_images without streaming"
            ],
            "lifecycle": {
              "all_results": "Follow everyactualreturnedoutputandownedasset; no result is discardedbecauseindex0orcontent_urlalreadyexists.",
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "Hvis resultatet af en billedgenerering eller -redigering skal kontrolleres, skal du gemme det oprindelige operation_id/X-Client-Request-ID og de returnerede resultatoplysninger. Hent eksisterende resultater, som du ejer, via mediebiblioteket med de faktiske task_id- eller asset_id-værdier. Send ikke anmodningen om generering/redigering igen, og opbyg ikke en polling-URL ud fra operation_id."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "ignored_reference_field": "JSONgeneration images[] is not parsed; images[].image_url belongs to a separately supported JSONedit profile.",
                "mask": false,
                "mode": "text_to_image",
                "reference_images": false,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt"
                ]
              },
              {
                "content_type": "multipart/form-data",
                "mask": false,
                "maximum_decoded_bytes_per_image": 10485760,
                "maximum_reference_images": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "minimum_reference_images": 0,
                "mode": "reference_images_generation",
                "optional_file_fields": [
                  "image",
                  "image[]",
                  "image[index]"
                ],
                "reference_images": true,
                "required": [
                  "prompt"
                ],
                "supplied_materials": [
                  "UTF8 prompt",
                  "actual PNG/JPEG file references"
                ]
              }
            ],
            "media_library": {
              "asset": {
                "fields": [
                  {
                    "description": null,
                    "name": "asset_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "task_id",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "output_key",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "family",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "model",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "method",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "status",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "content_type",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "sha256",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "size_bytes",
                    "type": "integer"
                  },
                  {
                    "description": null,
                    "name": "content_url",
                    "type": "string"
                  }
                ],
                "http": "GET",
                "id_source": "actual returned asset_id",
                "path": "/v1/media/assets/{asset_id}"
              },
              "content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "range_header_supported": true,
                "url_source": "Use exact returned signed content_url including its token; do not construct a token."
              },
              "expired_link": {
                "code": "link_expired",
                "http_status": 404,
                "recovery": "Read the asset again to obtain its refreshed signed content_url, then fetch that URL. Do not regenerate."
              },
              "list": {
                "all_pages": "Follow every returned next_cursor, then select records by their actual task_id/output_key.",
                "http": "GET",
                "output_fields": [
                  {
                    "description": null,
                    "name": "object",
                    "type": "string"
                  },
                  {
                    "description": null,
                    "name": "data",
                    "type": "asset[]"
                  },
                  {
                    "description": null,
                    "name": "next_cursor",
                    "type": "string|null"
                  }
                ],
                "parameters": [
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "family",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": null,
                    "default_known": false,
                    "enum": null,
                    "enum_known": false,
                    "name": "cursor",
                    "required": false,
                    "type": "string"
                  },
                  {
                    "availability": "source_interface",
                    "default": 20,
                    "default_known": true,
                    "enum": null,
                    "enum_known": false,
                    "maximum": 100,
                    "minimum": 1,
                    "name": "limit",
                    "required": false,
                    "type": "integer"
                  }
                ],
                "path": "/v1/media/assets"
              },
              "revoke": {
                "http": "DELETE",
                "meaning": "Revokes/deletes the existing owned file; this is not generation cancellation.",
                "path": "/v1/media/assets/{asset_id}",
                "pending_status": "revoking",
                "success_statuses": [
                  202,
                  204
                ]
              },
              "task": {
                "http": "GET",
                "id_source": "actual returned task_id or media library record; operation_id is not task_id",
                "path": "/v1/media/tasks/{task_id}"
              }
            },
            "operation_modes": [
              "text_to_image",
              "reference_images_generation_via_multipart"
            ],
            "outputs": {
              "all_results": "Gem hvert dataelement. Afkod hver b64_json, eller hent hver returneret signeret URL. Vælg filtypenavnet ud fra den faktiske MIME-type eller de faktiske bytes.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameter_conditions": {
              "size": {
                "aspect_ratio_range": [
                  "1:8",
                  "8:1"
                ],
                "default": "1024*1024",
                "max_area_4k_condition": "WanPro and no inputimages",
                "max_dimension": 4096,
                "maximum_area": 4194304,
                "minimum_area": 262144
              }
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "qwen-image-latest"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": 1,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "url",
                  "b64_json"
                ],
                "enum_known": true,
                "name": "response_format",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": false,
                "default_known": true,
                "enum": null,
                "enum_known": false,
                "name": "stream",
                "required": false,
                "type": "boolean"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "size",
                "required": false,
                "type": "string"
              },
              {
                "availability": "model_dependent",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "partial_images",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "different_method",
                "conditions": "Én faktisk URL pr. images[]-objekt. Antallet i arrayet er noget andet end denne strengværdi på bladniveau.",
                "decoded_max_bytes": 10485760,
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_images_per_array": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "images[].image_url",
                "required": false,
                "type": "string",
                "when": "Kun JSON images/edits; JSON images/generations fortolker ikke images-referencer."
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image",
                "required": false,
                "type": "file",
                "when": "generering med multipart/form-data"
              },
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum_decoded_bytes": 10485760,
                "maximum_items": 3,
                "mime_types": [
                  "image/png",
                  "image/jpeg"
                ],
                "name": "image[]",
                "required": false,
                "type": "file[]",
                "when": "generering med multipart/form-data"
              }
            ],
            "profile_binding": "Exact existing Ailoot model and method; interface constraints below do not assert provider qualification.",
            "unsupported": [
              "images[].file_id",
              "mask.file_id",
              "mask",
              "stream=true",
              "mask input is rejected by this Alibaba adapter"
            ]
          },
          "hints": [
            "Metodernes strukturer og ID’er er præcise; leverandørens muligheder er adskilt fra adgangstilladelse."
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional_controls": null,
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "det faktisk returnerede task_id eller posten i mediebiblioteket",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "operation_modes": [
            "images"
          ],
          "output": {
            "family": [
              "image"
            ],
            "format": null,
            "multioutputs": "retain every actual response output"
          }
        },
        "ctx": null,
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\nexport AILOOT_API_KEY\n: \"${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}\"\nexport AILOOT_PROMPT_FILE\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"qwen-image-latest\", \"prompt\": \"\"}')\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Choose your actual UTF-8 brief\")\np['prompt']=f.read_text(encoding=\"utf-8\")\nif not p['prompt'].strip():raise SystemExit(\"Brief must contain text\")\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "Create and save every image",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        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\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nf=Path(os.environ[\"AILOOT_PROMPT_FILE\"])\nif not f.is_file():raise SystemExit(\"Set your actual UTF-8 image brief file\")\nrequest={'model': 'qwen-image-latest', 'prompt': ''}\nrequest[\"prompt\"]=f.read_text(encoding=\"utf-8\")\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · save all image outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"qwen-image-latest\", \"prompt\": \"\"};\nif(!process.env.AILOOT_PROMPT_FILE)throw new Error(\"Set your actual UTF-8 image brief file\");\nrequest.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,\"utf8\");\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  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\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · save all image outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "http": "POST",
        "img_in": null,
        "img_out": null,
        "in": null,
        "input": [
          "text"
        ],
        "label": "Billeder",
        "max_out": null,
        "max_tool_calls": null,
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "pricing_profiles": [
          {
            "dimensions": {},
            "label": "Core",
            "units": [
              {
                "amount": 0.003,
                "amount_unit": "usd_per_display_unit",
                "key": "image_input",
                "label": "per input image",
                "side": "in"
              },
              {
                "amount": 0.04,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_1k",
                "label": "per 1K image",
                "side": "out"
              },
              {
                "amount": 0.075,
                "amount_unit": "usd_per_display_unit",
                "key": "image_output_2k",
                "label": "per 2K image",
                "side": "out"
              }
            ]
          }
        ],
        "request_model_id": "qwen-image-latest",
        "route_label": "Core",
        "status_reads": [],
        "tiers": [],
        "tool_prices": null,
        "unit": "conditional",
        "units": [
          {
            "key": "image_input",
            "label": "per input image",
            "side": "in",
            "usd": 0.003
          },
          {
            "key": "image_output_1k",
            "label": "per 1K image",
            "side": "out",
            "usd": 0.04
          },
          {
            "key": "image_output_2k",
            "label": "per 2K image",
            "side": "out",
            "usd": 0.075
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "qwen-image-3.0-pro",
        "request_model_id": "qwen-image-3.0-pro",
        "route_label": "Core"
      },
      {
        "canonical_model_id": "qwen-image-3.0-pro",
        "request_model_id": "qwen-image",
        "route_label": "Core"
      },
      {
        "canonical_model_id": "qwen-image-3.0-pro",
        "request_model_id": "qwen-image-latest",
        "route_label": "Core"
      }
    ],
    "name": "qwen-image-3.0-pro",
    "price": {
      "in": 0.003,
      "in_label": "per input image",
      "out": 0.04,
      "out_label": "per 1K image",
      "sort_in": null,
      "sort_out": null,
      "varies": false
    },
    "short": "Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        },
        {
          "contract_json_pointer": "/methods/1/rawMethod/contract",
          "html_json_pointer": "/methods/1/html",
          "method_ordinal": 1
        },
        {
          "contract_json_pointer": "/methods/2/rawMethod/contract",
          "html_json_pointer": "/methods/2/html",
          "method_ordinal": 2
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod",
        "/methods/1/rawMethod",
        "/methods/2/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Model til billedgenerering ud fra tekst med fokus på komplekse layouts, tekster og realistiske detaljer. Egner sig til plakater, storyboards, menuer og materiale med tæt komposition.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "a7b1ea9ea64bc69d955cbb8a7fd56cbca7a403562240c186d11096c4d81184fb",
    "renderer_sha256": "2bf9f26ea9bfd57ed53d867671d8f05b41a6ea85089f48039e3365dc2b92ec2c"
  },
  "sourceRevision": "9e46ae4b2b66955ab293fa0e6e85ad3399045c14481e7eb66e7b8b1737562da1"
}
