{
  "aboutHtml": "<p>Kling v1.5 là một phiên bản tạo video của Kling, có khả năng chuyển ảnh thành video theo danh mục mô hình trong tài liệu. Ảnh tĩnh được cung cấp đóng vai trò điểm khởi đầu về hình ảnh, còn bản mô tả yêu cầu bằng văn bản giải thích cảnh cần chuyển động như thế nào. Dùng mô hình để phát triển một cử chỉ nhân vật, một vật thể chuyển động hoặc một môi trường biến đổi từ ảnh có bố cục đã phù hợp với cảnh quay.</p><p>Chuẩn bị ảnh sao cho các chi tiết quan trọng của chủ thể được thể hiện rõ. Với nhân vật, cần nhìn rõ khuôn mặt, tư thế và trang phục; với vật thể, cần có đường nét rõ ràng và các đặc điểm chất liệu dễ thấy. Chừa khoảng trống trong bố cục cho chuyển động dự kiến. Lưu ảnh tĩnh gốc cùng chuỗi hình ảnh hoàn chỉnh để có thể đánh giá trực tiếp những thay đổi về diện mạo.</p><p>Viết hành động dưới dạng một sự việc có thể quan sát. Ví dụ, mô tả một người đang ngồi quay về phía cửa sổ hoặc một dải ruy băng bằng vải chuyển động trong làn gió nhẹ. Nêu hướng chuyển động và trạng thái kết thúc mong muốn. Khi có nhiều vật thể xuất hiện, hãy xác định vật thể nào chuyển động và những vật thể nào giữ nguyên vị trí.</p><p>Giải thích vai trò của máy quay. Góc nhìn cố định giúp dễ kiểm tra một cử chỉ nhỏ, còn góc nhìn chuyển động có thể cho thấy một mặt mới của cảnh. Mô tả chuyển động đó trong mối quan hệ với chủ thể. Yêu cầu máy quay tiến gần chủ thể và yêu cầu chủ thể tiến gần máy quay thể hiện hai ý đồ hình ảnh khác nhau.</p><p>Mục chuyển ảnh thành video trong tài liệu liệt kê các lựa chọn thời lượng 5 và 10 giây, chế độ std và pro, cùng khung hình ngang, dọc và vuông. Chọn các thiết lập mà quy trình đã chọn cung cấp trước khi đánh giá kết quả. Khi so sánh các phương án cảnh quay, hãy lưu chế độ, thời lượng và dạng khung hình thực tế cùng ảnh nguồn và câu lệnh.</p><p>Với cảnh giới thiệu vật thể, hãy xác định đặc điểm hình ảnh mà chuyển động cần làm lộ rõ. Đó có thể là một bề mặt phản chiếu, nếp gấp của chất liệu hoặc hình dáng tay cầm. Giữ hành động đủ tập trung để đặc điểm quan trọng luôn nhìn thấy được. Đánh giá vật thể trong suốt chuyển động và ở góc nhìn cuối cùng được sử dụng trong bản dựng.</p><p>Với cảnh nhân vật, hãy mô tả một cử chỉ có ý nghĩa và mối quan hệ của nhân vật với các vật thể gần đó. Xem lại khuôn mặt, bàn tay, trang phục và tỷ lệ cơ thể theo thời gian. Kiểm tra xem cử chỉ có đạt đến trạng thái kết thúc dự kiến hay không và cảnh có duy trì cách sắp xếp nhất quán giữa các yếu tố tiền cảnh và hậu cảnh hay không.</p><p>Giữ lại toàn bộ đoạn video được tạo cùng các tài liệu nguồn. Xem phần mở đầu, hành động chính và phần kết như một chuỗi thống nhất, sau đó chỉnh sửa dựa trên một điểm sai lệch cụ thể. Ghi chú như “nhân vật quay đi, không còn hướng về cửa sổ” tạo ra một yêu cầu sửa rõ ràng cho bản mô tả tiếp theo, đồng thời giữ nguyên phần còn lại của cảnh.</p>",
  "aboutText": "Kling v1.5 là một phiên bản tạo video của Kling, có khả năng chuyển ảnh thành video theo danh mục mô hình trong tài liệu. Ảnh tĩnh được cung cấp đóng vai trò điểm khởi đầu về hình ảnh, còn bản mô tả yêu cầu bằng văn bản giải thích cảnh cần chuyển động như thế nào. Dùng mô hình để phát triển một cử chỉ nhân vật, một vật thể chuyển động hoặc một môi trường biến đổi từ ảnh có bố cục đã phù hợp với cảnh quay.\n\nChuẩn bị ảnh sao cho các chi tiết quan trọng của chủ thể được thể hiện rõ. Với nhân vật, cần nhìn rõ khuôn mặt, tư thế và trang phục; với vật thể, cần có đường nét rõ ràng và các đặc điểm chất liệu dễ thấy. Chừa khoảng trống trong bố cục cho chuyển động dự kiến. Lưu ảnh tĩnh gốc cùng chuỗi hình ảnh hoàn chỉnh để có thể đánh giá trực tiếp những thay đổi về diện mạo.\n\nViết hành động dưới dạng một sự việc có thể quan sát. Ví dụ, mô tả một người đang ngồi quay về phía cửa sổ hoặc một dải ruy băng bằng vải chuyển động trong làn gió nhẹ. Nêu hướng chuyển động và trạng thái kết thúc mong muốn. Khi có nhiều vật thể xuất hiện, hãy xác định vật thể nào chuyển động và những vật thể nào giữ nguyên vị trí.\n\nGiải thích vai trò của máy quay. Góc nhìn cố định giúp dễ kiểm tra một cử chỉ nhỏ, còn góc nhìn chuyển động có thể cho thấy một mặt mới của cảnh. Mô tả chuyển động đó trong mối quan hệ với chủ thể. Yêu cầu máy quay tiến gần chủ thể và yêu cầu chủ thể tiến gần máy quay thể hiện hai ý đồ hình ảnh khác nhau.\n\nMục chuyển ảnh thành video trong tài liệu liệt kê các lựa chọn thời lượng 5 và 10 giây, chế độ std và pro, cùng khung hình ngang, dọc và vuông. Chọn các thiết lập mà quy trình đã chọn cung cấp trước khi đánh giá kết quả. Khi so sánh các phương án cảnh quay, hãy lưu chế độ, thời lượng và dạng khung hình thực tế cùng ảnh nguồn và câu lệnh.\n\nVới cảnh giới thiệu vật thể, hãy xác định đặc điểm hình ảnh mà chuyển động cần làm lộ rõ. Đó có thể là một bề mặt phản chiếu, nếp gấp của chất liệu hoặc hình dáng tay cầm. Giữ hành động đủ tập trung để đặc điểm quan trọng luôn nhìn thấy được. Đánh giá vật thể trong suốt chuyển động và ở góc nhìn cuối cùng được sử dụng trong bản dựng.\n\nVới cảnh nhân vật, hãy mô tả một cử chỉ có ý nghĩa và mối quan hệ của nhân vật với các vật thể gần đó. Xem lại khuôn mặt, bàn tay, trang phục và tỷ lệ cơ thể theo thời gian. Kiểm tra xem cử chỉ có đạt đến trạng thái kết thúc dự kiến hay không và cảnh có duy trì cách sắp xếp nhất quán giữa các yếu tố tiền cảnh và hậu cảnh hay không.\n\nGiữ lại toàn bộ đoạn video được tạo cùng các tài liệu nguồn. Xem phần mở đầu, hành động chính và phần kết như một chuỗi thống nhất, sau đó chỉnh sửa dựa trên một điểm sai lệch cụ thể. Ghi chú như “nhân vật quay đi, không còn hướng về cửa sổ” tạo ra một yêu cầu sửa rõ ràng cho bản mô tả tiếp theo, đồng thời giữ nguyên phần còn lại của cảnh.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "c349ecf904d9123d7c0d94fd75b07725e9c2a42bcc07c7d25b05259a0184b85f",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "vi",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Kling v1.5</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"Đóng\">×</button></div><div class=\"idline\"><span>Kling /</span><code>kling-v1-5</code><button type=\"button\" id=\"copy-id\">Sao chép ID</button></div><nav class=\"card-jump-nav\" aria-label=\"Các phần của thẻ mô hình\"><button type=\"button\" data-card-jump=\"overview\">Bắt đầu</button><button type=\"button\" data-card-jump=\"methods\">Đầu vào &amp; phương thức</button><button type=\"button\" data-card-jump=\"pricing\">Bảng giá</button><button type=\"button\" data-card-jump=\"examples\">Ví dụ</button><button type=\"button\" data-card-jump=\"results\">Kết quả</button><button type=\"button\" data-card-jump=\"aliases\">Bí danh</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"Phương thức API\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|videos|/v1/videos|kling-v1-5\">Video</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">Bắt đầu</h3><p class=\"mdesc-full\">Kling v1.5 là mô hình video có quy trình chuyển ảnh thành video được nêu trong tài liệu. Bắt đầu từ một ảnh tĩnh đã chuẩn bị và mô tả chuyển động, góc nhìn cùng bố cục cuối cùng cho một cảnh quay ngắn về nhân vật, vật thể hoặc môi trường.</p><dl class=\"card-io\" data-card-io><div><dt>Đầu vào được chấp nhận</dt><dd>Văn bản · Ảnh</dd></div><div><dt>Kết quả</dt><dd>Video</dd></div></dl><details class=\"card-about\"><summary>Về mô hình</summary><p class=\"note-s\" data-model-method-boundary>Mô tả này trình bày khả năng của mô hình. Đầu vào, đầu ra và tùy chọn có trên Ailoot được liệt kê bên dưới cho phương thức đã chọn.</p><div class=\"mabout\" id=\"m-about\"><p>Kling v1.5 là một phiên bản tạo video của Kling, có khả năng chuyển ảnh thành video theo danh mục mô hình trong tài liệu. Ảnh tĩnh được cung cấp đóng vai trò điểm khởi đầu về hình ảnh, còn bản mô tả yêu cầu bằng văn bản giải thích cảnh cần chuyển động như thế nào. Dùng mô hình để phát triển một cử chỉ nhân vật, một vật thể chuyển động hoặc một môi trường biến đổi từ ảnh có bố cục đã phù hợp với cảnh quay.</p><p>Chuẩn bị ảnh sao cho các chi tiết quan trọng của chủ thể được thể hiện rõ. Với nhân vật, cần nhìn rõ khuôn mặt, tư thế và trang phục; với vật thể, cần có đường nét rõ ràng và các đặc điểm chất liệu dễ thấy. Chừa khoảng trống trong bố cục cho chuyển động dự kiến. Lưu ảnh tĩnh gốc cùng chuỗi hình ảnh hoàn chỉnh để có thể đánh giá trực tiếp những thay đổi về diện mạo.</p><p>Viết hành động dưới dạng một sự việc có thể quan sát. Ví dụ, mô tả một người đang ngồi quay về phía cửa sổ hoặc một dải ruy băng bằng vải chuyển động trong làn gió nhẹ. Nêu hướng chuyển động và trạng thái kết thúc mong muốn. Khi có nhiều vật thể xuất hiện, hãy xác định vật thể nào chuyển động và những vật thể nào giữ nguyên vị trí.</p><p>Giải thích vai trò của máy quay. Góc nhìn cố định giúp dễ kiểm tra một cử chỉ nhỏ, còn góc nhìn chuyển động có thể cho thấy một mặt mới của cảnh. Mô tả chuyển động đó trong mối quan hệ với chủ thể. Yêu cầu máy quay tiến gần chủ thể và yêu cầu chủ thể tiến gần máy quay thể hiện hai ý đồ hình ảnh khác nhau.</p><p>Mục chuyển ảnh thành video trong tài liệu liệt kê các lựa chọn thời lượng 5 và 10 giây, chế độ std và pro, cùng khung hình ngang, dọc và vuông. Chọn các thiết lập mà quy trình đã chọn cung cấp trước khi đánh giá kết quả. Khi so sánh các phương án cảnh quay, hãy lưu chế độ, thời lượng và dạng khung hình thực tế cùng ảnh nguồn và câu lệnh.</p><p>Với cảnh giới thiệu vật thể, hãy xác định đặc điểm hình ảnh mà chuyển động cần làm lộ rõ. Đó có thể là một bề mặt phản chiếu, nếp gấp của chất liệu hoặc hình dáng tay cầm. Giữ hành động đủ tập trung để đặc điểm quan trọng luôn nhìn thấy được. Đánh giá vật thể trong suốt chuyển động và ở góc nhìn cuối cùng được sử dụng trong bản dựng.</p><p>Với cảnh nhân vật, hãy mô tả một cử chỉ có ý nghĩa và mối quan hệ của nhân vật với các vật thể gần đó. Xem lại khuôn mặt, bàn tay, trang phục và tỷ lệ cơ thể theo thời gian. Kiểm tra xem cử chỉ có đạt đến trạng thái kết thúc dự kiến hay không và cảnh có duy trì cách sắp xếp nhất quán giữa các yếu tố tiền cảnh và hậu cảnh hay không.</p><p>Giữ lại toàn bộ đoạn video được tạo cùng các tài liệu nguồn. Xem phần mở đầu, hành động chính và phần kết như một chuỗi thống nhất, sau đó chỉnh sửa dựa trên một điểm sai lệch cụ thể. Ghi chú như “nhân vật quay đi, không còn hướng về cửa sổ” tạo ra một yêu cầu sửa rõ ràng cho bản mô tả tiếp theo, đồng thời giữ nguyên phần còn lại của cảnh.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Có trên Ailoot · đầu vào &amp; phương thức</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · Video</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>Đầu vào</dt><dd><code>text</code>, <code>image</code></dd></div><div><dt>Đầu ra</dt><dd><code>video</code></dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>Trường</th><th>Loại</th><th>Yêu cầu</th><th>Giá trị &amp; giới hạn</th><th>Mặc định</th></tr></thead><tbody><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>kling-v1-5</div><div>Điều kiện: Dùng chính xác bộ chọn định tuyến Ailoot này.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">mode</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>std, pro</div><div>Điều kiện: Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</div></td><td data-cell-label=\"Mặc định\" data-default=\"known\"><span class=\"card-cell-label\">Mặc định</span>std</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>16:9, 9:16, 1:1</div><div>Điều kiện: Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>integer</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>5, 10</div><div>Điều kiện: Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">end_image</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Điều kiện: Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">image</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string or array&lt;string&gt;</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Điều kiện: Cung cấp URL hình ảnh thực tế của bạn có thể truy cập được. Danh sách chỉ được chấp nhận khi lược đồ tham số quy định kiểu mảng.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">negative_prompt</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Không bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Điều kiện: Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span><code>string</code></td><td data-cell-label=\"Yêu cầu\"><span class=\"card-cell-label\">Yêu cầu</span>Bắt buộc</td><td data-cell-label=\"Giá trị &amp; giới hạn\"><span class=\"card-cell-label\">Giá trị &amp; giới hạn</span><div>Điều kiện: Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</div></td><td data-cell-label=\"Mặc định\" data-default=\"unspecified\"><span class=\"card-cell-label\">Mặc định</span>—</td></tr></tbody></table></div><details class=\"note-s\" data-method-contract><summary>Tham số phương thức và vòng đời</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>Tham số</th><th>Hợp đồng</th></tr></thead><tbody><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>content_type</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>application/json</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>required</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>model, prompt, image</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>optional</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>mode, aspect_ratio, duration, end_image, negative_prompt</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>material_types</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>text, image</td></tr><tr><th data-cell-label=\"Tham số\" scope=\"row\"><span class=\"card-cell-label\">Tham số</span><code>conditions</code></th><td data-cell-label=\"Hợp đồng\"><span class=\"card-cell-label\">Hợp đồng</span>Dùng chính xác bộ chọn định tuyến Ailoot này., Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định., Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định., Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định., Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định., Cung cấp URL hình ảnh thực tế của bạn có thể truy cập được. Danh sách chỉ được chấp nhận khi lược đồ tham số quy định kiểu mảng., Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định., Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.</td></tr></tbody></table></div><p>Bí danh phương thức: <code>/v1/videos/generations</code></p><p>Vòng đời: <code>submit_once_poll_original</code></p><p class=\"note-s\"><code>GET /v1/videos/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/generations/{request_id}</code></p><p class=\"note-s\"><code>GET /v1/videos/{request_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></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">Bảng giá</h3><div class=\"card-result-process\" data-billing-basis><h5>Cách tính phí cuối cùng</h5><p class=\"note-s\">Các đơn giá hiển thị dùng để ước tính chi phí trước khi tạo. Khoản phí cuối cùng được tính dựa trên chi phí ghi nhận cho lượt tạo gốc. Thời lượng đầu ra đo được và số lượng dự kiến không phải là số lượng cuối cùng dùng để tính phí.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>Thông tin biểu giá không bổ sung tùy chọn yêu cầu. Các tham số được hỗ trợ nằm trong phương thức đã chọn.</p><dl data-price-conditions><dt>Chế độ nhanh</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi chọn chế độ nhanh</span></dd><dt>Chế độ Flex</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi chọn chế độ flex</span></dd><dt>Mức độ suy luận tối đa</dt><dd>Chưa chỉ định <span class=\"note-s\">Khi áp dụng mức điều chỉnh mặc định (default) cho mức độ suy luận tối đa</span></dd></dl></div><div data-declared-tariff-pricing><h4>Mức phí ước tính để so sánh</h4><h4>Giá theo cấu hình</h4><p class=\"note-s\">Đối chiếu từng khoản phí với điều kiện hiển thị. Dùng một mức phí cho mỗi nhóm cấu hình thay thế.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>Cấu hình</th><th>Biểu mức phí</th><th>Số lượng dự báo</th><th>Phí</th></tr></thead><tbody><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Giá cơ sở cho token</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>Mức phí cơ bản</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>—</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu vào · Token đầu vào · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu ra · Token đầu ra · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Đọc bộ nhớ đệm · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Ghi bộ nhớ đệm · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div><div><span>Đầu vào · Ghi bộ nhớ đệm, 1 giờ · Ước tính chỉ để so sánh</span> <b>—</b> <span class=\"price-unit\">/ 1K token</span></div></td></tr><tr><th data-cell-label=\"Cấu hình\" scope=\"row\"><span class=\"card-cell-label\">Cấu hình</span>Chi phí tạo ước tính</th><td data-cell-label=\"Biểu mức phí\"><span class=\"card-cell-label\">Biểu mức phí</span>—</td><td data-cell-label=\"Số lượng dự báo\"><span class=\"card-cell-label\">Số lượng dự báo</span>ước tính cho một lần tạo</td><td data-cell-label=\"Phí\"><span class=\"card-cell-label\">Phí</span><div><span>Đầu ra · Chi phí tạo ước tính · Ước tính chỉ để so sánh</span> <b>$6</b> <span class=\"price-unit\">ước tính trước khi tạo</span></div><p class=\"note-s\">Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot tạm giữ một khoản ước tính trước yêu cầu. Sau khi có kết quả, phí cuối cùng được quyết toán theo mức sử dụng đo được. Việc quyết toán khi truyền luồng dùng bản ghi mức sử dụng cuối cùng. <a href=\"/docs/vi/billing/reserve/\">Cách hoạt động của cơ chế tạm giữ và quyết toán →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">Ví dụ yêu cầu</h3><h4>Ailoot Ultra · Video</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"Các phiên bản mã\"><button class=\"cg-tab\" id=\"model-code-2805-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2805-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · chỉ tạo một lần và giữ lại kết quả đầy đủ</button><button class=\"cg-tab\" id=\"model-code-2805-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2805-panel-1\" aria-selected=\"false\" tabindex=\"-1\">Đọc tác vụ gốc</button><button class=\"cg-tab\" id=\"model-code-2805-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2805-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Lưu từng tài nguyên đã hoàn tất thuộc quyền sở hữu của bạn</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"Sao chép mã\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-2805-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2805-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\nexport AILOOT_API_KEY\n: &quot;${AILOOT_IMAGE_URL:?Set an actual customer material or documented value}&quot;\nexport AILOOT_IMAGE_URL\npython3 - &lt;&lt;&#39;PY_REQUEST&#39;\nimport json,os\nfrom pathlib import Path\np=json.loads(&#39;{&quot;model&quot;: &quot;kling-v1-5&quot;, &quot;prompt&quot;: &quot;A cat is walking on grass.&quot;, &quot;image&quot;: &quot;YOUR_ACCESSIBLE_IMAGE_URL&quot;}&#39;)\np[&#39;image&#39;]=os.environ[&#39;AILOOT_IMAGE_URL&#39;]\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/videos \\\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\n# Submit once. Retain the complete result, original identifiers and every response header.\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2805-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2805-tab-1\" hidden><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_STATUS&#39;\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(&quot;result.json&quot;).read_text())\nu=urljoin(&quot;https://api.ailoot.ai&quot;,r[&quot;polling_url&quot;])\np=urlsplit(u)\nif p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or p.username or p.password:\n    raise SystemExit(&quot;Unexpected returned polling URL; preserve the response&quot;)\nsubprocess.run([&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,u,&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;],&quot;-D&quot;,&quot;status-headers.txt&quot;,&quot;-o&quot;,&quot;status.json&quot;],check=True)\n# Read this same original polling_url again while pending.\n# Preserve unknown/result_pending_check; do not repeat creation.\nPY_STATUS\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2805-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2805-tab-2\" hidden><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_ASSETS&#39;\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(&quot;status.json&quot;).read_text())\nroles={}\ndef visit(v,path=&quot;&quot;):\n    if isinstance(v,dict):\n        for k,x in v.items(): visit(x,path+&quot;/&quot;+k)\n    elif isinstance(v,list):\n        for i,x in enumerate(v): visit(x,path+&quot;/&quot;+str(i))\n    elif isinstance(v,str):\n        u=urljoin(&quot;https://api.ailoot.ai&quot;,v); p=urlsplit(u)\n        if p.scheme==&quot;https&quot; and p.netloc==&quot;api.ailoot.ai&quot; and not p.username and not p.password and p.path.startswith(&quot;/v1/media/assets/&quot;) and p.path.endswith(&quot;/content&quot;):\n            roles.setdefault(u,[]).append(path)\nvisit(r)\nif not roles: raise SystemExit(&quot;No completed owned assets; retain the original status&quot;)\nmanifest=[]\nfor i,(u,paths) in enumerate(roles.items()):\n    target=Path(f&quot;asset-{i}.bin&quot;)\n    subprocess.run([&quot;curl&quot;,&quot;--fail-with-body&quot;,&quot;--silent&quot;,&quot;--show-error&quot;,u,&quot;-H&quot;,&quot;Authorization: Bearer &quot;+os.environ[&quot;AILOOT_API_KEY&quot;],&quot;-o&quot;,str(target)],check=True)\n    raw=target.read_bytes()\n    if not raw: raise SystemExit(&quot;Empty asset; retain original status and metadata&quot;)\n    ext=&quot;glb&quot; if raw[:4]==b&quot;glTF&quot; else &quot;png&quot; if raw[:8]==b&quot;\\x89PNG\\r\\n\\x1a\\n&quot; else &quot;jpg&quot; if raw[:3]==b&quot;\\xff\\xd8\\xff&quot; else &quot;webp&quot; if raw[:4]==b&quot;RIFF&quot; and raw[8:12]==b&quot;WEBP&quot; else &quot;mp4&quot; if raw[4:8]==b&quot;ftyp&quot; else &quot;bin&quot;\n    name=f&quot;asset-{i}.{ext}&quot;\n    if target.name!=name: target.rename(name)\n    manifest.append({&quot;file&quot;:name,&quot;response_paths&quot;:paths,&quot;bytes&quot;:len(raw)})\nPath(&quot;asset-manifest.json&quot;).write_text(json.dumps(manifest,indent=2))\nprint(&quot;Saved&quot;,len(manifest),&quot;unique owned assets; every response role retained&quot;)\nPY_ASSETS\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">Nhận và lưu kết quả</h3><h4>Ailoot Ultra · Video</h4><ul class=\"card-result-paths\"><li><code>GET /v1/videos/{request_id}</code></li><li><code>GET /v1/videos/generations/{request_id}</code></li><li><code>GET /v1/videos/{request_id}/content</code></li><li><code>GET /v1/media/assets</code></li><li><code>GET /v1/media/assets/{asset_id}</code></li></ul><div class=\"card-result-process\" data-all-results><h5>Lưu tất cả kết quả đã hoàn tất</h5><p class=\"note-s\">Lưu mọi video đã hoàn tất hoặc tệp trả về; truy xuất từng URL tài nguyên thực tế được trả về.</p><p class=\"note-s\">Giữ lại toàn bộ phản hồi và tiêu đề, các mã định danh gốc, mọi đầu ra thực tế và tất cả trường mức sử dụng/hạch toán. Lưu từng tài sản duy nhất thuộc quyền sở hữu và giữ lại mọi vai trò tham chiếu đến tài sản đó.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>Nếu cần kiểm tra phản hồi gốc</h5><p class=\"note-s\">Giữ lại id tác vụ hoặc thao tác công khai được trả về và tất cả tiêu đề. Chỉ đọc tác vụ ban đầu; unknown hoặc result_pending_check không cho phép tạo thêm tác vụ.</p></div><details class=\"card-about\" data-output-fields><summary>Trường phản hồi</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>Trường</th><th>Loại</th></tr></thead><tbody><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">polling_url</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">provider_task_id</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">task_id</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">status</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr><tr><th data-cell-label=\"Trường\" scope=\"row\"><span class=\"card-cell-label\">Trường</span><code class=\"card-field-name\">video_url</code></th><td data-cell-label=\"Loại\" data-field-type><span class=\"card-cell-label\">Loại</span>string</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>Lỗi và bước tiếp theo</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>Phản hồi</th><th>Điều kiện</th><th>Bước tiếp theo</th></tr></thead><tbody><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Trường bắt buộc, bộ chọn mô hình, kiểu dữ liệu hoặc cách biểu diễn đầu vào không hợp lệ.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Xem chi tiết kết quả kiểm tra tính hợp lệ được trả về trước khi chuẩn bị một yêu cầu riêng.</td></tr><tr><th data-cell-label=\"Phản hồi\" scope=\"row\"><span class=\"card-cell-label\">Phản hồi</span><code></code></th><td data-cell-label=\"Điều kiện\"><span class=\"card-cell-label\">Điều kiện</span>Yêu cầu hoặc kết quả gốc chưa xác định hoặc cần kiểm tra.</td><td data-cell-label=\"Bước tiếp theo\"><span class=\"card-cell-label\">Bước tiếp theo</span>Giữ nguyên các mã định danh và trường tiêu đề gốc; chỉ đọc các bản ghi trạng thái/thư viện được hỗ trợ. Không gửi lại yêu cầu tạo.</td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">Bí danh</h3><h4>Bí danh mô hình</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=kling-v1-5&amp;route=Ultra&amp;caller=kling-v1-5&amp;fmt=videos\"><code>kling-v1-5</code></a></span></p><h4>Bí danh đường dẫn phương thức</h4><p class=\"note-s\"><code>/v1/videos/generations</code></p><h4>ID gọi liên quan</h4><p class=\"note-s\"><a href=\"#m=kling-v1-5&amp;route=Ultra&amp;caller=kling-v1-5&amp;fmt=videos\"><code>kling-v1-5</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "kling-v1-5",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "kling-v1-5",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|kling-v1-5",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "The displayed rates estimate the cost before generation. The final charge is calculated from the cost recorded for the original generation. Measured output duration and forecast quantities are not the final billable quantity.",
          "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 the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "authentication": {
              "header": "Authorization",
              "scheme": "Bearer",
              "value": "$AILOOT_API_KEY"
            },
            "errors": [
              {
                "condition": "Trường bắt buộc, bộ chọn mô hình, kiểu dữ liệu hoặc cách biểu diễn đầu vào không hợp lệ.",
                "http_status": 400,
                "recovery": "Xem chi tiết kết quả kiểm tra tính hợp lệ được trả về trước khi chuẩn bị một yêu cầu riêng.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Yêu cầu hoặc kết quả gốc chưa xác định hoặc cần kiểm tra.",
                "http_status": null,
                "recovery": "Giữ nguyên các mã định danh và trường tiêu đề gốc; chỉ đọc các bản ghi trạng thái/thư viện được hỗ trợ. Không gửi lại yêu cầu tạo.",
                "type": null
              }
            ],
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "cancel_endpoint": null,
              "completed_states": [
                "completed"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [
                "failed"
              ],
              "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
              "mode": "submit_once_poll_original",
              "owned_content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "Use the exact returned signed URL; never construct a token."
              },
              "pending_states": [
                "pending",
                "processing"
              ],
              "state_field": "status",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "unknown": "Giữ lại id tác vụ hoặc thao tác công khai được trả về và tất cả tiêu đề. Chỉ đọc tác vụ ban đầu; unknown hoặc result_pending_check không cho phép tạo thêm tác vụ.",
              "unknown_no_replay": true
            },
            "outputs": {
              "all_results": "Giữ lại toàn bộ phản hồi và tiêu đề, các mã định danh gốc, mọi đầu ra thực tế và tất cả trường mức sử dụng/hạch toán. Lưu từng tài sản duy nhất thuộc quyền sở hữu và giữ lại mọi vai trò tham chiếu đến tài sản đó.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "name": "id",
                  "type": "string"
                },
                {
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "name": "task_id",
                  "type": "string"
                },
                {
                  "name": "status",
                  "type": "string"
                },
                {
                  "name": "video_url",
                  "type": "string"
                }
              ],
              "maximum_outputs": null
            },
            "parameters": [
              {
                "conditions": "Dùng chính xác bộ chọn định tuyến Ailoot này.",
                "default_known": false,
                "enum": [
                  "kling-v1-5"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default": "std",
                "default_known": true,
                "enum": [
                  "std",
                  "pro"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "mode",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16",
                  "1:1"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum": [
                  5,
                  10
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "duration",
                "required": false,
                "type": "integer"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "end_image",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Cung cấp URL hình ảnh thực tế của bạn có thể truy cập được. Danh sách chỉ được chấp nhận khi lược đồ tham số quy định kiểu mảng.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "image",
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 10,
                    "type": "array"
                  }
                ],
                "required": true,
                "type": "string or array<string>"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "negative_prompt",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "prompt",
                "required": true,
                "type": "string"
              }
            ],
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "16:9",
                    "9:16",
                    "1:1"
                  ],
                  "type": "string"
                },
                "duration": {
                  "enum": [
                    5,
                    10
                  ],
                  "type": "integer"
                },
                "end_image": {
                  "type": "string"
                },
                "image": {
                  "oneOf": [
                    {
                      "type": "string"
                    },
                    {
                      "items": {
                        "type": "string"
                      },
                      "maxItems": 10,
                      "type": "array"
                    }
                  ]
                },
                "mode": {
                  "default": "std",
                  "enum": [
                    "std",
                    "pro"
                  ],
                  "type": "string"
                },
                "model": {
                  "enum": [
                    "kling-v1-5"
                  ],
                  "type": "string"
                },
                "negative_prompt": {
                  "type": "string"
                },
                "prompt": {
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt",
                "image"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": true,
              "body": {
                "image": "YOUR_ACCESSIBLE_IMAGE_URL",
                "model": "kling-v1-5",
                "prompt": "A cat is walking on grass."
              },
              "content_type": "application/json",
              "example_is_offline_content": true
            },
            "usage": {
              "meter": "Use the accepted method price and actual recorded usage; the request reserve is an estimate. A billing unit does not add an input capability.",
              "preserve": "Keep all returned usage, accounting and request identifiers with every actual output.",
              "settlement": "Retain the original operation; reconcile its result and accounting once."
            }
          },
          "input": {
            "conditions": [
              "Dùng chính xác bộ chọn định tuyến Ailoot này.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Cung cấp URL hình ảnh thực tế của bạn có thể truy cập được. Danh sách chỉ được chấp nhận khi lược đồ tham số quy định kiểu mảng.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định."
            ],
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "optional": [
              "mode",
              "aspect_ratio",
              "duration",
              "end_image",
              "negative_prompt"
            ],
            "required": [
              "model",
              "prompt",
              "image"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "cancel_endpoint": null,
            "completed_states": [
              "completed"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [
              "failed"
            ],
            "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
            "mode": "submit_once_poll_original",
            "owned_content": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}/content",
              "url_source": "Use the exact returned signed URL; never construct a token."
            },
            "pending_states": [
              "pending",
              "processing"
            ],
            "state_field": "status",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "unknown": "Keep the returned public task or operation id and all headers. Read only the original task; unknown or result_pending_check does not authorize another creation.",
            "unknown_no_replay": true
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "output": {
            "all_results": "Retain the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "name": "id",
                "type": "string"
              },
              {
                "name": "polling_url",
                "type": "string"
              },
              {
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "name": "task_id",
                "type": "string"
              },
              {
                "name": "status",
                "type": "string"
              },
              {
                "name": "video_url",
                "type": "string"
              }
            ],
            "maximum_outputs": null
          }
        },
        "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"
              }
            ]
          },
          {
            "basis": "Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Chi phí tạo ước tính",
            "units": [
              {
                "amount": "6",
                "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": "6",
                "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\n: \"${AILOOT_IMAGE_URL:?Set an actual customer material or documented value}\"\nexport AILOOT_IMAGE_URL\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"kling-v1-5\", \"prompt\": \"A cat is walking on grass.\", \"image\": \"YOUR_ACCESSIBLE_IMAGE_URL\"}')\np['image']=os.environ['AILOOT_IMAGE_URL']\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/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n# Submit once. Retain the complete result, original identifiers and every response header.\n",
            "label": "curl · create once and retain the complete result",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_STATUS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\nu=urljoin(\"https://api.ailoot.ai\",r[\"polling_url\"])\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or p.username or p.password:\n    raise SystemExit(\"Unexpected returned polling URL; preserve the response\")\nsubprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-D\",\"status-headers.txt\",\"-o\",\"status.json\"],check=True)\n# Read this same original polling_url again while pending.\n# Preserve unknown/result_pending_check; do not repeat creation.\nPY_STATUS\n",
            "label": "Read the original task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nroles={}\ndef visit(v,path=\"\"):\n    if isinstance(v,dict):\n        for k,x in v.items(): visit(x,path+\"/\"+k)\n    elif isinstance(v,list):\n        for i,x in enumerate(v): visit(x,path+\"/\"+str(i))\n    elif isinstance(v,str):\n        u=urljoin(\"https://api.ailoot.ai\",v); p=urlsplit(u)\n        if p.scheme==\"https\" and p.netloc==\"api.ailoot.ai\" and not p.username and not p.password and p.path.startswith(\"/v1/media/assets/\") and p.path.endswith(\"/content\"):\n            roles.setdefault(u,[]).append(path)\nvisit(r)\nif not roles: raise SystemExit(\"No completed owned assets; retain the original status\")\nmanifest=[]\nfor i,(u,paths) in enumerate(roles.items()):\n    target=Path(f\"asset-{i}.bin\")\n    subprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-o\",str(target)],check=True)\n    raw=target.read_bytes()\n    if not raw: raise SystemExit(\"Empty asset; retain original status and metadata\")\n    ext=\"glb\" if raw[:4]==b\"glTF\" else \"png\" if raw[:8]==b\"\\x89PNG\\r\\n\\x1a\\n\" else \"jpg\" if raw[:3]==b\"\\xff\\xd8\\xff\" else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"mp4\" if raw[4:8]==b\"ftyp\" else \"bin\"\n    name=f\"asset-{i}.{ext}\"\n    if target.name!=name: target.rename(name)\n    manifest.append({\"file\":name,\"response_paths\":paths,\"bytes\":len(raw)})\nPath(\"asset-manifest.json\").write_text(json.dumps(manifest,indent=2))\nprint(\"Saved\",len(manifest),\"unique owned assets; every response role retained\")\nPY_ASSETS\n",
            "label": "Save every completed owned asset",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Video",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/videos/generations"
        ],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "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"
              }
            ]
          },
          {
            "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": "6",
                "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": "6",
                "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": "kling-v1-5",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}"
        ],
        "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": "6",
            "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": "6",
            "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": "kling-v1-5",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "8be82381a391a3770061e1241b82cb728442852150a4482a01efa4d02028e590",
    "input_html_sha256": "a8cfb78d842ada32a185577472d44b544d4748af63de4e53b62b9ac5640951da",
    "private_audit_sha256": "267f477ccd1a962754c17eb4e031aee5a7437821a6910f7033704108cf98c06f",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/vi/kling-v1-5/",
    "description": "Kling v1.5 là mô hình video có quy trình chuyển ảnh thành video được nêu trong tài liệu. Bắt đầu từ một ảnh tĩnh đã chuẩn bị và mô tả chuyển động, góc nhìn cùng bố cục cuối cùng cho một cảnh quay ngắn về nhân vật, vật thể hoặc môi trường.",
    "locale": "vi",
    "md_url": "https://ailoot.ai/models/vi/kling-v1-5/index.md",
    "title": "Kling v1.5 — Ailoot",
    "url": "https://ailoot.ai/models/vi/kling-v1-5/"
  },
  "rawModel": {
    "about": "Kling v1.5 là một phiên bản tạo video của Kling, có khả năng chuyển ảnh thành video theo danh mục mô hình trong tài liệu. Ảnh tĩnh được cung cấp đóng vai trò điểm khởi đầu về hình ảnh, còn bản mô tả yêu cầu bằng văn bản giải thích cảnh cần chuyển động như thế nào. Dùng mô hình để phát triển một cử chỉ nhân vật, một vật thể chuyển động hoặc một môi trường biến đổi từ ảnh có bố cục đã phù hợp với cảnh quay.\n\nChuẩn bị ảnh sao cho các chi tiết quan trọng của chủ thể được thể hiện rõ. Với nhân vật, cần nhìn rõ khuôn mặt, tư thế và trang phục; với vật thể, cần có đường nét rõ ràng và các đặc điểm chất liệu dễ thấy. Chừa khoảng trống trong bố cục cho chuyển động dự kiến. Lưu ảnh tĩnh gốc cùng chuỗi hình ảnh hoàn chỉnh để có thể đánh giá trực tiếp những thay đổi về diện mạo.\n\nViết hành động dưới dạng một sự việc có thể quan sát. Ví dụ, mô tả một người đang ngồi quay về phía cửa sổ hoặc một dải ruy băng bằng vải chuyển động trong làn gió nhẹ. Nêu hướng chuyển động và trạng thái kết thúc mong muốn. Khi có nhiều vật thể xuất hiện, hãy xác định vật thể nào chuyển động và những vật thể nào giữ nguyên vị trí.\n\nGiải thích vai trò của máy quay. Góc nhìn cố định giúp dễ kiểm tra một cử chỉ nhỏ, còn góc nhìn chuyển động có thể cho thấy một mặt mới của cảnh. Mô tả chuyển động đó trong mối quan hệ với chủ thể. Yêu cầu máy quay tiến gần chủ thể và yêu cầu chủ thể tiến gần máy quay thể hiện hai ý đồ hình ảnh khác nhau.\n\nMục chuyển ảnh thành video trong tài liệu liệt kê các lựa chọn thời lượng 5 và 10 giây, chế độ std và pro, cùng khung hình ngang, dọc và vuông. Chọn các thiết lập mà quy trình đã chọn cung cấp trước khi đánh giá kết quả. Khi so sánh các phương án cảnh quay, hãy lưu chế độ, thời lượng và dạng khung hình thực tế cùng ảnh nguồn và câu lệnh.\n\nVới cảnh giới thiệu vật thể, hãy xác định đặc điểm hình ảnh mà chuyển động cần làm lộ rõ. Đó có thể là một bề mặt phản chiếu, nếp gấp của chất liệu hoặc hình dáng tay cầm. Giữ hành động đủ tập trung để đặc điểm quan trọng luôn nhìn thấy được. Đánh giá vật thể trong suốt chuyển động và ở góc nhìn cuối cùng được sử dụng trong bản dựng.\n\nVới cảnh nhân vật, hãy mô tả một cử chỉ có ý nghĩa và mối quan hệ của nhân vật với các vật thể gần đó. Xem lại khuôn mặt, bàn tay, trang phục và tỷ lệ cơ thể theo thời gian. Kiểm tra xem cử chỉ có đạt đến trạng thái kết thúc dự kiến hay không và cảnh có duy trì cách sắp xếp nhất quán giữa các yếu tố tiền cảnh và hậu cảnh hay không.\n\nGiữ lại toàn bộ đoạn video được tạo cùng các tài liệu nguồn. Xem phần mở đầu, hành động chính và phần kết như một chuỗi thống nhất, sau đó chỉnh sửa dựa trên một điểm sai lệch cụ thể. Ghi chú như “nhân vật quay đi, không còn hướng về cửa sổ” tạo ra một yêu cầu sửa rõ ràng cho bản mô tả tiếp theo, đồng thời giữ nguyên phần còn lại của cảnh.",
    "about_sha256": "f1e2aa1f98338a01eb461fbe7e6c3e7cda8fa7076aef23990d07cdaa1a38c56b",
    "alias_of": null,
    "aliases": [],
    "author": "Kling",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text",
        "image"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "6",
            "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": "6",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "Giá theo cấu hình được trình bày đầy đủ trong phần chi tiết."
      }
    ],
    "ctx": null,
    "display_name": "Kling v1.5",
    "formats": [
      "videos"
    ],
    "id": "kling-v1-5",
    "input": [
      "text",
      "image"
    ],
    "kind": "video",
    "locale": "en",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "The displayed rates estimate the cost before generation. The final charge is calculated from the cost recorded for the original generation. Measured output duration and forecast quantities are not the final billable quantity.",
          "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 the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "authentication": {
              "header": "Authorization",
              "scheme": "Bearer",
              "value": "$AILOOT_API_KEY"
            },
            "errors": [
              {
                "condition": "Trường bắt buộc, bộ chọn mô hình, kiểu dữ liệu hoặc cách biểu diễn đầu vào không hợp lệ.",
                "http_status": 400,
                "recovery": "Xem chi tiết kết quả kiểm tra tính hợp lệ được trả về trước khi chuẩn bị một yêu cầu riêng.",
                "type": "invalid_request_error"
              },
              {
                "condition": "Yêu cầu hoặc kết quả gốc chưa xác định hoặc cần kiểm tra.",
                "http_status": null,
                "recovery": "Giữ nguyên các mã định danh và trường tiêu đề gốc; chỉ đọc các bản ghi trạng thái/thư viện được hỗ trợ. Không gửi lại yêu cầu tạo.",
                "type": null
              }
            ],
            "lifecycle": {
              "assets": [
                {
                  "http": "GET",
                  "path": "/v1/media/assets"
                },
                {
                  "http": "GET",
                  "path": "/v1/media/assets/{asset_id}"
                }
              ],
              "cancel_endpoint": null,
              "completed_states": [
                "completed"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [
                "failed"
              ],
              "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
              "mode": "submit_once_poll_original",
              "owned_content": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}/content",
                "url_source": "Use the exact returned signed URL; never construct a token."
              },
              "pending_states": [
                "pending",
                "processing"
              ],
              "state_field": "status",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "unknown": "Giữ lại id tác vụ hoặc thao tác công khai được trả về và tất cả tiêu đề. Chỉ đọc tác vụ ban đầu; unknown hoặc result_pending_check không cho phép tạo thêm tác vụ.",
              "unknown_no_replay": true
            },
            "outputs": {
              "all_results": "Giữ lại toàn bộ phản hồi và tiêu đề, các mã định danh gốc, mọi đầu ra thực tế và tất cả trường mức sử dụng/hạch toán. Lưu từng tài sản duy nhất thuộc quyền sở hữu và giữ lại mọi vai trò tham chiếu đến tài sản đó.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "name": "id",
                  "type": "string"
                },
                {
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "name": "task_id",
                  "type": "string"
                },
                {
                  "name": "status",
                  "type": "string"
                },
                {
                  "name": "video_url",
                  "type": "string"
                }
              ],
              "maximum_outputs": null
            },
            "parameters": [
              {
                "conditions": "Dùng chính xác bộ chọn định tuyến Ailoot này.",
                "default_known": false,
                "enum": [
                  "kling-v1-5"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default": "std",
                "default_known": true,
                "enum": [
                  "std",
                  "pro"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "mode",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum": [
                  "16:9",
                  "9:16",
                  "1:1"
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum": [
                  5,
                  10
                ],
                "enum_known": true,
                "maximum_length": null,
                "name": "duration",
                "required": false,
                "type": "integer"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "end_image",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Cung cấp URL hình ảnh thực tế của bạn có thể truy cập được. Danh sách chỉ được chấp nhận khi lược đồ tham số quy định kiểu mảng.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "image",
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 10,
                    "type": "array"
                  }
                ],
                "required": true,
                "type": "string or array<string>"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "negative_prompt",
                "required": false,
                "type": "string"
              },
              {
                "conditions": "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
                "default_known": false,
                "enum_known": false,
                "maximum_length": null,
                "name": "prompt",
                "required": true,
                "type": "string"
              }
            ],
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "aspect_ratio": {
                  "enum": [
                    "16:9",
                    "9:16",
                    "1:1"
                  ],
                  "type": "string"
                },
                "duration": {
                  "enum": [
                    5,
                    10
                  ],
                  "type": "integer"
                },
                "end_image": {
                  "type": "string"
                },
                "image": {
                  "oneOf": [
                    {
                      "type": "string"
                    },
                    {
                      "items": {
                        "type": "string"
                      },
                      "maxItems": 10,
                      "type": "array"
                    }
                  ]
                },
                "mode": {
                  "default": "std",
                  "enum": [
                    "std",
                    "pro"
                  ],
                  "type": "string"
                },
                "model": {
                  "enum": [
                    "kling-v1-5"
                  ],
                  "type": "string"
                },
                "negative_prompt": {
                  "type": "string"
                },
                "prompt": {
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt",
                "image"
              ],
              "type": "object"
            },
            "schema_template": {
              "actual_file_preparation_required": true,
              "body": {
                "image": "YOUR_ACCESSIBLE_IMAGE_URL",
                "model": "kling-v1-5",
                "prompt": "A cat is walking on grass."
              },
              "content_type": "application/json",
              "example_is_offline_content": true
            },
            "usage": {
              "meter": "Use the accepted method price and actual recorded usage; the request reserve is an estimate. A billing unit does not add an input capability.",
              "preserve": "Keep all returned usage, accounting and request identifiers with every actual output.",
              "settlement": "Retain the original operation; reconcile its result and accounting once."
            }
          },
          "input": {
            "conditions": [
              "Dùng chính xác bộ chọn định tuyến Ailoot này.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Cung cấp URL hình ảnh thực tế của bạn có thể truy cập được. Danh sách chỉ được chấp nhận khi lược đồ tham số quy định kiểu mảng.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định.",
              "Dùng trường được tài liệu mô tả và các lựa chọn được liệt kê cho mô hình đã chọn; bỏ qua giá trị tùy chọn chưa được chỉ định."
            ],
            "content_type": "application/json",
            "material_types": [
              "text",
              "image"
            ],
            "optional": [
              "mode",
              "aspect_ratio",
              "duration",
              "end_image",
              "negative_prompt"
            ],
            "required": [
              "model",
              "prompt",
              "image"
            ]
          },
          "lifecycle": {
            "assets": [
              {
                "http": "GET",
                "path": "/v1/media/assets"
              },
              {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              }
            ],
            "cancel_endpoint": null,
            "completed_states": [
              "completed"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [
              "failed"
            ],
            "id_source": "Use returned polling_url and id. Keep provider_task_id and X-Ailoot-Task-Id as separate original identifiers.",
            "mode": "submit_once_poll_original",
            "owned_content": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}/content",
              "url_source": "Use the exact returned signed URL; never construct a token."
            },
            "pending_states": [
              "pending",
              "processing"
            ],
            "state_field": "status",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "unknown": "Keep the returned public task or operation id and all headers. Read only the original task; unknown or result_pending_check does not authorize another creation.",
            "unknown_no_replay": true
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "output": {
            "all_results": "Retain the complete response and headers, original identifiers, every actual output and all usage/accounting fields. Save each unique owned asset and retain every role pointing to it.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "name": "id",
                "type": "string"
              },
              {
                "name": "polling_url",
                "type": "string"
              },
              {
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "name": "task_id",
                "type": "string"
              },
              {
                "name": "status",
                "type": "string"
              },
              {
                "name": "video_url",
                "type": "string"
              }
            ],
            "maximum_outputs": null
          }
        },
        "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"
              }
            ]
          },
          {
            "basis": "Ước tính này không phải là khoản phí bổ sung hay mức giá cố định cho lượt tạo đã hoàn tất.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "Chi phí tạo ước tính",
            "units": [
              {
                "amount": "6",
                "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": "6",
                "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\n: \"${AILOOT_IMAGE_URL:?Set an actual customer material or documented value}\"\nexport AILOOT_IMAGE_URL\npython3 - <<'PY_REQUEST'\nimport json,os\nfrom pathlib import Path\np=json.loads('{\"model\": \"kling-v1-5\", \"prompt\": \"A cat is walking on grass.\", \"image\": \"YOUR_ACCESSIBLE_IMAGE_URL\"}')\np['image']=os.environ['AILOOT_IMAGE_URL']\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/videos \\\n  -H \"Authorization: Bearer $AILOOT_API_KEY\" -H 'Content-Type: application/json' \\\n  --data-binary @request.json -D response-headers.txt -o result.json\n# Submit once. Retain the complete result, original identifiers and every response header.\n",
            "label": "curl · create once and retain the complete result",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_STATUS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\nu=urljoin(\"https://api.ailoot.ai\",r[\"polling_url\"])\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or p.username or p.password:\n    raise SystemExit(\"Unexpected returned polling URL; preserve the response\")\nsubprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-D\",\"status-headers.txt\",\"-o\",\"status.json\"],check=True)\n# Read this same original polling_url again while pending.\n# Preserve unknown/result_pending_check; do not repeat creation.\nPY_STATUS\n",
            "label": "Read the original task",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\nexport AILOOT_API_KEY\npython3 - <<'PY_ASSETS'\nimport json,os,subprocess\nfrom pathlib import Path\nfrom urllib.parse import urljoin,urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nroles={}\ndef visit(v,path=\"\"):\n    if isinstance(v,dict):\n        for k,x in v.items(): visit(x,path+\"/\"+k)\n    elif isinstance(v,list):\n        for i,x in enumerate(v): visit(x,path+\"/\"+str(i))\n    elif isinstance(v,str):\n        u=urljoin(\"https://api.ailoot.ai\",v); p=urlsplit(u)\n        if p.scheme==\"https\" and p.netloc==\"api.ailoot.ai\" and not p.username and not p.password and p.path.startswith(\"/v1/media/assets/\") and p.path.endswith(\"/content\"):\n            roles.setdefault(u,[]).append(path)\nvisit(r)\nif not roles: raise SystemExit(\"No completed owned assets; retain the original status\")\nmanifest=[]\nfor i,(u,paths) in enumerate(roles.items()):\n    target=Path(f\"asset-{i}.bin\")\n    subprocess.run([\"curl\",\"--fail-with-body\",\"--silent\",\"--show-error\",u,\"-H\",\"Authorization: Bearer \"+os.environ[\"AILOOT_API_KEY\"],\"-o\",str(target)],check=True)\n    raw=target.read_bytes()\n    if not raw: raise SystemExit(\"Empty asset; retain original status and metadata\")\n    ext=\"glb\" if raw[:4]==b\"glTF\" else \"png\" if raw[:8]==b\"\\x89PNG\\r\\n\\x1a\\n\" else \"jpg\" if raw[:3]==b\"\\xff\\xd8\\xff\" else \"webp\" if raw[:4]==b\"RIFF\" and raw[8:12]==b\"WEBP\" else \"mp4\" if raw[4:8]==b\"ftyp\" else \"bin\"\n    name=f\"asset-{i}.{ext}\"\n    if target.name!=name: target.rename(name)\n    manifest.append({\"file\":name,\"response_paths\":paths,\"bytes\":len(raw)})\nPath(\"asset-manifest.json\").write_text(json.dumps(manifest,indent=2))\nprint(\"Saved\",len(manifest),\"unique owned assets; every response role retained\")\nPY_ASSETS\n",
            "label": "Save every completed owned asset",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "http": "POST",
        "in": null,
        "input": [
          "text",
          "image"
        ],
        "label": "Video",
        "max_out": null,
        "max_reasoning_effort_multiplier": null,
        "method_aliases": [
          "/v1/videos/generations"
        ],
        "out": null,
        "output": [
          "video"
        ],
        "path": "/v1/videos",
        "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"
              }
            ]
          },
          {
            "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": "6",
                "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": "6",
                "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": "kling-v1-5",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}"
        ],
        "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": "6",
            "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": "6",
            "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": "kling-v1-5",
        "request_model_id": "kling-v1-5",
        "route_label": "Ultra"
      }
    ],
    "name": "Kling v1.5",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 6,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 6,
      "varies": false
    },
    "short": "Kling v1.5 là mô hình video có quy trình chuyển ảnh thành video được nêu trong tài liệu. Bắt đầu từ một ảnh tĩnh đã chuẩn bị và mô tả chuyển động, góc nhìn cùng bố cục cuối cùng cho một cảnh quay ngắn về nhân vật, vật thể hoặc môi trường.",
    "short_sha256": "558a8b7e65d88706809794101986a0723e56fbfa5f6e152e7186404a71f537ae"
  },
  "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": "Kling v1.5 là mô hình video có quy trình chuyển ảnh thành video được nêu trong tài liệu. Bắt đầu từ một ảnh tĩnh đã chuẩn bị và mô tả chuyển động, góc nhìn cùng bố cục cuối cùng cho một cảnh quay ngắn về nhân vật, vật thể hoặc môi trường.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "6b884a30c70bc9a8cb3be7faf3a6c381529c6f6822ff996f6f348b0f2e113e5c",
    "renderer_sha256": "64a62299639eb843877e9ec5c95e32bf22bac3acfe230f6f502c5c3aa186f9c1"
  },
  "sourceRevision": "14937abf8a9bc011fcb81f2dc76ddc2d065e6c54864353e43c6b28f20517cdf1"
}
