{
  "aboutHtml": "<p>Vidu Q2는 viduq2로 선택하는 텍스트 기반 영상 프로필을 통해 글로 설명한 장면에서 영상을 만듭니다. 필수 입력은 정확한 모델 ID와 장면을 설명하는 프롬프트입니다. 외형과 움직임을 말로 지정할 수 있는 짧은 상품 구상, 장소를 소개하는 전경, 인물 동작에 사용하세요. 설정된 이 방식은 텍스트 기반 영상 생성이며, 설명이 이 선택자에 별도 이미지 참조 모드나 영상 편집 모드를 부여하지는 않습니다.</p><p>화면에 보이는 순서를 중심으로 지시를 구성하세요. 피사체, 장소, 동작, 숏 크기, 카메라 움직임, 마지막 구도를 지정합니다. 상품 구상에는 탁자 위 물체, 소재를 가로지르는 빛, 알아보기 쉬운 디테일에서 끝나는 느린 카메라 접근을 설명하세요. 장소 장면에서는 중심 대상으로 다가가기 전에 환경을 소개합니다. 의도한 결말을 담을 여유가 있도록 동작을 선택한 클립 길이에 맞추세요.</p><p>프롬프트 상한은 2,000자입니다. 핵심 피사체와 동작을 먼저 적고, 원하는 결과에 영향을 주는 조명·소재·환경·카메라 디테일을 더하세요. 시각적 스타일은 프롬프트에서 지정합니다. Q2 전용 가이드에 따르면 별도의 style 및 movement_amplitude 매개변수는 이 모델에 적용되지 않습니다. 따라서 general 또는 anime 프리셋과 움직임 진폭 옵션은 명확한 장면 설명을 대신할 수 없습니다.</p><p>모델별 길이 설정은 한 초부터 열 초까지의 정수 초를 받습니다. Q2 해상도 선택지는 540p, 720p, 1080p이며, 문서상 기본값은 720p입니다. 동작과 용도에 맞게 길이와 해상도를 함께 선택하세요. 짧게 드러내는 장면과 더 오래 이어지는 움직임은 타이밍이 달라야 합니다. 요청 길이를 늘리는 것은 화면의 순서를 위한 것이어야 하며, 변함없는 지시를 단순히 늘이는 데 그쳐서는 안 됩니다. 최종 배치를 준비할 때 반환된 클립의 실제 크기와 길이를 확인하세요.</p><p>문서화된 aspect_ratio 선택지는 16:9, 9:16, 3:4, 4:3, 1:1이며 기본값은 16:9입니다. 가이드는 Q2 제품군에 3:4와 4:3을 명시적으로 포함합니다. 생성 전에 화면을 선택하고 이에 맞는 구도를 설명하세요. 세로 화면에서는 주 피사체가 잘 보이게 하고, 가로 화면에서는 너비를 활용해 주변 환경을 보여 줍니다. 마지막 화면은 의도한 페이지·프레젠테이션 또는 이후 자막 작업에 충분히 명확하도록 만드세요.</p><p>seed 필드는 변화를 제어합니다. 생략하거나 0을 주면 무작위 값을 선택하고, 영이 아닌 값을 주면 반복 가능한 생성용으로 문서화된 고정 seed 옵션을 선택합니다. 버전을 비교할 때 반환된 seed를 프롬프트 및 설정과 함께 보관하세요. 공통 작업 설명에는 Q3 모델 전용 audio 및 off_peak 제어도 나옵니다. 이 Q3 옵션은 이 Q2 프로필에 부여된 기능이 아니므로, 문서화된 텍스트 입력과 영상 출력을 중심으로 요청을 계획하세요.</p><p>생성은 비동기 방식입니다. 제출하면 task_id와 초기 상태가 반환되며, 새로 만든 작업에는 created가 사용됩니다. 처리를 추적하는 동안 이 작업 ID를 보관하세요. 문서화된 결과 조회는 성공 결과에 state=success를 사용하고 creations 배열을 반환합니다. 각 항목의 영상 URL은 creations[].url에 있습니다. 작업에 항상 생성물이 정확히 하나만 있다고 가정하지 말고, 반환된 모든 영상을 저장하세요.</p><p>결과 문서에는 실제 영상의 길이, fps, 해상도의 너비와 높이도 보고된다고 나옵니다. 예제의 프레임 속도나 크기를 고정된 Q2 사양으로 보지 말고, 보고된 값을 완성 클립과 함께 보관하세요. 작업 생성 응답에는 요청 구성과 함께 credits 값이 포함됩니다. 각 영상이 생성 설정과 연결된 상태를 유지하도록, 이 보고된 작업 메타데이터와 완료된 작업 ID를 결과와 함께 보관하세요.</p><p>전체 시퀀스를 원래 지시와 비교하세요. 피사체 외형, 물체 형태, 움직임 방향, 카메라 연속성, 의도한 마지막 화면을 확인합니다. 수정할 때는 지시와 어긋난 구체적인 디테일을 지정하고, 잘된 장면 부분을 유지하세요. 이후 비교가 실제 결과물을 바탕으로 이루어지도록 프롬프트, 정확한 선택자, 설정, 작업 ID, 완성 영상을 함께 보관하세요.</p>",
  "aboutText": "Vidu Q2는 viduq2로 선택하는 텍스트 기반 영상 프로필을 통해 글로 설명한 장면에서 영상을 만듭니다. 필수 입력은 정확한 모델 ID와 장면을 설명하는 프롬프트입니다. 외형과 움직임을 말로 지정할 수 있는 짧은 상품 구상, 장소를 소개하는 전경, 인물 동작에 사용하세요. 설정된 이 방식은 텍스트 기반 영상 생성이며, 설명이 이 선택자에 별도 이미지 참조 모드나 영상 편집 모드를 부여하지는 않습니다.\n\n화면에 보이는 순서를 중심으로 지시를 구성하세요. 피사체, 장소, 동작, 숏 크기, 카메라 움직임, 마지막 구도를 지정합니다. 상품 구상에는 탁자 위 물체, 소재를 가로지르는 빛, 알아보기 쉬운 디테일에서 끝나는 느린 카메라 접근을 설명하세요. 장소 장면에서는 중심 대상으로 다가가기 전에 환경을 소개합니다. 의도한 결말을 담을 여유가 있도록 동작을 선택한 클립 길이에 맞추세요.\n\n프롬프트 상한은 2,000자입니다. 핵심 피사체와 동작을 먼저 적고, 원하는 결과에 영향을 주는 조명·소재·환경·카메라 디테일을 더하세요. 시각적 스타일은 프롬프트에서 지정합니다. Q2 전용 가이드에 따르면 별도의 style 및 movement_amplitude 매개변수는 이 모델에 적용되지 않습니다. 따라서 general 또는 anime 프리셋과 움직임 진폭 옵션은 명확한 장면 설명을 대신할 수 없습니다.\n\n모델별 길이 설정은 한 초부터 열 초까지의 정수 초를 받습니다. Q2 해상도 선택지는 540p, 720p, 1080p이며, 문서상 기본값은 720p입니다. 동작과 용도에 맞게 길이와 해상도를 함께 선택하세요. 짧게 드러내는 장면과 더 오래 이어지는 움직임은 타이밍이 달라야 합니다. 요청 길이를 늘리는 것은 화면의 순서를 위한 것이어야 하며, 변함없는 지시를 단순히 늘이는 데 그쳐서는 안 됩니다. 최종 배치를 준비할 때 반환된 클립의 실제 크기와 길이를 확인하세요.\n\n문서화된 aspect_ratio 선택지는 16:9, 9:16, 3:4, 4:3, 1:1이며 기본값은 16:9입니다. 가이드는 Q2 제품군에 3:4와 4:3을 명시적으로 포함합니다. 생성 전에 화면을 선택하고 이에 맞는 구도를 설명하세요. 세로 화면에서는 주 피사체가 잘 보이게 하고, 가로 화면에서는 너비를 활용해 주변 환경을 보여 줍니다. 마지막 화면은 의도한 페이지·프레젠테이션 또는 이후 자막 작업에 충분히 명확하도록 만드세요.\n\nseed 필드는 변화를 제어합니다. 생략하거나 0을 주면 무작위 값을 선택하고, 영이 아닌 값을 주면 반복 가능한 생성용으로 문서화된 고정 seed 옵션을 선택합니다. 버전을 비교할 때 반환된 seed를 프롬프트 및 설정과 함께 보관하세요. 공통 작업 설명에는 Q3 모델 전용 audio 및 off_peak 제어도 나옵니다. 이 Q3 옵션은 이 Q2 프로필에 부여된 기능이 아니므로, 문서화된 텍스트 입력과 영상 출력을 중심으로 요청을 계획하세요.\n\n생성은 비동기 방식입니다. 제출하면 task_id와 초기 상태가 반환되며, 새로 만든 작업에는 created가 사용됩니다. 처리를 추적하는 동안 이 작업 ID를 보관하세요. 문서화된 결과 조회는 성공 결과에 state=success를 사용하고 creations 배열을 반환합니다. 각 항목의 영상 URL은 creations[].url에 있습니다. 작업에 항상 생성물이 정확히 하나만 있다고 가정하지 말고, 반환된 모든 영상을 저장하세요.\n\n결과 문서에는 실제 영상의 길이, fps, 해상도의 너비와 높이도 보고된다고 나옵니다. 예제의 프레임 속도나 크기를 고정된 Q2 사양으로 보지 말고, 보고된 값을 완성 클립과 함께 보관하세요. 작업 생성 응답에는 요청 구성과 함께 credits 값이 포함됩니다. 각 영상이 생성 설정과 연결된 상태를 유지하도록, 이 보고된 작업 메타데이터와 완료된 작업 ID를 결과와 함께 보관하세요.\n\n전체 시퀀스를 원래 지시와 비교하세요. 피사체 외형, 물체 형태, 움직임 방향, 카메라 연속성, 의도한 마지막 화면을 확인합니다. 수정할 때는 지시와 어긋난 구체적인 디테일을 지정하고, 잘된 장면 부분을 유지하세요. 이후 비교가 실제 결과물을 바탕으로 이루어지도록 프롬프트, 정확한 선택자, 설정, 작업 ID, 완성 영상을 함께 보관하세요.",
  "editorialOverlay": {
    "copy_fields": null,
    "copy_sha256": null,
    "copy_source": null,
    "html_sha256": "9a6d99dfeae15b2fdf454b877261a00ad1e9fc5580b3fd1484d877bc197ac55b",
    "module_sha256": "ee9dc1c50b1e6a8fb7fa062030fcb4646b9aaaeb08be513b723a5a92a7290f06",
    "raw_model_unchanged": true,
    "schema": "ailoot-native-model-editorial-v1"
  },
  "locale": "ko",
  "methods": [
    {
      "html": "<div class=\"sheet-head\"><span class=\"mav\" aria-hidden=\"true\">•</span><h2 id=\"sheet-title\">Vidu: Q2 Text-to-Video</h2><button class=\"icon-btn\" type=\"button\" data-close-sheet aria-label=\"닫기\">×</button></div><div class=\"idline\"><span>Vidu /</span><code>viduq2</code><button type=\"button\" id=\"copy-id\">ID 복사</button></div><nav class=\"card-jump-nav\" aria-label=\"모델 카드 섹션\"><button type=\"button\" data-card-jump=\"overview\">시작하기</button><button type=\"button\" data-card-jump=\"methods\">입력 및 메서드</button><button type=\"button\" data-card-jump=\"pricing\">요금</button><button type=\"button\" data-card-jump=\"examples\">예제</button><button type=\"button\" data-card-jump=\"results\">결과</button><button type=\"button\" data-card-jump=\"aliases\">별칭</button></nav><div class=\"card-method-tabs\" role=\"tablist\" aria-label=\"API 메서드\"><button type=\"button\" role=\"tab\" tabindex=\"0\" aria-controls=\"card-method-content\" aria-selected=\"true\" id=\"card-method-tab-0\" data-card-method=\"Ultra|videos|/v1/videos|viduq2\">동영상</button></div><div id=\"card-method-content\" role=\"tabpanel\" aria-labelledby=\"card-method-tab-0\"><section class=\"card-section\" data-card-section=\"overview\"><h3 tabindex=\"-1\">시작하기</h3><p class=\"mdesc-full\">Vidu Q2는 텍스트 장면 지시로 영상을 만들며, 길이 1–10초, 540p·720p·1080p 출력과 다섯 가지 화면비를 지원합니다. 이 viduq2 프로필은 프롬프트로 스타일과 움직임을 지정하고, 비동기 작업을 통해 결과를 반환합니다.</p><dl class=\"card-io\" data-card-io><div><dt>허용 입력</dt><dd>텍스트</dd></div><div><dt>결과</dt><dd>동영상</dd></div></dl><details class=\"card-about\"><summary>모델 소개</summary><p class=\"note-s\" data-model-method-boundary>이 설명은 모델의 기능을 다룹니다. Ailoot에서 사용할 수 있는 입력, 출력 및 옵션은 아래에 선택한 메서드별로 표시됩니다.</p><div class=\"mabout\" id=\"m-about\"><p>Vidu Q2는 viduq2로 선택하는 텍스트 기반 영상 프로필을 통해 글로 설명한 장면에서 영상을 만듭니다. 필수 입력은 정확한 모델 ID와 장면을 설명하는 프롬프트입니다. 외형과 움직임을 말로 지정할 수 있는 짧은 상품 구상, 장소를 소개하는 전경, 인물 동작에 사용하세요. 설정된 이 방식은 텍스트 기반 영상 생성이며, 설명이 이 선택자에 별도 이미지 참조 모드나 영상 편집 모드를 부여하지는 않습니다.</p><p>화면에 보이는 순서를 중심으로 지시를 구성하세요. 피사체, 장소, 동작, 숏 크기, 카메라 움직임, 마지막 구도를 지정합니다. 상품 구상에는 탁자 위 물체, 소재를 가로지르는 빛, 알아보기 쉬운 디테일에서 끝나는 느린 카메라 접근을 설명하세요. 장소 장면에서는 중심 대상으로 다가가기 전에 환경을 소개합니다. 의도한 결말을 담을 여유가 있도록 동작을 선택한 클립 길이에 맞추세요.</p><p>프롬프트 상한은 2,000자입니다. 핵심 피사체와 동작을 먼저 적고, 원하는 결과에 영향을 주는 조명·소재·환경·카메라 디테일을 더하세요. 시각적 스타일은 프롬프트에서 지정합니다. Q2 전용 가이드에 따르면 별도의 style 및 movement_amplitude 매개변수는 이 모델에 적용되지 않습니다. 따라서 general 또는 anime 프리셋과 움직임 진폭 옵션은 명확한 장면 설명을 대신할 수 없습니다.</p><p>모델별 길이 설정은 한 초부터 열 초까지의 정수 초를 받습니다. Q2 해상도 선택지는 540p, 720p, 1080p이며, 문서상 기본값은 720p입니다. 동작과 용도에 맞게 길이와 해상도를 함께 선택하세요. 짧게 드러내는 장면과 더 오래 이어지는 움직임은 타이밍이 달라야 합니다. 요청 길이를 늘리는 것은 화면의 순서를 위한 것이어야 하며, 변함없는 지시를 단순히 늘이는 데 그쳐서는 안 됩니다. 최종 배치를 준비할 때 반환된 클립의 실제 크기와 길이를 확인하세요.</p><p>문서화된 aspect_ratio 선택지는 16:9, 9:16, 3:4, 4:3, 1:1이며 기본값은 16:9입니다. 가이드는 Q2 제품군에 3:4와 4:3을 명시적으로 포함합니다. 생성 전에 화면을 선택하고 이에 맞는 구도를 설명하세요. 세로 화면에서는 주 피사체가 잘 보이게 하고, 가로 화면에서는 너비를 활용해 주변 환경을 보여 줍니다. 마지막 화면은 의도한 페이지·프레젠테이션 또는 이후 자막 작업에 충분히 명확하도록 만드세요.</p><p>seed 필드는 변화를 제어합니다. 생략하거나 0을 주면 무작위 값을 선택하고, 영이 아닌 값을 주면 반복 가능한 생성용으로 문서화된 고정 seed 옵션을 선택합니다. 버전을 비교할 때 반환된 seed를 프롬프트 및 설정과 함께 보관하세요. 공통 작업 설명에는 Q3 모델 전용 audio 및 off_peak 제어도 나옵니다. 이 Q3 옵션은 이 Q2 프로필에 부여된 기능이 아니므로, 문서화된 텍스트 입력과 영상 출력을 중심으로 요청을 계획하세요.</p><p>생성은 비동기 방식입니다. 제출하면 task_id와 초기 상태가 반환되며, 새로 만든 작업에는 created가 사용됩니다. 처리를 추적하는 동안 이 작업 ID를 보관하세요. 문서화된 결과 조회는 성공 결과에 state=success를 사용하고 creations 배열을 반환합니다. 각 항목의 영상 URL은 creations[].url에 있습니다. 작업에 항상 생성물이 정확히 하나만 있다고 가정하지 말고, 반환된 모든 영상을 저장하세요.</p><p>결과 문서에는 실제 영상의 길이, fps, 해상도의 너비와 높이도 보고된다고 나옵니다. 예제의 프레임 속도나 크기를 고정된 Q2 사양으로 보지 말고, 보고된 값을 완성 클립과 함께 보관하세요. 작업 생성 응답에는 요청 구성과 함께 credits 값이 포함됩니다. 각 영상이 생성 설정과 연결된 상태를 유지하도록, 이 보고된 작업 메타데이터와 완료된 작업 ID를 결과와 함께 보관하세요.</p><p>전체 시퀀스를 원래 지시와 비교하세요. 피사체 외형, 물체 형태, 움직임 방향, 카메라 연속성, 의도한 마지막 화면을 확인합니다. 수정할 때는 지시와 어긋난 구체적인 디테일을 지정하고, 잘된 장면 부분을 유지하세요. 이후 비교가 실제 결과물을 바탕으로 이루어지도록 프롬프트, 정확한 선택자, 설정, 작업 ID, 완성 영상을 함께 보관하세요.</p></div></details></section><section class=\"card-section\" data-card-section=\"methods\"><h3 tabindex=\"-1\">Ailoot에서 사용 가능 · 입력 및 메서드</h3><details class=\"card-method\" open><summary><b>Ailoot Ultra · 동영상</b> <code>POST /v1/videos</code></summary><dl class=\"method-capabilities\"><div><dt>입력</dt><dd><code>text</code></dd></div><div><dt>출력</dt><dd><code>video</code></dd></div></dl><div class=\"tw\" data-card-parameters data-typed-parameters><table><thead><tr><th>필드</th><th>유형</th><th>요건</th><th>값과 한도</th><th>기본값</th></tr></thead><tbody><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">model</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>필수</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>viduq2</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">prompt</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>필수</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>조건: 생성할 장면을 설명하세요. 문서에 명시된 제한은 2000자입니다. Ailoot는 문자열이 비어 있지 않은지 확인하고 텍스트를 보존합니다.</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">duration</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>integer</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>선택 사항</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>최솟값: 1</div><div>최댓값: 10</div><div>조건: viduq2 모델별 설명에는 정수 단위 1–10초가 명시되어 있습니다. 모델별 기본 길이는 문서에 명시되지 않았습니다.</div><div>단위: 초</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">seed</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>선택 사항</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>조건: 무작위 동작을 사용하려면 생략하거나 문자열 &quot;0&quot;을 전송하세요. 영이 아닌 seed를 제공하면 문서에 명시된 고정 seed 동작이 선택됩니다. 숫자 범위는 명시되어 있지 않습니다.</div></td><td data-cell-label=\"기본값\" data-default=\"unspecified\"><span class=\"card-cell-label\">기본값</span>—</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">aspect_ratio</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>선택 사항</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>16:9, 9:16, 3:4, 4:3, 1:1</div></td><td data-cell-label=\"기본값\" data-default=\"known\"><span class=\"card-cell-label\">기본값</span>16:9</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">resolution</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>선택 사항</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>540p, 720p, 1080p</div><div>조건: viduq2 모델별 목록에는 1–10초에 대한 이 구간들이 문서화되어 있습니다. 공통 열거형과 표에는 360p도 나오지만, 적용 여부가 해당 목록과 충돌하므로 여기서는 지원을 단정하지 않습니다.</div></td><td data-cell-label=\"기본값\" data-default=\"known\"><span class=\"card-cell-label\">기본값</span>720p</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">style</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>선택 사항</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>general, anime</div><div>조건: 공통 요청은 이 필드를 허용하지만, 문서에는 viduq2에 효과가 없다고 명시되어 있습니다.</div></td><td data-cell-label=\"기본값\" data-default=\"known\"><span class=\"card-cell-label\">기본값</span>general</td></tr><tr data-parameter-availability=\"source_interface\"><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">movement_amplitude</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span><code>string</code></td><td data-cell-label=\"요건\"><span class=\"card-cell-label\">요건</span>선택 사항</td><td data-cell-label=\"값과 한도\"><span class=\"card-cell-label\">값과 한도</span><div>auto, small, medium, large</div><div>조건: 공통 요청은 이 필드를 허용하지만, 문서에는 q2 모델에 효과가 없다고 명시되어 있습니다.</div></td><td data-cell-label=\"기본값\" data-default=\"known\"><span class=\"card-cell-label\">기본값</span>auto</td></tr></tbody></table></div><details class=\"card-about\" data-material-combinations><summary>입력 자료 조합</summary><p class=\"note-s\"><b></b></p></details><details class=\"note-s\" data-method-contract><summary>메서드 매개변수와 수명 주기</summary><div class=\"tw\" data-card-table=\"contract\"><table><thead><tr><th>매개변수</th><th>명세</th></tr></thead><tbody><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>content_type</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>application/json</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>required</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>model, prompt</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>optional</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>duration, seed, aspect_ratio, resolution, style, movement_amplitude</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>material_types</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>text</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>additional_properties</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>true</td></tr><tr><th data-cell-label=\"매개변수\" scope=\"row\"><span class=\"card-cell-label\">매개변수</span><code>validation_scope</code></th><td data-cell-label=\"명세\"><span class=\"card-cell-label\">명세</span>Ailoot는 model/prompt 문자열이 비어 있지 않은지 검증합니다. 아래 선택 사항의 유형과 제한은 문서에 명시된 요청 계약입니다. 다른 요청 필드는 선택한 모델에 전달되도록 보존됩니다.</td></tr></tbody></table></div><p>메서드 별칭: <code>/v1/videos/generations</code></p><p>수명 주기: <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/videos/generations/{request_id}/content</code></p><p class=\"note-s\">한 번 생성하고 반환된 공개 id와 polling_url을 보존하세요.</p><p class=\"note-s\">원래 작업을 폴링하고 state를 조회하세요. success와 소유한 creations[].url 결과가 완료 판정 기준입니다.</p><p class=\"note-s\">반환된 소유 동영상 URL을 모두 다운로드하세요. 예제를 근거로 출력 수, 길이 또는 프레임 속도가 고정되어 있다고 판단하지 마세요.</p></details></details></section><section class=\"card-section\" data-card-section=\"pricing\"><h3 tabindex=\"-1\">요금</h3><div class=\"card-result-process\" data-billing-basis><h5>최종 요금 계산 방식</h5><p class=\"note-s\">표시된 요율은 생성 전 비용을 예상하는 데 사용됩니다. 최종 청구액은 최초 생성에 기록된 비용으로 계산됩니다. 측정된 출력 길이와 예상 수량은 최종 청구 수량이 아닙니다.</p></div><div data-native-semantic-method=\"v1\" data-tariff-reference-only><p class=\"note-s\" data-rate-support-note>요금 정보는 요청 옵션을 추가하지 않습니다. 지원되는 매개변수는 선택한 메서드에 표시됩니다.</p><dl data-price-conditions><dt>빠른 모드</dt><dd>미지정 <span class=\"note-s\">빠른 모드를 선택한 경우</span></dd><dt>Flex 모드</dt><dd>미지정 <span class=\"note-s\">flex 모드를 선택한 경우</span></dd><dt>최대 추론 수준</dt><dd>미지정 <span class=\"note-s\">최대 추론 수준에 default 조정값을 적용하는 경우</span></dd></dl></div><div data-declared-tariff-pricing><h4>비교용 예상 요금</h4><h4>설정별 가격</h4><p class=\"note-s\">각 요금을 표시된 조건과 대조하세요. 서로 대체되는 설정 묶음마다 하나의 요금만 적용하세요.</p><div class=\"tw\" data-pricing-profiles><table><thead><tr><th>설정</th><th>요금표</th><th>예측 수량</th><th>요금</th></tr></thead><tbody><tr><th data-cell-label=\"설정\" scope=\"row\"><span class=\"card-cell-label\">설정</span>기본 토큰 요금</th><td data-cell-label=\"요금표\"><span class=\"card-cell-label\">요금표</span>기본 요금</td><td data-cell-label=\"예측 수량\"><span class=\"card-cell-label\">예측 수량</span>—</td><td data-cell-label=\"요금\"><span class=\"card-cell-label\">요금</span><div><span>입력 · 입력 토큰 · 비교 전용 추정치</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>출력 · 출력 토큰 · 비교 전용 추정치</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>입력 · 캐시 읽기 · 비교 전용 추정치</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>입력 · 캐시 쓰기 · 비교 전용 추정치</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div><div><span>입력 · 캐시 쓰기, 1시간 · 비교 전용 추정치</span> <b>—</b> <span class=\"price-unit\">/ 1K 토큰</span></div></td></tr><tr><th data-cell-label=\"설정\" scope=\"row\"><span class=\"card-cell-label\">설정</span>예상 생성 비용</th><td data-cell-label=\"요금표\"><span class=\"card-cell-label\">요금표</span>—</td><td data-cell-label=\"예측 수량\"><span class=\"card-cell-label\">예측 수량</span>1회 생성 예상치</td><td data-cell-label=\"요금\"><span class=\"card-cell-label\">요금</span><div><span>출력 · 예상 생성 비용 · 비교 전용 추정치</span> <b>$5.12</b> <span class=\"price-unit\">생성 전 추정치</span></div><p class=\"note-s\">이 예상 금액은 추가 요금이나 생성 완료 시 적용되는 고정 요금이 아닙니다.</p></td></tr></tbody></table></div></div><p class=\"note-s\">Ailoot는 요청 전에 예상 금액을 미리 확보합니다. 결과를 받은 뒤 측정된 사용량을 기준으로 최종 요금을 정산합니다. 스트리밍 정산에는 최종 사용량 기록을 사용합니다. <a href=\"/docs/ko/billing/reserve/\">금액 확보와 정산 방식 →</a></p></section><section class=\"card-section\" data-card-section=\"examples\"><h3 tabindex=\"-1\">요청 예제</h3><h4>Ailoot Ultra · 동영상</h4><div class=\"code-group\"><div class=\"cg-bar\"><div class=\"cg-tabs\" role=\"tablist\" aria-label=\"코드 예제 형식\"><button class=\"cg-tab\" id=\"model-code-2782-tab-0\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2782-panel-0\" aria-selected=\"true\" tabindex=\"0\">curl · 동영상 생성</button><button class=\"cg-tab\" id=\"model-code-2782-tab-1\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2782-panel-1\" aria-selected=\"false\" tabindex=\"-1\">curl · 원본 작업 조회</button><button class=\"cg-tab\" id=\"model-code-2782-tab-2\" role=\"tab\" type=\"button\" aria-controls=\"model-code-2782-panel-2\" aria-selected=\"false\" tabindex=\"-1\">curl · 소유한 모든 동영상 다운로드</button></div><div class=\"cg-tools\"><button class=\"cg-btn cg-copy\" type=\"button\" aria-label=\"코드 복사\"><svg class=\"cp\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><rect x=\"5.25\" y=\"5.25\" width=\"8.5\" height=\"8.5\" rx=\"1.75\"/><path d=\"M10.75 5.25V3.5a1.25 1.25 0 0 0-1.25-1.25H3.5A1.25 1.25 0 0 0 2.25 3.5v6a1.25 1.25 0 0 0 1.25 1.25h1.75\"/></svg><svg class=\"ok\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.4\"><path d=\"m3 8.5 3.25 3.25L13 5\"/></svg></button></div></div><div class=\"cg-body\"><div class=\"cg-pane\" id=\"model-code-2782-panel-0\" role=\"tabpanel\" aria-labelledby=\"model-code-2782-tab-0\"><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\ncat &gt; request.json &lt;&lt;&#39;JSON_REQUEST&#39;\n{&quot;model&quot;:&quot;viduq2&quot;,&quot;prompt&quot;:&quot;In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene.&quot;}\nJSON_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</code></pre></div><div class=\"cg-pane\" id=\"model-code-2782-panel-1\" role=\"tabpanel\" aria-labelledby=\"model-code-2782-tab-1\" hidden><pre data-lang=\"bash\"><code>set -eu\n: &quot;${AILOOT_API_KEY:?Set your Ailoot API key}&quot;\npython3 - &lt;&lt;&#39;PY_POLL&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(&quot;result.json&quot;).read_text())\ni=r.get(&quot;id&quot;)\nif not isinstance(i,str) or not i:raise SystemExit(&quot;Keep original response/headers/id; do not resubmit creation.&quot;)\nu=urljoin(&quot;https://api.ailoot.ai&quot;,r.get(&quot;polling_url&quot;) or &quot;/v1/videos/&quot;+quote(i,safe=&quot;&quot;))\np=urlsplit(u)\nif p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or not p.path.startswith(&quot;/v1/videos/&quot;):raise SystemExit(&quot;Use the actual Ailoot lookup path.&quot;)\nPath(&quot;poll-url.txt&quot;).write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error &quot;$(cat poll-url.txt)&quot; -H &quot;Authorization: Bearer $AILOOT_API_KEY&quot; -D status-headers.txt -o status.json\n</code></pre></div><div class=\"cg-pane\" id=\"model-code-2782-panel-2\" role=\"tabpanel\" aria-labelledby=\"model-code-2782-tab-2\" hidden><pre data-lang=\"bash\"><code>set -eu\npython3 - &lt;&lt;&#39;PY_ASSETS&#39;\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(&quot;status.json&quot;).read_text())\nif r.get(&quot;state&quot;)!=&quot;success&quot;:raise SystemExit(&quot;Poll the same original job until its owned result is returned.&quot;)\ncreations=r.get(&quot;creations&quot;)\nif not isinstance(creations,list) or not creations:raise SystemExit(&quot;No completed video creations.&quot;)\nurls=[]\nfor item in creations:\n    value=item.get(&quot;url&quot;) if isinstance(item,dict) else None\n    values=[value] if isinstance(value,str) else value\n    if not isinstance(values,list) or not values:raise SystemExit(&quot;No completed video URL.&quot;)\n    for u in values:\n        if not isinstance(u,str):raise SystemExit(&quot;Invalid returned URL.&quot;)\n        p=urlsplit(u)\n        if p.scheme!=&quot;https&quot; or p.netloc!=&quot;api.ailoot.ai&quot; or not p.path.startswith(&quot;/v1/media/assets/&quot;) or not p.path.endswith(&quot;/content&quot;) or not p.query:raise SystemExit(&quot;Wait for the actual Ailoot-owned signed result.&quot;)\n        urls.append(u)\nPath(&quot;asset-urls.txt&quot;).write_text(&quot;\\n&quot;.join(urls)+&quot;\\n&quot;)\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error &quot;$asset_url&quot; -o &quot;video-${index}.bin&quot;\n  index=$((index + 1))\ndone &lt; asset-urls.txt\n</code></pre></div></div></div></section><section class=\"card-section\" data-card-section=\"results\"><h3 tabindex=\"-1\">결과 수신 및 저장</h3><h4>Ailoot Ultra · 동영상</h4><p class=\"note-s\">JSON은 네이티브 state와 creations 배열을 유지하고 공개 id/provider_task_id/polling_url을 추가합니다. 선택된 동영상 URL은 게시 전에는 비어 있으며 완료 후에는 Ailoot가 소유한 서명된 URL이 됩니다.</p><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/videos/generations/{request_id}/content</code></li></ul><div class=\"card-result-process\" data-all-results><h5>완료된 결과 모두 보관</h5><p class=\"note-s\">완료된 모든 동영상과 반환된 파일을 저장하고, 실제로 반환된 모든 자산 URL에서 가져오세요.</p><p class=\"note-s\">creations[].url에 실제로 반환된 URL을 모두 다운로드하세요. 콘텐츠 인덱스는 실제 반환된 출력 하나를 식별합니다.</p></div><div class=\"card-result-process\" data-unknown-recovery><h5>원래 응답을 확인해야 할 경우</h5><p class=\"note-s\">고정된 명세에는 최종 실패 상태 목록이 없습니다. 원본 응답/헤더/id를 보존하고, 알 수 없는 상태나 result_pending_check 오류가 발생하면 같은 작업을 확인하세요. 결과를 알 수 없는 생성을 절대로 다시 제출하지 마세요.</p></div><details class=\"card-about\" data-output-fields><summary>응답 필드</summary><div class=\"tw\" data-card-table=\"output\"><table><thead><tr><th>필드</th><th>유형</th><th>의미</th></tr></thead><tbody><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">id</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>반환된 공개 Ailoot 작업 또는 연산 식별자입니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">provider_task_id</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>공개 id와 별개인 원래 작업 식별자입니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">polling_url</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>원래 작업에 대해 반환된 Ailoot 조회 경로입니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">task_id</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>생성 응답에 포함된 원래 식별자입니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">state</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>네이티브 작업 상태: 고정된 대기 상태는 created, 완료 상태는 success입니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">err_code</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>작업 진단 정보입니다. 저장된 명세에는 열거된 오류 코드 목록이 없습니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">creations[].url</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>string|string[]</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>선택한 완료 동영상 URL은 각각 Ailoot가 소유한 서명된 URL로 대체됩니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">creations[].video.duration</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>number when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>반환된 동영상 길이입니다. 실제 완료 결과를 확인하세요.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">creations[].video.fps</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>integer when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>반환된 프레임 속도입니다. 고정된 프레임 속도를 보장하지 않습니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">creations[].video.resolution.width</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>integer when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>픽셀 단위로 반환된 출력 너비입니다.</td></tr><tr><th data-cell-label=\"필드\" scope=\"row\"><span class=\"card-cell-label\">필드</span><code class=\"card-field-name\">creations[].video.resolution.height</code></th><td data-cell-label=\"유형\" data-field-type><span class=\"card-cell-label\">유형</span>integer when supplied</td><td data-cell-label=\"의미\"><span class=\"card-cell-label\">의미</span>픽셀 단위로 반환된 출력 높이입니다.</td></tr></tbody></table></div></details><details class=\"card-about\" data-method-errors><summary>오류와 다음 단계</summary><div class=\"tw\" data-card-table=\"errors\"><table><thead><tr><th>응답</th><th>조건</th><th>다음 단계</th></tr></thead><tbody><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>400 · <code>invalid_request_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>JSON/모델이 유효하지 않거나 필수 문자열이 없거나 비어 있거나 콘텐츠 인덱스가 유효하지 않습니다.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>401 · <code>authentication_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>유효하지 않은 Ailoot API 키입니다.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>403 · <code>permission_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>이 API 키 그룹은 해당 미디어 경로에 접근하도록 허용되지 않았습니다.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>404 · <code>not_found_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>원래 작업 또는 요청한 출력이 없거나 동일한 사용자/API 키/그룹의 소유가 아닙니다.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>502 · <code>result_pending_check</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>최초 제출 또는 상태 정보가 불완전하거나 대조하여 확인할 수 없습니다. 원래 ID를 보존하고 다시 제출하지 마세요.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>503 · <code>result_pending_check</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>원래 연결, 경로 또는 소유 미디어를 아직 확인 중입니다. 해당 원래 작업을 계속 확인하세요.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr><tr><th data-cell-label=\"응답\" scope=\"row\"><span class=\"card-cell-label\">응답</span>503 · <code>server_error</code></th><td data-cell-label=\"조건\"><span class=\"card-cell-label\">조건</span>미디어 서비스 또는 원래 작업 저장소를 사용할 수 없습니다.</td><td data-cell-label=\"다음 단계\"><span class=\"card-cell-label\">다음 단계</span></td></tr></tbody></table></div></details></section><section class=\"card-section\" data-card-section=\"aliases\"><h3 tabindex=\"-1\">별칭</h3><h4>모델 별칭</h4><p class=\"note-s\"><span data-model-alias-route=\"Ultra\"><b>Ailoot Ultra</b> <a href=\"#m=viduq2&amp;route=Ultra&amp;caller=viduq2&amp;fmt=videos\"><code>viduq2</code></a></span></p><h4>메서드 경로 별칭</h4><p class=\"note-s\"><code>/v1/videos/generations</code></p><h4>관련 호출용 ID</h4><p class=\"note-s\"><a href=\"#m=viduq2&amp;route=Ultra&amp;caller=viduq2&amp;fmt=videos\"><code>viduq2</code></a></p></section></div>",
      "method_identity": {
        "effective_request_model_id": "viduq2",
        "fmt": "videos",
        "http": "POST",
        "path": "/v1/videos",
        "request_model_id": "viduq2",
        "route_label": "Ultra"
      },
      "method_key": "Ultra|videos|/v1/videos|viduq2",
      "ordinal": 0,
      "rawMethod": {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "표시된 요율은 생성 전 비용을 예상하는 데 사용됩니다. 최종 청구액은 최초 생성에 기록된 비용으로 계산됩니다. 측정된 출력 길이와 예상 수량은 최종 청구 수량이 아닙니다.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "errors": [
              {
                "condition": "JSON/모델이 유효하지 않거나 필수 문자열이 없거나 비어 있거나 콘텐츠 인덱스가 유효하지 않습니다.",
                "http_status": 400,
                "type": "invalid_request_error"
              },
              {
                "condition": "유효하지 않은 Ailoot API 키입니다.",
                "http_status": 401,
                "type": "authentication_error"
              },
              {
                "condition": "이 API 키 그룹은 해당 미디어 경로에 접근하도록 허용되지 않았습니다.",
                "http_status": 403,
                "type": "permission_error"
              },
              {
                "condition": "원래 작업 또는 요청한 출력이 없거나 동일한 사용자/API 키/그룹의 소유가 아닙니다.",
                "http_status": 404,
                "type": "not_found_error"
              },
              {
                "condition": "최초 제출 또는 상태 정보가 불완전하거나 대조하여 확인할 수 없습니다. 원래 ID를 보존하고 다시 제출하지 마세요.",
                "http_status": 502,
                "type": "result_pending_check"
              },
              {
                "condition": "원래 연결, 경로 또는 소유 미디어를 아직 확인 중입니다. 해당 원래 작업을 계속 확인하세요.",
                "http_status": 503,
                "type": "result_pending_check"
              },
              {
                "condition": "미디어 서비스 또는 원래 작업 저장소를 사용할 수 없습니다.",
                "http_status": 503,
                "type": "server_error"
              }
            ],
            "ignored_fields": [
              "style",
              "movement_amplitude"
            ],
            "lifecycle": {
              "cancel_endpoint": null,
              "completed_states": [
                "success"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "content_pending": "Original status JSON until publication.",
              "content_ready": {
                "http_status": 303,
                "location": "actual signed Ailoot-owned asset URL"
              },
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [],
              "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
              "mode": "submit_once_poll_original",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "pending_states": [
                "created"
              ],
              "signed_asset_lifetime_seconds": 86400,
              "state_field": "state",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 200,
              "unknown": "고정된 명세에는 최종 실패 상태 목록이 없습니다. 원본 응답/헤더/id를 보존하고, 알 수 없는 상태나 result_pending_check 오류가 발생하면 같은 작업을 확인하세요. 결과를 알 수 없는 생성을 절대로 다시 제출하지 마세요.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              [
                "text"
              ]
            ],
            "operation_modes": [
              "text_to_video"
            ],
            "outputs": {
              "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
              "all_results": "creations[].url에 실제로 반환된 URL을 모두 다운로드하세요. 콘텐츠 인덱스는 실제 반환된 출력 하나를 식별합니다.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "description": "반환된 공개 Ailoot 작업 또는 연산 식별자입니다.",
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": "공개 id와 별개인 원래 작업 식별자입니다.",
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "description": "원래 작업에 대해 반환된 Ailoot 조회 경로입니다.",
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "description": "생성 응답에 포함된 원래 식별자입니다.",
                  "name": "task_id",
                  "type": "string when supplied"
                },
                {
                  "description": "네이티브 작업 상태: 고정된 대기 상태는 created, 완료 상태는 success입니다.",
                  "name": "state",
                  "type": "string when supplied"
                },
                {
                  "description": "작업 진단 정보입니다. 저장된 명세에는 열거된 오류 코드 목록이 없습니다.",
                  "name": "err_code",
                  "type": "string when supplied"
                },
                {
                  "description": "선택한 완료 동영상 URL은 각각 Ailoot가 소유한 서명된 URL로 대체됩니다.",
                  "name": "creations[].url",
                  "type": "string|string[]"
                },
                {
                  "description": "반환된 동영상 길이입니다. 실제 완료 결과를 확인하세요.",
                  "name": "creations[].video.duration",
                  "type": "number when supplied"
                },
                {
                  "description": "반환된 프레임 속도입니다. 고정된 프레임 속도를 보장하지 않습니다.",
                  "name": "creations[].video.fps",
                  "type": "integer when supplied"
                },
                {
                  "description": "픽셀 단위로 반환된 출력 너비입니다.",
                  "name": "creations[].video.resolution.width",
                  "type": "integer when supplied"
                },
                {
                  "description": "픽셀 단위로 반환된 출력 높이입니다.",
                  "name": "creations[].video.resolution.height",
                  "type": "integer when supplied"
                }
              ],
              "format": null,
              "maximum_outputs": null,
              "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
              "result": "JSON은 네이티브 state와 creations 배열을 유지하고 공개 id/provider_task_id/polling_url을 추가합니다. 선택된 동영상 URL은 게시 전에는 비어 있으며 완료 후에는 Ailoot가 소유한 서명된 URL이 됩니다."
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "viduq2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "생성할 장면을 설명하세요. 문서에 명시된 제한은 2000자입니다. Ailoot는 문자열이 비어 있지 않은지 확인하고 텍스트를 보존합니다.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 2000,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "viduq2 모델별 설명에는 정수 단위 1–10초가 명시되어 있습니다. 모델별 기본 길이는 문서에 명시되지 않았습니다.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum": 10,
                "minimum": 1,
                "name": "duration",
                "required": false,
                "type": "integer",
                "unit": "초"
              },
              {
                "availability": "source_interface",
                "conditions": "무작위 동작을 사용하려면 생략하거나 문자열 \"0\"을 전송하세요. 영이 아닌 seed를 제공하면 문서에 명시된 고정 seed 동작이 선택됩니다. 숫자 범위는 명시되어 있지 않습니다.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "seed",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "16:9",
                "default_known": true,
                "enum": [
                  "16:9",
                  "9:16",
                  "3:4",
                  "4:3",
                  "1:1"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "viduq2 모델별 목록에는 1–10초에 대한 이 구간들이 문서화되어 있습니다. 공통 열거형과 표에는 360p도 나오지만, 적용 여부가 해당 목록과 충돌하므로 여기서는 지원을 단정하지 않습니다.",
                "default": "720p",
                "default_known": true,
                "enum": [
                  "540p",
                  "720p",
                  "1080p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "공통 요청은 이 필드를 허용하지만, 문서에는 viduq2에 효과가 없다고 명시되어 있습니다.",
                "default": "general",
                "default_known": true,
                "enum": [
                  "general",
                  "anime"
                ],
                "enum_known": true,
                "name": "style",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "공통 요청은 이 필드를 허용하지만, 문서에는 q2 모델에 효과가 없다고 명시되어 있습니다.",
                "default": "auto",
                "default_known": true,
                "enum": [
                  "auto",
                  "small",
                  "medium",
                  "large"
                ],
                "enum_known": true,
                "name": "movement_amplitude",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Literal viduq2 model with the documented Ailoot videos interface.",
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "aspect_ratio": {
                  "default": "16:9",
                  "enum": [
                    "16:9",
                    "9:16",
                    "3:4",
                    "4:3",
                    "1:1"
                  ],
                  "type": "string"
                },
                "duration": {
                  "maximum": 10,
                  "minimum": 1,
                  "type": "integer"
                },
                "model": {
                  "const": "viduq2",
                  "minLength": 1,
                  "type": "string"
                },
                "movement_amplitude": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "small",
                    "medium",
                    "large"
                  ],
                  "type": "string"
                },
                "prompt": {
                  "maxLength": 2000,
                  "minLength": 1,
                  "type": "string"
                },
                "resolution": {
                  "default": "720p",
                  "enum": [
                    "540p",
                    "720p",
                    "1080p"
                  ],
                  "type": "string"
                },
                "seed": {
                  "type": "string"
                },
                "style": {
                  "default": "general",
                  "enum": [
                    "general",
                    "anime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "source_ambiguities": [
              "The shared enum and table mention 360p, while the model-specific viduq2 resolution description lists 540p/720p/1080p. The method asserts only the explicit model-specific list.",
              "The shared duration example uses a quoted string despite an integer schema. The copyable viduq2 example omits that optional field; an explicit duration follows the documented integer type.",
              "No model-specific default duration, maximum output count, generated-file retention period, cancellation endpoint or terminal failure-state list is established by these saved documents.",
              "The documented fetch uses an id path parameter; the pinned declaration names that same substituted value task_id. The fetch example has no task_id field, which the current client accepts only by retaining the original task identity."
            ],
            "unsupported": [
              "Image-guided input, video editing and extension are not part of this text-to-video method.",
              "The audio and off_peak parameters are documented only for other model selectors, not viduq2.",
              "No live streaming, callback completion or owned cover-image result contract is established here."
            ]
          },
          "hints": [
            "한 번 생성하고 반환된 공개 id와 polling_url을 보존하세요.",
            "원래 작업을 폴링하고 state를 조회하세요. success와 소유한 creations[].url 결과가 완료 판정 기준입니다.",
            "반환된 소유 동영상 URL을 모두 다운로드하세요. 예제를 근거로 출력 수, 길이 또는 프레임 속도가 고정되어 있다고 판단하지 마세요."
          ],
          "input": {
            "additional_properties": true,
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional": [
              "duration",
              "seed",
              "aspect_ratio",
              "resolution",
              "style",
              "movement_amplitude"
            ],
            "required": [
              "model",
              "prompt"
            ],
            "validation_scope": "Ailoot는 model/prompt 문자열이 비어 있지 않은지 검증합니다. 아래 선택 사항의 유형과 제한은 문서에 명시된 요청 계약입니다. 다른 요청 필드는 선택한 모델에 전달되도록 보존됩니다."
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "completed_states": [
              "success"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "content_pending": "Original status JSON until publication.",
            "content_ready": {
              "http_status": 303,
              "location": "actual signed Ailoot-owned asset URL"
            },
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [],
            "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
            "mode": "submit_once_poll_original",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "pending_states": [
              "created"
            ],
            "signed_asset_lifetime_seconds": 86400,
            "state_field": "state",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 200,
            "unknown": "The pinned declaration enumerates no terminal failure state. Preserve original response/headers/id and check that same operation for any unrecognized state or result_pending_check error; never resubmit an unknown creation.",
            "unknown_no_replay": true
          },
          "manufacturer_capability": {
            "documented_material_types": [
              "text"
            ]
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "operation_modes": [
            "text_to_video"
          ],
          "output": {
            "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
            "all_results": "Download every actual returned URL in creations[].url; a content index identifies one real returned output.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "description": "Returned public Ailoot task or operation identifier.",
                "name": "id",
                "type": "string"
              },
              {
                "description": "Original task identifier, separate from the public id.",
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "description": "Returned Ailoot lookup path for the original task.",
                "name": "polling_url",
                "type": "string"
              },
              {
                "description": "Original identifier present in the creation response.",
                "name": "task_id",
                "type": "string when supplied"
              },
              {
                "description": "Native task state: created for the pinned pending state and success for completion.",
                "name": "state",
                "type": "string when supplied"
              },
              {
                "description": "Task diagnostic; the saved specification declares no enumerated error-code list.",
                "name": "err_code",
                "type": "string when supplied"
              },
              {
                "description": "Every selected completed video URL is replaced with an Ailoot-owned signed URL.",
                "name": "creations[].url",
                "type": "string|string[]"
              },
              {
                "description": "Returned video duration; inspect the actual completed result.",
                "name": "creations[].video.duration",
                "type": "number when supplied"
              },
              {
                "description": "Returned frame rate; no fixed frame rate is promised.",
                "name": "creations[].video.fps",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output width in pixels.",
                "name": "creations[].video.resolution.width",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output height in pixels.",
                "name": "creations[].video.resolution.height",
                "type": "integer when supplied"
              }
            ],
            "format": null,
            "maximum_outputs": null,
            "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
            "result": "JSON retains the native state and creations array, with public id/provider_task_id/polling_url added. Selected video URLs are blank before publication and become Ailoot-owned signed URLs after completion."
          }
        },
        "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": "이 예상 금액은 추가 요금이나 생성 완료 시 적용되는 고정 요금이 아닙니다.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "예상 생성 비용",
            "units": [
              {
                "amount": "5.12",
                "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": "5.12",
                "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}\"\ncat > request.json <<'JSON_REQUEST'\n{\"model\":\"viduq2\",\"prompt\":\"In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene.\"}\nJSON_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",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_POLL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\ni=r.get(\"id\")\nif not isinstance(i,str) or not i:raise SystemExit(\"Keep original response/headers/id; do not resubmit creation.\")\nu=urljoin(\"https://api.ailoot.ai\",r.get(\"polling_url\") or \"/v1/videos/\"+quote(i,safe=\"\"))\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/videos/\"):raise SystemExit(\"Use the actual Ailoot lookup path.\")\nPath(\"poll-url.txt\").write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error \"$(cat poll-url.txt)\" -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\n",
            "label": "curl · read original task",
            "language": "bash"
          },
          {
            "code": "set -eu\npython3 - <<'PY_ASSETS'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nif r.get(\"state\")!=\"success\":raise SystemExit(\"Poll the same original job until its owned result is returned.\")\ncreations=r.get(\"creations\")\nif not isinstance(creations,list) or not creations:raise SystemExit(\"No completed video creations.\")\nurls=[]\nfor item in creations:\n    value=item.get(\"url\") if isinstance(item,dict) else None\n    values=[value] if isinstance(value,str) else value\n    if not isinstance(values,list) or not values:raise SystemExit(\"No completed video URL.\")\n    for u in values:\n        if not isinstance(u,str):raise SystemExit(\"Invalid returned URL.\")\n        p=urlsplit(u)\n        if p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/media/assets/\") or not p.path.endswith(\"/content\") or not p.query:raise SystemExit(\"Wait for the actual Ailoot-owned signed result.\")\n        urls.append(u)\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" -o \"video-${index}.bin\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "curl · download every owned video",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and retain the returned public id and polling_url.",
          "Poll the original operation and read state; success and an owned creations[].url result are the completion boundary.",
          "Download every returned owned video URL; do not infer a fixed output count, duration or frame rate from the example."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "동영상",
        "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": "5.12",
                "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": "5.12",
                "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": "viduq2",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}",
          "GET /v1/videos/{request_id}/content",
          "GET /v1/videos/generations/{request_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "5.12",
            "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": "5.12",
            "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": "viduq2",
  "nativeProvenance": {
    "input_facts_canonical_sha256": "e9d18d229ae1cee7fe99cc1f6b506c79fcf26e7d9b41beb724aeb1d98af4de06",
    "input_html_sha256": "4e909b388b301abf008c46554ee5360147d56b39cd92ae88bfbe37455237e251",
    "private_audit_sha256": "ad099b5dcda8f4866a49b0bd7fc11181c2be9decd60fe7f8838165ad33b4c45e",
    "role": "historical-normalized-input-audit-hashes",
    "schema": "ailoot-native-model-provenance-v2"
  },
  "page": {
    "canonical": "https://ailoot.ai/models/ko/viduq2/",
    "description": "Vidu Q2는 텍스트 장면 지시로 영상을 만들며, 길이 1–10초, 540p·720p·1080p 출력과 다섯 가지 화면비를 지원합니다. 이 viduq2 프로필은 프롬프트로 스타일과 움직임을 지정하고, 비동기 작업을 통해 결과를 반환합니다.",
    "locale": "ko",
    "md_url": "https://ailoot.ai/models/ko/viduq2/index.md",
    "title": "Vidu: Q2 Text-to-Video — Ailoot",
    "url": "https://ailoot.ai/models/ko/viduq2/"
  },
  "rawModel": {
    "about": "Vidu Q2는 viduq2로 선택하는 텍스트 기반 영상 프로필을 통해 글로 설명한 장면에서 영상을 만듭니다. 필수 입력은 정확한 모델 ID와 장면을 설명하는 프롬프트입니다. 외형과 움직임을 말로 지정할 수 있는 짧은 상품 구상, 장소를 소개하는 전경, 인물 동작에 사용하세요. 설정된 이 방식은 텍스트 기반 영상 생성이며, 설명이 이 선택자에 별도 이미지 참조 모드나 영상 편집 모드를 부여하지는 않습니다.\n\n화면에 보이는 순서를 중심으로 지시를 구성하세요. 피사체, 장소, 동작, 숏 크기, 카메라 움직임, 마지막 구도를 지정합니다. 상품 구상에는 탁자 위 물체, 소재를 가로지르는 빛, 알아보기 쉬운 디테일에서 끝나는 느린 카메라 접근을 설명하세요. 장소 장면에서는 중심 대상으로 다가가기 전에 환경을 소개합니다. 의도한 결말을 담을 여유가 있도록 동작을 선택한 클립 길이에 맞추세요.\n\n프롬프트 상한은 2,000자입니다. 핵심 피사체와 동작을 먼저 적고, 원하는 결과에 영향을 주는 조명·소재·환경·카메라 디테일을 더하세요. 시각적 스타일은 프롬프트에서 지정합니다. Q2 전용 가이드에 따르면 별도의 style 및 movement_amplitude 매개변수는 이 모델에 적용되지 않습니다. 따라서 general 또는 anime 프리셋과 움직임 진폭 옵션은 명확한 장면 설명을 대신할 수 없습니다.\n\n모델별 길이 설정은 한 초부터 열 초까지의 정수 초를 받습니다. Q2 해상도 선택지는 540p, 720p, 1080p이며, 문서상 기본값은 720p입니다. 동작과 용도에 맞게 길이와 해상도를 함께 선택하세요. 짧게 드러내는 장면과 더 오래 이어지는 움직임은 타이밍이 달라야 합니다. 요청 길이를 늘리는 것은 화면의 순서를 위한 것이어야 하며, 변함없는 지시를 단순히 늘이는 데 그쳐서는 안 됩니다. 최종 배치를 준비할 때 반환된 클립의 실제 크기와 길이를 확인하세요.\n\n문서화된 aspect_ratio 선택지는 16:9, 9:16, 3:4, 4:3, 1:1이며 기본값은 16:9입니다. 가이드는 Q2 제품군에 3:4와 4:3을 명시적으로 포함합니다. 생성 전에 화면을 선택하고 이에 맞는 구도를 설명하세요. 세로 화면에서는 주 피사체가 잘 보이게 하고, 가로 화면에서는 너비를 활용해 주변 환경을 보여 줍니다. 마지막 화면은 의도한 페이지·프레젠테이션 또는 이후 자막 작업에 충분히 명확하도록 만드세요.\n\nseed 필드는 변화를 제어합니다. 생략하거나 0을 주면 무작위 값을 선택하고, 영이 아닌 값을 주면 반복 가능한 생성용으로 문서화된 고정 seed 옵션을 선택합니다. 버전을 비교할 때 반환된 seed를 프롬프트 및 설정과 함께 보관하세요. 공통 작업 설명에는 Q3 모델 전용 audio 및 off_peak 제어도 나옵니다. 이 Q3 옵션은 이 Q2 프로필에 부여된 기능이 아니므로, 문서화된 텍스트 입력과 영상 출력을 중심으로 요청을 계획하세요.\n\n생성은 비동기 방식입니다. 제출하면 task_id와 초기 상태가 반환되며, 새로 만든 작업에는 created가 사용됩니다. 처리를 추적하는 동안 이 작업 ID를 보관하세요. 문서화된 결과 조회는 성공 결과에 state=success를 사용하고 creations 배열을 반환합니다. 각 항목의 영상 URL은 creations[].url에 있습니다. 작업에 항상 생성물이 정확히 하나만 있다고 가정하지 말고, 반환된 모든 영상을 저장하세요.\n\n결과 문서에는 실제 영상의 길이, fps, 해상도의 너비와 높이도 보고된다고 나옵니다. 예제의 프레임 속도나 크기를 고정된 Q2 사양으로 보지 말고, 보고된 값을 완성 클립과 함께 보관하세요. 작업 생성 응답에는 요청 구성과 함께 credits 값이 포함됩니다. 각 영상이 생성 설정과 연결된 상태를 유지하도록, 이 보고된 작업 메타데이터와 완료된 작업 ID를 결과와 함께 보관하세요.\n\n전체 시퀀스를 원래 지시와 비교하세요. 피사체 외형, 물체 형태, 움직임 방향, 카메라 연속성, 의도한 마지막 화면을 확인합니다. 수정할 때는 지시와 어긋난 구체적인 디테일을 지정하고, 잘된 장면 부분을 유지하세요. 이후 비교가 실제 결과물을 바탕으로 이루어지도록 프롬프트, 정확한 선택자, 설정, 작업 ID, 완성 영상을 함께 보관하세요.",
    "alias_of": null,
    "aliases": [],
    "author": "Vidu",
    "capabilities": {
      "context_length": 0,
      "manufacturer_input": [
        "text"
      ],
      "manufacturer_output": [
        "video"
      ]
    },
    "card_routes": [
      {
        "label": "Ultra",
        "rates": [
          {
            "amount": "5.12",
            "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": "5.12",
            "native_quantity": 1,
            "public_unit_label": "estimate before generation",
            "quantity": 1,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "request_estimate"
          }
        ],
        "summary": "구성의 전체 요금 정보는 상세 정보에서 확인할 수 있습니다."
      }
    ],
    "ctx": null,
    "display_name": "Vidu: Q2 Text-to-Video",
    "formats": [
      "videos"
    ],
    "id": "viduq2",
    "input": [
      "text"
    ],
    "kind": "video",
    "locale": "en",
    "max_out": null,
    "methods": [
      {
        "available": null,
        "billing_basis": {
          "basis": "original_invoice_usd",
          "description": "표시된 요율은 생성 전 비용을 예상하는 데 사용됩니다. 최종 청구액은 최초 생성에 기록된 비용으로 계산됩니다. 측정된 출력 길이와 예상 수량은 최종 청구 수량이 아닙니다.",
          "forecast_quantity_is_estimate": true,
          "physical_output_is_billable_quantity": false,
          "version": "original_invoice_usd_v1"
        },
        "cache_read": null,
        "cache_write": null,
        "cache_write_1h": null,
        "contract": {
          "data": {
            "errors": [
              {
                "condition": "JSON/모델이 유효하지 않거나 필수 문자열이 없거나 비어 있거나 콘텐츠 인덱스가 유효하지 않습니다.",
                "http_status": 400,
                "type": "invalid_request_error"
              },
              {
                "condition": "유효하지 않은 Ailoot API 키입니다.",
                "http_status": 401,
                "type": "authentication_error"
              },
              {
                "condition": "이 API 키 그룹은 해당 미디어 경로에 접근하도록 허용되지 않았습니다.",
                "http_status": 403,
                "type": "permission_error"
              },
              {
                "condition": "원래 작업 또는 요청한 출력이 없거나 동일한 사용자/API 키/그룹의 소유가 아닙니다.",
                "http_status": 404,
                "type": "not_found_error"
              },
              {
                "condition": "최초 제출 또는 상태 정보가 불완전하거나 대조하여 확인할 수 없습니다. 원래 ID를 보존하고 다시 제출하지 마세요.",
                "http_status": 502,
                "type": "result_pending_check"
              },
              {
                "condition": "원래 연결, 경로 또는 소유 미디어를 아직 확인 중입니다. 해당 원래 작업을 계속 확인하세요.",
                "http_status": 503,
                "type": "result_pending_check"
              },
              {
                "condition": "미디어 서비스 또는 원래 작업 저장소를 사용할 수 없습니다.",
                "http_status": 503,
                "type": "server_error"
              }
            ],
            "ignored_fields": [
              "style",
              "movement_amplitude"
            ],
            "lifecycle": {
              "cancel_endpoint": null,
              "completed_states": [
                "success"
              ],
              "content": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}/content",
                  "query": {
                    "index": "actual output index; default 0"
                  }
                }
              ],
              "content_pending": "Original status JSON until publication.",
              "content_ready": {
                "http_status": 303,
                "location": "actual signed Ailoot-owned asset URL"
              },
              "create": {
                "http": "POST",
                "path": "/v1/videos"
              },
              "failed_states": [],
              "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
              "mode": "submit_once_poll_original",
              "owned_result": {
                "http": "GET",
                "path": "/v1/media/assets/{asset_id}"
              },
              "pending_states": [
                "created"
              ],
              "signed_asset_lifetime_seconds": 86400,
              "state_field": "state",
              "status": [
                {
                  "http": "GET",
                  "path": "/v1/videos/{request_id}"
                },
                {
                  "http": "GET",
                  "path": "/v1/videos/generations/{request_id}"
                }
              ],
              "submit_status": 200,
              "unknown": "고정된 명세에는 최종 실패 상태 목록이 없습니다. 원본 응답/헤더/id를 보존하고, 알 수 없는 상태나 result_pending_check 오류가 발생하면 같은 작업을 확인하세요. 결과를 알 수 없는 생성을 절대로 다시 제출하지 마세요.",
              "unknown_no_replay": true
            },
            "material_combinations": [
              [
                "text"
              ]
            ],
            "operation_modes": [
              "text_to_video"
            ],
            "outputs": {
              "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
              "all_results": "creations[].url에 실제로 반환된 URL을 모두 다운로드하세요. 콘텐츠 인덱스는 실제 반환된 출력 하나를 식별합니다.",
              "every_actual_output": true,
              "family": "video",
              "fields": [
                {
                  "description": "반환된 공개 Ailoot 작업 또는 연산 식별자입니다.",
                  "name": "id",
                  "type": "string"
                },
                {
                  "description": "공개 id와 별개인 원래 작업 식별자입니다.",
                  "name": "provider_task_id",
                  "type": "string"
                },
                {
                  "description": "원래 작업에 대해 반환된 Ailoot 조회 경로입니다.",
                  "name": "polling_url",
                  "type": "string"
                },
                {
                  "description": "생성 응답에 포함된 원래 식별자입니다.",
                  "name": "task_id",
                  "type": "string when supplied"
                },
                {
                  "description": "네이티브 작업 상태: 고정된 대기 상태는 created, 완료 상태는 success입니다.",
                  "name": "state",
                  "type": "string when supplied"
                },
                {
                  "description": "작업 진단 정보입니다. 저장된 명세에는 열거된 오류 코드 목록이 없습니다.",
                  "name": "err_code",
                  "type": "string when supplied"
                },
                {
                  "description": "선택한 완료 동영상 URL은 각각 Ailoot가 소유한 서명된 URL로 대체됩니다.",
                  "name": "creations[].url",
                  "type": "string|string[]"
                },
                {
                  "description": "반환된 동영상 길이입니다. 실제 완료 결과를 확인하세요.",
                  "name": "creations[].video.duration",
                  "type": "number when supplied"
                },
                {
                  "description": "반환된 프레임 속도입니다. 고정된 프레임 속도를 보장하지 않습니다.",
                  "name": "creations[].video.fps",
                  "type": "integer when supplied"
                },
                {
                  "description": "픽셀 단위로 반환된 출력 너비입니다.",
                  "name": "creations[].video.resolution.width",
                  "type": "integer when supplied"
                },
                {
                  "description": "픽셀 단위로 반환된 출력 높이입니다.",
                  "name": "creations[].video.resolution.height",
                  "type": "integer when supplied"
                }
              ],
              "format": null,
              "maximum_outputs": null,
              "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
              "result": "JSON은 네이티브 state와 creations 배열을 유지하고 공개 id/provider_task_id/polling_url을 추가합니다. 선택된 동영상 URL은 게시 전에는 비어 있으며 완료 후에는 Ailoot가 소유한 서명된 URL이 됩니다."
            },
            "parameters": [
              {
                "availability": "source_interface",
                "default": null,
                "default_known": false,
                "enum": [
                  "viduq2"
                ],
                "enum_known": true,
                "name": "model",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "생성할 장면을 설명하세요. 문서에 명시된 제한은 2000자입니다. Ailoot는 문자열이 비어 있지 않은지 확인하고 텍스트를 보존합니다.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maxLength": 2000,
                "minLength": 1,
                "name": "prompt",
                "required": true,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "viduq2 모델별 설명에는 정수 단위 1–10초가 명시되어 있습니다. 모델별 기본 길이는 문서에 명시되지 않았습니다.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "maximum": 10,
                "minimum": 1,
                "name": "duration",
                "required": false,
                "type": "integer",
                "unit": "초"
              },
              {
                "availability": "source_interface",
                "conditions": "무작위 동작을 사용하려면 생략하거나 문자열 \"0\"을 전송하세요. 영이 아닌 seed를 제공하면 문서에 명시된 고정 seed 동작이 선택됩니다. 숫자 범위는 명시되어 있지 않습니다.",
                "default": null,
                "default_known": false,
                "enum": null,
                "enum_known": false,
                "name": "seed",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "default": "16:9",
                "default_known": true,
                "enum": [
                  "16:9",
                  "9:16",
                  "3:4",
                  "4:3",
                  "1:1"
                ],
                "enum_known": true,
                "name": "aspect_ratio",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "viduq2 모델별 목록에는 1–10초에 대한 이 구간들이 문서화되어 있습니다. 공통 열거형과 표에는 360p도 나오지만, 적용 여부가 해당 목록과 충돌하므로 여기서는 지원을 단정하지 않습니다.",
                "default": "720p",
                "default_known": true,
                "enum": [
                  "540p",
                  "720p",
                  "1080p"
                ],
                "enum_known": true,
                "name": "resolution",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "공통 요청은 이 필드를 허용하지만, 문서에는 viduq2에 효과가 없다고 명시되어 있습니다.",
                "default": "general",
                "default_known": true,
                "enum": [
                  "general",
                  "anime"
                ],
                "enum_known": true,
                "name": "style",
                "required": false,
                "type": "string"
              },
              {
                "availability": "source_interface",
                "conditions": "공통 요청은 이 필드를 허용하지만, 문서에는 q2 모델에 효과가 없다고 명시되어 있습니다.",
                "default": "auto",
                "default_known": true,
                "enum": [
                  "auto",
                  "small",
                  "medium",
                  "large"
                ],
                "enum_known": true,
                "name": "movement_amplitude",
                "required": false,
                "type": "string"
              }
            ],
            "profile_binding": "Literal viduq2 model with the documented Ailoot videos interface.",
            "request_schema": {
              "additionalProperties": true,
              "properties": {
                "aspect_ratio": {
                  "default": "16:9",
                  "enum": [
                    "16:9",
                    "9:16",
                    "3:4",
                    "4:3",
                    "1:1"
                  ],
                  "type": "string"
                },
                "duration": {
                  "maximum": 10,
                  "minimum": 1,
                  "type": "integer"
                },
                "model": {
                  "const": "viduq2",
                  "minLength": 1,
                  "type": "string"
                },
                "movement_amplitude": {
                  "default": "auto",
                  "enum": [
                    "auto",
                    "small",
                    "medium",
                    "large"
                  ],
                  "type": "string"
                },
                "prompt": {
                  "maxLength": 2000,
                  "minLength": 1,
                  "type": "string"
                },
                "resolution": {
                  "default": "720p",
                  "enum": [
                    "540p",
                    "720p",
                    "1080p"
                  ],
                  "type": "string"
                },
                "seed": {
                  "type": "string"
                },
                "style": {
                  "default": "general",
                  "enum": [
                    "general",
                    "anime"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "model",
                "prompt"
              ],
              "type": "object"
            },
            "source_ambiguities": [
              "The shared enum and table mention 360p, while the model-specific viduq2 resolution description lists 540p/720p/1080p. The method asserts only the explicit model-specific list.",
              "The shared duration example uses a quoted string despite an integer schema. The copyable viduq2 example omits that optional field; an explicit duration follows the documented integer type.",
              "No model-specific default duration, maximum output count, generated-file retention period, cancellation endpoint or terminal failure-state list is established by these saved documents.",
              "The documented fetch uses an id path parameter; the pinned declaration names that same substituted value task_id. The fetch example has no task_id field, which the current client accepts only by retaining the original task identity."
            ],
            "unsupported": [
              "Image-guided input, video editing and extension are not part of this text-to-video method.",
              "The audio and off_peak parameters are documented only for other model selectors, not viduq2.",
              "No live streaming, callback completion or owned cover-image result contract is established here."
            ]
          },
          "hints": [
            "한 번 생성하고 반환된 공개 id와 polling_url을 보존하세요.",
            "원래 작업을 폴링하고 state를 조회하세요. success와 소유한 creations[].url 결과가 완료 판정 기준입니다.",
            "반환된 소유 동영상 URL을 모두 다운로드하세요. 예제를 근거로 출력 수, 길이 또는 프레임 속도가 고정되어 있다고 판단하지 마세요."
          ],
          "input": {
            "additional_properties": true,
            "content_type": "application/json",
            "material_types": [
              "text"
            ],
            "optional": [
              "duration",
              "seed",
              "aspect_ratio",
              "resolution",
              "style",
              "movement_amplitude"
            ],
            "required": [
              "model",
              "prompt"
            ],
            "validation_scope": "Ailoot는 model/prompt 문자열이 비어 있지 않은지 검증합니다. 아래 선택 사항의 유형과 제한은 문서에 명시된 요청 계약입니다. 다른 요청 필드는 선택한 모델에 전달되도록 보존됩니다."
          },
          "lifecycle": {
            "cancel_endpoint": null,
            "completed_states": [
              "success"
            ],
            "content": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}/content",
                "query": {
                  "index": "actual output index; default 0"
                }
              }
            ],
            "content_pending": "Original status JSON until publication.",
            "content_ready": {
              "http_status": 303,
              "location": "actual signed Ailoot-owned asset URL"
            },
            "create": {
              "http": "POST",
              "path": "/v1/videos"
            },
            "failed_states": [],
            "id_source": "Use the actual returned public id or X-Ailoot-Task-Id and polling_url. Keep task_id/provider_task_id separate; status lookup can retain the original task identity when the native fetch omits it.",
            "mode": "submit_once_poll_original",
            "owned_result": {
              "http": "GET",
              "path": "/v1/media/assets/{asset_id}"
            },
            "pending_states": [
              "created"
            ],
            "signed_asset_lifetime_seconds": 86400,
            "state_field": "state",
            "status": [
              {
                "http": "GET",
                "path": "/v1/videos/{request_id}"
              },
              {
                "http": "GET",
                "path": "/v1/videos/generations/{request_id}"
              }
            ],
            "submit_status": 200,
            "unknown": "The pinned declaration enumerates no terminal failure state. Preserve original response/headers/id and check that same operation for any unrecognized state or result_pending_check error; never resubmit an unknown creation.",
            "unknown_no_replay": true
          },
          "manufacturer_capability": {
            "documented_material_types": [
              "text"
            ]
          },
          "method": {
            "http": "POST",
            "path": "/v1/videos"
          },
          "method_aliases": [
            "/v1/videos/generations"
          ],
          "operation_modes": [
            "text_to_video"
          ],
          "output": {
            "additional_media_boundary": "Only creations[].url is selected for owned video delivery. No owned cover-image or callback result flow is established.",
            "all_results": "Download every actual returned URL in creations[].url; a content index identifies one real returned output.",
            "every_actual_output": true,
            "family": "video",
            "fields": [
              {
                "description": "Returned public Ailoot task or operation identifier.",
                "name": "id",
                "type": "string"
              },
              {
                "description": "Original task identifier, separate from the public id.",
                "name": "provider_task_id",
                "type": "string"
              },
              {
                "description": "Returned Ailoot lookup path for the original task.",
                "name": "polling_url",
                "type": "string"
              },
              {
                "description": "Original identifier present in the creation response.",
                "name": "task_id",
                "type": "string when supplied"
              },
              {
                "description": "Native task state: created for the pinned pending state and success for completion.",
                "name": "state",
                "type": "string when supplied"
              },
              {
                "description": "Task diagnostic; the saved specification declares no enumerated error-code list.",
                "name": "err_code",
                "type": "string when supplied"
              },
              {
                "description": "Every selected completed video URL is replaced with an Ailoot-owned signed URL.",
                "name": "creations[].url",
                "type": "string|string[]"
              },
              {
                "description": "Returned video duration; inspect the actual completed result.",
                "name": "creations[].video.duration",
                "type": "number when supplied"
              },
              {
                "description": "Returned frame rate; no fixed frame rate is promised.",
                "name": "creations[].video.fps",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output width in pixels.",
                "name": "creations[].video.resolution.width",
                "type": "integer when supplied"
              },
              {
                "description": "Returned output height in pixels.",
                "name": "creations[].video.resolution.height",
                "type": "integer when supplied"
              }
            ],
            "format": null,
            "maximum_outputs": null,
            "ownership": "Selected video outputs are copied, reopened and SHA256/length/positive-duration checked before publication.",
            "result": "JSON retains the native state and creations array, with public id/provider_task_id/polling_url added. Selected video URLs are blank before publication and become Ailoot-owned signed URLs after completion."
          }
        },
        "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": "이 예상 금액은 추가 요금이나 생성 완료 시 적용되는 고정 요금이 아닙니다.",
            "dimensions": {
              "forecast_quantity": "one generation estimate"
            },
            "label": "예상 생성 비용",
            "units": [
              {
                "amount": "5.12",
                "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": "5.12",
                "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}\"\ncat > request.json <<'JSON_REQUEST'\n{\"model\":\"viduq2\",\"prompt\":\"In an ultra-realistic fashion photography style featuring light blue and pale amber tones, an astronaut in a spacesuit walks through the fog. The background consists of enchanting white and golden lights, creating a minimalist still life and an impressive panoramic scene.\"}\nJSON_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",
            "label": "curl · create video",
            "language": "bash"
          },
          {
            "code": "set -eu\n: \"${AILOOT_API_KEY:?Set your Ailoot API key}\"\npython3 - <<'PY_POLL'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import quote,urljoin,urlsplit\nr=json.loads(Path(\"result.json\").read_text())\ni=r.get(\"id\")\nif not isinstance(i,str) or not i:raise SystemExit(\"Keep original response/headers/id; do not resubmit creation.\")\nu=urljoin(\"https://api.ailoot.ai\",r.get(\"polling_url\") or \"/v1/videos/\"+quote(i,safe=\"\"))\np=urlsplit(u)\nif p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/videos/\"):raise SystemExit(\"Use the actual Ailoot lookup path.\")\nPath(\"poll-url.txt\").write_text(u)\nPY_POLL\ncurl --fail-with-body --silent --show-error \"$(cat poll-url.txt)\" -H \"Authorization: Bearer $AILOOT_API_KEY\" -D status-headers.txt -o status.json\n",
            "label": "curl · read original task",
            "language": "bash"
          },
          {
            "code": "set -eu\npython3 - <<'PY_ASSETS'\nimport json\nfrom pathlib import Path\nfrom urllib.parse import urlsplit\nr=json.loads(Path(\"status.json\").read_text())\nif r.get(\"state\")!=\"success\":raise SystemExit(\"Poll the same original job until its owned result is returned.\")\ncreations=r.get(\"creations\")\nif not isinstance(creations,list) or not creations:raise SystemExit(\"No completed video creations.\")\nurls=[]\nfor item in creations:\n    value=item.get(\"url\") if isinstance(item,dict) else None\n    values=[value] if isinstance(value,str) else value\n    if not isinstance(values,list) or not values:raise SystemExit(\"No completed video URL.\")\n    for u in values:\n        if not isinstance(u,str):raise SystemExit(\"Invalid returned URL.\")\n        p=urlsplit(u)\n        if p.scheme!=\"https\" or p.netloc!=\"api.ailoot.ai\" or not p.path.startswith(\"/v1/media/assets/\") or not p.path.endswith(\"/content\") or not p.query:raise SystemExit(\"Wait for the actual Ailoot-owned signed result.\")\n        urls.append(u)\nPath(\"asset-urls.txt\").write_text(\"\\n\".join(urls)+\"\\n\")\nPY_ASSETS\nindex=0\nwhile IFS= read -r asset_url; do\n  curl --fail-with-body --silent --show-error \"$asset_url\" -o \"video-${index}.bin\"\n  index=$((index + 1))\ndone < asset-urls.txt\n",
            "label": "curl · download every owned video",
            "language": "bash"
          }
        ],
        "family": "openai",
        "fast_multiplier": null,
        "flex_multiplier": null,
        "fmt": "videos",
        "hints": [
          "Create once and retain the returned public id and polling_url.",
          "Poll the original operation and read state; success and an owned creations[].url result are the completion boundary.",
          "Download every returned owned video URL; do not infer a fixed output count, duration or frame rate from the example."
        ],
        "http": "POST",
        "in": null,
        "input": [
          "text"
        ],
        "label": "동영상",
        "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": "5.12",
                "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": "5.12",
                "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": "viduq2",
        "route_label": "Ultra",
        "status_reads": [
          "GET /v1/videos/{request_id}",
          "GET /v1/videos/generations/{request_id}",
          "GET /v1/videos/{request_id}/content",
          "GET /v1/videos/generations/{request_id}/content"
        ],
        "tiers": [],
        "units": [
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "input_price",
            "label": "Input tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "output_price",
            "label": "Output tokens",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "output_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "out",
            "unit": "output_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_read_price",
            "label": "Cache read",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "cached_input_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "cached_input_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_price",
            "label": "Cache write",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "generic_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "generic_cache_creation_token"
          },
          {
            "amount": null,
            "amount_unit": "usd_per_thousand_tokens",
            "billing_input": false,
            "estimate_only": true,
            "key": "cache_write_1h_price",
            "label": "Cache write, 1 hour",
            "native_amount_usd_per_unit": null,
            "native_quantity": 1,
            "native_unit": "one_hour_cache_creation_token",
            "public_unit_label": "/ 1K tokens",
            "quantity": 1000,
            "quantity_is_estimate": true,
            "rate_role": "typed_native_retail_rate",
            "side": "in",
            "unit": "one_hour_cache_creation_token"
          },
          {
            "amount": "5.12",
            "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": "5.12",
            "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": "viduq2",
        "request_model_id": "viduq2",
        "route_label": "Ultra"
      }
    ],
    "name": "Vidu: Q2 Text-to-Video",
    "price": {
      "estimate_only": true,
      "in": null,
      "in_label": null,
      "out": 5.12,
      "out_label": "estimate before generation",
      "scope_label": "Estimated generation cost",
      "sort_in": null,
      "sort_out": 5.12,
      "varies": false
    },
    "short": "Vidu Q2는 텍스트 장면 지시로 영상을 만들며, 길이 1–10초, 540p·720p·1080p 출력과 다섯 가지 화면비를 지원합니다. 이 viduq2 프로필은 프롬프트로 스타일과 움직임을 지정하고, 비동기 작업을 통해 결과를 반환합니다."
  },
  "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": "Vidu Q2는 텍스트 장면 지시로 영상을 만들며, 길이 1–10초, 540p·720p·1080p 출력과 다섯 가지 화면비를 지원합니다. 이 viduq2 프로필은 프롬프트로 스타일과 움직임을 지정하고, 비동기 작업을 통해 결과를 반환합니다.",
  "source": {
    "audit_sha256": "2e00086bcbfc28e64d0cebe97aa47c17d8d5618963027f8ffb9dc6123d7d25b1",
    "bridge_map_sha256": "1125275768b9636fc8461bc7da5061239a81ddfe508e2557843ca42c58ab0036",
    "raw_model_json_sha256": "3694201f44ad49f4a543cb395a8a3a1cbe7f40a2e277641d7b7ecbaa13ee1e04",
    "renderer_sha256": "6825a317438b70ab0939441dcebefece462384e77f7e96cce899605c4b208caa"
  },
  "sourceRevision": "1289973bf1cc70135624b4aa4527e41f46b728bc4590999a7a5014bd4661494b"
}
