จะเชื่อมต่อโมเดล AI หลายตัวกับ n8n ด้วย API เดียวได้อย่างไร
การเชื่อมต่อโมเดล AI แบบทีละผู้ให้บริการอาจเพียงพอสำหรับต้นแบบ แต่เมื่อการใช้งานเติบโตขึ้นก็จะเปราะบาง ผู้ให้บริการแต่ละรายมีข้อมูลรับรองปลายทาง รูปแบบคำขอ ข้อจำกัดอัตรา การเรียกเก็บเงิน และโครงสร้างการตอบกลับแยกกัน ใน n8n สิ่งนี้มักทำให้เกิดโหนด HTTP ที่ซ้ำซ้อนและกิ่งก้านเฉพาะผู้ให้บริการ ดังนั้นการเพิ่มโมเดลหรือเปลี่ยนเส้นทางสำรองจะหมายถึงการแก้ไขหลายส่วนของเวิร์กโฟลว์
n8n และ CometAPI แก้ปัญหาในคนละเลเยอร์ n8n ควบคุมว่าเมื่อใดให้งานทำงาน ตรวจสอบความถูกต้องของอินพุต กำหนดเส้นทางงานแบบซิงโครนัสและอะซิงโครนัส ทำการลองใหม่เมื่อเกิดข้อผิดพลาด และจัดเก็บผลลัพธ์ CometAPI รวมการเข้าถึงโมเดลไว้ภายใต้คีย์ API เดียวและ base URL เดียว เมื่อทำงานร่วมกัน พวกเขาช่วยกันกันการเปลี่ยนแปลงผู้ให้บริการออกจากเลเยอร์ออร์เคสเตรชัน: คุณสามารถสลับ model ID โดยยังคงตรรกะคิว การโพลล์ การจัดเก็บ และการมอนิเตอร์เดิมไว้
การผสมผสานนี้มีประโยชน์อย่างยิ่งสำหรับงานภาพและวิดีโอแบบผสมที่มาจากสเปรดชีตหรือเครื่องมือภายใน เวิร์กโฟลว์ยังคงเป็นภาพและตรวจสอบได้ใน n8n ขณะที่ข้อมูลรับรอง ความพร้อมใช้งานของโมเดล และค่าใช้จ่ายในการใช้งานยังคงจัดการได้ง่ายผ่านเลเยอร์ API เดียว
วิธีที่ง่ายที่สุดในการบูรณาการผู้ให้บริการ AI หลายรายเข้ากับแอปเดียว คือแยกออร์เคสเตรชันออกจากการเข้าถึงโมเดล ให้ n8n จัดการทริกเกอร์ การแตกแขนง การลองใหม่ และการจัดเก็บ ขณะที่ CometAPI มอบคีย์ API เดียวและ base URL เดียวให้กับทุกแขนง โดยเปลี่ยน model ID ให้กลายเป็นฟิลด์หนึ่งในแต่ละงานแทนที่จะเป็นบัญชีผู้ให้บริการ SDK และการตั้งค่าบิลลิงแยกกัน
ในคู่มือนี้ คุณจะสร้างไปป์ไลน์แบบ low-code ที่ใช้งานได้จริงซึ่งอ่านงานภาพและวิดีโอจาก Google Sheets ส่งไปยังโมเดลของ OpenAI และ ByteDance ผ่าน CometAPI บันทึก ID งานวิดีโอแบบอะซิงโครนัส โพลล์จนเสร็จ และอัปเสิร์ตผลลัพธ์สุดท้ายลงใน n8n Data Table
สิ่งที่คุณจะสร้าง
เวิร์กโฟลว์ที่เสร็จแล้วดำเนินตามเส้นทางนี้:
Google Sheets Trigger → Normalize Job → Switch by media type → CometAPI image or video request → Wait and poll video tasks → Upload or reference the output → 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, คีย์ API ของ CometAPI และ n8n Data Table ชื่อ ai_jobs สร้างคอลัมน์เหล่านี้ใน Data Table: job_id, media_type, model, status, task_id, result_url, error, และ updated_at
สำหรับ n8n แบบ self-hosted ให้เพิ่มค่าเหล่านี้ลงในสภาพแวดล้อมที่ใช้โดยโปรเซส n8n ของคุณ:
COMETAPI_BASE_URL=https://api.cometapi.com/v1COMETAPI_KEY=your_cometapi_key
รีสตาร์ท n8n หลังจากเปลี่ยนสภาพแวดล้อม ใน n8n Cloud หรือเมื่อใดก็ตามที่คุณไม่ต้องการเปิดเผยตัวแปรสภาพแวดล้อมในนิพจน์ของโหนด ให้สร้าง Credential แบบ HTTP Header Auth ชื่อ CometAPI Bearer ตั้งชื่อเฮดเดอร์เป็น Authorization และค่าคือ Bearer your_cometapi_key ตัวอย่างด้านล่างใช้ Credential นี้และ OpenAI-compatible base URL แบบคงที่ https://api.cometapi.com/v1.
ใช้ Model ID ปัจจุบัน
| งาน | ผู้ให้บริการและโมเดล | คำขอ | ผลลัพธ์ |
|---|---|---|---|
| ภาพ | OpenAI · gpt-image-2 | POST /v1/images/generations | รูปภาพ base64 แบบซิงโครนัส |
| วิดีโอ | ByteDance · seedance-2-5 | POST /v1/videos | งานแบบอะซิงโครนัส แล้วค่อยโพลล์ |
ทั้ง ID และความสามารถมีอยู่ใน API ไดเรกทอรีโมเดลแบบ live ของ CometAPI ณ วันที่ 11 สิงหาคม 2026 โมเดลภาพรองรับการสร้างภาพจากข้อความ Seedance 2.5 รองรับการสร้างวิดีโอจากข้อความและจากภาพ ความยาวคลิป 4–30 วินาที และขนาด 480p และ 720p ตามที่มีเอกสารไว้
ราคาข ณ วันที่ 11 สิงหาคม 2026: หน้าโมเดล GPT Image 2 ระบุ $4 ต่อหนึ่งล้านโทเค็นอินพุตและ $24 ต่อหนึ่งล้านโทเค็นเอาต์พุต หน้าโมเดล Seedance 2.5 ระบุ $0.103 ต่อวินาทีที่ 480p และ $0.231 ต่อวินาทีที่ 720p ราคาอาจเปลี่ยนแปลงได้ ดังนั้นให้ใช้ไดเรกทอรีโมเดลแบบ live หรือหน้าโมเดลเป็นแหล่งความจริงขณะรันไทม์
ความแตกต่างด้านสถาปัตยกรรมที่สำคัญคือ การสร้างภาพสามารถจัดการแบบคำขอ-ตอบกลับได้ ขณะที่การสร้างวิดีโอควรถูกมองว่าเป็นงานที่มีสถานะ ต้องบันทึก ID งานวิดีโอก่อนการโพลล์เพื่อป้องกันไม่ให้การรีสตาร์ทการทำงานของ n8n ทำให้งานหายไป
สร้างเวิร์กโฟลว์ใน n8n
- Trigger งานใหม่จาก Google Sheets
เพิ่มโหนด Google Sheets Trigger และเลือก Row added or updated ชี้ไปยังเวิร์กชีตที่มีคิวงานของคุณ เพิ่มโหนด IF ต่อจากทริกเกอร์และดำเนินการต่อเฉพาะเมื่อ status ว่างหรือเท่ากับ queued สิ่งนี้ป้องกันไม่ให้แถวที่เสร็จแล้วถูกส่งอีกเมื่อชีตมีการเปลี่ยนแปลง
- ทำให้แต่ละแถวเป็นมาตรฐานและตรวจสอบความถูกต้อง
เพิ่มโหนด Code ชื่อ Normalize Job โหนดนี้จะกำหนดค่าเริ่มต้นที่ปลอดภัย จำกัดเวิร์กโฟลว์ให้ใช้เฉพาะ model 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 must be image or video; received: ${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 ${model} is not allowed for ${mediaType} jobs`);}const prompt = String(row.prompt || '').trim();if (!prompt) throw new Error('prompt is required');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 must be an integer from 4 to 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(), },}];
เพิ่มโหนด Switch หลัง Normalize Job กำหนดเส้นทาง image ไปยังแขนงภาพ และ video ไปยังแขนงวิดีโอ
- สร้างภาพผ่านเอ็นด์พอยต์เดียว
เพิ่มโหนด HTTP Request ชื่อ Create Image ด้วยการตั้งค่าเหล่านี้:
- Method:
POST - URL:
https://api.cometapi.com/v1/images/generations - Authentication: Credential แบบ
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 เพิ่มโหนด Code ชื่อ Prepare Image File เพื่อแปลงข้อมูลนั้นเป็นไอเท็มแบบไบนารีของ n8n:
const job = $('Normalize Job').item.json;const b64 = $json.data?.[0]?.b64_json;if (!b64) throw new Error('CometAPI returned no image data');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 จากนั้นอัปเสิร์ตแถวลงใน ai_jobs หลีกเลี่ยงการเก็บเพย์โหลด base64 ขนาดใหญ่ใน Data Table
- สร้างงานวิดีโอแบบอะซิงโครนัส
เพิ่มโหนด HTTP Request ชื่อ Create Video:
- Method:
POST - URL:
https://api.cometapi.com/v1/videos - Authentication:
CometAPI Bearer - Body Content Type: Form-Data
เพิ่มช่องฟอร์มสี่ช่อง: model, prompt, seconds และ size แมปค่าจาก Normalize Job
ถัดไป เพิ่มโหนด Code ชื่อ Save Video Task:
const job = $('Normalize Job').item.json;const taskId = $json.id || $json.task_id;if (!taskId) throw new Error('Video task ID missing from create response');return [{ json: { ...job, task_id: taskId, status: $json.status || 'queued', result_url: '', error: '', updated_at: new Date().toISOString(), },}];
อัปเสิร์ตไอเท็มนี้ลงใน ai_jobs ก่อนการโพลล์ การบันทึก task ID ทันทีหมายความว่าการรีสตาร์ทหรือหมดเวลาจะไม่ทำให้งานหายไป
- รอ โพลล์ และจัดเก็บ URL ของวิดีโอ
เพิ่มโหนด Wait ตั้งไว้ 15 วินาที จากนั้นเพิ่มโหนด HTTP Request ชื่อ Get Video:
- Method:
GET - URL:
=https://api.cometapi.com/v1/videos/{{ $json.task_id }} - Authentication:
CometAPI Bearer
หลังคำขอ ใช้โหนด Switch บน status:
queuedหรือin_progress: กลับไปยังโหนด Waitcompleted: ดำเนินต่อไปยังFinalize Videofailedหรือerror: เขียนข้อผิดพลาดลงในai_jobsและหยุด
เพิ่มโค้ดโหนดนี้สำหรับแขนงที่เสร็จแล้ว:
const prior = $('Save Video Task').item.json;const resultUrl = $json.video_url || $json.url || $json.data?.video_url;if (!resultUrl) throw new Error('Completed video response has no video URL');return [{ json: { ...prior, status: 'completed', result_url: resultUrl, error: '', updated_at: new Date().toISOString(), },}];
อัปเสิร์ตไอเท็มสุดท้ายลงใน ai_jobs โดยใช้ job_id URL ของวิดีโอจาก CometAPI อาจเป็นแบบลงชื่อและชั่วคราว ดังนั้นเวิร์กโฟลว์ในโปรดักชันควรดาวน์โหลดและโฮสต์ใหม่ไฟล์ก่อนบันทึก URL ถาวร หากแอปของคุณรับคำขาเข้าได้ ให้แทนการโพลล์ด้วย webhook เมื่อโมเดลที่เลือกสนับสนุนการเรียกกลับ
แผนที่โหนดครบถ้วน
คุณสามารถประกอบเวิร์กโฟลว์เต็มได้ด้วยโหนดต่อไปนี้:
- Google Sheets Trigger — Row added or updated
- IF — Process only new or queued rows
- Code — Normalize Job
- Switch — Image or video
- Image branch: HTTP Request → Prepare Image File → Object Storage → Data Table Upsert
- Video branch: HTTP Request → Save Video Task → Data Table Upsert → Wait → HTTP Request → Status Switch
- Completed video: Finalize Video → Object Storage or permanent URL → Data Table Upsert
- Failed video: 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 || 'Video generation failed' }}", "updated_at": "={{ $now.toISO() }}"}
ทดสอบเวิร์กโฟลว์
เพิ่มสองแถวนี้ลงในชีตต้นทาง:
img-001 | image | gpt-image-2 | A cinematic product photo of a glass robot on a dark desk | 1024x1024 | | queuedvid-001 | video | seedance-2-5 | A paper airplane flies through a sunlit studio, smooth tracking shot | 1280x720 | 4 | queued
คำขอภาพควรส่งคืนโครงสร้างคล้ายกับ:
{ "created": 1786400000, "data": [ { "b64_json": "iVBORw0KGgoAAA..." } ]}
คำขอสร้างวิดีโอควรส่งคืนโครงสร้างงานคล้ายกับ:
{ "id": "video_task_abc123", "object": "video", "status": "queued", "progress": 0}
หลังการโพลล์ การตอบกลับที่เสร็จสมบูรณ์ควรมี task ID เดิม status: completed และ video_url ฟิลด์เสริมที่แน่นอนอาจแตกต่างกันไปตามโมเดล ซึ่งเป็นเหตุผลว่าทำไมโค้ด normalization จึงอ่านสถานะงานที่เสถียรและ result URL แทนที่จะคัดลอกการตอบกลับจากผู้ให้บริการทั้งหมดลงฐานข้อมูลของคุณ
ข้อผิดพลาดทั่วไปและวิธีแก้
| ข้อผิดพลาด | วิธีแก้ |
|---|---|
| 401 Unauthorized | ตรวจสอบว่าค่า Header Auth เริ่มต้นด้วย Bearer และคีย์ยังใช้งานอยู่ |
| 404 model or task not found | ตรวจสอบไดเรกทอรีโมเดลแบบ live และยืนยันว่าใช้ task ID ที่บันทึกกับ GET /v1/videos/{id} |
| 400 invalid size or seconds | ใช้ขนาดที่รองรับและคงระยะเวลา Seedance 2.5 ไว้ระหว่าง 4 ถึง 30 วินาที |
| 429 rate limited | ลดความพร้อมกันของ n8n และลองใหม่ด้วย backoff แบบเอ็กซ์โปเนนเชียลพร้อม jitter |
| Polling never ends | บันทึกจำนวนความพยายามและหยุดหลังครบกำหนดเวลา; ปฏิบัติต่อ failed และ error เป็นสถานะสิ้นสุด |
| Image payload is too large | แปลง base64 เป็นไบนารี อัปโหลด และเก็บเฉพาะ URL ถาวร |
เช็กลิสต์สำหรับโปรดักชัน
- ป้องกันข้อมูลรับรอง: เก็บคีย์ API ไว้ใน Credential ของ n8n หรือในตัวแปรสภาพแวดล้อมฝั่งเซิร์ฟเวอร์ อย่าใส่ไว้ในสเปรดชีตหรือส่งกลับไปยังเบราว์เซอร์
- ทำให้งานทุกงานเป็น idempotent: ใช้
job_idเป็นคีย์อัปเสิร์ต Data Table ก่อนสร้างงานใหม่ ให้ข้ามแถวที่ถูกทำเครื่องหมายว่าprocessingหรือcompletedอยู่แล้ว - ควบคุมการโพลล์และความพร้อมกัน: โพลล์งานวิดีโอทุก 10–20 วินาที จำกัดจำนวนความพยายาม และจำกัดการทำงานพร้อมกัน ถอยหลังเมื่อเจอการตอบกลับ 429, 500 และ 503 แทนที่จะสร้างงานซ้ำ
- ตรวจสอบนโยบายโมเดลก่อนทุกคำขอ: เก็บ allowlist ตามประเภทสื่อ รีเฟรชความพร้อมใช้งานของโมเดลและราคาโดยอิงจากไดเรกทอรีแบบ live ตามตารางเวลา แต่ปรับใช้การเปลี่ยนโมเดลผ่านการรีวิวแทนการปล่อยให้ผู้ใช้สเปรดชีตส่ง ID ตามใจ
- ติดตามต้นทุนต่อหนึ่งงาน: จัดเก็บโมเดล ความละเอียด ระยะเวลา และฟิลด์การใช้งานกับผลลัพธ์แต่ละรายการ งาน Seedance 2.5 ความยาว 4 วินาทีที่ 720p อยู่ที่ประมาณ $0.924 ตามอัตราที่ระบุ ณ 11 สิงหาคม 2026; ความยาวเดียวกันที่ 480p อยู่ที่ประมาณ $0.412 บังคับใช้ระยะเวลาและความละเอียดสูงสุดก่อนส่งคำขอ
- โฮสต์สื่อที่สร้างขึ้นใหม่: ปฏิบัติต่อ URL ที่ลงชื่อจากผู้ให้บริการเป็นลิงก์ส่งมอบ ไม่ใช่ที่จัดเก็บถาวร ดาวน์โหลดสื่อที่เสร็จแล้ว อัปโหลดไปยังบัคเก็ตที่คุณควบคุม และบันทึก URL ที่ทนทานพร้อมเช็คซัม
- เก็บร่องรอยการตรวจสอบ: จัดเก็บโมเดลคำขอ พารามิเตอร์ที่ sanitize แล้ว task ID การเปลี่ยนสถานะ จำนวนการลองใหม่ เวลาตอบสนอง และตำแหน่งสินทรัพย์สุดท้าย อย่าบันทึกคีย์ API หรือพรอมต์ส่วนตัวแบบเต็ม
ทำไมรูปแบบนี้จึงขยายได้
เวิร์กโฟลว์ยังคงเรียบง่ายเพราะผู้ให้บริการหรือโมเดลใหม่แต่ละตัวเป็นเพียงการตัดสินใจด้านการกำหนดเส้นทาง ไม่ใช่การบูรณาการบัญชีใหม่ สเปรดชีตยังคงเป็นคิวงาน n8n ยังเป็นเลเยอร์ออร์เคสเตรชัน และ CometAPI ยังเป็นเลเยอร์การเข้าถึงเดียว เพิ่มโมเดลด้วยการขยาย allowlist และการกำหนดค่ากิ่งก้าน; ขณะที่ทริกเกอร์ การคงอยู่ของงาน การโพลล์ การจัดเก็บ และตรรกะการมอนิเตอร์ยังคงไม่เปลี่ยนแปลง
นี่คือคำตอบเชิงปฏิบัติสำหรับการบูรณาการ AI หลายผู้ให้บริการ: เอ็นด์พอยต์และคีย์เดียวที่ควบคุมได้ การกำหนดเส้นทางโมเดลอย่างชัดเจน แยกเส้นทางซิงก์และอะซิงก์ และบันทึกที่คงทนสำหรับทุกงาน
คำถามที่พบบ่อย
คำถาม: n8n สามารถเรียกผู้ให้บริการ AI หลายรายผ่าน API เดียวได้ไหม?
คำตอบ: ได้ ด้วยเลเยอร์ API แบบรวม เช่น CometAPI n8n สามารถส่งคำขอไปยังโมเดลที่รองรับต่างๆ ได้ ขณะเก็บ Credential ของผู้ให้บริการและการรวม HTTP ไว้ศูนย์กลาง
คำถาม: ฉันสามารถใช้ CometAPI กับโหนด HTTP Request ของ n8n ได้ไหม?
คำตอบ: ได้ โหนด HTTP Request สามารถส่งคำขอไปยังเอ็นด์พอยต์ของ CometAPI พร้อมการรับรองความถูกต้องและพารามิเตอร์เฉพาะโมเดลที่ต้องการ
คำถาม: n8n สามารถสลับโมเดล AI อัตโนมัติเมื่อโมเดลหนึ่งล้มเหลวได้ไหม?
คำตอบ: ได้ ใช้แขนง IF/Switch หลังคำขอ API และกำหนดเส้นทางความล้มเหลวที่ลองใหม่ได้หรือเฉพาะโมเดลไปยังโมเดลสำรอง โมเดลสำรองควรรองรับโมดาลิตี้และความสามารถที่จำเป็นเหมือนกัน
