{
  "aboutHtml": "<p>Recraft V4 เป็นโมเดลราสเตอร์มาตรฐานในรุ่น V4 ของ Recraft ผู้ผลิตเน้นวิจารณญาณการออกแบบ ได้แก่ องค์ประกอบสมดุล ความสัมพันธ์สีสอดคล้อง และรายละเอียดที่สนับสนุนเจตนาของภาพ ทำงานกับภาพประกอบมีสไตล์ ฉากถ่าย และแนวคิดออกแบบกราฟิกได้ ใช้เมื่อบรีฟต้องการภาพที่รวมการเลือกสุนทรียะกับความแม่นยำตามพรอมป์ต์ ทั้งการสำรวจอารมณ์จากทิศทางสั้นหรือระบุเลย์เอาต์ตั้งใจอย่างละเอียด</p><p>รหัสโมเดลที่แน่นอนคือ recraftv4 เอกสารผู้ผลิตระบุผลราสเตอร์ 1K เป็น WebP แบบไม่สูญเสียข้อมูลหรือ PNG จัตุรัส 1024 × 1024 พิกเซล, 16:9 คือ 1344 × 768 และ 2:3 คือ 832 × 1280 อัตราส่วนอื่นที่รองรับมีขนาดของตน V4 Pro เป็นรุ่นราสเตอร์ 2K แยก ขณะที่ V4 Vector กับ Pro Vector ให้ SVG แก้ไขได้ เลือกรุ่น V4 ที่เจาะจงให้ตรงชิ้นงานที่ตั้งใจ แทนรวมคุณสมบัติผลต่างกันเหล่านี้</p><p>คู่มือผู้ผลิตแยกพรอมป์ต์ตีความสั้นจากทิศทางสร้างสรรค์มีโครงสร้าง วลีสั้นเปิดโอกาสให้สำรวจรูปทรง อารมณ์ และกรอบภาพ บรีฟมีโครงสร้างระบุตัวแบบ สถานที่ ท่า วัสดุ องค์ประกอบรอง แสง และลำดับภาพได้ สำหรับภาพประกอบเล่าเรื่อง บรรยายคนขี่จักรยานข้ามสะพานเล็ก รูปทรงลดทอนเด่น สีอุ่นหม่น และการเคลื่อนซ้ายไปขวาชัด การเลือกเนื้อหาและองค์ประกอบเช่นนี้นำไปทำได้มากกว่ารายการคำคุณศัพท์สไตล์ไม่เกี่ยวข้องยาว ๆ</p><p>ขอบเขต V4 รวมภาพประกอบ ภาพมีมิติ และภาพสมจริง คู่มือแนะนำบรรยายตรรกะการวาดสำหรับภาพประกอบ และวัสดุ แสง กล้อง และความลึกสำหรับภาพดู 3D อย่างหลังยังเป็นภาพราสเตอร์แทน mesh แก้ไขได้ สำหรับแนวคิดโปสเตอร์หรือบรรจุภัณฑ์ ระบุคำหลัก ตำแหน่ง และความสัมพันธ์ระหว่างภาพกับตัวพิมพ์ ผู้ผลิตเน้นข้อความสั้นและกลางอ่านได้ ให้ตรวจถ้อยคำกับการจัดจริงในภาพที่ส่งคืนก่อนใช้</p><p>การสร้างรองรับพรอมป์ต์สูงสุด 10,000 อักขระ seed สุ่ม ผลหนึ่งถึงหกภาพ สีที่ต้องการและสีพื้นหลังที่ต้องการ สามารถใช้สไตล์กำหนดเองที่เข้ากันได้หรือภาพอ้างอิงเป็นตัวเลือกเพื่อชี้นำแนวทางภาพผ่านการจับคู่แบบ flexible หรือ precise ได้ เลือกภาพอ้างอิงสะอาดหรือชุดที่เป็นโลกภาพเดียว แล้วให้พรอมป์ต์บรรยายตัวแบบกับฉากใหม่ ไม่รับประกันสีจากภาพอ้างอิงสู่ผลตรง จึงระบุชุดสีที่ต้องการชัดและเทียบผล สำหรับการสร้างแบบอ้างอิงสไตล์ ใช้ภาพ PNG, JPG หรือ WebP หนึ่งถึงสิบภาพ รวมไม่เกิน 64 MB และแต่ละภาพต่ำกว่า 20 MB แต่ละภาพต้องมีด้านสั้นอย่างน้อย 256 พิกเซล ด้านยาวไม่เกิน 4,096 พิกเซล และความละเอียดไม่เกิน 16 เมกะพิกเซล ใช้ภาพอ้างอิงเหล่านี้หรือสไตล์ที่บันทึกซึ่งเข้ากันได้อย่างใดอย่างหนึ่ง แทนใช้ทั้งสอง</p><p>image-to-image ตามเอกสารรวมภาพเดิมกับพรอมป์ต์ โดย strength ตั้งแต่ 0 ถึง 1 กำหนดว่าผลใหม่ออกห่างต้นฉบับเท่าใด การทำงานนั้นไม่รับตัวควบคุมสไตล์ V4 เอกสารสร้างปัจจุบันยังไม่รวมชื่อสไตล์ที่คัดสรร negative_prompt, text_layout, artistic_level และ no_text เตรียมคำบรรยายเชิงบวกของผลที่ต้องการและประเมินชิ้นงานในองค์ประกอบเป้าหมาย V4 มาตรฐานให้การตีความออกแบบราสเตอร์ที่ตรงประเด็น พร้อมรุ่น รูปแบบ และขนาดผลเฉพาะ สำหรับ image-to-image ให้ส่ง PNG, JPG, WebP หรือ SVG ต่ำกว่า 20 MB ไม่เกิน 16 เมกะพิกเซล โดยทั้งสองด้านอยู่ระหว่าง 256 ถึง 4,096 พิกเซล</p>",
  "aboutText": "Recraft V4 เป็นโมเดลราสเตอร์มาตรฐานในรุ่น V4 ของ Recraft ผู้ผลิตเน้นวิจารณญาณการออกแบบ ได้แก่ องค์ประกอบสมดุล ความสัมพันธ์สีสอดคล้อง และรายละเอียดที่สนับสนุนเจตนาของภาพ ทำงานกับภาพประกอบมีสไตล์ ฉากถ่าย และแนวคิดออกแบบกราฟิกได้ ใช้เมื่อบรีฟต้องการภาพที่รวมการเลือกสุนทรียะกับความแม่นยำตามพรอมป์ต์ ทั้งการสำรวจอารมณ์จากทิศทางสั้นหรือระบุเลย์เอาต์ตั้งใจอย่างละเอียด\n\nรหัสโมเดลที่แน่นอนคือ recraftv4 เอกสารผู้ผลิตระบุผลราสเตอร์ 1K เป็น WebP แบบไม่สูญเสียข้อมูลหรือ PNG จัตุรัส 1024 × 1024 พิกเซล, 16:9 คือ 1344 × 768 และ 2:3 คือ 832 × 1280 อัตราส่วนอื่นที่รองรับมีขนาดของตน V4 Pro เป็นรุ่นราสเตอร์ 2K แยก ขณะที่ V4 Vector กับ Pro Vector ให้ SVG แก้ไขได้ เลือกรุ่น V4 ที่เจาะจงให้ตรงชิ้นงานที่ตั้งใจ แทนรวมคุณสมบัติผลต่างกันเหล่านี้\n\nคู่มือผู้ผลิตแยกพรอมป์ต์ตีความสั้นจากทิศทางสร้างสรรค์มีโครงสร้าง วลีสั้นเปิดโอกาสให้สำรวจรูปทรง อารมณ์ และกรอบภาพ บรีฟมีโครงสร้างระบุตัวแบบ สถานที่ ท่า วัสดุ องค์ประกอบรอง แสง และลำดับภาพได้ สำหรับภาพประกอบเล่าเรื่อง บรรยายคนขี่จักรยานข้ามสะพานเล็ก รูปทรงลดทอนเด่น สีอุ่นหม่น และการเคลื่อนซ้ายไปขวาชัด การเลือกเนื้อหาและองค์ประกอบเช่นนี้นำไปทำได้มากกว่ารายการคำคุณศัพท์สไตล์ไม่เกี่ยวข้องยาว ๆ\n\nขอบเขต V4 รวมภาพประกอบ ภาพมีมิติ และภาพสมจริง คู่มือแนะนำบรรยายตรรกะการวาดสำหรับภาพประกอบ และวัสดุ แสง กล้อง และความลึกสำหรับภาพดู 3D อย่างหลังยังเป็นภาพราสเตอร์แทน mesh แก้ไขได้ สำหรับแนวคิดโปสเตอร์หรือบรรจุภัณฑ์ ระบุคำหลัก ตำแหน่ง และความสัมพันธ์ระหว่างภาพกับตัวพิมพ์ ผู้ผลิตเน้นข้อความสั้นและกลางอ่านได้ ให้ตรวจถ้อยคำกับการจัดจริงในภาพที่ส่งคืนก่อนใช้\n\nการสร้างรองรับพรอมป์ต์สูงสุด 10,000 อักขระ seed สุ่ม ผลหนึ่งถึงหกภาพ สีที่ต้องการและสีพื้นหลังที่ต้องการ สามารถใช้สไตล์กำหนดเองที่เข้ากันได้หรือภาพอ้างอิงเป็นตัวเลือกเพื่อชี้นำแนวทางภาพผ่านการจับคู่แบบ flexible หรือ precise ได้ เลือกภาพอ้างอิงสะอาดหรือชุดที่เป็นโลกภาพเดียว แล้วให้พรอมป์ต์บรรยายตัวแบบกับฉากใหม่ ไม่รับประกันสีจากภาพอ้างอิงสู่ผลตรง จึงระบุชุดสีที่ต้องการชัดและเทียบผล สำหรับการสร้างแบบอ้างอิงสไตล์ ใช้ภาพ PNG, JPG หรือ WebP หนึ่งถึงสิบภาพ รวมไม่เกิน 64 MB และแต่ละภาพต่ำกว่า 20 MB แต่ละภาพต้องมีด้านสั้นอย่างน้อย 256 พิกเซล ด้านยาวไม่เกิน 4,096 พิกเซล และความละเอียดไม่เกิน 16 เมกะพิกเซล ใช้ภาพอ้างอิงเหล่านี้หรือสไตล์ที่บันทึกซึ่งเข้ากันได้อย่างใดอย่างหนึ่ง แทนใช้ทั้งสอง\n\nimage-to-image ตามเอกสารรวมภาพเดิมกับพรอมป์ต์ โดย strength ตั้งแต่ 0 ถึง 1 กำหนดว่าผลใหม่ออกห่างต้นฉบับเท่าใด การทำงานนั้นไม่รับตัวควบคุมสไตล์ V4 เอกสารสร้างปัจจุบันยังไม่รวมชื่อสไตล์ที่คัดสรร negative_prompt, text_layout, artistic_level และ no_text เตรียมคำบรรยายเชิงบวกของผลที่ต้องการและประเมินชิ้นงานในองค์ประกอบเป้าหมาย V4 มาตรฐานให้การตีความออกแบบราสเตอร์ที่ตรงประเด็น พร้อมรุ่น รูปแบบ และขนาดผลเฉพาะ สำหรับ image-to-image ให้ส่ง PNG, JPG, WebP หรือ SVG ต่ำกว่า 20 MB ไม่เกิน 16 เมกะพิกเซล โดยทั้งสองด้านอยู่ระหว่าง 256 ถึง 4,096 พิกเซล",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "ae6f944a1e853675012682bf85b514806947749e6e6003daaf7fbe9caf0d6216",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "th",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Recraft: Recraft V4</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"ปิด\">×</button></div><div class=\"idline\"><span>Recraft /</span><code>recraft/recraft-v4</code><button type=\"button\" id=\"copy-id\">คัดลอก ID</button></div><nav class=\"card-jump-nav\" aria-label=\"ส่วนต่าง ๆ ของการ์ดโมเดล\"><button type=\"button\" data-card-jump=\"overview\">เริ่มต้น</button><button type=\"button\" data-card-jump=\"methods\">อินพุตและเมธอด</button><button type=\"button\" data-card-jump=\"pricing\">ราคา</button><button type=\"button\" data-card-jump=\"examples\">ตัวอย่าง</button><button type=\"button\" data-card-jump=\"results\">ผลลัพธ์</button><button type=\"button\" data-card-jump=\"aliases\">ชื่ออื่น</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"เมธอด 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\">รูปภาพ</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\">เริ่มต้น</h3><p class=\"mdesc-full\">Recraft V4 สร้างภาพราสเตอร์ 1K โดยเน้นองค์ประกอบ ความสัมพันธ์สี และทิศทางสร้างสรรค์ละเอียด ครอบคลุมภาพประกอบ ฉากถ่ายสมจริง และแนวคิดออกแบบกราฟิก มีข้อมูลเข้าสไตล์ตามต้องการและเวิร์กโฟลว์ image-to-image แยก</p><dl class=\"card-io\" data-card-io><div><dt>อินพุตที่รองรับ</dt><dd>ข้อความ · รูปภาพ</dd></div><div><dt>ผลลัพธ์</dt><dd>รูปภาพ</dd></div></dl><details class=\"card-about\"><summary>เกี่ยวกับโมเดล</summary><p class=\"note-s\" data-model-method-boundary>คำอธิบายนี้ครอบคลุมความสามารถของโมเดล อินพุต เอาต์พุต และตัวเลือกที่ใช้ได้ใน Ailoot แสดงด้านล่างตามเมธอดที่เลือก</p><div class=\"mabout\" id=\"m-about\"><p>Recraft V4 เป็นโมเดลราสเตอร์มาตรฐานในรุ่น V4 ของ Recraft ผู้ผลิตเน้นวิจารณญาณการออกแบบ ได้แก่ องค์ประกอบสมดุล ความสัมพันธ์สีสอดคล้อง และรายละเอียดที่สนับสนุนเจตนาของภาพ ทำงานกับภาพประกอบมีสไตล์ ฉากถ่าย และแนวคิดออกแบบกราฟิกได้ ใช้เมื่อบรีฟต้องการภาพที่รวมการเลือกสุนทรียะกับความแม่นยำตามพรอมป์ต์ ทั้งการสำรวจอารมณ์จากทิศทางสั้นหรือระบุเลย์เอาต์ตั้งใจอย่างละเอียด</p><p>รหัสโมเดลที่แน่นอนคือ recraftv4 เอกสารผู้ผลิตระบุผลราสเตอร์ 1K เป็น WebP แบบไม่สูญเสียข้อมูลหรือ PNG จัตุรัส 1024 × 1024 พิกเซล, 16:9 คือ 1344 × 768 และ 2:3 คือ 832 × 1280 อัตราส่วนอื่นที่รองรับมีขนาดของตน V4 Pro เป็นรุ่นราสเตอร์ 2K แยก ขณะที่ V4 Vector กับ Pro Vector ให้ SVG แก้ไขได้ เลือกรุ่น V4 ที่เจาะจงให้ตรงชิ้นงานที่ตั้งใจ แทนรวมคุณสมบัติผลต่างกันเหล่านี้</p><p>คู่มือผู้ผลิตแยกพรอมป์ต์ตีความสั้นจากทิศทางสร้างสรรค์มีโครงสร้าง วลีสั้นเปิดโอกาสให้สำรวจรูปทรง อารมณ์ และกรอบภาพ บรีฟมีโครงสร้างระบุตัวแบบ สถานที่ ท่า วัสดุ องค์ประกอบรอง แสง และลำดับภาพได้ สำหรับภาพประกอบเล่าเรื่อง บรรยายคนขี่จักรยานข้ามสะพานเล็ก รูปทรงลดทอนเด่น สีอุ่นหม่น และการเคลื่อนซ้ายไปขวาชัด การเลือกเนื้อหาและองค์ประกอบเช่นนี้นำไปทำได้มากกว่ารายการคำคุณศัพท์สไตล์ไม่เกี่ยวข้องยาว ๆ</p><p>ขอบเขต V4 รวมภาพประกอบ ภาพมีมิติ และภาพสมจริง คู่มือแนะนำบรรยายตรรกะการวาดสำหรับภาพประกอบ และวัสดุ แสง กล้อง และความลึกสำหรับภาพดู 3D อย่างหลังยังเป็นภาพราสเตอร์แทน mesh แก้ไขได้ สำหรับแนวคิดโปสเตอร์หรือบรรจุภัณฑ์ ระบุคำหลัก ตำแหน่ง และความสัมพันธ์ระหว่างภาพกับตัวพิมพ์ ผู้ผลิตเน้นข้อความสั้นและกลางอ่านได้ ให้ตรวจถ้อยคำกับการจัดจริงในภาพที่ส่งคืนก่อนใช้</p><p>การสร้างรองรับพรอมป์ต์สูงสุด 10,000 อักขระ seed สุ่ม ผลหนึ่งถึงหกภาพ สีที่ต้องการและสีพื้นหลังที่ต้องการ สามารถใช้สไตล์กำหนดเองที่เข้ากันได้หรือภาพอ้างอิงเป็นตัวเลือกเพื่อชี้นำแนวทางภาพผ่านการจับคู่แบบ flexible หรือ precise ได้ เลือกภาพอ้างอิงสะอาดหรือชุดที่เป็นโลกภาพเดียว แล้วให้พรอมป์ต์บรรยายตัวแบบกับฉากใหม่ ไม่รับประกันสีจากภาพอ้างอิงสู่ผลตรง จึงระบุชุดสีที่ต้องการชัดและเทียบผล สำหรับการสร้างแบบอ้างอิงสไตล์ ใช้ภาพ PNG, JPG หรือ WebP หนึ่งถึงสิบภาพ รวมไม่เกิน 64 MB และแต่ละภาพต่ำกว่า 20 MB แต่ละภาพต้องมีด้านสั้นอย่างน้อย 256 พิกเซล ด้านยาวไม่เกิน 4,096 พิกเซล และความละเอียดไม่เกิน 16 เมกะพิกเซล ใช้ภาพอ้างอิงเหล่านี้หรือสไตล์ที่บันทึกซึ่งเข้ากันได้อย่างใดอย่างหนึ่ง แทนใช้ทั้งสอง</p><p>image-to-image ตามเอกสารรวมภาพเดิมกับพรอมป์ต์ โดย strength ตั้งแต่ 0 ถึง 1 กำหนดว่าผลใหม่ออกห่างต้นฉบับเท่าใด การทำงานนั้นไม่รับตัวควบคุมสไตล์ V4 เอกสารสร้างปัจจุบันยังไม่รวมชื่อสไตล์ที่คัดสรร negative_prompt, text_layout, artistic_level และ no_text เตรียมคำบรรยายเชิงบวกของผลที่ต้องการและประเมินชิ้นงานในองค์ประกอบเป้าหมาย V4 มาตรฐานให้การตีความออกแบบราสเตอร์ที่ตรงประเด็น พร้อมรุ่น รูปแบบ และขนาดผลเฉพาะ สำหรับ image-to-image ให้ส่ง PNG, JPG, WebP หรือ SVG ต่ำกว่า 20 MB ไม่เกิน 16 เมกะพิกเซล โดยทั้งสองด้านอยู่ระหว่าง 256 ถึง 4,096 พิกเซล</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">ใช้งานได้ใน Ailoot · อินพุตและเมธอด</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · รูปภาพ</b> <code>POST /v1/images/generations</code></summary><dl class=\"method-capabilities\"><div><dt>ขาเข้า</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>ขาออก</dt><dd><code>image</code></dd></div><div><dt>รูปแบบเอาต์พุต</dt><dd>ไฟล์ภาพ</dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>ฟิลด์</th><th>ประเภท</th><th>ข้อกำหนด</th><th>ค่าและข้อจำกัด</th><th>ค่าเริ่มต้น</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span><code>string</code></td><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>จำเป็น</td><td data-cell-label=\"ค่าและข้อจำกัด\"><span class=\"card-cell-label\">ค่าและข้อจำกัด</span><div>recraft/recraft-v4</div></td><td data-cell-label=\"ค่าเริ่มต้น\" data-default=\"unspecified\"><span class=\"card-cell-label\">ค่าเริ่มต้น</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span><code>string</code></td><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>จำเป็น</td><td data-cell-label=\"ค่าและข้อจำกัด\"><span class=\"card-cell-label\">ค่าและข้อจำกัด</span><div>ความยาวขั้นต่ำ: 1</div></td><td data-cell-label=\"ค่าเริ่มต้น\" data-default=\"unspecified\"><span class=\"card-cell-label\">ค่าเริ่มต้น</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">n</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span><code>integer</code></td><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>ไม่บังคับ</td><td data-cell-label=\"ค่าและข้อจำกัด\"><span class=\"card-cell-label\">ค่าและข้อจำกัด</span><div>ขั้นต่ำ: 1</div><div>สูงสุด: 6</div></td><td data-cell-label=\"ค่าเริ่มต้น\" data-default=\"unspecified\"><span class=\"card-cell-label\">ค่าเริ่มต้น</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span><code>string</code></td><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>ไม่บังคับ</td><td data-cell-label=\"ค่าและข้อจำกัด\"><span class=\"card-cell-label\">ค่าและข้อจำกัด</span><div>1:1, 4:3, 3:4, 16:9, 9:16, auto</div></td><td data-cell-label=\"ค่าเริ่มต้น\" data-default=\"unspecified\"><span class=\"card-cell-label\">ค่าเริ่มต้น</span>—</td></tr><tr data-parameter-availability=\"saved_exact_supplier_endpoint\"><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">input_references</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span><code>array</code></td><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>ไม่บังคับ</td><td data-cell-label=\"ค่าและข้อจำกัด\"><span class=\"card-cell-label\">ค่าและข้อจำกัด</span><div>จำนวนรายการขั้นต่ำ: 0</div><div>จำนวนรายการสูงสุด: 1</div></td><td data-cell-label=\"ค่าเริ่มต้น\" data-default=\"unspecified\"><span class=\"card-cell-label\">ค่าเริ่มต้น</span>—</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>ชุดผสมของสื่ออินพุต</summary><p class=\"note-s\"><b>สร้างภาพจากข้อความ</b> · จำเป็น: prompt</p><p class=\"note-s\"><b>reference_guided_image</b> · จำเป็น: prompt, actual image reference</p></details><details class=\"note-s\" data-method-contract><summary>พารามิเตอร์และวงจรการทำงานของเมธอด</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>พารามิเตอร์</th><th>ข้อกำหนด</th></tr></thead><tbody><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>content_type</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>application/json</td></tr><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>required</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>model, prompt</td></tr><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>material_types</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>text, image</td></tr><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>optional_controls</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>n, aspect_ratio, input_references</td></tr><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>n</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>{&quot;minimum&quot;:1,&quot;maximum&quot;:6}</td></tr><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>reference_images</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>{&quot;minimum&quot;:0,&quot;maximum&quot;:1,&quot;source&quot;:&quot;เนื้อหาจริงที่ลูกค้าให้มา&quot;}</td></tr><tr><th data-cell-label=\"พารามิเตอร์\" scope=\"row\"><span class=\"card-cell-label\">พารามิเตอร์</span><code>provider_specific_options</code></th><td data-cell-label=\"ข้อกำหนด\"><span class=\"card-cell-label\">ข้อกำหนด</span>ใช้เฉพาะ style/controls/text_layout ในรายการอนุญาตของเอนด์พอยต์ที่บันทึกไว้ตรงตามที่กำหนด ห้ามเดารูปแบบข้อมูล</td></tr></tbody></table></div><p>ชื่ออื่นของเมธอด: <code>/v1/images</code></p><p>วงจรการทำงาน: <code>synchronous_result_then_owned_library</code></p><p class=\"note-s\"><code>GET /v1/media/tasks/{task_id}</code> · ค่า task_id ที่ส่งกลับมาจริง หรือระเบียนในคลังสื่อ</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\">ตัวอย่างที่ใช้เฉพาะพรอมป์ต์คงโครงสร้าง ImageGenerationRequest ทางการไว้</p><p class=\"note-s\">เก็บภาพทุกภาพที่ส่งกลับและการตอบกลับทั้งหมด จำนวนผลลัพธ์ยึดตามจำนวนจริง ไม่ใช่ค่า n ที่ขอ</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">ราคา</h3><div class=\"card-result-process\" data-billing-basis><h5>วิธีคำนวณค่าบริการสุดท้าย</h5><p class=\"note-s\">อัตราที่แสดงใช้ประมาณการค่าใช้จ่ายก่อนการสร้างผลลัพธ์ ยอดเรียกเก็บสุดท้ายคำนวณจากค่าใช้จ่ายที่บันทึกไว้สำหรับการสร้างผลลัพธ์ครั้งเดิม ระยะเวลาของผลลัพธ์ที่วัดได้และปริมาณที่คาดการณ์ไว้ไม่ใช่ปริมาณสุดท้ายที่ใช้คิดค่าบริการ</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>ข้อมูลอัตราราคาไม่ได้เพิ่มตัวเลือกคำขอ พารามิเตอร์ที่รองรับระบุไว้สำหรับเมธอดที่เลือก</p><dl data-price-conditions><dt>โหมดรวดเร็ว</dt><dd>ไม่ได้ระบุ <span class=\"note-s\">เมื่อเลือกโหมดรวดเร็ว</span></dd><dt>โหมดยืดหยุ่น</dt><dd>ไม่ได้ระบุ <span class=\"note-s\">เมื่อเลือกโหมด flex</span></dd><dt>ระดับการใช้เหตุผลสูงสุด</dt><dd>ไม่ได้ระบุ <span class=\"note-s\">เมื่อใช้การปรับตามค่าเริ่มต้น (default) สำหรับระดับการใช้เหตุผลสูงสุด</span></dd></dl></div><div data-declared-tariff-pricing><h4>อัตราประมาณการเพื่อเปรียบเทียบ</h4><h4>ราคาตามการตั้งค่า</h4><p class=\"note-s\">เทียบค่าบริการแต่ละรายการกับเงื่อนไขที่แสดง เลือกใช้อัตราเดียวสำหรับแต่ละชุดการตั้งค่าที่เป็นตัวเลือกทดแทนกัน</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>การตั้งค่า</th><th>ตารางอัตราค่าบริการ</th><th>ปริมาณคาดการณ์</th><th>หน่วยคิดค่าบริการ</th><th>ค่าบริการ</th></tr></thead><tbody><tr><th data-cell-label=\"การตั้งค่า\" scope=\"row\"><span class=\"card-cell-label\">การตั้งค่า</span>อัตราค่าบริการโทเคนพื้นฐาน</th><td data-cell-label=\"ตารางอัตราค่าบริการ\"><span class=\"card-cell-label\">ตารางอัตราค่าบริการ</span>อัตราพื้นฐาน</td><td data-cell-label=\"ปริมาณคาดการณ์\"><span class=\"card-cell-label\">ปริมาณคาดการณ์</span>—</td><td data-cell-label=\"หน่วยคิดค่าบริการ\"><span class=\"card-cell-label\">หน่วยคิดค่าบริการ</span>—</td><td data-cell-label=\"ค่าบริการ\"><span class=\"card-cell-label\">ค่าบริการ</span><div><span>ขาเข้า · โทเค็นอินพุต · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>—</b> <span class=\"price-unit\">/ 1K โทเค็น</span></div><div><span>ขาออก · โทเค็นเอาต์พุต · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>—</b> <span class=\"price-unit\">/ 1K โทเค็น</span></div><div><span>ขาเข้า · การอ่านแคช · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>—</b> <span class=\"price-unit\">/ 1K โทเค็น</span></div><div><span>ขาเข้า · การเขียนแคช · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>—</b> <span class=\"price-unit\">/ 1K โทเค็น</span></div><div><span>ขาเข้า · การเขียนแคช, 1 ชั่วโมง · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>—</b> <span class=\"price-unit\">/ 1K โทเค็น</span></div></td></tr><tr><th data-cell-label=\"การตั้งค่า\" scope=\"row\"><span class=\"card-cell-label\">การตั้งค่า</span>Ultra</th><td data-cell-label=\"ตารางอัตราค่าบริการ\"><span class=\"card-cell-label\">ตารางอัตราค่าบริการ</span>—</td><td data-cell-label=\"ปริมาณคาดการณ์\"><span class=\"card-cell-label\">ปริมาณคาดการณ์</span>—</td><td data-cell-label=\"หน่วยคิดค่าบริการ\"><span class=\"card-cell-label\">หน่วยคิดค่าบริการ</span>ต่อภาพเอาต์พุต</td><td data-cell-label=\"ค่าบริการ\"><span class=\"card-cell-label\">ค่าบริการ</span><div><span>ขาออก · ภาพขาออก · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>$0.08</b> <span class=\"price-unit\">ต่อภาพเอาต์พุต</span></div></td></tr><tr><th data-cell-label=\"การตั้งค่า\" scope=\"row\"><span class=\"card-cell-label\">การตั้งค่า</span>ต้นทุนการสร้างโดยประมาณ</th><td data-cell-label=\"ตารางอัตราค่าบริการ\"><span class=\"card-cell-label\">ตารางอัตราค่าบริการ</span>—</td><td data-cell-label=\"ปริมาณคาดการณ์\"><span class=\"card-cell-label\">ปริมาณคาดการณ์</span>ค่าประมาณสำหรับการสร้างหนึ่งครั้ง</td><td data-cell-label=\"หน่วยคิดค่าบริการ\"><span class=\"card-cell-label\">หน่วยคิดค่าบริการ</span>—</td><td data-cell-label=\"ค่าบริการ\"><span class=\"card-cell-label\">ค่าบริการ</span><div><span>ขาออก · ค่าใช้จ่ายในการสร้างโดยประมาณ · ประมาณการเพื่อเปรียบเทียบเท่านั้น</span> <b>$0.08</b> <span class=\"price-unit\">ประมาณการก่อนสร้าง</span></div><p class=\"note-s\">ค่าประมาณนี้ไม่ใช่ค่าใช้จ่ายเพิ่มเติมหรืออัตราคงที่สำหรับการสร้างผลลัพธ์ที่เสร็จสมบูรณ์แล้ว</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot กันยอดเงินประมาณการไว้ก่อนส่งคำขอ หลังได้ผลลัพธ์ จะคิดค่าบริการสุดท้ายตามการใช้งานที่วัดได้ การคิดค่าบริการแบบสตรีมใช้บันทึกการใช้งานสุดท้าย <a href=\"/docs/th/billing/reserve/\">วิธีกันยอดเงินและคิดค่าบริการสุดท้าย →</a></p><div data-declared-reference-pricing><h4>รายละเอียดอัตราอ้างอิง</h4><p class=\"note-s\">ตารางอัตราอ้างอิงระดับโมเดลไม่เปลี่ยนเมธอดที่เลือก ยอดประมาณการ หรือค่าบริการ การคิดค่าบริการจริงใช้อัตราของเมธอด Ailoot ที่เลือก</p><details class=\"card-price-reference\" data-declared-reference-group data-client-selectable=\"false\"><summary>การตั้งค่าราคาภาพ</summary><h4>ราคาตามการตั้งค่า</h4><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>การตั้งค่า</th><th>เงื่อนไขคิดค่าบริการ</th><th>ค่าบริการ</th></tr></thead><tbody><tr><th data-cell-label=\"การตั้งค่า\" scope=\"row\"><span class=\"card-cell-label\">การตั้งค่า</span>ภาพขาออก</th><td data-cell-label=\"เงื่อนไขคิดค่าบริการ\"><span class=\"card-cell-label\">เงื่อนไขคิดค่าบริการ</span>ไม่ได้ประกาศรูปแบบราคาย่อย</td><td data-cell-label=\"ค่าบริการ\"><span class=\"card-cell-label\">ค่าบริการ</span><div><span>ขาออก · ภาพขาออก</span> <b>$0.08</b> <span class=\"price-unit\">ต่อภาพ</span></div><p class=\"note-s\">รายการที่เทียบเท่ากันอธิบายยอดเรียกเก็บเดียวกัน ไม่ได้เพิ่มค่าธรรมเนียมครั้งที่สอง</p></td></tr></tbody></table></div></details></div></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">ตัวอย่างคำขอ</h3><h4>Ailoot Ultra · รูปภาพ</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"ตัวเลือกโค้ด\"><button class=\"cg-tab\" id=\"model-code-2535-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2535-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl</button><button class=\"cg-tab\" id=\"model-code-2535-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2535-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Python SDK</button><button class=\"cg-tab\" id=\"model-code-2535-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2535-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=\"คัดลอกโค้ด\"><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-2535-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2535-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&#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-2535-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2535-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&#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-2535-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2535-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&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\">รับและบันทึกผลลัพธ์</h3><h4>Ailoot Ultra · รูปภาพ</h4><p class=\"note-s\">ดาวน์โหลดภาพที่ส่งกลับมาทุกภาพ หรือบันทึกเนื้อหา Base64 ของภาพนั้น</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>เก็บผลลัพธ์ที่เสร็จสมบูรณ์ทั้งหมด</h5><p class=\"note-s\">บันทึกภาพที่สร้างเสร็จทุกภาพ โดยดึงภาพจากทุก URL ที่ส่งกลับมา หรือถอดรหัสเนื้อหา Base64</p><p class=\"note-s\">เก็บข้อมูลทุกรายการและการใช้งานทั้งหมด จัดเก็บภาพจริงที่ส่งกลับทุกภาพให้เป็นของคุณ ห้ามแต่ง URL หรือ ID</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>เมื่อต้องตรวจสอบการตอบกลับต้นฉบับ</h5><p class=\"note-s\">หากผลลัพธ์การสร้างหรือแก้ไขภาพต้องได้รับการตรวจสอบ ให้เก็บ operation_id/X-Client-Request-ID เดิมและข้อมูลผลลัพธ์ที่ส่งกลับมาไว้ กู้คืนผลลัพธ์ที่มีอยู่และเป็นของตนเองผ่านคลังสื่อโดยใช้ค่า task_id หรือ asset_id จริง ห้ามส่งคำขอสร้าง/แก้ไขซ้ำ หรือสร้าง URL สำหรับตรวจสอบสถานะเป็นระยะจาก operation_id</p></div><details class=\"card-about\" data-output-fields><summary>ฟิลด์การตอบกลับ</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>ฟิลด์</th><th>ประเภท</th></tr></thead><tbody><tr><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">created</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span>integer</td></tr><tr><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">data[].url</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span>string</td></tr><tr><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">data[].b64_json</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span>base64 string</td></tr><tr><th data-cell-label=\"ฟิลด์\" scope=\"row\"><span class=\"card-cell-label\">ฟิลด์</span><code class=\"card-field-name\">usage</code></th><td data-cell-label=\"ประเภท\" data-field-type><span class=\"card-cell-label\">ประเภท</span>object</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>ข้อผิดพลาดและขั้นตอนถัดไป</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>การตอบกลับ</th><th>เงื่อนไข</th><th>ขั้นตอนถัดไป</th></tr></thead><tbody><tr><th data-cell-label=\"การตอบกลับ\" scope=\"row\"><span class=\"card-cell-label\">การตอบกลับ</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"เงื่อนไข\"><span class=\"card-cell-label\">เงื่อนไข</span>ฟิลด์จำเป็น รูปแบบการแทนข้อมูล หรือค่าพารามิเตอร์ไม่ถูกต้อง</td><td data-cell-label=\"ขั้นตอนถัดไป\"><span class=\"card-cell-label\">ขั้นตอนถัดไป</span>แก้ฟิลด์ที่ระบุก่อนส่งคำขอสร้างครั้งใหม่</td></tr><tr><th data-cell-label=\"การตอบกลับ\" scope=\"row\"><span class=\"card-cell-label\">การตอบกลับ</span><code>server_error</code></th><td data-cell-label=\"เงื่อนไข\"><span class=\"card-cell-label\">เงื่อนไข</span>การตอบกลับที่ได้รับระบุว่าต้องตรวจสอบการดำเนินการหรือผลลัพธ์</td><td data-cell-label=\"ขั้นตอนถัดไป\"><span class=\"card-cell-label\">ขั้นตอนถัดไป</span>เก็บ ID การดำเนินการ/งานที่ส่งกลับมาแต่เดิม ส่วนหัวของคำขอ และการตอบกลับไว้ แล้วอ่านข้อมูลการดำเนินการเดิมนั้นต่อด้วยวิธีที่รองรับ ห้ามส่งคำขอสร้างซ้ำ</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">ชื่ออื่น</h3><h4>ชื่ออื่นของโมเดล</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=recraft%2Frecraft-v4&amp;route=Ultra&amp;caller=recraft%2Frecraft-v4&amp;fmt=images\"><code>recraft/recraft-v4</code></a></span></p><h4>ชื่อพาธเมธอดอื่น</h4><p class=\"note-s\"><code>/v1/images</code></p><h4>ID ที่เกี่ยวข้องสำหรับเรียกใช้โมเดล</h4><p class=\"note-s\"><a href=\"#m=recraft%2Frecraft-v4&amp;route=Ultra&amp;caller=recraft%2Frecraft-v4&amp;fmt=images\"><code>recraft/recraft-v4</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "recraft/recraft-v4",
        "fmt": "images",
        "http": "POST",
        "path": "/v1/images/generations",
        "request_model_id": "recraft/recraft-v4",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|images|/v1/images/generations|recraft%2Frecraft-v4",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "อัตราที่แสดงใช้ประมาณการค่าใช้จ่ายก่อนการสร้างผลลัพธ์ ยอดเรียกเก็บสุดท้ายคำนวณจากค่าใช้จ่ายที่บันทึกไว้สำหรับการสร้างผลลัพธ์ครั้งเดิม ระยะเวลาของผลลัพธ์ที่วัดได้และปริมาณที่คาดการณ์ไว้ไม่ใช่ปริมาณสุดท้ายที่ใช้คิดค่าบริการ",
          "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.",
            "errors": [
              {
                "code": null,
                "condition": "ฟิลด์จำเป็น รูปแบบการแทนข้อมูล หรือค่าพารามิเตอร์ไม่ถูกต้อง",
                "http_status": 400,
                "recovery": "แก้ฟิลด์ที่ระบุก่อนส่งคำขอสร้างครั้งใหม่",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "การตอบกลับที่ได้รับระบุว่าต้องตรวจสอบการดำเนินการหรือผลลัพธ์",
                "http_status": null,
                "recovery": "เก็บ ID การดำเนินการ/งานที่ส่งกลับมาแต่เดิม ส่วนหัวของคำขอ และการตอบกลับไว้ แล้วอ่านข้อมูลการดำเนินการเดิมนั้นต่อด้วยวิธีที่รองรับ ห้ามส่งคำขอสร้างซ้ำ",
                "type": "server_error"
              }
            ],
            "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": "หากผลลัพธ์การสร้างหรือแก้ไขภาพต้องได้รับการตรวจสอบ ให้เก็บ operation_id/X-Client-Request-ID เดิมและข้อมูลผลลัพธ์ที่ส่งกลับมาไว้ กู้คืนผลลัพธ์ที่มีอยู่และเป็นของตนเองผ่านคลังสื่อโดยใช้ค่า task_id หรือ asset_id จริง ห้ามส่งคำขอสร้าง/แก้ไขซ้ำ หรือสร้าง URL สำหรับตรวจสอบสถานะเป็นระยะจาก operation_id"
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_image",
                "required": [
                  "prompt"
                ]
              },
              {
                "content_type": "application/json",
                "maximum_references": 1,
                "mode": "reference_guided_image",
                "required": [
                  "prompt",
                  "actual image reference"
                ]
              }
            ],
            "outputs": {
              "all_results": "เก็บข้อมูลทุกรายการและการใช้งานทั้งหมด จัดเก็บภาพจริงที่ส่งกลับทุกภาพให้เป็นของคุณ ห้ามแต่ง URL หรือ 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"
                ],
                "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": {
                  "image_url": {
                    "url": "actual HTTP(S) image URL or base64 data URI"
                  },
                  "type": "image_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,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "recraft/recraft-v4"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "body": {
                "model": "recraft/recraft-v4",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json",
              "parameter_source": "parameters + request_schema; no fabricated reference URL"
            }
          },
          "hints": [
            "ตัวอย่างที่ใช้เฉพาะพรอมป์ต์คงโครงสร้าง ImageGenerationRequest ทางการไว้",
            "เก็บภาพทุกภาพที่ส่งกลับและการตอบกลับทั้งหมด จำนวนผลลัพธ์ยึดตามจำนวนจริง ไม่ใช่ค่า n ที่ขอ"
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "n": {
              "maximum": 6,
              "minimum": 1
            },
            "optional_controls": [
              "n",
              "aspect_ratio",
              "input_references"
            ],
            "provider_specific_options": "ใช้เฉพาะ style/controls/text_layout ในรายการอนุญาตของเอนด์พอยต์ที่บันทึกไว้ตรงตามที่กำหนด ห้ามเดารูปแบบข้อมูล",
            "reference_images": {
              "maximum": 1,
              "minimum": 0,
              "source": "เนื้อหาจริงที่ลูกค้าให้มา"
            },
            "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": "ค่า task_id ที่ส่งกลับมาจริง หรือระเบียนในคลังสื่อ",
                "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 returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "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": "ค่าประมาณนี้ไม่ใช่ค่าใช้จ่ายเพิ่มเติมหรืออัตราคงที่สำหรับการสร้างผลลัพธ์ที่เสร็จสมบูรณ์แล้ว",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "ต้นทุนการสร้างโดยประมาณ",
            "units": [
              {
                "amount": "0.08",
                "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.08",
                "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', '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', '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\", \"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": [
          "Prompt-only example preserves the official ImageGenerationRequest structure.",
          "Keep every returned image and the full response; output quantity is actual, not requested n."
        ],
        "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 returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "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.08",
                "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.08",
                "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",
        "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.08",
            "amount_unit": "usd_per_output_image",
            "billing_input": false,
            "estimate_only": true,
            "key": "image_output",
            "label": "output image",
            "native_amount_usd_per_unit": "0.08",
            "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.08",
            "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.08",
            "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",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "70b5ad06d2dee255a9c3c9b7cd510c86ed666d36d980184bebfaa7fd77ffe225",
    "input_html_sha256": "3cf15d046e686b9cd191395e3c2baa59c4df0b7a6f44922ced715513bf441e68",
    "private_audit_sha256": "d500ee8c882b1e62fadf2168f7d9aeedf232fbfa1b7c276e6ad416c74fe77152",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/th/recraft-recraft-v4/",
    "description": "Recraft V4 สร้างภาพราสเตอร์ 1K โดยเน้นองค์ประกอบ ความสัมพันธ์สี และทิศทางสร้างสรรค์ละเอียด ครอบคลุมภาพประกอบ ฉากถ่ายสมจริง และแนวคิดออกแบบกราฟิก มีข้อมูลเข้าสไตล์ตามต้องการและเวิร์กโฟลว์ image-to-image แยก",
    "locale": "th",
    "md_url": "https://ailoot.ai/models/th/recraft-recraft-v4/index.md",
    "title": "Recraft: Recraft V4 — Ailoot",
    "url": "https://ailoot.ai/models/th/recraft-recraft-v4/"
  },
  "rawModel": {
    "about": "Recraft V4 เป็นโมเดลราสเตอร์มาตรฐานในรุ่น V4 ของ Recraft ผู้ผลิตเน้นวิจารณญาณการออกแบบ ได้แก่ องค์ประกอบสมดุล ความสัมพันธ์สีสอดคล้อง และรายละเอียดที่สนับสนุนเจตนาของภาพ ทำงานกับภาพประกอบมีสไตล์ ฉากถ่าย และแนวคิดออกแบบกราฟิกได้ ใช้เมื่อบรีฟต้องการภาพที่รวมการเลือกสุนทรียะกับความแม่นยำตามพรอมป์ต์ ทั้งการสำรวจอารมณ์จากทิศทางสั้นหรือระบุเลย์เอาต์ตั้งใจอย่างละเอียด\n\nรหัสโมเดลที่แน่นอนคือ recraftv4 เอกสารผู้ผลิตระบุผลราสเตอร์ 1K เป็น WebP แบบไม่สูญเสียข้อมูลหรือ PNG จัตุรัส 1024 × 1024 พิกเซล, 16:9 คือ 1344 × 768 และ 2:3 คือ 832 × 1280 อัตราส่วนอื่นที่รองรับมีขนาดของตน V4 Pro เป็นรุ่นราสเตอร์ 2K แยก ขณะที่ V4 Vector กับ Pro Vector ให้ SVG แก้ไขได้ เลือกรุ่น V4 ที่เจาะจงให้ตรงชิ้นงานที่ตั้งใจ แทนรวมคุณสมบัติผลต่างกันเหล่านี้\n\nคู่มือผู้ผลิตแยกพรอมป์ต์ตีความสั้นจากทิศทางสร้างสรรค์มีโครงสร้าง วลีสั้นเปิดโอกาสให้สำรวจรูปทรง อารมณ์ และกรอบภาพ บรีฟมีโครงสร้างระบุตัวแบบ สถานที่ ท่า วัสดุ องค์ประกอบรอง แสง และลำดับภาพได้ สำหรับภาพประกอบเล่าเรื่อง บรรยายคนขี่จักรยานข้ามสะพานเล็ก รูปทรงลดทอนเด่น สีอุ่นหม่น และการเคลื่อนซ้ายไปขวาชัด การเลือกเนื้อหาและองค์ประกอบเช่นนี้นำไปทำได้มากกว่ารายการคำคุณศัพท์สไตล์ไม่เกี่ยวข้องยาว ๆ\n\nขอบเขต V4 รวมภาพประกอบ ภาพมีมิติ และภาพสมจริง คู่มือแนะนำบรรยายตรรกะการวาดสำหรับภาพประกอบ และวัสดุ แสง กล้อง และความลึกสำหรับภาพดู 3D อย่างหลังยังเป็นภาพราสเตอร์แทน mesh แก้ไขได้ สำหรับแนวคิดโปสเตอร์หรือบรรจุภัณฑ์ ระบุคำหลัก ตำแหน่ง และความสัมพันธ์ระหว่างภาพกับตัวพิมพ์ ผู้ผลิตเน้นข้อความสั้นและกลางอ่านได้ ให้ตรวจถ้อยคำกับการจัดจริงในภาพที่ส่งคืนก่อนใช้\n\nการสร้างรองรับพรอมป์ต์สูงสุด 10,000 อักขระ seed สุ่ม ผลหนึ่งถึงหกภาพ สีที่ต้องการและสีพื้นหลังที่ต้องการ สามารถใช้สไตล์กำหนดเองที่เข้ากันได้หรือภาพอ้างอิงเป็นตัวเลือกเพื่อชี้นำแนวทางภาพผ่านการจับคู่แบบ flexible หรือ precise ได้ เลือกภาพอ้างอิงสะอาดหรือชุดที่เป็นโลกภาพเดียว แล้วให้พรอมป์ต์บรรยายตัวแบบกับฉากใหม่ ไม่รับประกันสีจากภาพอ้างอิงสู่ผลตรง จึงระบุชุดสีที่ต้องการชัดและเทียบผล สำหรับการสร้างแบบอ้างอิงสไตล์ ใช้ภาพ PNG, JPG หรือ WebP หนึ่งถึงสิบภาพ รวมไม่เกิน 64 MB และแต่ละภาพต่ำกว่า 20 MB แต่ละภาพต้องมีด้านสั้นอย่างน้อย 256 พิกเซล ด้านยาวไม่เกิน 4,096 พิกเซล และความละเอียดไม่เกิน 16 เมกะพิกเซล ใช้ภาพอ้างอิงเหล่านี้หรือสไตล์ที่บันทึกซึ่งเข้ากันได้อย่างใดอย่างหนึ่ง แทนใช้ทั้งสอง\n\nimage-to-image ตามเอกสารรวมภาพเดิมกับพรอมป์ต์ โดย strength ตั้งแต่ 0 ถึง 1 กำหนดว่าผลใหม่ออกห่างต้นฉบับเท่าใด การทำงานนั้นไม่รับตัวควบคุมสไตล์ V4 เอกสารสร้างปัจจุบันยังไม่รวมชื่อสไตล์ที่คัดสรร negative_prompt, text_layout, artistic_level และ no_text เตรียมคำบรรยายเชิงบวกของผลที่ต้องการและประเมินชิ้นงานในองค์ประกอบเป้าหมาย V4 มาตรฐานให้การตีความออกแบบราสเตอร์ที่ตรงประเด็น พร้อมรุ่น รูปแบบ และขนาดผลเฉพาะ สำหรับ image-to-image ให้ส่ง PNG, JPG, WebP หรือ SVG ต่ำกว่า 20 MB ไม่เกิน 16 เมกะพิกเซล โดยทั้งสองด้านอยู่ระหว่าง 256 ถึง 4,096 พิกเซล",
    "alias_of": null,
    "aliases": [],
    "author": "Recraft",
    "available": null,
    "canonical_model": "recraft/recraft-v4",
    "capabilities": {
      "context_length": 65536,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "image"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "0.08",
            "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.08",
            "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": "ดูราคาตามการกำหนดค่าแบบครบถ้วนในรายละเอียด"
      }
    ],
    "ctx": null,
    "declared_tariff_references": [
      {
        "client_selectable": false,
        "key": "1ebd62ad63574ce77fb794fa",
        "label": "การตั้งค่าราคาภาพ",
        "profiles": [
          {
            "basis": "รายการที่เทียบเท่ากันอธิบายยอดเรียกเก็บเดียวกัน ไม่ได้เพิ่มค่าธรรมเนียมครั้งที่สอง",
            "dimensions": {
              "conditions": "ไม่ได้ประกาศรูปแบบราคาย่อย"
            },
            "label": "ภาพขาออก",
            "units": [
              {
                "amount": "0.08",
                "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",
    "input": [
      "text",
      "image"
    ],
    "kind": "image",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "อัตราที่แสดงใช้ประมาณการค่าใช้จ่ายก่อนการสร้างผลลัพธ์ ยอดเรียกเก็บสุดท้ายคำนวณจากค่าใช้จ่ายที่บันทึกไว้สำหรับการสร้างผลลัพธ์ครั้งเดิม ระยะเวลาของผลลัพธ์ที่วัดได้และปริมาณที่คาดการณ์ไว้ไม่ใช่ปริมาณสุดท้ายที่ใช้คิดค่าบริการ",
          "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.",
            "errors": [
              {
                "code": null,
                "condition": "ฟิลด์จำเป็น รูปแบบการแทนข้อมูล หรือค่าพารามิเตอร์ไม่ถูกต้อง",
                "http_status": 400,
                "recovery": "แก้ฟิลด์ที่ระบุก่อนส่งคำขอสร้างครั้งใหม่",
                "type": "invalid_request_error"
              },
              {
                "code": null,
                "condition": "การตอบกลับที่ได้รับระบุว่าต้องตรวจสอบการดำเนินการหรือผลลัพธ์",
                "http_status": null,
                "recovery": "เก็บ ID การดำเนินการ/งานที่ส่งกลับมาแต่เดิม ส่วนหัวของคำขอ และการตอบกลับไว้ แล้วอ่านข้อมูลการดำเนินการเดิมนั้นต่อด้วยวิธีที่รองรับ ห้ามส่งคำขอสร้างซ้ำ",
                "type": "server_error"
              }
            ],
            "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": "หากผลลัพธ์การสร้างหรือแก้ไขภาพต้องได้รับการตรวจสอบ ให้เก็บ operation_id/X-Client-Request-ID เดิมและข้อมูลผลลัพธ์ที่ส่งกลับมาไว้ กู้คืนผลลัพธ์ที่มีอยู่และเป็นของตนเองผ่านคลังสื่อโดยใช้ค่า task_id หรือ asset_id จริง ห้ามส่งคำขอสร้าง/แก้ไขซ้ำ หรือสร้าง URL สำหรับตรวจสอบสถานะเป็นระยะจาก operation_id"
            },
            "material_combinations": [
              {
                "content_type": "application/json",
                "mode": "text_to_image",
                "required": [
                  "prompt"
                ]
              },
              {
                "content_type": "application/json",
                "maximum_references": 1,
                "mode": "reference_guided_image",
                "required": [
                  "prompt",
                  "actual image reference"
                ]
              }
            ],
            "outputs": {
              "all_results": "เก็บข้อมูลทุกรายการและการใช้งานทั้งหมด จัดเก็บภาพจริงที่ส่งกลับทุกภาพให้เป็นของคุณ ห้ามแต่ง URL หรือ 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"
                ],
                "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": {
                  "image_url": {
                    "url": "actual HTTP(S) image URL or base64 data URI"
                  },
                  "type": "image_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,
                  "type": "array"
                },
                "model": {
                  "enum": [
                    "recraft/recraft-v4"
                  ],
                  "type": "string"
                },
                "n": {
                  "maximum": 6,
                  "minimum": 1,
                  "type": "integer"
                },
                "prompt": {
                  "minLength": 1,
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "schema_template": {
              "body": {
                "model": "recraft/recraft-v4",
                "prompt": "a red panda astronaut floating in space, studio lighting"
              },
              "content_type": "application/json",
              "parameter_source": "parameters + request_schema; no fabricated reference URL"
            }
          },
          "hints": [
            "ตัวอย่างที่ใช้เฉพาะพรอมป์ต์คงโครงสร้าง ImageGenerationRequest ทางการไว้",
            "เก็บภาพทุกภาพที่ส่งกลับและการตอบกลับทั้งหมด จำนวนผลลัพธ์ยึดตามจำนวนจริง ไม่ใช่ค่า n ที่ขอ"
          ],
          "input": {
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "n": {
              "maximum": 6,
              "minimum": 1
            },
            "optional_controls": [
              "n",
              "aspect_ratio",
              "input_references"
            ],
            "provider_specific_options": "ใช้เฉพาะ style/controls/text_layout ในรายการอนุญาตของเอนด์พอยต์ที่บันทึกไว้ตรงตามที่กำหนด ห้ามเดารูปแบบข้อมูล",
            "reference_images": {
              "maximum": 1,
              "minimum": 0,
              "source": "เนื้อหาจริงที่ลูกค้าให้มา"
            },
            "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": "ค่า task_id ที่ส่งกลับมาจริง หรือระเบียนในคลังสื่อ",
                "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 returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "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": "ค่าประมาณนี้ไม่ใช่ค่าใช้จ่ายเพิ่มเติมหรืออัตราคงที่สำหรับการสร้างผลลัพธ์ที่เสร็จสมบูรณ์แล้ว",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "ต้นทุนการสร้างโดยประมาณ",
            "units": [
              {
                "amount": "0.08",
                "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.08",
                "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', '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', '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\", \"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": [
          "Prompt-only example preserves the official ImageGenerationRequest structure.",
          "Keep every returned image and the full response; output quantity is actual, not requested n."
        ],
        "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 returned output images",
              "quoted_unit": "per image output"
            },
            "label": "Ultra",
            "units": [
              {
                "amount": "0.08",
                "amount_unit": "usd_per_output_image",
                "billing_input": false,
                "estimate_only": true,
                "key": "image_output",
                "label": "output image",
                "native_amount_usd_per_unit": "0.08",
                "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.08",
                "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.08",
                "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",
        "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.08",
            "amount_unit": "usd_per_output_image",
            "billing_input": false,
            "estimate_only": true,
            "key": "image_output",
            "label": "output image",
            "native_amount_usd_per_unit": "0.08",
            "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.08",
            "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.08",
            "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",
        "request_model_id": "recraft/recraft-v4",
        "route_label": "Ultra"
      }
    ],
    "name": "Recraft: Recraft V4",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 0.08,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 0.08,
      "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,
          "quality": "standard",
          "units_per_usd": 1000
        },
        "label": "Ultra",
        "units": [
          {
            "amount": "0.08",
            "amount_unit": "usd_per_output_image",
            "conditions": {
              "output_family": "raster",
              "per_actual_generated_image": true,
              "quality": "standard",
              "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",
    "short": "Recraft V4 สร้างภาพราสเตอร์ 1K โดยเน้นองค์ประกอบ ความสัมพันธ์สี และทิศทางสร้างสรรค์ละเอียด ครอบคลุมภาพประกอบ ฉากถ่ายสมจริง และแนวคิดออกแบบกราฟิก มีข้อมูลเข้าสไตล์ตามต้องการและเวิร์กโฟลว์ image-to-image แยก"
  },
  "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 สร้างภาพราสเตอร์ 1K โดยเน้นองค์ประกอบ ความสัมพันธ์สี และทิศทางสร้างสรรค์ละเอียด ครอบคลุมภาพประกอบ ฉากถ่ายสมจริง และแนวคิดออกแบบกราฟิก มีข้อมูลเข้าสไตล์ตามต้องการและเวิร์กโฟลว์ image-to-image แยก",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "2e5b0b3ca394d613d314caac35595c840da97357ed5d2002e1de504c610acabd",
    "renderer_sha256": "890edb706fafafdd4f598bb324acf65fada58918b0911b97eb80e68be2ef65d9"
  },
  "sourceRevision": "238bf17bc1de0b9d4c934bbf1dccaa67783dfe9a0dbd657d46a5807e3801b0fe"
}
