如何透過單一 API 將多個 AI 模型連接到 n8n?
逐一連接各家 AI 供應商在原型階段或許可行,但隨著用量增加,這種方式會變得脆弱。每個供應商都有不同的憑證、端點、請求格式、速率限制、計費與回應結構。在 n8n 中,這常導致重複的 HTTP 節點與供應商特定的分支,因此新增模型或更改後援路徑時,必須修改工作流程的多個部分。
n8n 與 CometAPI 解決的是不同層面的問題。n8n 控制作業何時執行、驗證輸入、路由同步與非同步任務、重試失敗並儲存結果。CometAPI 則將模型存取集中在一把 API key 與一個 base URL 背後。兩者搭配可將供應商的變動隔離於協作層之外:你只需切換模型 ID,即可保留相同的佇列、輪詢、儲存與監控邏輯。
這組合對於來自試算表或內部工具的混合圖片與影片作業特別實用。工作流程在 n8n 中保持可視化與可稽核,而憑證、模型可用性與使用成本則更容易透過單一 API 層管理。
將多家 AI 供應商整合到同一應用的最簡方法,是將協作與模型存取拆開處理。讓 n8n 負責觸發、分支、重試與儲存,而 CometAPI 讓每個分支都只需一把 API key 與一個 base URL。模型 ID 成為每個作業中的一個欄位,而不是獨立的供應商帳號、SDK 與計費設定。
本指南將帶你建立一條可運作的低程式碼管線:從 Google Sheets 讀取圖片與影片作業,透過 CometAPI 發送到 OpenAI 與 ByteDance 的模型,儲存非同步影片的任務 ID、輪詢完成狀態,並將最終結果 upsert 進 n8n Data Table。
你將完成的內容
最終工作流程如下:
Google Sheets Trigger → Normalize Job → 依媒體類型分支 → CometAPI 圖片或影片請求 → 等待並輪詢影片任務 → 上傳或引用輸出 → Data Table upsert。
在來源工作表使用以下欄位:
job_id | media_type | model | prompt | size | seconds | status
典型圖片列使用 image、gpt-image-2 與 1024x1024。影片列使用 video、seedance-2-5、1280x720,以及 4 到 30 秒的長度。
開始之前
你需要一個 n8n 執行個體、一份 Google Sheet、一把 CometAPI API key,以及一個名為 ai_jobs 的 n8n Data Table。請在 Data Table 建立這些欄位:job_id、media_type、model、status、task_id、result_url、error、updated_at。
若自我託管 n8n,請在 n8n 行程使用的環境中加入以下值:
COMETAPI_BASE_URL=https://api.cometapi.com/v1COMETAPI_KEY=your_cometapi_key
修改環境後請重啟 n8n。在 n8n Cloud,或當你不想在節點表達式中暴露環境變數時,建立一組名為 CometAPI Bearer 的 HTTP Header Auth 憑證。將 Header 名稱設為 Authorization,值設為 Bearer your_cometapi_key。下方範例使用此憑證與固定的 OpenAI 相容 base URL https://api.cometapi.com/v1.
使用目前的模型 ID
| 作業 | 供應商與模型 | 請求 | 結果 |
|---|---|---|---|
| 圖片 | OpenAI · gpt-image-2 | POST /v1/images/generations | 同步的 base64 圖片 |
| 影片 | ByteDance · seedance-2-5 | POST /v1/videos | 非同步任務,之後輪詢 |
上述 ID 與能力在 2026 年 8 月 11 日可於 即時 CometAPI 模型目錄 API 查詢。圖片模型支援文生圖。Seedance 2.5 支援文生影與圖生影、4–30 秒片段,以及文件記載的 480p 與 720p 尺寸。
定價截至 2026 年 8 月 11 日:GPT Image 2 模型頁標示輸入每百萬 token 4 美元、輸出每百萬 token 24 美元。Seedance 2.5 模型頁標示 480p 每秒 0.103 美元、720p 每秒 0.231 美元。價格可能變動,請以即時模型目錄或模型頁為執行時的權威來源。
重要的架構差異在於:圖片生成可用請求—回應處理,影片生成則應視為有狀態的作業。先持久化影片任務 ID 再開始輪詢,可避免 n8n 執行重啟時遺失該作業。
在 n8n 中建立工作流程
1. 由 Google Sheets 觸發新作業
新增一個 Google Sheets Trigger 節點並選擇 Row added or updated。指向包含作業佇列的工作表。在觸發器後立即新增一個 IF 節點,僅在 status 為空或等於 queued 時才繼續。這可避免工作表變動時已完成的列被再次提交。
2. 正規化與驗證每一列
新增一個名為 Normalize Job 的 Code 節點。此節點會套用安全預設、限制工作流程僅使用核准的模型 ID,並為兩個分支產出相同欄位。
const row = $json;const allowedModels = { image: new Set(['gpt-image-2']), video: new Set(['seedance-2-5']),};const mediaType = String(row.media_type || '').trim().toLowerCase();if (!allowedModels[mediaType]) { throw new Error(`media_type 必須為 image 或 video;接收到:${row.media_type}`);}const defaultModel = mediaType === 'image' ? 'gpt-image-2' : 'seedance-2-5';const model = String(row.model || defaultModel).trim();if (!allowedModels[mediaType].has(model)) { throw new Error(`模型 ${model} 不允許用於 ${mediaType} 作業`);}const prompt = String(row.prompt || '').trim();if (!prompt) throw new Error('prompt 為必填');const seconds = mediaType === 'video' ? Number(row.seconds || 4) : null;if (mediaType === 'video' && (!Number.isInteger(seconds) || seconds < 4 || seconds > 30)) { throw new Error('Seedance 2.5 的 seconds 必須為 4 到 30 的整數');}return [{ json: { job_id: String(row.job_id || $execution.id), media_type: mediaType, model, prompt, size: String(row.size || (mediaType === 'image' ? '1024x1024' : '1280x720')), seconds, status: 'processing', updated_at: new Date().toISOString(), },}];
在 Normalize Job 後新增一個 Switch 節點。將 image 導向圖片分支,將 video 導向影片分支。
3. 透過單一端點產生圖片
新增一個名為 Create Image 的 HTTP Request 節點,設定如下:
- Method: POST
- URL:
https://api.cometapi.com/v1/images/generations - Authentication:
CometAPI BearerHeader Auth 憑證 - Body Content Type: JSON
{ "model": "={{ $('Normalize Job').item.json.model }}", "prompt": "={{ $('Normalize Job').item.json.prompt }}", "size": "={{ $('Normalize Job').item.json.size }}"}
GPT Image 2 會回傳 base64 圖片資料。新增一個名為 Prepare Image File 的 Code 節點,將該資料轉為 n8n 的二進位項目:
const job = $('Normalize Job').item.json;const b64 = $json.data?.[0]?.b64_json;if (!b64) throw new Error('CometAPI 未返回圖片資料');return [{ json: { ...job, status: 'completed', task_id: '', result_url: '', error: '', updated_at: new Date().toISOString(), }, binary: { media: { data: b64, mimeType: 'image/png', fileName: `${job.job_id}.png`, }, },}];
將此節點連到你偏好的物件儲存節點,例如 S3 或 Google Drive。將回傳的檔案 URL 存入 result_url,然後 upsert 到 ai_jobs。避免將大型 base64 負載寫入 Data Table。
4. 建立非同步的影片任務
新增一個名為 Create Video 的 HTTP Request 節點:
- Method: POST
- URL:
https://api.cometapi.com/v1/videos - Authentication:
CometAPI Bearer - Body Content Type: Form-Data
新增四個表單欄位:model、prompt、seconds 與 size。其值從 Normalize Job 映射。
接著新增一個名為 Save Video Task 的 Code 節點:
const job = $('Normalize Job').item.json;const taskId = $json.id || $json.task_id;if (!taskId) throw new Error('建立回應中缺少影片任務 ID');return [{ json: { ...job, task_id: taskId, status: $json.status || 'queued', result_url: '', error: '', updated_at: new Date().toISOString(), },}];
在開始輪詢前先將此項目 upsert 到 ai_jobs。立刻儲存任務 ID 可避免因重啟或逾時而遺失作業。
5. 等待、輪詢並儲存影片 URL
新增一個 Wait 節點,設定為 15 秒。再新增一個名為 Get Video 的 HTTP Request 節點:
- Method: GET
- URL: =https://api.cometapi.com/v1/videos/{{ $json.task_id }}
- Authentication:
CometAPI Bearer
請求後,使用一個 Switch 節點判斷 status:
queued或in_progress:返回 Wait 節點。completed:繼續到Finalize Video。failed或error:將錯誤寫入ai_jobs並停止。
在完成分支加入以下 Code 節點:
const prior = $('Save Video Task').item.json;const resultUrl = $json.video_url || $json.url || $json.data?.video_url;if (!resultUrl) throw new Error('完成的影片回應沒有提供 video URL');return [{ json: { ...prior, status: 'completed', result_url: resultUrl, error: '', updated_at: new Date().toISOString(), },}];
依 job_id 將最終項目 upsert 到 ai_jobs。CometAPI 的影片 URL 可能是簽名且暫時的,因此在正式流程應先下載並重新託管,再儲存永久 URL。若你的應用可接收外部請求,且所選模型支援回呼,可用 webhook 取代輪詢。
完整節點圖
完整工作流程可由以下節點組成:
- Google Sheets Trigger — Row added or updated
- IF — 僅處理新的或已排隊的列
- Code — Normalize Job
- Switch — Image 或 video
- 圖片分支:HTTP Request → Prepare Image File → 物件儲存 → Data Table Upsert
- 影片分支:HTTP Request → Save Video Task → Data Table Upsert → Wait → HTTP Request → 狀態 Switch
- 完成影片:Finalize Video → 物件儲存或永久 URL → Data Table Upsert
- 失敗影片:Set Error → Data Table Upsert
針對失敗分支,在 Edit Fields 節點中使用以下表達式:
{ "job_id": "={{ $('Save Video Task').item.json.job_id }}", "status": "failed", "task_id": "={{ $('Save Video Task').item.json.task_id }}", "result_url": "", "error": "={{ $json.error?.message || $json.message || '影片生成失敗' }}", "updated_at": "={{ $now.toISO() }}"}
測試工作流程
在來源工作表新增以下兩列:
img-001 | image | gpt-image-2 | 一張在昏暗書桌上的玻璃機器人電影感產品照 | 1024x1024 | | queuedvid-001 | video | seedance-2-5 | 一架紙飛機飛過陽光灑落的攝影棚,平滑的追蹤運鏡 | 1280x720 | 4 | queued
圖片請求應回傳類似以下結構:
{ "created": 1786400000, "data": [ { "b64_json": "iVBORw0KGgoAAA..." } ]}
影片建立請求應回傳類似以下的任務結構:
{ "id": "video_task_abc123", "object": "video", "status": "queued", "progress": 0}
在輪詢後,完成的回應應包含相同的任務 ID、status: completed,以及一個 video_url。可選欄位可能因模型而異,因此正規化程式碼只讀取穩定的任務狀態與結果 URL,而非將供應商的整個回應複製進資料庫。
常見錯誤與修正
| 錯誤 | 修正 |
|---|---|
| 401 Unauthorized | 確認 Header Auth 的值以 Bearer 開頭,且該金鑰仍為有效。 |
| 404 model or task not found | 檢查即時模型目錄,並確認在 GET /v1/videos/{id} 中使用了已儲存的任務 ID。 |
| 400 invalid size or seconds | 使用支援的尺寸,且將 Seedance 2.5 的長度維持在 4 到 30 秒之間。 |
| 429 rate limited | 降低 n8n 併發度,並以指數退避加抖動重試。 |
| Polling never ends | 持久化嘗試次數並在定義的逾時後停止;將 failed 與 error 視為終止狀態。 |
| Image payload is too large | 將 base64 轉為二進位、上傳,並只儲存永久 URL。 |
上線清單
- 保護憑證:將 API key 存放於 n8n 憑證或伺服器端環境變數。不要將其放入試算表或回傳到瀏覽器。
- 讓每個作業具冪等性:使用
job_id作為 Data Table 的 upsert 鍵。在建立新任務之前,略過已標記為processing或completed的列。 - 控制輪詢與併發:每 10–20 秒輪詢影片作業,限制嘗試次數並限制同時執行數。在遇到 429、500、503 時退避,而不是建立重複任務。
- 在每次請求前驗證模型策略:依媒體類型維護允許清單。定期從即時目錄刷新模型可用性與價格,但透過審核流程部署模型變更,而非讓試算表使用者提交任意 ID。
- 追蹤每個作業成本:與每個結果一起儲存模型、解析度、時長與使用量欄位。以 2026-08-11 的標示價格估算,四秒 720p 的 Seedance 2.5 約 0.924 美元;同樣四秒 480p 約 0.412 美元。在提交請求前強制最大時長與解析度。
- 重新託管生成媒體:將供應商簽名 URL 視為傳遞連結,而非永久儲存。下載完成的媒體,上傳至你可控的儲存桶,並儲存耐久 URL 與雜湊值。
- 保留稽核軌跡:儲存請求模型、已淨化參數、任務 ID、狀態轉換、重試次數、回應時間與最終資產位置。不要記錄 API key 或完整的私人提示詞。
為何此模式可擴展
工作流程之所以保持簡潔,是因為每個新供應商或模型只是路由決策,而非全新的帳號整合。試算表仍是作業佇列、n8n 仍是協作層、CometAPI 仍是單一存取層。只要擴充允許清單與分支設定即可新增模型;觸發、任務持久化、輪詢、儲存與監控邏輯都不需變更。
這就是多供應商 AI 整合的務實做法:受控的單一端點與金鑰、明確的模型路由、分離的同步與非同步路徑,以及每個作業的可持久記錄。
常見問題
n8n 能否透過一個 API 呼叫多個 AI 供應商?
可以。透過 CometAPI 等統一 API 層,n8n 能向不同的支援模型發送請求,同時集中管理供應商憑證與 HTTP 整合。
我可以在 n8n 的 HTTP Request 節點使用 CometAPI 嗎?
可以。HTTP Request 節點可向 CometAPI 的 API 端點發送請求,並附上所需的認證與模型特定參數。
當某個模型失敗時,n8n 能自動切換到其他模型嗎?
可以。在 API 請求後加入 IF/Switch 分支,將可重試或模型特定的失敗路由到後援模型。後援模型須支援相同的模態與必要功能。
