{
  "aboutHtml": "<p>Recraft V4 Pro là mô hình raster độ phân giải cao hơn trong dòng V4 của Recraft. V4 tập trung vào phán đoán thị giác, bố cục cân bằng, màu thống nhất và diễn giải cẩn thận định hướng sáng tạo. Nhà sản xuất định vị Pro cho chi tiết tinh hơn, cảnh phức tạp chân thực hơn và hình ảnh sản xuất quy mô lớn. Dùng cho minh hoạ chi tiết, ảnh biên tập, ý tưởng áp phích hoặc tài nguyên khác hưởng lợi từ kết quả raster lớn hơn. Mô hình vẫn tách biệt với V4.1 về sau và đầu ra SVG của V4 Pro Vector.</p><p>Mã nhà sản xuất cụ thể là recraftv4_pro. Đầu ra được công bố là raster 2K ở WebP không mất dữ liệu hoặc PNG: 2048 × 2048 pixel cho ảnh vuông, 2688 × 1536 cho 16:9 và 1664 × 2560 cho 2:3. Tỷ lệ được hỗ trợ khác có kích thước riêng. Chọn tỷ lệ khung hình cho bố cục dự định hoặc kích thước chính xác được phép; kích thước pixel tuỳ ý không nằm trong hợp đồng tạo ảnh được công bố. V4 tiêu chuẩn có đầu ra raster 1K nhỏ hơn, còn mô hình vector không có độ phân giải pixel cố định.</p><p>V4 có thể diễn giải câu lệnh ngắn để khám phá hoặc câu lệnh có cấu trúc để có kết quả kiểm soát. Với định hướng mỹ thuật cụ thể, hướng dẫn nhà sản xuất đi từ chủ thể và môi trường đến khung hình, thuộc tính, quan hệ không gian, ánh sáng, chiều sâu và tâm trạng. Với ảnh sản phẩm biên tập, yêu cầu ảnh dọc ấn tượng của ghế có dáng điêu khắc, bề mặt kim loại xước, ánh sáng bên, nền tối yên và khoảng trống phía trên vật thể cho tiêu đề. Gọi tên các quan hệ đó làm bố cục dự định rõ hơn yêu cầu chung về ảnh cao cấp.</p><p>Phạm vi sáng tạo của dòng gồm minh hoạ kể chuyện, cảnh chân thực và hình ảnh có chiều sâu với chỉ dẫn chất liệu cùng ánh sáng. Kết quả trông 3D vẫn là ảnh, không phải cảnh 3D có thể chỉnh sửa. Với áp phích đồ hoạ, chỉ định các lớp thị giác và tương tác: nền, minh hoạ hoặc ảnh chụp, thứ bậc tiêu đề và chữ bổ trợ. V4 được định vị cho cụm từ ngắn và dài vừa dễ đọc, nhưng cần kiểm tra chính tả cùng thứ bậc hoàn chỉnh thay vì suy ra từ tên mô hình.</p><p>Tài liệu tham chiếu tạo ảnh hiện hành cho phép câu lệnh tối đa 10,000 ký tự, từ một đến sáu đầu ra, seed ngẫu nhiên và tuỳ chọn màu ưu tiên cùng màu nền. Phong cách tuỳ chỉnh hoặc ảnh tham chiếu tương thích tuỳ chọn có thể định hướng diện mạo với khớp linh hoạt hoặc chính xác. Mô hình không nhận tuỳ chọn V3 cũ negative_prompt, phong cách tuyển chọn, text_layout, artistic_level hoặc no_text. Mô tả ảnh cuối dự định trong câu lệnh khẳng định và giữ yêu cầu chủ thể, bố cục cùng màu rõ ràng. Với tạo ảnh theo phong cách tham chiếu, dùng từ một đến mười ảnh PNG, JPG hoặc WebP, tổng không quá 64 MB và mỗi ảnh dưới 20 MB. Mỗi tham chiếu cần cạnh ngắn ít nhất 256 pixel, cạnh dài không quá 4,096 pixel và độ phân giải không quá 16 megapixel. Dùng những tham chiếu này hoặc phong cách đã lưu tương thích, thay vì cả hai.</p><p>Recraft công bố thao tác ảnh thành ảnh riêng cho V4. Thao tác kết hợp ảnh có sẵn và câu lệnh với strength từ 0 đến 1 để kiểm soát mức thay đổi, và không nhận tuỳ chọn phong cách tuỳ chỉnh V4 trong thao tác đó. Chuẩn bị nguồn trong giới hạn đầu vào ảnh của nhà sản xuất và nêu thuộc tính cần mang sang kết quả mới. Với tài nguyên cuối lớn hơn, kiểm tra chi tiết nhỏ, vùng cắt và chữ ở kích thước dự định. Chi tiết raster bổ sung của Pro hỗ trợ việc kiểm tra đó, trong khi ảnh vẫn là diễn giải được tạo từ bản yêu cầu sáng tạo cung cấp. Với ảnh thành ảnh, cung cấp PNG, JPG, WebP hoặc SVG dưới 20 MB, không quá 16 megapixel, hai cạnh từ 256 đến 4,096 pixel.</p>",
  "aboutText": "Recraft V4 Pro là mô hình raster độ phân giải cao hơn trong dòng V4 của Recraft. V4 tập trung vào phán đoán thị giác, bố cục cân bằng, màu thống nhất và diễn giải cẩn thận định hướng sáng tạo. Nhà sản xuất định vị Pro cho chi tiết tinh hơn, cảnh phức tạp chân thực hơn và hình ảnh sản xuất quy mô lớn. Dùng cho minh hoạ chi tiết, ảnh biên tập, ý tưởng áp phích hoặc tài nguyên khác hưởng lợi từ kết quả raster lớn hơn. Mô hình vẫn tách biệt với V4.1 về sau và đầu ra SVG của V4 Pro Vector.\n\nMã nhà sản xuất cụ thể là recraftv4_pro. Đầu ra được công bố là raster 2K ở WebP không mất dữ liệu hoặc PNG: 2048 × 2048 pixel cho ảnh vuông, 2688 × 1536 cho 16:9 và 1664 × 2560 cho 2:3. Tỷ lệ được hỗ trợ khác có kích thước riêng. Chọn tỷ lệ khung hình cho bố cục dự định hoặc kích thước chính xác được phép; kích thước pixel tuỳ ý không nằm trong hợp đồng tạo ảnh được công bố. V4 tiêu chuẩn có đầu ra raster 1K nhỏ hơn, còn mô hình vector không có độ phân giải pixel cố định.\n\nV4 có thể diễn giải câu lệnh ngắn để khám phá hoặc câu lệnh có cấu trúc để có kết quả kiểm soát. Với định hướng mỹ thuật cụ thể, hướng dẫn nhà sản xuất đi từ chủ thể và môi trường đến khung hình, thuộc tính, quan hệ không gian, ánh sáng, chiều sâu và tâm trạng. Với ảnh sản phẩm biên tập, yêu cầu ảnh dọc ấn tượng của ghế có dáng điêu khắc, bề mặt kim loại xước, ánh sáng bên, nền tối yên và khoảng trống phía trên vật thể cho tiêu đề. Gọi tên các quan hệ đó làm bố cục dự định rõ hơn yêu cầu chung về ảnh cao cấp.\n\nPhạm vi sáng tạo của dòng gồm minh hoạ kể chuyện, cảnh chân thực và hình ảnh có chiều sâu với chỉ dẫn chất liệu cùng ánh sáng. Kết quả trông 3D vẫn là ảnh, không phải cảnh 3D có thể chỉnh sửa. Với áp phích đồ hoạ, chỉ định các lớp thị giác và tương tác: nền, minh hoạ hoặc ảnh chụp, thứ bậc tiêu đề và chữ bổ trợ. V4 được định vị cho cụm từ ngắn và dài vừa dễ đọc, nhưng cần kiểm tra chính tả cùng thứ bậc hoàn chỉnh thay vì suy ra từ tên mô hình.\n\nTài liệu tham chiếu tạo ảnh hiện hành cho phép câu lệnh tối đa 10,000 ký tự, từ một đến sáu đầu ra, seed ngẫu nhiên và tuỳ chọn màu ưu tiên cùng màu nền. Phong cách tuỳ chỉnh hoặc ảnh tham chiếu tương thích tuỳ chọn có thể định hướng diện mạo với khớp linh hoạt hoặc chính xác. Mô hình không nhận tuỳ chọn V3 cũ negative_prompt, phong cách tuyển chọn, text_layout, artistic_level hoặc no_text. Mô tả ảnh cuối dự định trong câu lệnh khẳng định và giữ yêu cầu chủ thể, bố cục cùng màu rõ ràng. Với tạo ảnh theo phong cách tham chiếu, dùng từ một đến mười ảnh PNG, JPG hoặc WebP, tổng không quá 64 MB và mỗi ảnh dưới 20 MB. Mỗi tham chiếu cần cạnh ngắn ít nhất 256 pixel, cạnh dài không quá 4,096 pixel và độ phân giải không quá 16 megapixel. Dùng những tham chiếu này hoặc phong cách đã lưu tương thích, thay vì cả hai.\n\nRecraft công bố thao tác ảnh thành ảnh riêng cho V4. Thao tác kết hợp ảnh có sẵn và câu lệnh với strength từ 0 đến 1 để kiểm soát mức thay đổi, và không nhận tuỳ chọn phong cách tuỳ chỉnh V4 trong thao tác đó. Chuẩn bị nguồn trong giới hạn đầu vào ảnh của nhà sản xuất và nêu thuộc tính cần mang sang kết quả mới. Với tài nguyên cuối lớn hơn, kiểm tra chi tiết nhỏ, vùng cắt và chữ ở kích thước dự định. Chi tiết raster bổ sung của Pro hỗ trợ việc kiểm tra đó, trong khi ảnh vẫn là diễn giải được tạo từ bản yêu cầu sáng tạo cung cấp. Với ảnh thành ảnh, cung cấp PNG, JPG, WebP hoặc SVG dưới 20 MB, không quá 16 megapixel, hai cạnh từ 256 đến 4,096 pixel.\n\n",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "b2006ebfa7fe2600826dbdebfdf98e3b2325cc4f351a355dfc207d3a60a15374",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "vi",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Recraft: Recraft V4 Pro</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Đóng\">×</button></div><div class=\"idline\"><span>Recraft /</span><code>recraft/recraft-v4-pro</code><button type=\"button\" id=\"copy-id\">Sao chép ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Các phần của thẻ mô hình\"><button type=\"button\" data-card-jump=\"overview\">Bắt đầu</button><button type=\"button\" data-card-jump=\"methods\">Đầu vào &amp; phương thức</button><button type=\"button\" data-card-jump=\"pricing\">Bảng giá</button><button type=\"button\" data-card-jump=\"examples\">Ví dụ</button><button type=\"button\" data-card-jump=\"results\">Kết quả</button><button type=\"button\" data-card-jump=\"aliases\">Bí danh</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Phương thức API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|images|/v1/images/generations|recraft%2Frecraft-v4-pro\">Ảnh</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Bắt đầu</h3><p class=\"mdesc-full\">Recraft V4 Pro tạo ảnh raster 2K cho bố cục chi tiết, hình ảnh chân thực, minh hoạ và công việc sáng tạo hướng đến in ấn. Đây là phiên bản V4 độ phân giải cao hơn, với bản yêu cầu văn bản, đầu vào phong cách tuỳ chọn và quy trình ảnh thành ảnh riêng.</p><dl class=\"card-io\" data-card-io><div><dt>Đầu vào được chấp nhận</dt><dd>Văn bản · Ảnh</dd></div><div><dt>Kết quả</dt><dd>Ảnh</dd></div></dl><details class=\"card-about\"><summary>Về mô hình</summary><p class=\"note-s\" data-model-method-boundary>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.</p><div class=\"mabout\" id=\"m-about\"><p>Recraft V4 Pro là mô hình raster độ phân giải cao hơn trong dòng V4 của Recraft. V4 tập trung vào phán đoán thị giác, bố cục cân bằng, màu thống nhất và diễn giải cẩn thận định hướng sáng tạo. Nhà sản xuất định vị Pro cho chi tiết tinh hơn, cảnh phức tạp chân thực hơn và hình ảnh sản xuất quy mô lớn. Dùng cho minh hoạ chi tiết, ảnh biên tập, ý tưởng áp phích hoặc tài nguyên khác hưởng lợi từ kết quả raster lớn hơn. Mô hình vẫn tách biệt với V4.1 về sau và đầu ra SVG của V4 Pro Vector.</p><p>Mã nhà sản xuất cụ thể là recraftv4_pro. Đầu ra được công bố là raster 2K ở WebP không mất dữ liệu hoặc PNG: 2048 × 2048 pixel cho ảnh vuông, 2688 × 1536 cho 16:9 và 1664 × 2560 cho 2:3. Tỷ lệ được hỗ trợ khác có kích thước riêng. Chọn tỷ lệ khung hình cho bố cục dự định hoặc kích thước chính xác được phép; kích thước pixel tuỳ ý không nằm trong hợp đồng tạo ảnh được công bố. V4 tiêu chuẩn có đầu ra raster 1K nhỏ hơn, còn mô hình vector không có độ phân giải pixel cố định.</p><p>V4 có thể diễn giải câu lệnh ngắn để khám phá hoặc câu lệnh có cấu trúc để có kết quả kiểm soát. Với định hướng mỹ thuật cụ thể, hướng dẫn nhà sản xuất đi từ chủ thể và môi trường đến khung hình, thuộc tính, quan hệ không gian, ánh sáng, chiều sâu và tâm trạng. Với ảnh sản phẩm biên tập, yêu cầu ảnh dọc ấn tượng của ghế có dáng điêu khắc, bề mặt kim loại xước, ánh sáng bên, nền tối yên và khoảng trống phía trên vật thể cho tiêu đề. Gọi tên các quan hệ đó làm bố cục dự định rõ hơn yêu cầu chung về ảnh cao cấp.</p><p>Phạm vi sáng tạo của dòng gồm minh hoạ kể chuyện, cảnh chân thực và hình ảnh có chiều sâu với chỉ dẫn chất liệu cùng ánh sáng. Kết quả trông 3D vẫn là ảnh, không phải cảnh 3D có thể chỉnh sửa. Với áp phích đồ hoạ, chỉ định các lớp thị giác và tương tác: nền, minh hoạ hoặc ảnh chụp, thứ bậc tiêu đề và chữ bổ trợ. V4 được định vị cho cụm từ ngắn và dài vừa dễ đọc, nhưng cần kiểm tra chính tả cùng thứ bậc hoàn chỉnh thay vì suy ra từ tên mô hình.</p><p>Tài liệu tham chiếu tạo ảnh hiện hành cho phép câu lệnh tối đa 10,000 ký tự, từ một đến sáu đầu ra, seed ngẫu nhiên và tuỳ chọn màu ưu tiên cùng màu nền. Phong cách tuỳ chỉnh hoặc ảnh tham chiếu tương thích tuỳ chọn có thể định hướng diện mạo với khớp linh hoạt hoặc chính xác. Mô hình không nhận tuỳ chọn V3 cũ negative_prompt, phong cách tuyển chọn, text_layout, artistic_level hoặc no_text. Mô tả ảnh cuối dự định trong câu lệnh khẳng định và giữ yêu cầu chủ thể, bố cục cùng màu rõ ràng. Với tạo ảnh theo phong cách tham chiếu, dùng từ một đến mười ảnh PNG, JPG hoặc WebP, tổng không quá 64 MB và mỗi ảnh dưới 20 MB. Mỗi tham chiếu cần cạnh ngắn ít nhất 256 pixel, cạnh dài không quá 4,096 pixel và độ phân giải không quá 16 megapixel. Dùng những tham chiếu này hoặc phong cách đã lưu tương thích, thay vì cả hai.</p><p>Recraft công bố thao tác ảnh thành ảnh riêng cho V4. Thao tác kết hợp ảnh có sẵn và câu lệnh với strength từ 0 đến 1 để kiểm soát mức thay đổi, và không nhận tuỳ chọn phong cách tuỳ chỉnh V4 trong thao tác đó. Chuẩn bị nguồn trong giới hạn đầu vào ảnh của nhà sản xuất và nêu thuộc tính cần mang sang kết quả mới. Với tài nguyên cuối lớn hơn, kiểm tra chi tiết nhỏ, vùng cắt và chữ ở kích thước dự định. Chi tiết raster bổ sung của Pro hỗ trợ việc kiểm tra đó, trong khi ảnh vẫn là diễn giải được tạo từ bản yêu cầu sáng tạo cung cấp. Với ảnh thành ảnh, cung cấp PNG, JPG, WebP hoặc SVG dưới 20 MB, không quá 16 megapixel, hai cạnh từ 256 đến 4,096 pixel.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Có trên Ailoot · đầu vào &amp; phương thức</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Ảnh</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>Đầu vào</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Đầu ra</dt><dd><code>image</code></dd></div><div><dt>Định dạng đầu ra</dt><dd>Tệp ảnh</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Trường</th><th>Loại</th><th>Yêu cầu</th><th>Giá trị &amp; giới hạn</th><th>Mặc định</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>recraft/recraft-v4-pro</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Độ dài tối thiểu: 1</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">n</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>integer</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Tối thiểu: 1</div><div>Tối đa: 6</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>1:1, 4:3, 3:4, 16:9, 9:16, auto</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">input_references</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>array</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Số mục tối thiểu: 0</div><div>Số mục tối đa: 1</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>Tổ hợp tư liệu đầu vào</summary><p class=\"note-s\"><b>Văn bản thành ảnh</b> · Bắt buộc: prompt</p></details><details class=\"note-s\" data-method-contract><summary>Tham số phương thức và vòng đời</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Tham số</th><th>Hợp đồng</th></tr></thead><tbody><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>content_type</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>application/json</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>required</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>model, prompt</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>material_types</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>text, image</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>optional_controls</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>aspect_ratio, n, input_references</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>exact_supported_parameters</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>{&quot;aspect_ratio&quot;:{&quot;type&quot;:&quot;enum&quot;,&quot;values&quot;:[&quot;1:1&quot;,&quot;4:3&quot;,&quot;3:4&quot;,&quot;16:9&quot;,&quot;9:16&quot;,&quot;auto&quot;]},&quot;n&quot;:{&quot;type&quot;:&quot;range&quot;,&quot;min&quot;:1,&quot;max&quot;:6},&quot;input_references&quot;:{&quot;type&quot;:&quot;range&quot;,&quot;min&quot;:0,&quot;max&quot;:1}}</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>reference_material_rule</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>Chỉ dùng tham chiếu ảnh thực tế của khách hàng; các điều kiện của điểm cuối nhà cung cấp chi phối việc sử dụng chúng.</td></tr></tbody></table></div><p>Bí danh phương thức: <code>/v1/images</code></p><p>Vòng đời: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · 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</p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}/content</code></p><p class=\"note-s\"><code>GET /v1/media/assets</code></p><p class=\"note-s\"><code>GET /v1/media/assets/{asset_id}</code></p><p class=\"note-s\">Dùng mô hình chính xác và các trường đầu vào theo tài liệu.</p><p class=\"note-s\">Giữ lại toàn bộ phản hồi, mọi đầu ra thực tế và các ID gốc được trả về.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Bảng giá</h3><div class=\"card-result-process\" data-billing-basis><h5>Cách tính phí cuối cùng</h5><p class=\"note-s\">Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Thông tin biểu giá không bổ sung tùy chọn yêu cầu. Các tham số được hỗ trợ nằm trong phương thức đã chọn.</p><dl data-price-conditions><dt>Chế độ nhanh</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi chọn chế độ nhanh</span></dd><dt>Chế độ Flex</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi chọn chế độ flex</span></dd><dt>Mức độ suy luận tối đa</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi áp dụng mức điều chỉnh mặc định (default) cho mức độ suy luận tối đa</span></dd></dl></div><div data-declared-tariff-pricing><h4>Mức phí ước tính để so sánh</h4><h4>Giá theo cấu hình</h4><p class=\"note-s\">Đối chiếu từng khoản phí với điều kiện hiển thị. Dùng một mức phí cho mỗi nhóm cấu hình thay thế.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Cấu hình</th><th>Biểu mức phí</th><th>Số lượng dự báo</th><th>Đơn vị tính phí</th><th>Phí</th></tr></thead><tbody><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá cơ sở cho token</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>Mức phí cơ bản</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>—</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>—</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu vào · Token đầu vào · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu ra · Token đầu ra · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Đọc bộ nhớ đệm · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Ghi bộ nhớ đệm · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Ghi bộ nhớ đệm, 1 giờ · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Ultra</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>—</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>—</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>mỗi ảnh đầu ra</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Đầu ra hình ảnh · Ước tính chỉ để so sánh</span> <b>$0.5</b> <span class=\"price-unit\">mỗi ảnh đầu ra</span></div></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Chi phí tạo ước tính</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>—</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>ước tính cho một lần tạo</td><td data-cell-label=\"Đơn vị tính phí\"><span class=\"card-cell-label\">Đơn vị tính phí</span>—</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Chi phí tạo ước tính · Ước tính chỉ để so sánh</span> <b>$0.5</b> <span class=\"price-unit\">ước tính trước khi tạo</span></div><p class=\"note-s\">Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.</p></td></tr></tbody></table></div></div><p class=\"note-s\">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. <a href=\"/docs/vi/billing/reserve/\">Cách hoạt động của cơ chế tạm giữ và quyết toán →</a></p><div data-declared-reference-pricing><h4>Chi tiết giá cước tham chiếu</h4><p class=\"note-s\">Biểu tham chiếu cấp mô hình không thay đổi việc chọn phương thức, báo giá hoặc khoản phí. Khoản phí đang áp dụng dùng mức phí phương thức Ailoot đã chọn.</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>Các cấu hình giá ảnh</summary><h4>Giá theo cấu hình</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Cấu hình</th><th>Điều kiện tính phí</th><th>Phí</th></tr></thead><tbody><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Ảnh đầu ra</th><td data-cell-label=\"Điều kiện tính phí\"><span class=\"card-cell-label\">Điều kiện tính phí</span>Không khai báo biến thể giá.</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Ảnh đầu ra</span> <b>$0.5</b> <span class=\"price-unit\">mỗi ảnh</span></div><p class=\"note-s\">Các mục niêm yết tương đương mô tả cùng một khoản phí; không cộng thêm phí thứ hai.</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Ví dụ yêu cầu</h3><h4>Ailoot Ultra · Ảnh</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Các phiên bản mã\"><button class=\"cg-tab\" id=\"model-code-2536-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2536-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-2536-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2536-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK</button><button class=\"cg-tab\" id=\"model-code-2536-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2536-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Node.js SDK</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Sao chép mã\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-2536-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2536-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np={&#39;model&#39;: &#39;recraft/recraft-v4-pro&#39;, &#39;prompt&#39;: &#39;a red panda astronaut floating in space, studio lighting&#39;}\n\nPath(&quot;request.json&quot;).write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -H &#39;Content-Type: application/json&#39; \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - &lt;&lt;&#39;PY_RESULT&#39;\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\nsave_images(json.loads(Path(&quot;result.json&quot;).read_text())[&quot;data&quot;])\nPY_RESULT\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2536-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2536-tab-1\" hidden><pre data-lang=\"python\"><code>from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(&quot;No completed images; retain the full response&quot;)\n    for index, item in enumerate(items):\n        encoded=item.get(&quot;b64_json&quot;)\n        uri=item.get(&quot;url&quot;, &quot;&quot;)\n        if not encoded and uri.startswith(&quot;data:image/&quot;):\n            header, separator, encoded=uri.partition(&quot;,&quot;)\n            if not separator or &quot;;base64&quot; not in header: raise SystemExit(&quot;Unsupported image data URI&quot;)\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(&quot;https://api.ailoot.ai&quot;,uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=&quot;https&quot; or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(&quot;Invalid returned image URL&quot;)\n            owned=parsed.netloc==&quot;api.ailoot.ai&quot; and parsed.path.startswith(&quot;/v1/media/assets/&quot;) and parsed.path.endswith(&quot;/content&quot;)\n            args=[&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,uri]\n            if owned: args += [&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;]]\n            temporary=Path(f&quot;image-{index}.bin&quot;)\n            subprocess.run(args+[&quot;-o&quot;,str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(&quot;Image has neither bytes nor URL&quot;)\n        if not raw: raise SystemExit(&quot;Empty image result&quot;)\n        ext=&quot;png&quot; if raw.startswith(b&quot;\\x89PNG&quot;) else &quot;jpg&quot; if raw.startswith(b&quot;\\xff\\xd8&quot;) else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;svg&quot; if raw.lstrip().startswith((b&quot;&lt;svg&quot;,b&quot;&lt;?xml&quot;)) else &quot;bin&quot;\n        Path(f&quot;image-{index}.{ext}&quot;).write_bytes(raw)\n    print(&quot;Every returned image saved; complete response metadata retained&quot;)\n\nrequest={&#39;model&#39;: &#39;recraft/recraft-v4-pro&#39;, &#39;prompt&#39;: &#39;a red panda astronaut floating in space, studio lighting&#39;}\nclient=OpenAI(base_url=&quot;https://api.ailoot.ai/v1&quot;,api_key=os.environ[&quot;AILOOT_API_KEY&quot;],max_retries=0)\nresult=client.images.generate(**request)\nPath(&quot;sdk-result.txt&quot;).write_text(str(result),encoding=&quot;utf-8&quot;)\nsave_images([{&quot;b64_json&quot;:getattr(item,&quot;b64_json&quot;,None),&quot;url&quot;:getattr(item,&quot;url&quot;,None)} for item in result.data])\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2536-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2536-tab-2\" hidden><pre data-lang=\"js\"><code>import OpenAI from &quot;openai&quot;;\nimport { readFileSync, writeFileSync } from &quot;node:fs&quot;;\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(&quot;Set your actual Ailoot API key&quot;);\nconst client=new OpenAI({baseURL:&quot;https://api.ailoot.ai/v1&quot;,apiKey:key,maxRetries:0});\nconst request={&quot;model&quot;: &quot;recraft/recraft-v4-pro&quot;, &quot;prompt&quot;: &quot;a red panda astronaut floating in space, studio lighting&quot;};\nconst result=await client.images.generate(request);\nwriteFileSync(&quot;sdk-result.json&quot;,JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(&quot;No completed images&quot;);\nfor(let index=0;index&lt;result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||&quot;&quot;,raw;\n  if(!encoded &amp;&amp; uri.startsWith(&quot;data:image/&quot;)) {\n    const comma=uri.indexOf(&quot;,&quot;);if(comma&lt;0 || !uri.slice(0,comma).includes(&quot;;base64&quot;)) throw new Error(&quot;Unsupported image data URI&quot;);\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(&quot;Invalid Base64&quot;);\n    raw=Buffer.from(encoded,&quot;base64&quot;);\n  } else if(uri) {\n    const u=new URL(uri,&quot;https://api.ailoot.ai&quot;);\n    if(u.protocol!==&quot;https:&quot; || u.username || u.password) throw new Error(&quot;Invalid returned URL&quot;);\n    const owned=u.origin===&quot;https://api.ailoot.ai&quot; &amp;&amp; u.pathname.startsWith(&quot;/v1/media/assets/&quot;) &amp;&amp; u.pathname.endsWith(&quot;/content&quot;);\n    const response=await fetch(u,{headers:owned?{Authorization:&quot;Bearer &quot;+key}:{},redirect:&quot;manual&quot;});\n    if(!response.ok) throw new Error(&quot;Image content download failed: &quot;+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(&quot;Image has neither bytes nor URL&quot;);\n  if(!raw.length) throw new Error(&quot;Empty image result&quot;);\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?&quot;png&quot;:raw[0]===255&amp;&amp;raw[1]===216?&quot;jpg&quot;:raw.toString(&quot;ascii&quot;,0,4)===&quot;RIFF&quot;&amp;&amp;raw.toString(&quot;ascii&quot;,8,12)===&quot;WEBP&quot;?&quot;webp&quot;:raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;svg&quot;)||raw.toString(&quot;utf8&quot;).trimStart().startsWith(&quot;&lt;?xml&quot;)?&quot;svg&quot;:&quot;bin&quot;;\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(&quot;Every returned image saved; sdk-result.json retains complete metadata&quot;);\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Nhận và lưu kết quả</h3><h4>Ailoot Ultra · Ảnh</h4><p class=\"note-s\">Tải xuống từng ảnh trả về hoặc lưu nội dung Base64 của ảnh</p><ul class=\"card-result-paths\"><li><code>GET /v1/media/tasks/{task_id}</code></li><li><code>GET /v1/media/assets/{asset_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Lưu tất cả kết quả đã hoàn tất</h5><p class=\"note-s\">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.</p><p class=\"note-s\">Giữ lại mọi mục dữ liệu và toàn bộ mức sử dụng; tiếp nhận quyền sở hữu và lưu tất cả ảnh thực tế được trả về. Không tự tạo URL hoặc ID.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Nếu cần kiểm tra phản hồi gốc</h5><p class=\"note-s\">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.</p></div><details class=\"card-about\" data-output-fields><summary>Trường phản hồi</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Trường</th><th>Loại</th></tr></thead><tbody><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>integer</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>base64 string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>object</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Bí danh</h3><h4>Bí danh mô hình</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=recraft%2Frecraft-v4-pro&amp;route=Ultra&amp;caller=recraft%2Frecraft-v4-pro&amp;fmt=images\"><code>recraft/recraft-v4-pro</code></a></span></p><h4>Bí danh đường dẫn phương thức</h4><p class=\"note-s\"><code>/v1/images</code></p><h4>ID gọi liên quan</h4><p class=\"note-s\"><a href=\"#m=recraft%2Frecraft-v4-pro&amp;route=Ultra&amp;caller=recraft%2Frecraft-v4-pro&amp;fmt=images\"><code>recraft/recraft-v4-pro</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "recraft/recraft-v4-pro",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "recraft/recraft-v4-pro",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|images|/v1/images/generations|recraft%2Frecraft-v4-pro",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Retain every data item and complete usage; own and save all actual returned images. No invented URLs or IDs.",
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "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."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_image",
                "required": [
                  "prompt"
                ]
              }
            ],
            "outputs": {
              "all_results": "Giữ lại mọi mục dữ liệu và toàn bộ mức sử dụng; tiếp nhận quyền sở hữu và lưu tất cả ảnh thực tế được trả về. Không tự tạo URL hoặc ID.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "enum": [
                  "recraft/recraft-v4-pro"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "maximum": 6,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "enum": [
                  "1:1",
                  "4:3",
                  "3:4",
                  "16:9",
                  "9:16",
                  "auto"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "items": {
                  "properties": {
                    "image_url": {
                      "properties": {
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "url"
                      ],
                      "type": "object"
                    },
                    "type": {
                      "const": "image_url"
                    }
                  },
                  "required": [
                    "type",
                    "image_url"
                  ],
                  "type": "object"
                },
                "material_rule": "Actual customer HTTP(S) image URL or base64 data URI; no invented reference URL.",
                "maximum_items": 1,
                "minimum_items": 0,
                "name": "input_references",
                "required": false,
                "type": "array"
              }
            ],
            "request_schema": {
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "1:1",
                    "4:3",
                    "3:4",
                    "16:9",
                    "9:16",
                    "auto"
                  ],
                  "type": "string"
                },
                "input_references": {
                  "items": {
                    "properties": {
                      "image_url": {
                        "properties": {
                          "url": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url"
                    ],
                    "type": "object"
                  },
                  "maxItems": 1,
                  "minItems": 0,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "recraft/recraft-v4-pro"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": false,
              "body": {
                "model": "recraft/recraft-v4-pro",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json"
            }
          },
          "hints": [
            "Dùng mô hình chính xác và các trường đầu vào theo tài liệu.",
            "Giữ lại toàn bộ phản hồi, mọi đầu ra thực tế và các ID gốc được trả về."
          ],
          "input": {
            "content_type": "application/json",
            "exact_supported_parameters": {
              "aspect_ratio": {
                "type": "enum",
                "values": [
                  "1:1",
                  "4:3",
                  "3:4",
                  "16:9",
                  "9:16",
                  "auto"
                ]
              },
              "input_references": {
                "max": 1,
                "min": 0,
                "type": "range"
              },
              "n": {
                "max": 6,
                "min": 1,
                "type": "range"
              }
            },
            "material_types": [
              "text",
              "image"
            ],
            "optional_controls": [
              "aspect_ratio",
              "n",
              "input_references"
            ],
            "reference_material_rule": "Chỉ dùng tham chiếu ảnh thực tế của khách hàng; các điều kiện của điểm cuối nhà cung cấp chi phối việc sử dụng chúng.",
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "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",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "method_aliases": [
            "/v1/images"
          ],
          "operation_modes": [
            "text_to_image",
            "reference_guided_image"
          ],
          "output": {
            "all_results": true,
            "family": "image",
            "format": "actual validated raster MIME",
            "result": "every actual owned URL or b64_json"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual physical units",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_image_output",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "image output",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Chi phí tạo ước tính",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np={'model': 'recraft/recraft-v4-pro', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "curl · exact creation/save all outputs",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nrequest={'model': 'recraft/recraft-v4-pro', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · exact payload/save all outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"recraft/recraft-v4-pro\", \"prompt\": \"a red panda astronaut floating in space, studio lighting\"};\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?\"png\":raw[0]===255&&raw[1]===216?\"jpg\":raw.toString(\"ascii\",0,4)===\"RIFF\"&&raw.toString(\"ascii\",8,12)===\"WEBP\"?\"webp\":raw.toString(\"utf8\").trimStart().startsWith(\"<svg\")||raw.toString(\"utf8\").trimStart().startsWith(\"<?xml\")?\"svg\":\"bin\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · exact payload/save all outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "hints": [
          "Use the exact model and documented input fields.",
          "Keep the complete response, every actual output and original returned IDs."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Картинки",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/images"
        ],
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual physical units",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_image_output",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "image output",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "recraft/recraft-v4-pro",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.5",
            "amount_unit": "usd_per_image_output",
            "billing_input": false,
            "estimate_only": true,
            "key": "image_output",
            "label": "image output",
            "native_amount_usd_per_unit": "0.5",
            "native_quantity": 1,
            "public_unit_label": "per image output",
            "quantity": "1",
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "image_output"
          },
          {
            "amount": "0.5",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.5",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    }
  ],
  "model_id": "recraft/recraft-v4-pro",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "384f633a3866249d87bb72e68ae8ce9d35c45b21d33fa69c52db7a5f0af56467",
    "input_html_sha256": "c6f80e065202a45e9b6b19652a412e3843f765a066ee494520cd5ef53b408990",
    "private_audit_sha256": "a5d08fe5cee09a08fa99aca3c808d88b0232a2061e1f32d3a32d8b10242c5381",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/vi/recraft-recraft-v4-pro/",
    "description": "Recraft V4 Pro tạo ảnh raster 2K cho bố cục chi tiết, hình ảnh chân thực, minh hoạ và công việc sáng tạo hướng đến in ấn. Đây là phiên bản V4 độ phân giải cao hơn, với bản yêu cầu văn bản, đầu vào phong cách tuỳ chọn và quy trình ảnh thành ảnh riêng.",
    "locale": "vi",
    "md_url": "https://ailoot.ai/models/vi/recraft-recraft-v4-pro/index.md",
    "title": "Recraft: Recraft V4 Pro — Ailoot",
    "url": "https://ailoot.ai/models/vi/recraft-recraft-v4-pro/"
  },
  "rawModel": {
    "about": "Recraft V4 Pro là mô hình raster độ phân giải cao hơn trong dòng V4 của Recraft. V4 tập trung vào phán đoán thị giác, bố cục cân bằng, màu thống nhất và diễn giải cẩn thận định hướng sáng tạo. Nhà sản xuất định vị Pro cho chi tiết tinh hơn, cảnh phức tạp chân thực hơn và hình ảnh sản xuất quy mô lớn. Dùng cho minh hoạ chi tiết, ảnh biên tập, ý tưởng áp phích hoặc tài nguyên khác hưởng lợi từ kết quả raster lớn hơn. Mô hình vẫn tách biệt với V4.1 về sau và đầu ra SVG của V4 Pro Vector.\n\nMã nhà sản xuất cụ thể là recraftv4_pro. Đầu ra được công bố là raster 2K ở WebP không mất dữ liệu hoặc PNG: 2048 × 2048 pixel cho ảnh vuông, 2688 × 1536 cho 16:9 và 1664 × 2560 cho 2:3. Tỷ lệ được hỗ trợ khác có kích thước riêng. Chọn tỷ lệ khung hình cho bố cục dự định hoặc kích thước chính xác được phép; kích thước pixel tuỳ ý không nằm trong hợp đồng tạo ảnh được công bố. V4 tiêu chuẩn có đầu ra raster 1K nhỏ hơn, còn mô hình vector không có độ phân giải pixel cố định.\n\nV4 có thể diễn giải câu lệnh ngắn để khám phá hoặc câu lệnh có cấu trúc để có kết quả kiểm soát. Với định hướng mỹ thuật cụ thể, hướng dẫn nhà sản xuất đi từ chủ thể và môi trường đến khung hình, thuộc tính, quan hệ không gian, ánh sáng, chiều sâu và tâm trạng. Với ảnh sản phẩm biên tập, yêu cầu ảnh dọc ấn tượng của ghế có dáng điêu khắc, bề mặt kim loại xước, ánh sáng bên, nền tối yên và khoảng trống phía trên vật thể cho tiêu đề. Gọi tên các quan hệ đó làm bố cục dự định rõ hơn yêu cầu chung về ảnh cao cấp.\n\nPhạm vi sáng tạo của dòng gồm minh hoạ kể chuyện, cảnh chân thực và hình ảnh có chiều sâu với chỉ dẫn chất liệu cùng ánh sáng. Kết quả trông 3D vẫn là ảnh, không phải cảnh 3D có thể chỉnh sửa. Với áp phích đồ hoạ, chỉ định các lớp thị giác và tương tác: nền, minh hoạ hoặc ảnh chụp, thứ bậc tiêu đề và chữ bổ trợ. V4 được định vị cho cụm từ ngắn và dài vừa dễ đọc, nhưng cần kiểm tra chính tả cùng thứ bậc hoàn chỉnh thay vì suy ra từ tên mô hình.\n\nTài liệu tham chiếu tạo ảnh hiện hành cho phép câu lệnh tối đa 10,000 ký tự, từ một đến sáu đầu ra, seed ngẫu nhiên và tuỳ chọn màu ưu tiên cùng màu nền. Phong cách tuỳ chỉnh hoặc ảnh tham chiếu tương thích tuỳ chọn có thể định hướng diện mạo với khớp linh hoạt hoặc chính xác. Mô hình không nhận tuỳ chọn V3 cũ negative_prompt, phong cách tuyển chọn, text_layout, artistic_level hoặc no_text. Mô tả ảnh cuối dự định trong câu lệnh khẳng định và giữ yêu cầu chủ thể, bố cục cùng màu rõ ràng. Với tạo ảnh theo phong cách tham chiếu, dùng từ một đến mười ảnh PNG, JPG hoặc WebP, tổng không quá 64 MB và mỗi ảnh dưới 20 MB. Mỗi tham chiếu cần cạnh ngắn ít nhất 256 pixel, cạnh dài không quá 4,096 pixel và độ phân giải không quá 16 megapixel. Dùng những tham chiếu này hoặc phong cách đã lưu tương thích, thay vì cả hai.\n\nRecraft công bố thao tác ảnh thành ảnh riêng cho V4. Thao tác kết hợp ảnh có sẵn và câu lệnh với strength từ 0 đến 1 để kiểm soát mức thay đổi, và không nhận tuỳ chọn phong cách tuỳ chỉnh V4 trong thao tác đó. Chuẩn bị nguồn trong giới hạn đầu vào ảnh của nhà sản xuất và nêu thuộc tính cần mang sang kết quả mới. Với tài nguyên cuối lớn hơn, kiểm tra chi tiết nhỏ, vùng cắt và chữ ở kích thước dự định. Chi tiết raster bổ sung của Pro hỗ trợ việc kiểm tra đó, trong khi ảnh vẫn là diễn giải được tạo từ bản yêu cầu sáng tạo cung cấp. Với ảnh thành ảnh, cung cấp PNG, JPG, WebP hoặc SVG dưới 20 MB, không quá 16 megapixel, hai cạnh từ 256 đến 4,096 pixel.\n\n",
    "alias_of": null,
    "aliases": [],
    "author": "Recraft",
    "available": null,
    "canonical_model": "recraft/recraft-v4-pro",
    "capabilities": {
      "context_length": 65536,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "image"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.5",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.5",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "Giá theo cấu hình được trình bày đầy đủ trong phần chi tiết."
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "a9d07f22b268672412dfcf4c",
        "label": "Các cấu hình giá ảnh",
        "profiles": [
          {
            "basis": "Các mục niêm yết tương đương mô tả cùng một khoản phí; không cộng thêm phí thứ hai.",
            "dimensions": {
              "conditions": "Không khai báo biến thể giá."
            },
            "label": "Ảnh đầu ra",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_image",
                "billing_input": false,
                "key": "output_image",
                "label": "Output image",
                "public_unit_label": "per image",
                "quantity": 1,
                "rate_role": "typed_image_reference",
                "side": "out",
                "unit": "image"
              }
            ]
          }
        ]
      }
    ],
    "entity_type": "model",
    "formats": [
      "images"
    ],
    "id": "recraft/recraft-v4-pro",
    "input": [
      "text",
      "image"
    ],
    "kind": "image",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "all_results": "Retain every data item and complete usage; own and save all actual returned images. No invented URLs or IDs.",
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}/content",
                  "url_source": "exact returned signed URL; never construct token"
                }
              ],
              "mode": "synchronous_result_then_owned_library",
              "operation_id_is_not_task_id": true,
              "status": [
                {
                  "http": "GET",
                  "id_source": "actual returned task_id or media library record",
                  "path": "/v1/media/tasks/{task_id}"
                }
              ],
              "unknown": "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."
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_image",
                "required": [
                  "prompt"
                ]
              }
            ],
            "outputs": {
              "all_results": "Giữ lại mọi mục dữ liệu và toàn bộ mức sử dụng; tiếp nhận quyền sở hữu và lưu tất cả ảnh thực tế được trả về. Không tự tạo URL hoặc ID.",
              "family": "image",
              "fields": [
                {
                  "description": null,
                  "name": "created",
                  "type": "integer"
                },
                {
                  "description": null,
                  "name": "data[].url",
                  "type": "string"
                },
                {
                  "description": null,
                  "name": "data[].b64_json",
                  "type": "base64 string"
                },
                {
                  "description": null,
                  "name": "usage",
                  "type": "object"
                }
              ],
              "format": "actual validated raster MIME"
            },
            "parameters": [
              {
                "availability": "source_interface",
                "enum": [
                  "recraft/recraft-v4-pro"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "min_length": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "maximum": 6,
                "minimum": 1,
                "name": "n",
                "required": false,
                "type": "integer"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "enum": [
                  "1:1",
                  "4:3",
                  "3:4",
                  "16:9",
                  "9:16",
                  "auto"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "saved_exact_supplier_endpoint",
                "items": {
                  "properties": {
                    "image_url": {
                      "properties": {
                        "url": {
                          "type": "string"
                        }
                      },
                      "required": [
                        "url"
                      ],
                      "type": "object"
                    },
                    "type": {
                      "const": "image_url"
                    }
                  },
                  "required": [
                    "type",
                    "image_url"
                  ],
                  "type": "object"
                },
                "material_rule": "Actual customer HTTP(S) image URL or base64 data URI; no invented reference URL.",
                "maximum_items": 1,
                "minimum_items": 0,
                "name": "input_references",
                "required": false,
                "type": "array"
              }
            ],
            "request_schema": {
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "1:1",
                    "4:3",
                    "3:4",
                    "16:9",
                    "9:16",
                    "auto"
                  ],
                  "type": "string"
                },
                "input_references": {
                  "items": {
                    "properties": {
                      "image_url": {
                        "properties": {
                          "url": {
                            "type": "string"
                          }
                        },
                        "required": [
                          "url"
                        ],
                        "type": "object"
                      },
                      "type": {
                        "const": "image_url"
                      }
                    },
                    "required": [
                      "type",
                      "image_url"
                    ],
                    "type": "object"
                  },
                  "maxItems": 1,
                  "minItems": 0,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "recraft/recraft-v4-pro"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": false,
              "body": {
                "model": "recraft/recraft-v4-pro",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json"
            }
          },
          "hints": [
            "Dùng mô hình chính xác và các trường đầu vào theo tài liệu.",
            "Giữ lại toàn bộ phản hồi, mọi đầu ra thực tế và các ID gốc được trả về."
          ],
          "input": {
            "content_type": "application/json",
            "exact_supported_parameters": {
              "aspect_ratio": {
                "type": "enum",
                "values": [
                  "1:1",
                  "4:3",
                  "3:4",
                  "16:9",
                  "9:16",
                  "auto"
                ]
              },
              "input_references": {
                "max": 1,
                "min": 0,
                "type": "range"
              },
              "n": {
                "max": 6,
                "min": 1,
                "type": "range"
              }
            },
            "material_types": [
              "text",
              "image"
            ],
            "optional_controls": [
              "aspect_ratio",
              "n",
              "input_references"
            ],
            "reference_material_rule": "Chỉ dùng tham chiếu ảnh thực tế của khách hàng; các điều kiện của điểm cuối nhà cung cấp chi phối việc sử dụng chúng.",
            "required": [
              "model",
              "prompt"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "exact returned signed URL; never construct token"
              }
            ],
            "mode": "synchronous_result_then_owned_library",
            "operation_id_is_not_task_id": true,
            "status": [
              {
                "http": "GET",
                "id_source": "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",
                "path": "/v1/media/tasks/{task_id}"
              }
            ],
            "unknown": "If an image generation or edit result requires a check, keep the original operation_id/X-Client-Request-ID and returned result information. Recover existing owned results through the media library using actual task_id or asset_id values. Do not resubmit the generation/edit request or construct a polling URL from operation_id."
          },
          "method": {
            "http": "POST",
            "path": "/v1/images/generations"
          },
          "method_aliases": [
            "/v1/images"
          ],
          "operation_modes": [
            "text_to_image",
            "reference_guided_image"
          ],
          "output": {
            "all_results": true,
            "family": "image",
            "format": "actual validated raster MIME",
            "result": "every actual owned URL or b64_json"
          }
        },
        "ctx": null,
        "declared_pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual physical units",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_image_output",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "image output",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Chi phí tạo ước tính",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "examples": [
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np={'model': 'recraft/recraft-v4-pro', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\n\nPath(\"request.json\").write_text(json.dumps(p,ensure_ascii=False))\nPY_REQUEST\ncurl --fail-with-body --silent --show-error https://api.ailoot.ai/v1/images/generations \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\npython3 - <<'PY_RESULT'\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\nsave_images(json.loads(Path(\"result.json\").read_text())[\"data\"])\nPY_RESULT\n",
            "label": "curl · exact creation/save all outputs",
            "language": "bash"
          },
          {
            "code": "from openai import OpenAI\nimport base64, json, os, subprocess\nfrom pathlib import Path\nfrom urllib.parse import urlsplit, urljoin\n\ndef save_images(items):\n    if not items: raise SystemExit(\"No completed images; retain the full response\")\n    for index, item in enumerate(items):\n        encoded=item.get(\"b64_json\")\n        uri=item.get(\"url\", \"\")\n        if not encoded and uri.startswith(\"data:image/\"):\n            header, separator, encoded=uri.partition(\",\")\n            if not separator or \";base64\" not in header: raise SystemExit(\"Unsupported image data URI\")\n        if encoded:\n            raw=base64.b64decode(encoded,validate=True)\n        elif uri:\n            uri=urljoin(\"https://api.ailoot.ai\",uri)\n            parsed=urlsplit(uri)\n            if parsed.scheme!=\"https\" or not parsed.netloc or parsed.username or parsed.password:\n                raise SystemExit(\"Invalid returned image URL\")\n            owned=parsed.netloc==\"api.ailoot.ai\" and parsed.path.startswith(\"/v1/media/assets/\") and parsed.path.endswith(\"/content\")\n            args=[\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",uri]\n            if owned: args += [\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"]]\n            temporary=Path(f\"image-{index}.bin\")\n            subprocess.run(args+[\"-o\",str(temporary)],check=True)\n            raw=temporary.read_bytes()\n            temporary.unlink()\n        else: raise SystemExit(\"Image has neither bytes nor URL\")\n        if not raw: raise SystemExit(\"Empty image result\")\n        ext=\"png\" if raw.startswith(b\"\\x89PNG\") else \"jpg\" if raw.startswith(b\"\\xff\\xd8\") else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"svg\" if raw.lstrip().startswith((b\"<svg\",b\"<?xml\")) else \"bin\"\n        Path(f\"image-{index}.{ext}\").write_bytes(raw)\n    print(\"Every returned image saved; complete response metadata retained\")\n\nrequest={'model': 'recraft/recraft-v4-pro', 'prompt': 'a red panda astronaut floating in space, studio lighting'}\nclient=OpenAI(base_url=\"https://api.ailoot.ai/v1\",api_key=os.environ[\"AILOOT_API_KEY\"],max_retries=0)\nresult=client.images.generate(**request)\nPath(\"sdk-result.txt\").write_text(str(result),encoding=\"utf-8\")\nsave_images([{\"b64_json\":getattr(item,\"b64_json\",None),\"url\":getattr(item,\"url\",None)} for item in result.data])\n",
            "label": "Python SDK · exact payload/save all outputs",
            "language": "python"
          },
          {
            "code": "import OpenAI from \"openai\";\nimport { readFileSync, writeFileSync } from \"node:fs\";\nconst key=process.env.AILOOT_API_KEY;\nif(!key) throw new Error(\"Set your actual Ailoot API key\");\nconst client=new OpenAI({baseURL:\"https://api.ailoot.ai/v1\",apiKey:key,maxRetries:0});\nconst request={\"model\": \"recraft/recraft-v4-pro\", \"prompt\": \"a red panda astronaut floating in space, studio lighting\"};\nconst result=await client.images.generate(request);\nwriteFileSync(\"sdk-result.json\",JSON.stringify(result,null,2));\nif(!result.data?.length) throw new Error(\"No completed images\");\nfor(let index=0;index<result.data.length;index++) {\n  const item=result.data[index];let encoded=item.b64_json,uri=item.url||\"\",raw;\n  if(!encoded && uri.startsWith(\"data:image/\")) {\n    const comma=uri.indexOf(\",\");if(comma<0 || !uri.slice(0,comma).includes(\";base64\")) throw new Error(\"Unsupported image data URI\");\n    encoded=uri.slice(comma+1);\n  }\n  if(encoded) {\n    if(encoded.length%4!==0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) throw new Error(\"Invalid Base64\");\n    raw=Buffer.from(encoded,\"base64\");\n  } else if(uri) {\n    const u=new URL(uri,\"https://api.ailoot.ai\");\n    if(u.protocol!==\"https:\" || u.username || u.password) throw new Error(\"Invalid returned URL\");\n    const owned=u.origin===\"https://api.ailoot.ai\" && u.pathname.startsWith(\"/v1/media/assets/\") && u.pathname.endsWith(\"/content\");\n    const response=await fetch(u,{headers:owned?{Authorization:\"Bearer \"+key}:{},redirect:\"manual\"});\n    if(!response.ok) throw new Error(\"Image content download failed: \"+response.status);\n    raw=Buffer.from(await response.arrayBuffer());\n  } else throw new Error(\"Image has neither bytes nor URL\");\n  if(!raw.length) throw new Error(\"Empty image result\");\n  const ext=raw.subarray(0,4).equals(Buffer.from([137,80,78,71]))?\"png\":raw[0]===255&&raw[1]===216?\"jpg\":raw.toString(\"ascii\",0,4)===\"RIFF\"&&raw.toString(\"ascii\",8,12)===\"WEBP\"?\"webp\":raw.toString(\"utf8\").trimStart().startsWith(\"<svg\")||raw.toString(\"utf8\").trimStart().startsWith(\"<?xml\")?\"svg\":\"bin\";\n  writeFileSync(`image-${index}.${ext}`,raw);\n}\nconsole.log(\"Every returned image saved; sdk-result.json retains complete metadata\");\n",
            "label": "Node SDK · exact payload/save all outputs",
            "language": "js"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "images",
        "hints": [
          "Use the exact model and documented input fields.",
          "Keep the complete response, every actual output and original returned IDs."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Картинки",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/images"
        ],
        "out": null,
        "output": [
          "image"
        ],
        "path": "/v1/images/generations",
        "price_conditions": [
          {
            "label": "Fast mode",
            "value": "Not specified",
            "when": "When fast mode is selected"
          },
          {
            "label": "Flex mode",
            "value": "Not specified",
            "when": "When flex mode is selected"
          },
          {
            "label": "Maximum reasoning effort",
            "value": "Not specified",
            "when": "When maximum reasoning effort uses the default adjustment"
          }
        ],
        "pricing": {
          "billing_mode": "original_invoice_usd",
          "image_input_price": null,
          "image_output_price": null
        },
        "pricing_profiles": [
          {
            "dimensions": {
              "regime": "base"
            },
            "label": "Base token rates",
            "units": [
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "input_price",
                "label": "Input tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "output_price",
                "label": "Output tokens",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "output_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "output_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_read_price",
                "label": "Cache read",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "cached_input_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "cached_input_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_price",
                "label": "Cache write",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "generic_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "generic_cache_creation_token"
              },
              {
                "amount": null,
                "amount_unit": "usd_per_thousand_tokens",
                "billing_input": false,
                "estimate_only": true,
                "key": "cache_write_1h_price",
                "label": "Cache write, 1 hour",
                "native_amount_usd_per_unit": null,
                "native_quantity": 1,
                "native_unit": "one_hour_cache_creation_token",
                "public_unit_label": "/ 1K tokens",
                "quantity": 1000,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "in",
                "unit": "one_hour_cache_creation_token"
              }
            ]
          },
          {
            "dimensions": {
              "quantity_basis": "actual physical units",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_image_output",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "image output",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "per image output",
                "quantity": "1",
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "image_output"
              }
            ]
          },
          {
            "basis": "This estimate is not an additional charge or a fixed rate for the completed generation.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Estimated generation cost",
            "units": [
              {
                "amount": "0.5",
                "amount_unit": "usd_per_exact_native_unit",
                "billing_input": false,
                "estimate_only": true,
                "key": "forecast_usd",
                "label": "Estimated generation cost",
                "native_amount_usd_per_unit": "0.5",
                "native_quantity": 1,
                "public_unit_label": "estimate before generation",
                "quantity": 1,
                "quantity_is_estimate": true,
                "rate_role": "typed_native_retail_rate",
                "side": "out",
                "unit": "request_estimate"
              }
            ]
          }
        ],
        "request_model_id": "recraft/recraft-v4-pro",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/media/tasks/{task_id}",
          "GET /v1/media/assets/{asset_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "0.5",
            "amount_unit": "usd_per_image_output",
            "billing_input": false,
            "estimate_only": true,
            "key": "image_output",
            "label": "image output",
            "native_amount_usd_per_unit": "0.5",
            "native_quantity": 1,
            "public_unit_label": "per image output",
            "quantity": "1",
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "image_output"
          },
          {
            "amount": "0.5",
            "amount_unit": "usd_per_exact_native_unit",
            "billing_input": false,
            "estimate_only": true,
            "key": "forecast_usd",
            "label": "Estimated generation cost",
            "native_amount_usd_per_unit": "0.5",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ]
      }
    ],
    "model_aliases": [
      {
        "canonical_model_id": "recraft/recraft-v4-pro",
        "request_model_id": "recraft/recraft-v4-pro",
        "route_label": "Ultra"
      }
    ],
    "name": "Recraft: Recraft V4 Pro",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.5,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.5,
      "varies": false
    },
    "pricing_profiles": [
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "output_family": "raster",
          "per_actual_generated_image": true,
          "pro_raster_resolution": "2K",
          "quality": "pro",
          "units_per_usd": 1000
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.50",
            "amount_unit": "usd_per_output_image",
            "conditions": {
              "output_family": "raster",
              "per_actual_generated_image": true,
              "pro_raster_resolution": "2K",
              "quality": "pro",
              "units_per_usd": 1000
            },
            "key": "base",
            "label": "base",
            "profile_index": 0,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "output_image"
          }
        ]
      },
      {
        "applicability": {
          "client_selectable": false,
          "native_profile_selection_pending": true,
          "scope": "manufacturer_reference"
        },
        "dimensions": {
          "adds_to_per_image_base": true,
          "applies_only_where_exact_maker_method_accepts_style_references": true,
          "once_per_request_not_per_output": true,
          "only_when_generating_with_style_reference_creates_style": true
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.010",
            "amount_unit": "usd_per_request",
            "conditions": {
              "adds_to_per_image_base": true,
              "applies_only_where_exact_maker_method_accepts_style_references": true,
              "once_per_request_not_per_output": true,
              "only_when_generating_with_style_reference_creates_style": true
            },
            "key": "style_creation_surcharge",
            "label": "style creation surcharge",
            "profile_index": 1,
            "quantity": "1",
            "rate_role": "binding_component_rate",
            "side": "out",
            "unit": "request"
          }
        ]
      }
    ],
    "public_id": "recraft/recraft-v4-pro",
    "short": "Recraft V4 Pro tạo ảnh raster 2K cho bố cục chi tiết, hình ảnh chân thực, minh hoạ và công việc sáng tạo hướng đến in ấn. Đây là phiên bản V4 độ phân giải cao hơn, với bản yêu cầu văn bản, đầu vào phong cách tuỳ chọn và quy trình ảnh thành ảnh riêng."
  },
  "renderer_schema": {
    "method_order": "Original DTO methods order; every exact route/format/path/caller survives.",
    "prices": "Original public DTO fields and original native display HTML; no flattened or normalized offers."
  },
  "representation": "exact-public-dto-and-native-renderer-html",
  "representationNotes": {
    "current_reference": {
      "about_json_pointer": "/aboutHtml",
      "methods": [
        {
          "contract_json_pointer": "/methods/0/rawMethod/contract",
          "html_json_pointer": "/methods/0/html",
          "method_ordinal": 0
        }
      ],
      "role": "current-semantic-reference"
    },
    "raw_input": {
      "examples_role": "historical-input-not-current-ready-examples",
      "json_pointers": [
        "/rawModel",
        "/methods/0/rawMethod"
      ],
      "role": "historical-owner-input"
    },
    "schema": "ailoot-native-model-representations-v1"
  },
  "schema": "ailoot-static-model-facts-v1",
  "schema_version": 1,
  "shortText": "Recraft V4 Pro tạo ảnh raster 2K cho bố cục chi tiết, hình ảnh chân thực, minh hoạ và công việc sáng tạo hướng đến in ấn. Đây là phiên bản V4 độ phân giải cao hơn, với bản yêu cầu văn bản, đầu vào phong cách tuỳ chọn và quy trình ảnh thành ảnh riêng.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "635c10b8c0c19fb980712caba17a0921eeee609185fc8239c9322a65f4270432",
    "renderer_sha256": "64a62299639eb843877e9ec5c95e32bf22bac3acfe230f6f502c5c3aa186f9c1"
  },
  "sourceRevision": "e3bead7de020a1b175783da9ebdc75fb81936eb94bb4121054ddb32797fb128f"
}
