Source: https://ailoot.ai/models/vi/qwen-image-3-0-pro/
Canonical: https://ailoot.ai/models/vi/qwen-image-3-0-pro/
Language: vi

# qwen-image-3.0-pro

[Markdown](https://ailoot.ai/models/vi/qwen-image-3-0-pro/index.md) · [JSON](https://ailoot.ai/models/vi/qwen-image-3-0-pro/facts.json)

## [qwen-image-3.0-pro](https://ailoot.ai/models/vi/qwen-image-3-0-pro/)

Mô hình tạo ảnh từ văn bản, chú trọng bố cục phức tạp, chữ trong ảnh và chi tiết chân thực. Phù hợp với áp phích, bảng phân cảnh, thực đơn và tư liệu có bố cục dày đặc.

- [**Ailoot · Ảnh** `POST /v1/images/generations` `qwen-image-3.0-pro`](https://ailoot.ai/models/vi/qwen-image-3-0-pro/#method-0)
- [**Ailoot · Ảnh** `POST /v1/images/generations` `qwen-image`](https://ailoot.ai/models/vi/qwen-image-3-0-pro/#method-1)
- [**Ailoot · Ảnh** `POST /v1/images/generations` `qwen-image-latest`](https://ailoot.ai/models/vi/qwen-image-3-0-pro/#method-2)

Về mô hình

Mô tả này trình bày khả năng của mô hình. Đầu vào, đầu ra và tùy chọn có trên Ailoot được liệt kê bên dưới cho phương thức đã chọn.

Qwen-Image-3.0-Pro là mô hình của Alibaba để tạo và chỉnh sửa ảnh, khi bố cục, chữ trong ảnh và các chi tiết nhỏ đóng vai trò quan trọng. Các hướng ứng dụng gồm bố cục dày đặc, hình ảnh lồng trong hình ảnh, dàn trang báo, bảng phân cảnh, thực đơn và phiếu học tập. Thẻ Ailoot hiện tại giới thiệu chế độ tạo ảnh từ yêu cầu bằng văn bản. Alibaba còn có chỉnh sửa và xử lý ảnh tham chiếu; các thao tác này cần hỗ trợ đầu vào ảnh riêng và không được cung cấp qua phương thức hiện tại của thẻ.

#### Chữ và chi tiết trong ảnh

Nhà sản xuất nhấn mạnh khả năng xử lý yêu cầu dài tới 4,5 nghìn token, chữ trong ảnh bằng 12 ngôn ngữ và nhiều phông chữ. Đây là khả năng xử lý yêu cầu được mô tả, không phải dung lượng cửa sổ ngữ cảnh chính thức đã công bố. Những đặc điểm được nêu gồm thể hiện chữ nhỏ cỡ 10 pixel, kết cấu da và tóc, cùng những thay đổi nhỏ của nét mặt. Các chi tiết đó hữu ích khi chuẩn bị tư liệu được xem ở cự ly gần.

Qwen-Image-3.0-Pro cũng được thiết kế cho ý tưởng hình ảnh của trang web, trò chơi và màn hình phát trực tiếp. Trong kết quả này, có thể kết hợp hình minh họa, cấu trúc màn hình và chữ đã định dạng. Mô hình tạo ra ảnh của bản thiết kế; một ứng dụng hoạt động được cần có phần triển khai riêng.

#### Chỉnh sửa trong đặc tả Alibaba

Với chế độ chỉnh sửa, Alibaba nêu số lượng từ một đến ba ảnh. Trong cách này, nhà sản xuất cho phép gắn đối tượng với số thứ tự ảnh tham chiếu và mô tả cách kết hợp tư liệu. Các thao tác được cung cấp gồm thêm, xóa, di chuyển đối tượng, thay đổi hành động, phong cách, chi tiết và chữ. Mô tả phủ định giúp chỉ ra các yếu tố không mong muốn.

Tư liệu đầu vào cho chế độ chỉnh sửa của nhà sản xuất được chấp nhận ở định dạng JPG, JPEG, PNG, BMP, TIFF, WEBP và GIF. Với GIF động, khung hình đầu tiên được sử dụng. Mỗi tệp tối đa 10 MB; nhà sản xuất khuyến nghị ảnh có các chiều từ 384 đến 3072 pixel. Đây là khuyến nghị về đầu vào, không phải kích thước của kết quả thành phẩm.

Đặc tả của nhà sản xuất cho phép từ một đến sáu ảnh PNG đầu ra trong mỗi yêu cầu. Diện tích ảnh đầu ra nằm trong khoảng 262 144 đến 4 194 304 pixel, tương ứng với ảnh vuông từ 512 × 512 đến 2048 × 2048. Tỷ lệ khung hình cho phép từ 1:8 đến 8:1, nên với bố cục kéo dài, độ dài cạnh còn phụ thuộc vào hình dạng khung hình được chọn. Có tùy chọn xử lý bổ sung yêu cầu trước khi tạo ảnh.

**Ailoot · Ảnh** `POST /v1/images/generations` `qwen-image-3.0-pro`

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

Alibaba /`qwen-image-3.0-pro`

ID mô hình

- `qwen-image-3.0-pro`
- `qwen-image`
- `qwen-image-latest`

### Bắt đầu

Mô hình tạo ảnh từ văn bản, chú trọng bố cục phức tạp, chữ trong ảnh và chi tiết chân thực. Phù hợp với áp phích, bảng phân cảnh, thực đơn và tư liệu có bố cục dày đặc.

Đầu vào được chấp nhận

Văn bản

Kết quả

Ảnh

### Có trên Ailoot · đầu vào & phương thức

**Ailoot · Ảnh** `POST /v1/images/generations`

Đầu vào

`text`

Đầu ra

`image`

Định dạng đầu ra

Tệp ảnh

| Trường | Loại | Yêu cầu | Giá trị & giới hạn | Mặc định |
| --- | --- | --- | --- | --- |
| Trường`model` | Loại`string` | Yêu cầuBắt buộc | Giá trị & giới hạn qwen-image-3.0-pro | Mặc định— |
| Trường`prompt` | Loại`string` | Yêu cầuBắt buộc | Giá trị & giới hạn Độ dài tối thiểu: 1 | Mặc định— |
| Trường`n` | Loại`integer` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tối thiểu: 1 | Mặc định1 |
| Trường`response_format` | Loại`string` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn url, b64\_json | Mặc định— |
| Trường`stream` | Loại`boolean` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn | Mặc địnhfalse |
| Trường`size` | Loại`string` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tùy thuộc vào mô hình | Mặc định— |
| Trường`partial_images` | Loại`integer` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tùy thuộc vào mô hình | Mặc định— |
| Trường`images[].image_url` | Loại`string` | Yêu cầuKhông hỗ trợ | Giá trị & giới hạn Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Số ảnh tối đa mỗi mảng: 3 Điều kiện: Một URL thực tế cho mỗi đối tượng images\[\]. Số phần tử mảng khác với nút lá dạng chuỗi này. Áp dụng khi: Chỉ JSON images/edits; JSON images/generations không phân tích các tham chiếu images. | Mặc định— |
| Trường`image` | Loại`file` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Áp dụng khi: tạo bằng multipart/form-data | Mặc định— |
| Trường`image[]` | Loại`file[]` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Số mục tối đa: 3 Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Áp dụng khi: tạo bằng multipart/form-data | Mặc định— |

Tổ hợp tư liệu đầu vào

**Văn bản thành ảnh** · Bắt buộc: prompt

**reference\_images\_generation** · Bắt buộc: prompt

Tham số phương thức và vòng đời

| Tham số | Hợp đồng |
| --- | --- |
| Tham số`material_types` | Hợp đồngtext |
| Tham số`required` | Hợp đồngmodel, prompt |
| Tham số`optional_controls` | Hợp đồngnull |
| Tham số`content_type` | Hợp đồngapplication/json |

Vòng đời: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Giá trị task\_id thực tế đã trả về hoặc bản ghi trong thư viện nội dung đa phương tiện

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

`GET /v1/media/assets`

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

Cấu trúc phương thức và ID là chính xác; khả năng của nhà cung cấp tách biệt với việc cho phép tiếp nhận yêu cầu.

### Bảng giá

#### Mức phí phương thức Ailoot

Đầu vào

0,003 US$ *mỗi ảnh đầu vào*

Đầu ra

0,04 US$ *mỗi ảnh 1K*

Đầu ra

0,075 US$ *mỗi ảnh 2K*

Ailoot tạm giữ một khoản ước tính trước yêu cầu. Sau khi có kết quả, phí cuối cùng được quyết toán theo mức sử dụng đo được. Việc quyết toán khi truyền luồng dùng bản ghi mức sử dụng cuối cùng. [Cách hoạt động của cơ chế tạm giữ và quyết toán →](https://ailoot.ai/docs/vi/billing/reserve/)

### Ví dụ yêu cầu

#### Ailoot · Ảnh

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

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

```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': 'qwen-image-3.0-pro', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

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

### Nhận và lưu kết quả

#### Ailoot · Ảnh

Tải xuống từng ảnh trả về hoặc lưu nội dung Base64 của ảnh

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

##### Lưu tất cả kết quả đã hoàn tất

Lưu mọi ảnh đã hoàn tất; truy xuất từng URL trả về hoặc giải mã nội dung Base64 của ảnh.

Lưu mọi phần tử dữ liệu. Giải mã từng b64\_json hoặc tải xuống từ mọi URL có chữ ký đã trả về. Chọn phần mở rộng tệp dựa trên MIME/nội dung byte thực tế.

##### Nếu cần kiểm tra phản hồi gốc

Nếu kết quả tạo hoặc chỉnh sửa ảnh cần được kiểm tra, giữ lại operation\_id/X-Client-Request-ID gốc và thông tin kết quả đã trả về. Khôi phục các kết quả hiện có thuộc quyền sở hữu của bạn qua thư viện nội dung đa phương tiện bằng các giá trị task\_id hoặc asset\_id thực tế. Không gửi lại yêu cầu tạo/chỉnh sửa ảnh hoặc tạo URL truy vấn trạng thái từ operation\_id.

Trường phản hồi

| Trường | Loại |
| --- | --- |
| Trường`created` | Loạiinteger |
| Trường`data[].url` | Loạistring |
| Trường`data[].b64_json` | Loạibase64 string |
| Trường`usage` | Loạiobject |

Lỗi và bước tiếp theo

| Phản hồi | Điều kiện | Bước tiếp theo |
| --- | --- | --- |
| Phản hồi400 · `invalid_request_error` | Điều kiệnTrường bắt buộc, cách biểu diễn tài liệu hoặc giá trị tham số không hợp lệ | Bước tiếp theoSửa các trường được chỉ ra trước khi gửi yêu cầu tạo mới. |
| Phản hồi`server_error` | Điều kiệnPhản hồi trả về cho biết thao tác hoặc kết quả cần được kiểm tra | Bước tiếp theoGiữ lại ID thao tác/tác vụ gốc đã trả về, các header của yêu cầu và toàn bộ phản hồi; tiếp tục truy xuất thao tác gốc đó bằng các phương thức được hỗ trợ. Không gửi lại yêu cầu tạo. |

### Bí danh

#### Bí danh mô hình

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

#### Bí danh đường dẫn phương thức

Dùng các đường dẫn phương thức hiển thị ở trên.

#### ID gọi liên quan

[`qwen-image-3.0-pro`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-3.0-pro&fmt=images), [`qwen-image`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image&fmt=images), [`qwen-image-latest`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-latest&fmt=images)

**Ailoot · Ảnh** `POST /v1/images/generations` `qwen-image`

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

Alibaba /`qwen-image`

ID mô hình

- `qwen-image-3.0-pro`
- `qwen-image`
- `qwen-image-latest`

### Bắt đầu

Mô hình tạo ảnh từ văn bản, chú trọng bố cục phức tạp, chữ trong ảnh và chi tiết chân thực. Phù hợp với áp phích, bảng phân cảnh, thực đơn và tư liệu có bố cục dày đặc.

Đầu vào được chấp nhận

Văn bản

Kết quả

Ảnh

### Có trên Ailoot · đầu vào & phương thức

**Ailoot · Ảnh** `POST /v1/images/generations`

Đầu vào

`text`

Đầu ra

`image`

Định dạng đầu ra

Tệp ảnh

| Trường | Loại | Yêu cầu | Giá trị & giới hạn | Mặc định |
| --- | --- | --- | --- | --- |
| Trường`model` | Loại`string` | Yêu cầuBắt buộc | Giá trị & giới hạn qwen-image | Mặc định— |
| Trường`prompt` | Loại`string` | Yêu cầuBắt buộc | Giá trị & giới hạn Độ dài tối thiểu: 1 | Mặc định— |
| Trường`n` | Loại`integer` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tối thiểu: 1 | Mặc định1 |
| Trường`response_format` | Loại`string` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn url, b64\_json | Mặc định— |
| Trường`stream` | Loại`boolean` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn | Mặc địnhfalse |
| Trường`size` | Loại`string` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tùy thuộc vào mô hình | Mặc định— |
| Trường`partial_images` | Loại`integer` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tùy thuộc vào mô hình | Mặc định— |
| Trường`images[].image_url` | Loại`string` | Yêu cầuKhông hỗ trợ | Giá trị & giới hạn Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Số ảnh tối đa mỗi mảng: 3 Điều kiện: Một URL thực tế cho mỗi đối tượng images\[\]. Số phần tử mảng khác với nút lá dạng chuỗi này. Áp dụng khi: Chỉ JSON images/edits; JSON images/generations không phân tích các tham chiếu images. | Mặc định— |
| Trường`image` | Loại`file` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Áp dụng khi: tạo bằng multipart/form-data | Mặc định— |
| Trường`image[]` | Loại`file[]` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Số mục tối đa: 3 Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Áp dụng khi: tạo bằng multipart/form-data | Mặc định— |

Tổ hợp tư liệu đầu vào

**Văn bản thành ảnh** · Bắt buộc: prompt

**reference\_images\_generation** · Bắt buộc: prompt

Tham số phương thức và vòng đời

| Tham số | Hợp đồng |
| --- | --- |
| Tham số`material_types` | Hợp đồngtext |
| Tham số`required` | Hợp đồngmodel, prompt |
| Tham số`optional_controls` | Hợp đồngnull |
| Tham số`content_type` | Hợp đồngapplication/json |

Vòng đời: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Giá trị task\_id thực tế đã trả về hoặc bản ghi trong thư viện nội dung đa phương tiện

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

`GET /v1/media/assets`

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

Cấu trúc phương thức và ID là chính xác; khả năng của nhà cung cấp tách biệt với việc cho phép tiếp nhận yêu cầu.

### Bảng giá

#### Mức phí phương thức Ailoot

Đầu vào

0,003 US$ *mỗi ảnh đầu vào*

Đầu ra

0,04 US$ *mỗi ảnh 1K*

Đầu ra

0,075 US$ *mỗi ảnh 2K*

Ailoot tạm giữ một khoản ước tính trước yêu cầu. Sau khi có kết quả, phí cuối cùng được quyết toán theo mức sử dụng đo được. Việc quyết toán khi truyền luồng dùng bản ghi mức sử dụng cuối cùng. [Cách hoạt động của cơ chế tạm giữ và quyết toán →](https://ailoot.ai/docs/vi/billing/reserve/)

### Ví dụ yêu cầu

#### Ailoot · Ảnh

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

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

```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': 'qwen-image', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

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

### Nhận và lưu kết quả

#### Ailoot · Ảnh

Tải xuống từng ảnh trả về hoặc lưu nội dung Base64 của ảnh

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

##### Lưu tất cả kết quả đã hoàn tất

Lưu mọi ảnh đã hoàn tất; truy xuất từng URL trả về hoặc giải mã nội dung Base64 của ảnh.

Lưu mọi phần tử dữ liệu. Giải mã từng b64\_json hoặc tải xuống từ mọi URL có chữ ký đã trả về. Chọn phần mở rộng tệp dựa trên MIME/nội dung byte thực tế.

##### Nếu cần kiểm tra phản hồi gốc

Nếu kết quả tạo hoặc chỉnh sửa ảnh cần được kiểm tra, giữ lại operation\_id/X-Client-Request-ID gốc và thông tin kết quả đã trả về. Khôi phục các kết quả hiện có thuộc quyền sở hữu của bạn qua thư viện nội dung đa phương tiện bằng các giá trị task\_id hoặc asset\_id thực tế. Không gửi lại yêu cầu tạo/chỉnh sửa ảnh hoặc tạo URL truy vấn trạng thái từ operation\_id.

Trường phản hồi

| Trường | Loại |
| --- | --- |
| Trường`created` | Loạiinteger |
| Trường`data[].url` | Loạistring |
| Trường`data[].b64_json` | Loạibase64 string |
| Trường`usage` | Loạiobject |

Lỗi và bước tiếp theo

| Phản hồi | Điều kiện | Bước tiếp theo |
| --- | --- | --- |
| Phản hồi400 · `invalid_request_error` | Điều kiệnTrường bắt buộc, cách biểu diễn tài liệu hoặc giá trị tham số không hợp lệ | Bước tiếp theoSửa các trường được chỉ ra trước khi gửi yêu cầu tạo mới. |
| Phản hồi`server_error` | Điều kiệnPhản hồi trả về cho biết thao tác hoặc kết quả cần được kiểm tra | Bước tiếp theoGiữ lại ID thao tác/tác vụ gốc đã trả về, các header của yêu cầu và toàn bộ phản hồi; tiếp tục truy xuất thao tác gốc đó bằng các phương thức được hỗ trợ. Không gửi lại yêu cầu tạo. |

### Bí danh

#### Bí danh mô hình

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

#### Bí danh đường dẫn phương thức

Dùng các đường dẫn phương thức hiển thị ở trên.

#### ID gọi liên quan

[`qwen-image-3.0-pro`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-3.0-pro&fmt=images), [`qwen-image`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image&fmt=images), [`qwen-image-latest`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-latest&fmt=images)

**Ailoot · Ảnh** `POST /v1/images/generations` `qwen-image-latest`

[`qwen-image-latest`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-latest&fmt=images)

Alibaba /`qwen-image-latest`

ID mô hình

- `qwen-image-3.0-pro`
- `qwen-image`
- `qwen-image-latest`

### Bắt đầu

Mô hình tạo ảnh từ văn bản, chú trọng bố cục phức tạp, chữ trong ảnh và chi tiết chân thực. Phù hợp với áp phích, bảng phân cảnh, thực đơn và tư liệu có bố cục dày đặc.

Đầu vào được chấp nhận

Văn bản

Kết quả

Ảnh

### Có trên Ailoot · đầu vào & phương thức

**Ailoot · Ảnh** `POST /v1/images/generations`

Đầu vào

`text`

Đầu ra

`image`

Định dạng đầu ra

Tệp ảnh

| Trường | Loại | Yêu cầu | Giá trị & giới hạn | Mặc định |
| --- | --- | --- | --- | --- |
| Trường`model` | Loại`string` | Yêu cầuBắt buộc | Giá trị & giới hạn qwen-image-latest | Mặc định— |
| Trường`prompt` | Loại`string` | Yêu cầuBắt buộc | Giá trị & giới hạn Độ dài tối thiểu: 1 | Mặc định— |
| Trường`n` | Loại`integer` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tối thiểu: 1 | Mặc định1 |
| Trường`response_format` | Loại`string` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn url, b64\_json | Mặc định— |
| Trường`stream` | Loại`boolean` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn | Mặc địnhfalse |
| Trường`size` | Loại`string` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tùy thuộc vào mô hình | Mặc định— |
| Trường`partial_images` | Loại`integer` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Tùy thuộc vào mô hình | Mặc định— |
| Trường`images[].image_url` | Loại`string` | Yêu cầuKhông hỗ trợ | Giá trị & giới hạn Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Số ảnh tối đa mỗi mảng: 3 Điều kiện: Một URL thực tế cho mỗi đối tượng images\[\]. Số phần tử mảng khác với nút lá dạng chuỗi này. Áp dụng khi: Chỉ JSON images/edits; JSON images/generations không phân tích các tham chiếu images. | Mặc định— |
| Trường`image` | Loại`file` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Áp dụng khi: tạo bằng multipart/form-data | Mặc định— |
| Trường`image[]` | Loại`file[]` | Yêu cầuKhông bắt buộc | Giá trị & giới hạn Số mục tối đa: 3 Số byte tối đa sau giải mã: 10.485.760 Loại MIME: image/png, image/jpeg Áp dụng khi: tạo bằng multipart/form-data | Mặc định— |

Tổ hợp tư liệu đầu vào

**Văn bản thành ảnh** · Bắt buộc: prompt

**reference\_images\_generation** · Bắt buộc: prompt

Tham số phương thức và vòng đời

| Tham số | Hợp đồng |
| --- | --- |
| Tham số`material_types` | Hợp đồngtext |
| Tham số`required` | Hợp đồngmodel, prompt |
| Tham số`optional_controls` | Hợp đồngnull |
| Tham số`content_type` | Hợp đồngapplication/json |

Vòng đời: `synchronous_result_then_owned_library`

`GET /v1/media/tasks/{task_id}` · Giá trị task\_id thực tế đã trả về hoặc bản ghi trong thư viện nội dung đa phương tiện

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

`GET /v1/media/assets`

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

Cấu trúc phương thức và ID là chính xác; khả năng của nhà cung cấp tách biệt với việc cho phép tiếp nhận yêu cầu.

### Bảng giá

#### Mức phí phương thức Ailoot

Đầu vào

0,003 US$ *mỗi ảnh đầu vào*

Đầu ra

0,04 US$ *mỗi ảnh 1K*

Đầu ra

0,075 US$ *mỗi ảnh 2K*

Ailoot tạm giữ một khoản ước tính trước yêu cầu. Sau khi có kết quả, phí cuối cùng được quyết toán theo mức sử dụng đo được. Việc quyết toán khi truyền luồng dùng bản ghi mức sử dụng cuối cùng. [Cách hoạt động của cơ chế tạm giữ và quyết toán →](https://ailoot.ai/docs/vi/billing/reserve/)

### Ví dụ yêu cầu

#### Ailoot · Ảnh

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

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

```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': 'qwen-image-latest', 'prompt': ''}
request["prompt"]=f.read_text(encoding="utf-8")
client=OpenAI(base_url="https://api.ailoot.ai/v1",api_key=os.environ["AILOOT_API_KEY"],max_retries=0)
result=client.images.generate(**request)
Path("sdk-result.txt").write_text(str(result),encoding="utf-8")
save_images([{"b64_json":getattr(item,"b64_json",None),"url":getattr(item,"url",None)} for item in result.data])
```

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

### Nhận và lưu kết quả

#### Ailoot · Ảnh

Tải xuống từng ảnh trả về hoặc lưu nội dung Base64 của ảnh

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

##### Lưu tất cả kết quả đã hoàn tất

Lưu mọi ảnh đã hoàn tất; truy xuất từng URL trả về hoặc giải mã nội dung Base64 của ảnh.

Lưu mọi phần tử dữ liệu. Giải mã từng b64\_json hoặc tải xuống từ mọi URL có chữ ký đã trả về. Chọn phần mở rộng tệp dựa trên MIME/nội dung byte thực tế.

##### Nếu cần kiểm tra phản hồi gốc

Nếu kết quả tạo hoặc chỉnh sửa ảnh cần được kiểm tra, giữ lại operation\_id/X-Client-Request-ID gốc và thông tin kết quả đã trả về. Khôi phục các kết quả hiện có thuộc quyền sở hữu của bạn qua thư viện nội dung đa phương tiện bằng các giá trị task\_id hoặc asset\_id thực tế. Không gửi lại yêu cầu tạo/chỉnh sửa ảnh hoặc tạo URL truy vấn trạng thái từ operation\_id.

Trường phản hồi

| Trường | Loại |
| --- | --- |
| Trường`created` | Loạiinteger |
| Trường`data[].url` | Loạistring |
| Trường`data[].b64_json` | Loạibase64 string |
| Trường`usage` | Loạiobject |

Lỗi và bước tiếp theo

| Phản hồi | Điều kiện | Bước tiếp theo |
| --- | --- | --- |
| Phản hồi400 · `invalid_request_error` | Điều kiệnTrường bắt buộc, cách biểu diễn tài liệu hoặc giá trị tham số không hợp lệ | Bước tiếp theoSửa các trường được chỉ ra trước khi gửi yêu cầu tạo mới. |
| Phản hồi`server_error` | Điều kiệnPhản hồi trả về cho biết thao tác hoặc kết quả cần được kiểm tra | Bước tiếp theoGiữ lại ID thao tác/tác vụ gốc đã trả về, các header của yêu cầu và toàn bộ phản hồi; tiếp tục truy xuất thao tác gốc đó bằng các phương thức được hỗ trợ. Không gửi lại yêu cầu tạo. |

### Bí danh

#### Bí danh mô hình

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

#### Bí danh đường dẫn phương thức

Dùng các đường dẫn phương thức hiển thị ở trên.

#### ID gọi liên quan

[`qwen-image-3.0-pro`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-3.0-pro&fmt=images), [`qwen-image`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image&fmt=images), [`qwen-image-latest`](https://ailoot.ai/models/vi/#m=qwen-image-3.0-pro&route=Core&caller=qwen-image-latest&fmt=images)

FAQ · qwen-image-3.0-pro

Có những đầu vào và kết quả nào?

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

Yêu cầu sử dụng những trường nào?

`POST /v1/images/generations` · `qwen-image-3.0-pro`: `model`, `prompt`, `n`, `response_format`, `stream`, `image`, `image[]` `POST /v1/images/generations` · `qwen-image`: `model`, `prompt`, `n`, `response_format`, `stream`, `image`, `image[]` `POST /v1/images/generations` · `qwen-image-latest`: `model`, `prompt`, `n`, `response_format`, `stream`, `image`, `image[]`

Áp dụng những giới hạn nào?

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

Kết nối Ailoot với Claude Code, OpenCode, Hermes hoặc ứng dụng của bạn.

## Công ty và danh mục dự án của công ty

Công ty và danh mục dự án của công ty: hàng triệu khách hàng; doanh số hàng tỷ mỗi tháng.

## Mua token với giá ưu đãi.

Ưu đãi thuê bao cho nhu cầu thường xuyên. Mã khuyến mãi giảm đến 50% khi mua token.

Thuê bao

Chọn gói ưu đãi cho các yêu cầu thường xuyên của bạn.

Mã giảm đến 50%

Nhập mã khi mua. Giá được tính lại theo chương trình đang áp dụng.

Chi phí trong lịch sử

Mô hình, token và số tiền được lưu cho mỗi yêu cầu.

[Chọn gói thuê bao](https://ailoot.ai/docs/vi/billing/subscriptions/) · [Xem giá mô hình](https://ailoot.ai/models/vi/)

## Kết nối API vào sản phẩm bạn đang bán.

SaaS, ứng dụng và bot — theo đề nghị giao kết chính thức và thỏa thuận cấp phép Ailoot. Muốn bán lại, hãy yêu cầu giấy phép bán lại.

Ứng dụng thương mại

Tích hợp tạo văn bản, ảnh, video và âm thanh vào các tính năng trả phí của dịch vụ.

Giấy phép bán lại

Gửi mô tả dự án và cách cung cấp quyền truy cập. Yêu cầu điều khoản sử dụng và bán lại bằng văn bản.

Tài liệu trên website

Đề nghị giao kết, thỏa thuận cấp phép và chính sách xử lý dữ liệu có sẵn trước khi kết nối.

[Yêu cầu giấy phép bán lại](mailto:support@ailoot.ai) · [Đề nghị giao kết và thỏa thuận cấp phép](https://ailoot.ai/legal/offer?lang=vi)

## Ailoot · Công ty và danh mục dự án của công ty





Ailoot dựa trên kinh nghiệm vận hành tích lũy, cơ sở khách hàng lớn, dịch vụ ổn định và việc kiểm soát KPI liên tục.





Công ty và danh mục dự án của công ty: hàng triệu khách hàng; doanh số hàng tỷ mỗi tháng.





Ailoot áp dụng kinh nghiệm vận hành này để cung cấp quyền truy cập API vào các tính năng AI trong sản phẩm của khách hàng, tác tử, ứng dụng và quy trình tự động hóa.
