Open AIavDocs首頁
API 金鑰只能放在伺服器端環境變數或金鑰管理服務中,不得寫進前端程式、Git、日誌或截圖。

官方 SDK 快速入門

官方 SDK 封裝了完整流程(建立 → 輪詢 → 下載),會自動產生冪等鍵並提供類型化錯誤;Node SDK 沒有任何相依套件,Python SDK 只相依 httpx。目前以 GitHub 儲存庫形式提供,npm / PyPI 正式發布將另行公告。

Node

npm install github:openaiav/sdk-node   # npm release to be announced

import { OpenAiav } from '@openaiav/sdk'
const client = new OpenAiav({ apiKey: process.env.OPENAIAV_API_KEY })
const task = await client.generations.createAndWait({
  model: 'seedance-2.5-oa', prompt: 'She walks into the sunlight.',
  resolution: '480p', aspectRatio: 'adaptive', durationSeconds: 4,
  generateAudio: false
})
await client.generations.downloadToFile(task.id, './out.mp4')

Python

pip install git+https://github.com/openaiav/sdk-python   # PyPI release to be announced

from openaiav import OpenAiav
client = OpenAiav(os.environ["OPENAIAV_API_KEY"])
task = client.generations.create_and_wait({
    "model": "seedance-2.5-oa", "prompt": "She walks into the sunlight.",
    "resolution": "480p", "aspectRatio": "adaptive", "durationSeconds": 4,
    "generateAudio": False,
})
client.generations.download_to_file(task["id"], "./out.mp4")

四步完成串接

  1. 使用伺服器端環境變數 OPENAIAV_API_KEY 呼叫 https://api.openaiav.com/v1/models,讀取目前的模型鍵、計價與 reference_modes。
  2. 向 POST /v1/generations 提交 prompt、referenceMode 與 referenceImages;參考圖是公開的 HTTPS URL,不需要預先註冊。建立成功時回傳 HTTP 201。
  3. 儲存回應中的 id,依 poll_after_ms 對同一個 GET /v1/generations/{id} 輪詢。processing、result_pending、submission_unknown 都請繼續等待,不要重新建立。
  4. 狀態變為 succeeded 後,呼叫 GET /v1/generations/{id}/content 下載;完整回應為 HTTP 200,單一區間的 Range 為 206。

驗證與冪等

export OPENAIAV_API_KEY='oav_...'
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY  (reuse this value only when retrying this same create)"

每個請求都要帶 Authorization: Bearer oav_...,金鑰只放在伺服器端。建立任務需要 generation:create,查詢和下載需要 generation:read。每個建立意圖生成一個新的 Idempotency-Key(UUID),範例每次執行都會換新的鍵;只在網路結果不確定、重試同一個建立請求時重複使用它,同一個鍵不得搭配不同的請求內容。

請求標頭

參數類型必填說明
Authorizationstring必填所有 /v1 請求都使用 Bearer oav_...;金鑰只儲存在伺服器端。
Idempotency-Keystring僅建立任務時必填每個建立意圖生成一個新值(例如 UUID),只在重試同一個建立請求時重複使用;相同的值與請求內容不會重複生成或重複扣款。
Content-Typestring僅 POST 必填建立任務使用 application/json。

端點一覽

方法路徑成功權限範圍說明
GET/v1/models200任何有效的 API 金鑰讀取目前可售模型、價格、解析度、時長與 reference_modes。提交前必須依目錄確認模型能力。
POST/v1/generation-quotes201generation:create預覽目前價格,不鎖定價格;建立任務時重新定價,依建立回應的 reserved_usd 固定扣款,失敗全額退款。仍可傳入 quoteId,expires_at 僅為重新整理提示。
POST/v1/generations201generation:create建立非同步任務;參考圖與 referenceMode 在同一個 JSON 請求中提交。
GET/v1/generations/{id}200generation:read依回應中的 poll_after_ms 查詢同一任務,直到終態。
GET/v1/generations/{id}/content200 / 206generation:read任務成功後下載輸出;單一區間的 Range 請求回傳 206。

第一步:讀取模型能力

不要把模型能力寫死。只有 reference_modes 列出的模式可以提交;介面也應在提交前隱藏或阻擋不相容的組合。最小範例固定示範 seedance-2.5-oa 的 4 秒、480p、無音訊請求。

curl --fail-with-body 'https://api.openaiav.com/v1/models' \
  --header "Authorization: Bearer $OPENAIAV_API_KEY"

最小公開影片範例

完整流程都在同一個範例裡:建立 → 輪詢同一任務 → 下載。 first_frame 使用一張參考圖和 adaptive;generateAudio=false 避免請求音訊。建立、輪詢、下載的成功狀態分別是 201、200、200/206;失敗回應先讀取 HTTP,再讀取 error.code。

# Keep OPENAIAV_API_KEY in an environment variable; do not paste secrets into shell history.
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY  (reuse this value only when retrying this same create)"

# 1. Create — success: HTTP 201. On failure, the response body contains error.code.
# Lost response (timeout or dropped connection)? Re-run this same command in this shell:
# the unchanged $IDEMPOTENCY_KEY returns the original task instead of creating a second one.
curl --fail-with-body --request POST 'https://api.openaiav.com/v1/generations' \
  --header "Authorization: Bearer $OPENAIAV_API_KEY" \
  --header "Idempotency-Key: $IDEMPOTENCY_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "model": "seedance-2.5-oa",
  "prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
  "resolution": "480p",
  "aspectRatio": "adaptive",
  "durationSeconds": 4,
  "referenceMode": "first_frame",
  "referenceImages": [
    "https://developers.openaiav.com/samples/seedance-letter-reference.webp"
  ],
  "generateAudio": false,
  "outputFormat": "mp4"
}'

# 2. Save the returned id as TASK_ID. Poll the same id — success: HTTP 200.
curl --fail-with-body 'https://api.openaiav.com/v1/generations/TASK_ID' \
  --header "Authorization: Bearer $OPENAIAV_API_KEY"

# Repeat step 2 after poll_after_ms until status is succeeded or failed.
# Never recreate a task whose status is submission_unknown.

# 3. After succeeded, download — success: HTTP 200 (or 206 with Range).
curl --fail-with-body --location 'https://api.openaiav.com/v1/generations/TASK_ID/content' \
  --header "Authorization: Bearer $OPENAIAV_API_KEY" \
  --output 'result.mp4'

請求參數

參數類型必填說明
modelstring必填取自 GET /v1/models 的 model;最小影片範例使用 seedance-2.5-oa。
promptstring必填1–4000 字元。全能參考可依陣列順序用 @Image1、@Image2 指代圖片。
resolutionstring選填必須屬於所選模型的 resolutions;最小影片範例使用 480p。
aspectRatiostring選填必須屬於所選模型的 aspect_ratios;所選模型的首幀能力要求自適應畫幅時,請使用 adaptive。圖片模型若列出 image_size_options,resolution 與 aspectRatio 必須作為一組從中選取:並非每個解析度都提供全部畫幅。
durationSecondsinteger選填影片時長以 durationSeconds 指定,須為目錄 duration_seconds 區間內的整數秒數;省略時使用模型最短時長。最小範例使用 4 秒。
referenceModefirst_frame | omni_reference使用影片參考圖時必填只能用於目錄 reference_modes 明確列出的 Seedance 影片模型。一次請求只能選一個模式。
referenceImagesstring[]與 referenceMode 同時填寫公開的 HTTPS 圖片 URL。first_frame 必須且只能 1 張;omni_reference 的上限請讀取 reference_images_max。
inputImagesstring[]選填圖生圖的輸入圖片(參考圖),僅用於圖片模型。每一項是公開的 HTTPS 圖片 URL,或 data:image/png;base64,…、data:image/jpeg;base64,…、data:image/webp;base64,… 形式的 data URL。各模型的上限請見 GET /v1/models:input_images_max、input_image_max_bytes(每張,URL 與 data URL 都適用)和 input_image_mime_types。參考圖可能提高扣款。不要與影片參考模式混用。
generateAudioboolean選填支援音訊的影片模型省略時預設為 true。最經濟的範例明確傳入 false;目前目錄沒有單列音訊附加費,計費一律以 GET /v1/models 為準。
outputFormatmp4 | mov選填只能選擇目錄 output_formats 中的值;最小範例使用 mp4。

參考素材模式

first_frame

first_frame:參考圖會成為起始畫面並決定構圖。必須且只能提交 1 張 referenceImages;aspectRatio 取自所選模型的 aspect_ratios,目錄含 adaptive 時會固定為 adaptive(輸出依參考圖畫幅)。 first_last_frame:提交剛好 2 張 referenceImages,依陣列順序分別是首幀與尾幀,中間畫面由模型補全。兩張圖不需要相同尺寸。幀模式與 omni_reference 互斥。

{
  "model": "seedance-2.5-oa",
  "prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
  "resolution": "480p",
  "aspectRatio": "adaptive",
  "durationSeconds": 4,
  "referenceMode": "first_frame",
  "referenceImages": [
    "https://developers.openaiav.com/samples/seedance-letter-reference.webp"
  ],
  "generateAudio": false,
  "outputFormat": "mp4"
}

omni_reference

omni_reference:參考素材用於鎖定主體、風格與場景的一致性,不要求成為首幀。除 referenceImages 外,支援的模型還可傳入 referenceVideos 與 referenceAudios;各類上限請見下表,目錄未宣告的類型一提交即回傳 400。提示詞依同類型內的陣列順序引用 @Image1、@Video1、@Audio1。

{
  "model": "seedance-2.5-oa",
  "prompt": "Keep the identity and outfit from @Image1; a young woman walks from a stone cottage into the morning sunlight",
  "resolution": "480p",
  "aspectRatio": "16:9",
  "durationSeconds": 4,
  "referenceMode": "omni_reference",
  "referenceImages": [
    "https://developers.openaiav.com/samples/seedance-letter-reference.webp"
  ],
  "generateAudio": false,
  "outputFormat": "mp4"
}

實際相容範圍

所有影片模型都使用同一套串接方式:同一個端點、同一組欄位,換模型只需改 model。差異全部由目錄宣告——下表就是目錄本身,逐一列出每個模型支援哪些參考模式、各類素材可收幾個。目錄沒有宣告的能力,提交時會被明確拒絕,不會默默忽略。

目錄尚未載入。請先呼叫 GET /v1/models;沒有 reference_modes 的模型不得提交參考模式。

首幀細則與尾幀接力

首幀細則:first_frame 與 omni_reference 互斥,同一請求只能選其一;omni 模式下可用提示詞間接引導某張參考圖作為起始畫面,但需要嚴格的首幀一致時,請使用 first_frame 模式提交那張圖。Seedance 2.5 的首幀任務畫幅固定為 adaptive(輸出依首幀)。尾幀接力:建立時傳入 returnLastFrame: true,成功後任務會另外回傳 last_frame_url(與影片同寬高的無浮水印 PNG,保留 24 小時)——把這個 URL 直接作為下一個請求 first_frame 的 referenceImages,即可串聯多鏡頭的連續敘事,不需任何預先註冊步驟。

參考影片計價

  • 可測得時長的參考影片按固定價格計費,可先預覽這個金額;無法測得時長時拒絕預覽,不扣費。
  • 呼叫 POST /v1/generation-quotes 預覽目前價格。伺服器會測量 URL 影片;建立任務時重新測量並定價,實際金額以建立回應的 reserved_usd 為準。仍可傳入 quoteId,但不鎖定價格;expires_at 僅提示重新整理預覽。
  • 模型目錄規定單一、總時長、數量及最低計費秒數;Seedance 2.0 系列的每段參考影片為 2–15 秒,其他適用模型為 2–30 秒。實測超出範圍回傳 422 REFERENCE_DURATION_OUT_OF_RANGE,不扣費。
  • 只支援 MP4/MOV 公開 HTTPS 直連網址。已知檔案大小超過 200 MiB 時回傳 REFERENCE_VIDEO_TOO_LARGE;未回報大小仍可報價。非公開位址回傳 REFERENCE_URL_NOT_PUBLIC,探測繁忙時回傳 429 REFERENCE_PROBE_BUSY。控制台上傳上限為 32 MiB。
  • 每個任務都在建立時依報價扣除 reserved_usd,成功時就按這個金額,失敗時全額退回。預覽中的 price_usd 等於在預覽那一刻建立所需扣除的金額;輸出影片長度仍須明確指定,不可使用 -1。
  • 公開影片 URL 在預覽和建立時各探測一次,隨後以直連網址供生成服務讀取,無須平台儲存或素材註冊。請保持連結內容穩定。上傳檔案走獨立註冊路徑。真人臉素材仍受模型限制。

圖片模型計價

  • 圖片模型按張計價,價格隨 resolution 與 aspectRatio 變化,請見 image_pricing.rates。gpt-image-* 與 nano-banana-* 模型的列表價以短提示詞、不帶參考圖計算。
  • 帶參考圖或提示詞較長時,這些模型的扣款會更高。建立任務前,用同樣的請求內容呼叫 POST /v1/generation-quotes,回傳的 price_usd 就是這次請求按目前價格的扣款金額。任務失敗將全額退款。

輪詢與下載

只有 succeeded 與 failed 是終態。submission_unknown 表示受理結果確認中,result_pending 表示結果正在完成:保留原任務 ID,繼續輪詢,絕對不要重送建立請求。成功後請優先使用需驗證的下載路徑 /content,不要依賴任何非 Open AIav 的網址。輸出結果保留 24 小時(詳細資訊會回傳 output_expires_at 倒數;過期後下載會回傳 410 OUTPUT_EXPIRED,請及時另存)。

狀態終態處理方式
processing否已受理;請依 poll_after_ms 繼續查詢。
result_pending否結果正在完成;保留任務 ID 並繼續輪詢同一任務,勿重新建立。
submission_unknown否受理結果確認中;不要重送建立請求,請保留並繼續查詢原任務 ID。
succeeded是成功;使用 /content 下載輸出。
failed是確定失敗,已全額退款;請讀取 error_code。

舊端點遷移

舊的 /v1/assets、/v1/assets/content、/v1/assets/{id}、/v1/asset-groups 與 /v1/asset-groups/{id} 已停用;使用有效金鑰及相應的舊 scope 呼叫時會回傳 HTTP 410 / ENDPOINT_RETIRED。新的串接不得呼叫這些路徑;請把 referenceMode 與 referenceImages 放進同一次生成請求。

錯誤碼對照

完整對照:HTTP 狀態、錯誤碼、含義、建議處理方式與 SDK 錯誤類別。本表與 SDK 的錯誤對應使用同一個資料來源;遇到未知的新錯誤碼時,SDK 會依 HTTP 狀態分類處理。

HTTP錯誤碼含義建議處理方式SDK
401UNAUTHENTICATED缺少 API 金鑰或無法識別。請帶上 Authorization: Bearer oav_… 請求標頭;金鑰只放在伺服器端。AuthenticationError
401INVALID_API_KEY金鑰無效或已撤銷。請在控制台確認金鑰狀態;必要時輪換以取得新金鑰。AuthenticationError
403INSUFFICIENT_SCOPE金鑰缺少此操作所需的權限範圍(scope)。建立任務需要 generation:create,查詢與下載需要 generation:read。PermissionError
429RATE_LIMITED請求超出此金鑰的速率限制。請依 Retry-After / retryAfterSeconds 延後重試;SDK 會自動處理。RateLimitError
400IDEMPOTENCY_KEY_REQUIRED建立任務必須帶上 Idempotency-Key。每個新請求都建立唯一的鍵;網路重試時重複使用同一個鍵。SDK 會自動建立。InvalidRequestError
409IDEMPOTENCY_KEY_CONFLICT同一個冪等鍵被用於不同的請求內容。參數不同時請換新鍵;以相同參數重試時,鍵與請求內容必須完全一致。InvalidRequestError
400MODEL_NOT_FOUND未知的模型 ID。請以 GET /v1/models 回傳的 model 為準(例如 seedance-2.5-oa)。InvalidRequestError
503MODEL_NOT_AVAILABLE此模型暫時無法呼叫。本次未扣款。請查看此模型在 GET /v1/models 中的 status,稍後再試。ServerError
400INVALID_PROMPT提示詞為空或過長。提示詞須為 1–4000 字元。InvalidRequestError
400INVALID_DURATIONdurationSeconds 不在模型允許的區間內。請指定影片長度:填寫目錄 duration_seconds 區間內的整數秒數。InvalidRequestError
400INVALID_RESOLUTION此模型不支援該解析度。請從目錄的 resolutions 中選擇。InvalidRequestError
400INVALID_ASPECT_RATIO此模型不支援該畫幅。請從目錄的 aspect_ratios 中選擇;first_frame 通常固定為 adaptive。InvalidRequestError
400INVALID_REFERENCE_IMAGESreferenceImages 必須是公開 HTTPS URL 的陣列。每一項都要提供任務期間可讀取的 https:// 圖片連結。InvalidRequestError
400INVALID_REFERENCE_IMAGE其中一項參考圖不是有效的 URL。錯誤訊息會標示索引(referenceImages[i]);請檢查該連結。InvalidRequestError
400REFERENCE_IMAGE_URL_NOT_HTTPS參考圖連結不是公開的 HTTPS。不支援 http、內部網路或 data URL;請上傳到可公開存取的儲存空間。InvalidRequestError
400REFERENCE_MODE_REQUIRES_IMAGES指定了 referenceMode 卻沒有參考圖。referenceMode 與 referenceImages 必須同時提供。InvalidRequestError
400REFERENCE_MODE_NOT_SUPPORTED此模型不支援所選的參考模式。請依目錄的 reference_modes 選擇 first_frame / omni_reference。InvalidRequestError
400FIRST_FRAME_REQUIRES_ONE_IMAGEfirst_frame 必須且只能有一張參考圖。只提交 1 張;多張圖片請改用 omni_reference。InvalidRequestError
400TOO_MANY_REFERENCES參考圖數量超過目錄上限。上限請見目錄的 reference_images_max。InvalidRequestError
400INVALID_INPUT_IMAGESinputImages 必須是陣列。每一項須為 HTTPS URL 或 data:image/* base64。InvalidRequestError
400INVALID_INPUT_IMAGE其中一項輸入圖片的格式無效。每一項須為 HTTPS URL 或 data:image/* base64;錯誤訊息會標示索引。InvalidRequestError
400INPUT_IMAGE_URL_NOT_HTTPS輸入圖片連結不是 HTTPS。請改用 https:// 連結,或 data:image/png;base64,… 這類 data URL。InvalidRequestError
400INPUT_IMAGE_TOO_LARGE內嵌圖片超過 10 MiB。壓縮到 10 MiB 以內再送出。列出 input_image_max_bytes 的模型對 HTTPS 連結同樣限制大小:超過時任務會以 REFERENCE_INPUT_INVALID 失敗並全額退款。InvalidRequestError
400IMAGE_INPUT_NOT_SUPPORTED此模型不支援圖片輸入。只有目錄宣告 input_images_max>0 的圖片模型可以使用 inputImages。InvalidRequestError
400TOO_MANY_INPUT_IMAGES輸入圖片數量超過上限。上限請見目錄的 input_images_max。InvalidRequestError
422REFERENCE_DURATION_OUT_OF_RANGE實測的參考影片時長超出模型限制。檢查目錄中的單一、總時長及數量上限後重新預覽;本次未扣費。InvalidRequestError
422REFERENCE_DURATION_UNVERIFIED無法實測參考影片時長。請使用一般 MP4/MOV,建議 faststart;URL 主機須支援 Range 請求。InvalidRequestError
422REFERENCE_URL_NOT_PUBLIC參考影片 URL 不是公開 HTTPS 位址。請使用不需登入的公開 HTTPS 直連網址,連接埠為 443。InvalidRequestError
422CONTENT_TYPE_MISMATCH參考影片 URL 回傳的內容不是所需的影片格式。確認連結直接回傳 MP4/MOV 位元組,而非網頁或圖片。InvalidRequestError
422REFERENCE_VIDEO_TOO_LARGE參考影片超出檔案大小上限。公開 URL 上限為 200 MiB,控制台上傳上限為 32 MiB;壓縮或裁剪後重新預覽。InvalidRequestError
429REFERENCE_PROBE_BUSY同時實測的參考影片過多。依 retry_after_seconds 稍後重試;本次未扣費。RateLimitError
400INSUFFICIENT_BALANCE餘額不足以支付本次任務。請到控制台「錢包」儲值或兌換後重試。InvalidRequestError
400LEGACY_ASSET_REFERENCE_RETIRED素材 ID 引用已停用。請在同一次請求中使用 referenceMode + referenceImages(公開 HTTPS)。InvalidRequestError
404NOT_FOUND任務不存在,或屬於其他帳號。請確認任務 ID 與金鑰屬於同一個帳號。InvalidRequestError
409OUTPUT_NOT_READY輸出尚未就緒。請依 poll_after_ms 繼續輪詢任務,直到終態。InvalidRequestError
410OUTPUT_EXPIRED輸出的下載期限(成功後 24 小時)已過。請及時儲存輸出;過期後需重新生成。可用詳細資訊中的 output_expires_at 顯示倒數。OutputExpiredError

圖片任務失敗碼

圖片任務以 status=failed 結束時,請讀取 error_code 並對照下表。失敗的任務將全額退款。SDK 會拋出帶有同一錯誤碼的 GenerationFailedError。

錯誤碼含義
CONTENT_POLICY_REJECTED內容未通過審核,請調整內容後重新提交。
REFERENCE_INPUT_INVALID素材不符合要求,請檢查格式、大小及模型支援的參數。
REFERENCE_SOURCE_UNREACHABLE素材連結無法讀取,請檢查連結有效期限或重新上傳。
REFERENCE_SERVICE_UNAVAILABLE素材處理服務暫時無法使用,請附上任務編號聯絡客服;不需要因此反覆更換圖片。
GENERATION_INPUT_INVALID生成參數不符合模型要求,請檢查輸入。
GENERATION_RATE_LIMITED生成服務暫時達到速率限制,請稍後再試。
GENERATION_REJECTED生成請求遭到拒絕,請附上任務編號聯絡客服確認原因。
GENERATION_SERVICE_UNAVAILABLE生成服務暫時無法使用,請稍後再試。
GENERATION_FAILED任務未能完成,請附上任務編號聯絡客服。

僅在控制台回傳的錯誤碼

HTTP錯誤碼含義建議處理方式
400REFERENCE_UPLOAD_NOT_FOUND本機上傳的引用不存在、已過期或不屬於目前的帳號。請在線上測試中重新上傳後再執行(上傳內容只在短時間內有效)。
429UPLOAD_QUOTA_EXCEEDED未使用的上傳數量已達上限。請先執行使用這些上傳內容的任務,或等待其過期後重試。
429WEBHOOK_ENDPOINT_LIMITWebhook 端點數量已達上限。請刪除或停用不再使用的端點。
400INVALID_WEBHOOK_URL回呼 URL 不是可公開存取的 HTTPS 位址。請使用公開的 HTTPS 位址;內部網路或迴路位址會被拒絕。