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

# wan2.7-image-pro

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

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

نموذج لإنشاء الصور من طلب نصي. يتيح المصنّع التحكم في لوحة الألوان ودقة حتى 4K للتوليد النصي العادي.

- [**Ailoot · الصور** `POST /v1/images/generations` `wan2.7-image-pro`](https://ailoot.ai/models/ar/wan2-7-image-pro/#method-0)
- [**Ailoot · الصور** `POST /v1/images/generations` `wan-image`](https://ailoot.ai/models/ar/wan2-7-image-pro/#method-1)
- [**Ailoot · الصور** `POST /v1/images/generations` `wan-image-latest`](https://ailoot.ai/models/ar/wan2-7-image-pro/#method-2)

عن النموذج

يغطي هذا الوصف قدرات النموذج. وترد أدناه المدخلات والمخرجات والخيارات المتاحة في Ailoot للطريقة المحددة.

Wan2.7-Image-Pro هو نموذج من Alibaba لإنشاء الصور من النص. تنشر بطاقة Ailoot الحالية الإدخال النصي والنتيجة كصورة. يتيح المصنّع أيضًا التحرير ودمج الصور المرجعية والتعديلات الموضعية؛ وهذه الطرق تتطلب دعمًا منفصلًا للصور المدخلة ولا توفرها الطريقة الحالية في البطاقة.

في وضع الصور المرجعية لدى المصنّع يمكن إرسال حتى تسع صور أصلية ووصف العناصر المطلوبة من كل منها. عند التحرير يعمل النموذج على الحفاظ على العنصر الرئيسي ويعدل التفاصيل المحددة أو يجمع تكوينًا جديدًا من مواد متعددة. لتوجيه التعديلات بدقة أكبر، يمكن تحديد حتى منطقتين مستطيلتين في صورة مدخلة واحدة.

#### لوحة الألوان والطلب المعقد

يمكن خارج السلاسل المتتابعة تحديد لوحة من 3–10 ألوان. وضع الاستدلال مخصص للتوليد النصي العادي دون صور مرجعية أو سلسلة متتابعة: يحلل النموذج وصف المشهد مسبقًا.

بحسب مواصفات Alibaba، تشمل المخرجات العادية صورة واحدة إلى أربع صور. في سلسلة قصصية يمكن تعيين حد أعلى حتى 12؛ ويختار النموذج العدد الفعلي وفق الطلب. قد تراعي السلسلة النص والصور المرجعية للحفاظ على صفات مشتركة للشخصيات وتطور مترابط للقصة. لا تُستخدم لوحة الألوان أو الاستدلال في هذا الوضع.

#### الدقة تعتمد على الوضع

يُدعم مستوى 4K في التوليد النصي العادي دون صور مرجعية أو سلسلة متتابعة. يقتصر التحرير بالصور والسلاسل المتتابعة على مستوى 2K. تحدد هذه الترميزات مساحة البكسلات، لا طولًا متساويًا لكل جانب. يمكن اختيار نسبة الإطار من 1:8 إلى 8:1؛ وعند التحرير بدقة محددة مسبقًا تتبع نسبة الأبعاد الصورة المرجعية الأخيرة. تُحفظ النتائج في PNG.

للطرق ذات الصور المدخلة تتيح Alibaba صيغ JPEG وJPG وPNG دون شفافية وBMP وWEBP. الحدود 20 ميغابايت لكل ملف، ومن 240 إلى 8000 بكسل لكل جانب، ونسبة من 1:8 إلى 8:1. يدعم الطلب النصي الصينية والإنجليزية؛ والحد الأقصى 5000 حرف مع حذف الجزء الزائد. لا يتوفر وصف سلبي أو توسيع للطلب في هذا الإصدار. تساعد بذرة العشوائية الابتدائية على الحفاظ على تشابه النسخ، لكنها لا تضمن التكرار الدقيق.

**Ailoot · الصور** `POST /v1/images/generations` `wan2.7-image-pro`

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

Alibaba /`wan2.7-image-pro`

معرّف النموذج ID

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

### البداية

نموذج لإنشاء الصور من طلب نصي. يتيح المصنّع التحكم في لوحة الألوان ودقة حتى 4K للتوليد النصي العادي.

المدخلات المقبولة

النص

النتائج

الصور

### متاح في Ailoot · المدخلات والطرائق

**Ailoot · الصور** `POST /v1/images/generations`

الإدخال

`text`

الإخراج

`image`

صيغة الإخراج

ملف صورة

| الحقل | النوع | المتطلب | القيم والحدود | القيمة الافتراضية |
| --- | --- | --- | --- | --- |
| الحقل`model` | النوع`string` | المتطلبمطلوب | القيم والحدود wan2.7-image-pro | القيمة الافتراضية— |
| الحقل`prompt` | النوع`string` | المتطلبمطلوب | القيم والحدود الحد الأدنى للطول: ⁦1⁩ | القيمة الافتراضية— |
| الحقل`n` | النوع`integer` | المتطلباختياري | القيم والحدود الحد الأدنى: ⁦1⁩ | القيمة الافتراضية⁦1⁩ |
| الحقل`response_format` | النوع`string` | المتطلباختياري | القيم والحدود url, b64\_json | القيمة الافتراضية— |
| الحقل`stream` | النوع`boolean` | المتطلباختياري | القيم والحدود | القيمة الافتراضيةfalse |
| الحقل`size` | النوع`string` | المتطلباختياري | القيم والحدود يعتمد على النموذج | القيمة الافتراضية— |
| الحقل`partial_images` | النوع`integer` | المتطلباختياري | القيم والحدود يعتمد على النموذج | القيمة الافتراضية— |
| الحقل`images[].image_url` | النوع`string` | المتطلبغير مدعوم | القيم والحدود الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg الحد الأقصى للصور في كل مصفوفة: ⁦9⁩ الشروط: عنوان URL فعلي واحد لكل كائن images\[\]. عدد عناصر المصفوفة منفصل عن هذه القيمة النصية الطرفية. ينطبق عندما: خاص بـJSON images/edits فقط؛ لا يحلّل JSON images/generations مراجع images. | القيمة الافتراضية— |
| الحقل`image` | النوع`file` | المتطلباختياري | القيم والحدود الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg ينطبق عندما: توليد باستخدام multipart/form-data | القيمة الافتراضية— |
| الحقل`image[]` | النوع`file[]` | المتطلباختياري | القيم والحدود الحد الأقصى للعناصر: ⁦9⁩ الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg ينطبق عندما: توليد باستخدام multipart/form-data | القيمة الافتراضية— |

تركيبات مواد الإدخال

**تحويل النص إلى صورة** · مطلوب: prompt

**reference\_images\_generation** · مطلوب: prompt

معلمات الطريقة ودورة حياتها

| المعلمة | المواصفات |
| --- | --- |
| المعلمة`material_types` | المواصفاتtext |
| المعلمة`required` | المواصفاتmodel, prompt |
| المعلمة`optional_controls` | المواصفاتnull |
| المعلمة`content_type` | المواصفاتapplication/json |

دورة الحياة: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · قيمة task\_id الفعلية المُعادة أو سجل مكتبة الوسائط

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

`GET /v1/media/assets`

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

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

### الباقات

#### تعرفات طرائق Ailoot

الإخراج

⁦‏0.075 US$⁩ *لكل صورة بدقة 1K*

الإخراج

⁦‏0.075 US$⁩ *لكل صورة بدقة 2K*

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. [كيفية عمل حجز المبلغ وتسوية الرسوم →](https://ailoot.ai/docs/ar/billing/reserve/)

#### تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

wan2.7-image-pro

#### الأسعار حسب الإعدادات

| الإعدادات | شروط الفوترة | الرسوم |
| --- | --- | --- |
| الإعداداتwan2.7-image-pro · الإعداد الافتراضي | شروط الفوترةالإعداد الافتراضي | الرسوم الإدخال · الإدخال **⁦‏0.00 US$⁩** لكل استدعاء الإخراج · الإخراج **⁦‏0.16 US$⁩** لكل استدعاء |

### أمثلة للطلبات

#### Ailoot · الصور

curlPython SDKNode.js SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "wan2.7-image-pro", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

```python
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")

f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'wan2.7-image-pro', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

```js
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "wan2.7-image-pro", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
  const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
  if(!encoded && uri.startsWith("data:image/")) {
    const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
    encoded=uri.slice(comma+1);
  }
  if(encoded) {
    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
    raw=Buffer.from(encoded,"base64");
  } else if(uri) {
    const u=new URL(uri,"https://api.ailoot.ai");
    if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
    const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
    const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
    if(!response.ok) throw new Error("Image content download failed: "+response.status);
    raw=Buffer.from(await response.arrayBuffer());
  } else throw new Error("Image has neither bytes nor URL");
  if(!raw.length) throw new Error("Empty image result");
  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
  writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
```

### استلام النتائج وحفظها

#### Ailoot · الصور

نزّل كل صورة مُرجعة أو احفظ محتواها بصيغة Base64

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

##### الاحتفاظ بكل النتائج المكتملة

احفظ كل صورة مكتملة؛ نزّلها من كل URL مُرجع، أو فك ترميز محتواها بصيغة Base64.

احفظ كل عنصر بيانات. فك ترميز كل b64\_json أو اجلب محتوى كل عنوان URL موقّع مُعاد. اختر امتداد اسم الملف بناءً على نوع MIME والبايتات الفعلية.

##### عند الحاجة إلى التحقق من الاستجابة الأصلية

إذا تطلبت نتيجة توليد صورة أو تعديلها التحقق، فاحتفظ بقيمة operation\_id/X-Client-Request-ID الأصلية ومعلومات النتيجة المُعادة. استعد النتائج الموجودة والمملوكة لك عبر مكتبة الوسائط باستخدام قيم task\_id أو asset\_id الفعلية. لا تُعِد إرسال طلب التوليد أو التعديل، ولا تنشئ عنوان URL للاستعلام الدوري من operation\_id.

حقول الاستجابة

| الحقل | النوع |
| --- | --- |
| الحقل`created` | النوعinteger |
| الحقل`data[].url` | النوعstring |
| الحقل`data[].b64_json` | النوعbase64 string |
| الحقل`usage` | النوعobject |

الأخطاء والخطوات التالية

| الاستجابة | الشرط | الخطوة التالية |
| --- | --- | --- |
| الاستجابة⁦400⁩ · `invalid_request_error` | الشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحة | الخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد. |
| الاستجابة`server_error` | الشرطتشير الاستجابة المُعادة إلى أن العملية أو النتيجة تتطلب التحقق | الخطوة التاليةاحتفظ بمعرّف العملية أو المهمة الأصلي المُعاد، وبترويسات الطلب وبالاستجابة؛ وواصل عمليات القراءة المدعومة لتلك العملية الأصلية. لا تُعِد إرسال طلب الإنشاء. |

### الأسماء البديلة

#### الأسماء البديلة للنموذج

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

#### الأسماء البديلة لمسارات الطرائق

استخدم مسارات الطرائق المعروضة أعلاه.

#### معرّفات النماذج ذات الصلة IDs

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

**Ailoot · الصور** `POST /v1/images/generations` `wan-image`

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

Alibaba /`wan-image`

معرّف النموذج ID

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

### البداية

نموذج لإنشاء الصور من طلب نصي. يتيح المصنّع التحكم في لوحة الألوان ودقة حتى 4K للتوليد النصي العادي.

المدخلات المقبولة

النص

النتائج

الصور

### متاح في Ailoot · المدخلات والطرائق

**Ailoot · الصور** `POST /v1/images/generations`

الإدخال

`text`

الإخراج

`image`

صيغة الإخراج

ملف صورة

| الحقل | النوع | المتطلب | القيم والحدود | القيمة الافتراضية |
| --- | --- | --- | --- | --- |
| الحقل`model` | النوع`string` | المتطلبمطلوب | القيم والحدود wan-image | القيمة الافتراضية— |
| الحقل`prompt` | النوع`string` | المتطلبمطلوب | القيم والحدود الحد الأدنى للطول: ⁦1⁩ | القيمة الافتراضية— |
| الحقل`n` | النوع`integer` | المتطلباختياري | القيم والحدود الحد الأدنى: ⁦1⁩ | القيمة الافتراضية⁦1⁩ |
| الحقل`response_format` | النوع`string` | المتطلباختياري | القيم والحدود url, b64\_json | القيمة الافتراضية— |
| الحقل`stream` | النوع`boolean` | المتطلباختياري | القيم والحدود | القيمة الافتراضيةfalse |
| الحقل`size` | النوع`string` | المتطلباختياري | القيم والحدود يعتمد على النموذج | القيمة الافتراضية— |
| الحقل`partial_images` | النوع`integer` | المتطلباختياري | القيم والحدود يعتمد على النموذج | القيمة الافتراضية— |
| الحقل`images[].image_url` | النوع`string` | المتطلبغير مدعوم | القيم والحدود الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg الحد الأقصى للصور في كل مصفوفة: ⁦9⁩ الشروط: عنوان URL فعلي واحد لكل كائن images\[\]. عدد عناصر المصفوفة منفصل عن هذه القيمة النصية الطرفية. ينطبق عندما: خاص بـJSON images/edits فقط؛ لا يحلّل JSON images/generations مراجع images. | القيمة الافتراضية— |
| الحقل`image` | النوع`file` | المتطلباختياري | القيم والحدود الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg ينطبق عندما: توليد باستخدام multipart/form-data | القيمة الافتراضية— |
| الحقل`image[]` | النوع`file[]` | المتطلباختياري | القيم والحدود الحد الأقصى للعناصر: ⁦9⁩ الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg ينطبق عندما: توليد باستخدام multipart/form-data | القيمة الافتراضية— |

تركيبات مواد الإدخال

**تحويل النص إلى صورة** · مطلوب: prompt

**reference\_images\_generation** · مطلوب: prompt

معلمات الطريقة ودورة حياتها

| المعلمة | المواصفات |
| --- | --- |
| المعلمة`material_types` | المواصفاتtext |
| المعلمة`required` | المواصفاتmodel, prompt |
| المعلمة`optional_controls` | المواصفاتnull |
| المعلمة`content_type` | المواصفاتapplication/json |

دورة الحياة: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · قيمة task\_id الفعلية المُعادة أو سجل مكتبة الوسائط

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

`GET /v1/media/assets`

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

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

### الباقات

#### تعرفات طرائق Ailoot

الإخراج

⁦‏0.075 US$⁩ *لكل صورة بدقة 1K*

الإخراج

⁦‏0.075 US$⁩ *لكل صورة بدقة 2K*

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. [كيفية عمل حجز المبلغ وتسوية الرسوم →](https://ailoot.ai/docs/ar/billing/reserve/)

#### تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

wan2.7-image-pro

#### الأسعار حسب الإعدادات

| الإعدادات | شروط الفوترة | الرسوم |
| --- | --- | --- |
| الإعداداتwan2.7-image-pro · الإعداد الافتراضي | شروط الفوترةالإعداد الافتراضي | الرسوم الإدخال · الإدخال **⁦‏0.00 US$⁩** لكل استدعاء الإخراج · الإخراج **⁦‏0.16 US$⁩** لكل استدعاء |

### أمثلة للطلبات

#### Ailoot · الصور

curlPython SDKNode.js SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "wan-image", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

```python
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")

f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'wan-image', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

```js
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "wan-image", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
  const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
  if(!encoded && uri.startsWith("data:image/")) {
    const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
    encoded=uri.slice(comma+1);
  }
  if(encoded) {
    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
    raw=Buffer.from(encoded,"base64");
  } else if(uri) {
    const u=new URL(uri,"https://api.ailoot.ai");
    if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
    const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
    const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
    if(!response.ok) throw new Error("Image content download failed: "+response.status);
    raw=Buffer.from(await response.arrayBuffer());
  } else throw new Error("Image has neither bytes nor URL");
  if(!raw.length) throw new Error("Empty image result");
  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
  writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
```

### استلام النتائج وحفظها

#### Ailoot · الصور

نزّل كل صورة مُرجعة أو احفظ محتواها بصيغة Base64

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

##### الاحتفاظ بكل النتائج المكتملة

احفظ كل صورة مكتملة؛ نزّلها من كل URL مُرجع، أو فك ترميز محتواها بصيغة Base64.

احفظ كل عنصر بيانات. فك ترميز كل b64\_json أو اجلب محتوى كل عنوان URL موقّع مُعاد. اختر امتداد اسم الملف بناءً على نوع MIME والبايتات الفعلية.

##### عند الحاجة إلى التحقق من الاستجابة الأصلية

إذا تطلبت نتيجة توليد صورة أو تعديلها التحقق، فاحتفظ بقيمة operation\_id/X-Client-Request-ID الأصلية ومعلومات النتيجة المُعادة. استعد النتائج الموجودة والمملوكة لك عبر مكتبة الوسائط باستخدام قيم task\_id أو asset\_id الفعلية. لا تُعِد إرسال طلب التوليد أو التعديل، ولا تنشئ عنوان URL للاستعلام الدوري من operation\_id.

حقول الاستجابة

| الحقل | النوع |
| --- | --- |
| الحقل`created` | النوعinteger |
| الحقل`data[].url` | النوعstring |
| الحقل`data[].b64_json` | النوعbase64 string |
| الحقل`usage` | النوعobject |

الأخطاء والخطوات التالية

| الاستجابة | الشرط | الخطوة التالية |
| --- | --- | --- |
| الاستجابة⁦400⁩ · `invalid_request_error` | الشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحة | الخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد. |
| الاستجابة`server_error` | الشرطتشير الاستجابة المُعادة إلى أن العملية أو النتيجة تتطلب التحقق | الخطوة التاليةاحتفظ بمعرّف العملية أو المهمة الأصلي المُعاد، وبترويسات الطلب وبالاستجابة؛ وواصل عمليات القراءة المدعومة لتلك العملية الأصلية. لا تُعِد إرسال طلب الإنشاء. |

### الأسماء البديلة

#### الأسماء البديلة للنموذج

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

#### الأسماء البديلة لمسارات الطرائق

استخدم مسارات الطرائق المعروضة أعلاه.

#### معرّفات النماذج ذات الصلة IDs

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

**Ailoot · الصور** `POST /v1/images/generations` `wan-image-latest`

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

Alibaba /`wan-image-latest`

معرّف النموذج ID

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

### البداية

نموذج لإنشاء الصور من طلب نصي. يتيح المصنّع التحكم في لوحة الألوان ودقة حتى 4K للتوليد النصي العادي.

المدخلات المقبولة

النص

النتائج

الصور

### متاح في Ailoot · المدخلات والطرائق

**Ailoot · الصور** `POST /v1/images/generations`

الإدخال

`text`

الإخراج

`image`

صيغة الإخراج

ملف صورة

| الحقل | النوع | المتطلب | القيم والحدود | القيمة الافتراضية |
| --- | --- | --- | --- | --- |
| الحقل`model` | النوع`string` | المتطلبمطلوب | القيم والحدود wan-image-latest | القيمة الافتراضية— |
| الحقل`prompt` | النوع`string` | المتطلبمطلوب | القيم والحدود الحد الأدنى للطول: ⁦1⁩ | القيمة الافتراضية— |
| الحقل`n` | النوع`integer` | المتطلباختياري | القيم والحدود الحد الأدنى: ⁦1⁩ | القيمة الافتراضية⁦1⁩ |
| الحقل`response_format` | النوع`string` | المتطلباختياري | القيم والحدود url, b64\_json | القيمة الافتراضية— |
| الحقل`stream` | النوع`boolean` | المتطلباختياري | القيم والحدود | القيمة الافتراضيةfalse |
| الحقل`size` | النوع`string` | المتطلباختياري | القيم والحدود يعتمد على النموذج | القيمة الافتراضية— |
| الحقل`partial_images` | النوع`integer` | المتطلباختياري | القيم والحدود يعتمد على النموذج | القيمة الافتراضية— |
| الحقل`images[].image_url` | النوع`string` | المتطلبغير مدعوم | القيم والحدود الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg الحد الأقصى للصور في كل مصفوفة: ⁦9⁩ الشروط: عنوان URL فعلي واحد لكل كائن images\[\]. عدد عناصر المصفوفة منفصل عن هذه القيمة النصية الطرفية. ينطبق عندما: خاص بـJSON images/edits فقط؛ لا يحلّل JSON images/generations مراجع images. | القيمة الافتراضية— |
| الحقل`image` | النوع`file` | المتطلباختياري | القيم والحدود الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg ينطبق عندما: توليد باستخدام multipart/form-data | القيمة الافتراضية— |
| الحقل`image[]` | النوع`file[]` | المتطلباختياري | القيم والحدود الحد الأقصى للعناصر: ⁦9⁩ الحد الأقصى للبايتات بعد فك الترميز: ⁦20,971,520⁩ أنواع MIME: image/png, image/jpeg ينطبق عندما: توليد باستخدام multipart/form-data | القيمة الافتراضية— |

تركيبات مواد الإدخال

**تحويل النص إلى صورة** · مطلوب: prompt

**reference\_images\_generation** · مطلوب: prompt

معلمات الطريقة ودورة حياتها

| المعلمة | المواصفات |
| --- | --- |
| المعلمة`material_types` | المواصفاتtext |
| المعلمة`required` | المواصفاتmodel, prompt |
| المعلمة`optional_controls` | المواصفاتnull |
| المعلمة`content_type` | المواصفاتapplication/json |

دورة الحياة: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · قيمة task\_id الفعلية المُعادة أو سجل مكتبة الوسائط

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

`GET /v1/media/assets`

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

بُنى الطرق ومعرّفاتها دقيقة؛ قدرة المورد منفصلة عن السماح بالطلب.

### الباقات

#### تعرفات طرائق Ailoot

الإخراج

⁦‏0.075 US$⁩ *لكل صورة بدقة 1K*

الإخراج

⁦‏0.075 US$⁩ *لكل صورة بدقة 2K*

تحجز Ailoot مبلغًا تقديريًا قبل الطلب. وبعد ظهور النتيجة، تُسوّي الرسوم النهائية بناءً على الاستخدام المقاس. وتستخدم تسوية البث سجل الاستخدام النهائي. [كيفية عمل حجز المبلغ وتسوية الرسوم →](https://ailoot.ai/docs/ar/billing/reserve/)

#### تفاصيل التعرفة المرجعية

لا تغيّر جداول التعرفة المرجعية على مستوى النموذج اختيار الطريقة أو عروض الأسعار أو الرسوم. وتستخدم الرسوم الفعلية تعرفات طريقة Ailoot المحددة.

wan2.7-image-pro

#### الأسعار حسب الإعدادات

| الإعدادات | شروط الفوترة | الرسوم |
| --- | --- | --- |
| الإعداداتwan2.7-image-pro · الإعداد الافتراضي | شروط الفوترةالإعداد الافتراضي | الرسوم الإدخال · الإدخال **⁦‏0.00 US$⁩** لكل استدعاء الإخراج · الإخراج **⁦‏0.16 US$⁩** لكل استدعاء |

### أمثلة للطلبات

#### Ailoot · الصور

curlPython SDKNode.js SDK

```bash
set -eu
: "${AILOOT_API_KEY:?Set your Ailoot API key}"
export AILOOT_API_KEY
export AILOOT_API_KEY
: "${AILOOT_PROMPT_FILE:?Set your actual UTF-8 image brief}"
export AILOOT_PROMPT_FILE
python3 - <<'PY_REQUEST'
import json,os
from pathlib import Path
p=json.loads('{"model": "wan-image-latest", "prompt": ""}')
f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Choose your actual UTF-8 brief")
p['prompt']=f.read_text(encoding="utf-8")
if not p['prompt'].strip():raise SystemExit("Brief must contain text")
Path("request.json").write_text(json.dumps(p,ensure_ascii=False))
PY_REQUEST
curl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \
  -H "Authorization: Bearer $AILOOT_API_KEY" -H 'Content-Type: application/json' \
  --data-binary @request.json -D response-headers.txt -o result.json
python3 - <<'PY_RESULT'
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")
save_images(json.loads(Path("result.json").read_text())["data"])
PY_RESULT
```

```python
from openai import OpenAI
import base64, json, os, subprocess
from pathlib import Path
from urllib.parse import urlsplit, urljoin

def save_images(items):
    if not items: raise SystemExit("No completed images; retain the full response")
    for index, item in enumerate(items):
        encoded=item.get("b64_json")
        uri=item.get("url", "")
        if not encoded and uri.startswith("data:image/"):
            header, separator, encoded=uri.partition(",")
            if not separator or ";base64" not in header: raise SystemExit("Unsupported image data URI")
        if encoded:
            raw=base64.b64decode(encoded,validate=True)
        elif uri:
            uri=urljoin("https://api.ailoot.ai",uri)
            parsed=urlsplit(uri)
            if parsed.scheme!="https" or not parsed.netloc or parsed.username or parsed.password:
                raise SystemExit("Invalid returned image URL")
            owned=parsed.netloc=="api.ailoot.ai" and parsed.path.startswith("/v1/media/assets/") and parsed.path.endswith("/content")
            args=["curl","--fail-with-body","--silent","--show-error",uri]
            if owned: args += ["-H","Authorization: Bearer "+os.environ["AILOOT_API_KEY"]]
            temporary=Path(f"image-{index}.bin")
            subprocess.run(args+["-o",str(temporary)],check=True)
            raw=temporary.read_bytes()
            temporary.unlink()
        else: raise SystemExit("Image has neither bytes nor URL")
        if not raw: raise SystemExit("Empty image result")
        ext="png" if raw.startswith(b"\x89PNG") else "jpg" if raw.startswith(b"\xff\xd8") else "webp" if raw[:4]==b"RIFF" and raw[8:12]==b"WEBP" else "svg" if raw.lstrip().startswith((b"<svg",b"<?xml")) else "bin"
        Path(f"image-{index}.{ext}").write_bytes(raw)
    print("Every returned image saved; complete response metadata retained")

f=Path(os.environ["AILOOT_PROMPT_FILE"])
if not f.is_file():raise SystemExit("Set your actual UTF-8 image brief file")
request={'model': 'wan-image-latest', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

```js
import OpenAI from "openai";
import { readFileSync, writeFileSync } from "node:fs";
const key=process.env.AILOOT_API_KEY;
if(!key) throw new Error("Set your actual Ailoot API key");
const client=new OpenAI({baseURL:"https://api.ailoot.ai/v1",apiKey:key,maxRetries:0});
const request={"model": "wan-image-latest", "prompt": ""};
if(!process.env.AILOOT_PROMPT_FILE)throw new Error("Set your actual UTF-8 image brief file");
request.prompt=readFileSync(process.env.AILOOT_PROMPT_FILE,"utf8");
const result=await client.images.generate(request);
writeFileSync("sdk-result.json",JSON.stringify(result,null,2));
if(!result.data?.length) throw new Error("No completed images");
for(let index=0;index<result.data.length;index++) {
  const item=result.data[index];let encoded=item.b64_json,uri=item.url||"",raw;
  if(!encoded && uri.startsWith("data:image/")) {
    const comma=uri.indexOf(",");if(comma<0 || !uri.slice(0,comma).includes(";base64")) throw new Error("Unsupported image data URI");
    encoded=uri.slice(comma+1);
  }
  if(encoded) {
    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error("Invalid Base64");
    raw=Buffer.from(encoded,"base64");
  } else if(uri) {
    const u=new URL(uri,"https://api.ailoot.ai");
    if(u.protocol!=="https:" || u.username || u.password) throw new Error("Invalid returned URL");
    const owned=u.origin==="https://api.ailoot.ai" && u.pathname.startsWith("/v1/media/assets/") && u.pathname.endsWith("/content");
    const response=await fetch(u,{headers:owned?{Authorization:"Bearer "+key}:{},redirect:"manual"});
    if(!response.ok) throw new Error("Image content download failed: "+response.status);
    raw=Buffer.from(await response.arrayBuffer());
  } else throw new Error("Image has neither bytes nor URL");
  if(!raw.length) throw new Error("Empty image result");
  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?"png":raw[0]===255&&raw[1]===216?"jpg":raw.toString("ascii",0,4)==="RIFF"&&raw.toString("ascii",8,12)==="WEBP"?"webp":raw.toString("utf8").trimStart().startsWith("<svg")||raw.toString("utf8").trimStart().startsWith("<?xml")?"svg":"bin";
  writeFileSync(`image-${index}.${ext}`,raw);
}
console.log("Every returned image saved; sdk-result.json retains complete metadata");
```

### استلام النتائج وحفظها

#### Ailoot · الصور

نزّل كل صورة مُرجعة أو احفظ محتواها بصيغة Base64

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

##### الاحتفاظ بكل النتائج المكتملة

احفظ كل صورة مكتملة؛ نزّلها من كل URL مُرجع، أو فك ترميز محتواها بصيغة Base64.

احفظ كل عنصر بيانات. فك ترميز كل b64\_json أو اجلب محتوى كل عنوان URL موقّع مُعاد. اختر امتداد اسم الملف بناءً على نوع MIME والبايتات الفعلية.

##### عند الحاجة إلى التحقق من الاستجابة الأصلية

إذا تطلبت نتيجة توليد صورة أو تعديلها التحقق، فاحتفظ بقيمة operation\_id/X-Client-Request-ID الأصلية ومعلومات النتيجة المُعادة. استعد النتائج الموجودة والمملوكة لك عبر مكتبة الوسائط باستخدام قيم task\_id أو asset\_id الفعلية. لا تُعِد إرسال طلب التوليد أو التعديل، ولا تنشئ عنوان URL للاستعلام الدوري من operation\_id.

حقول الاستجابة

| الحقل | النوع |
| --- | --- |
| الحقل`created` | النوعinteger |
| الحقل`data[].url` | النوعstring |
| الحقل`data[].b64_json` | النوعbase64 string |
| الحقل`usage` | النوعobject |

الأخطاء والخطوات التالية

| الاستجابة | الشرط | الخطوة التالية |
| --- | --- | --- |
| الاستجابة⁦400⁩ · `invalid_request_error` | الشرطحقول مطلوبة أو تمثيل مادة أو قيمة معلمة غير صحيحة | الخطوة التاليةصحّح الحقول المحددة قبل طلب إنشاء جديد. |
| الاستجابة`server_error` | الشرطتشير الاستجابة المُعادة إلى أن العملية أو النتيجة تتطلب التحقق | الخطوة التاليةاحتفظ بمعرّف العملية أو المهمة الأصلي المُعاد، وبترويسات الطلب وبالاستجابة؛ وواصل عمليات القراءة المدعومة لتلك العملية الأصلية. لا تُعِد إرسال طلب الإنشاء. |

### الأسماء البديلة

#### الأسماء البديلة للنموذج

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

#### الأسماء البديلة لمسارات الطرائق

استخدم مسارات الطرائق المعروضة أعلاه.

#### معرّفات النماذج ذات الصلة IDs

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

FAQ · wan2.7-image-pro

ما المدخلات والنتائج المتاحة؟

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

ما الحقول التي يستخدمها الطلب؟

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

ما الحدود المطبقة؟

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

اربط Ailoot بخدمة Claude Code أوOpenCode أوHermes أوتطبيقك.

## الشركة ومحفظة مشاريعها

الشركة ومحفظة مشاريعها: ملايين العملاء؛ مبيعات بالمليارات شهريًا.

## اشتر الرموز بخصم.

خصم اشتراك للعمل المنتظم. الرموز الترويجية حتى 50% على شراء الرموز.

الاشتراك

اختر خطة بخصم لطلباتك المنتظمة.

رمز خصم حتى 50%

أدخل الرمز عند الشراء. يعاد حساب السعر وفق العرض الساري.

المصروفات في السجل

يحفظ النموذج والرموز والمبلغ لكل طلب.

[اختر اشتراكا](https://ailoot.ai/docs/ar/billing/subscriptions/) · [اعرض أسعار النماذج](https://ailoot.ai/models/ar/)

## اربط API بالمنتج الذي تبيعه.

SaaS والتطبيقات والبوتات وفق العرض واتفاقية ترخيص Ailoot. لإعادة البيع، اطلب ترخيص موزع.

تطبيق تجاري

أضف توليد النص والصور والفيديو والصوت إلى ميزات خدمتك المدفوعة.

ترخيص إعادة البيع

أرسل وصف المشروع وطريقة توفير الوصول. اطلب شروط استخدام وإعادة بيع مكتوبة.

المستندات على الموقع

العرض واتفاقية الترخيص وسياسة معالجة البيانات متاحة قبل الربط.

[اطلب ترخيص إعادة بيع](mailto:support@ailoot.ai) · [العرض واتفاقية الترخيص](https://ailoot.ai/legal/offer?lang=ar)

## Ailoot · الشركة ومحفظة مشاريعها





تستند Ailoot إلى خبرة تشغيلية متراكمة وقاعدة عملاء واسعة وخدمة مستقرة ومراقبة مستمرة لمؤشرات الأداء KPI.





الشركة ومحفظة مشاريعها: ملايين العملاء؛ مبيعات بالمليارات شهريًا.





توظف Ailoot هذه الخبرة التشغيلية لإتاحة الوصول عبر API إلى قدرات الذكاء الاصطناعي في منتجات العملاء ووكلائهم وتطبيقاتهم وعمليات الأتمتة.
