μ¬μ©μ 곡μ μλ£("무λ£μΈλ° 무μ νμΌλ‘ μΈ μ μλ AI μμ λꡬ 5κ°") κΈ°λ° GitHub μ΅μ μ‘°μ¬ + MCO μμ νμ΄νλΌμΈ ν΅ν©. μμ±: paperclip CEO λ³Έμ¬ /
/sprintμμCEO λͺ¨λ (2026-06-30). μμΉ(λ©λͺ¨λ¦¬): "κ²μ¦ν μ μμΌλ©΄ κ²μ¦ν μ μλ€κ³ μ΄μΌκΈ°. κ±°μ§ μμ± μ£Όμ₯ κΈμ§." β λ§μΌν 문ꡬ("λ¬΄λ£ λ¬΄μ ν")κ° μλλΌ μ€μ μλν κ°λ₯ν 곡μ API κΈ°μ€μΌλ‘ ν΅ν©.
| # | λꡬ | 곡μ API | MCO ν΅ν© λ°©μ | λ¬΄λ£ νλ (μ€μΈ‘ κΈ°μ€) |
|---|---|---|---|---|
| 1 | Qwen / Wan (Alibaba) | β DashScope REST | ν€-κ²μ΄νΈ μ΄λν° qwen-video.mjs |
μ κ· μμ 1,650μ΄ (μ±κ°ν¬λ₯΄ Intl, 90μΌ) β μ μΌν μ§μ§ λ¬΄λ£ μμ κ²½λ‘ (κ³μ μ€λͺ μΈμ¦ νμ) |
| 2 | BytePlus ModelArk (Seedance) | β ModelArk REST | ν€-κ²μ΄νΈ μ΄λν° byteplus-video.mjs |
π΄ μμ μ λ£(resource pack μ ꡬ맀). λ¬΄λ£ ν¬λ λ§μ LLM μ μ© β μ½μ μ€μΈ‘ νμ 2026-06-30 |
| 3 | Snapgen.ai / GeminiGen | β
REST (x-api-key) |
μ΄λν° snapgen-video.mjs β οΈμ€ν |
ν¬λ λ§μ (Veo/Sora 리μ λ¬) |
| 4 | Meta AI (Movie Gen / Vibes) | β μμ | ν둬ννΈ ν¬νΌ + μλ κ°μ΄λ | μΉ UI λ¬΄λ£ |
| 5 | TikTok Symphony | β οΈ μ΄λμ /κ΄κ³ κ³μ | ν둬ννΈ ν¬νΌ + μλ κ°μ΄λ | UI 무λ£(κ΄κ³ κ³μ νμ) |
κ²°λ‘ : 3κ°λ ν€λ§ λ£μΌλ©΄ μλ ν΅ν©(ν€-κ²μ΄νΈ λλ‘μΈ, ν€ μμΌλ©΄ κΈ°μ‘΄ fal κ²½λ‘λ‘ ν΄λ°± β νκ· 0). 2κ°(MetaΒ·TikTok)λ νΌλΈλ¦ APIκ° μμ΄ μ΅μ ν둬ννΈ μλ μμ± + λ¨κ³λ³ μλ κ°μ΄λλ‘ μ§μ.
νΈμΆλΆ βββΆ video-providers.generateVideo(spec)
β
ββ 무λ£-μ°μ μ²΄μΈ (VIDEO_PROVIDER_CHAIN=qwen,byteplus,snapgen)
β ββ ν€ μλ 첫 μ΄λν° μλ (MCSLA ν둬ννΈ κ°ν)
β
ββ μ λΆ ν€ μμ/μ€ν¨ β fal-video.generateVideo (Higgsfield β fal.ai μ’
λμ )
/opt/star365-hq/api/video-providers.mjs (PROVIDERS, providerStatus(), generateVideo(), helper.metaGuide()/tiktokGuide())video-util.mjs (ν€ν΄μΒ·νλ‘μ°¨λ¨Β·async poll β DRY)POST https://dashscope-intl.aliyuncs.com/api/v1/services/aigc/video-generation/video-synthesis β GET /api/v1/tasks/{id} ν΄λ§Authorization: Bearer sk-... + X-DashScope-Async: enablewan2.5-t2v-preview / wan2.2-t2v-plus λ± (env QWEN_T2V_MODEL λ‘ κ΅μ²΄)/root/.dashscope_key (ν μ€ sk-...) λλ env DASHSCOPE_API_KEYgithub.com/Wan-Video/Wan2.2 β λ¬΄λ£ μμ§ ν self-host/fal λ체 κ°λ₯. 곡μ SDK dashscope-sdk-nodejs.POST https://ark.ap-southeast.bytepluses.com/api/v3/contents/generations/tasks β GET .../{id} ν΄λ§Authorization: Bearer $ARK_API_KEYcontent λ°°μ΄(λ©ν°λͺ¨λ¬) β {type:'text'} + i2v μ {type:'image_url', role:'first_frame'}dreamina-seedance-2-0-fast-260128 / dreamina-seedance-2-0-260128/root/.byteplus_ark_key λλ env ARK_API_KEYbytedance/seedance-2.0 μ λμΌ λͺ¨λΈ.dreamina-seedance-2-0-fast-260128)λ μ ννλ, Seedance μμμ λ¬΄λ£ λΆκ° β resource pack μ ꡬ맀/κ²°μ μλ¨ νμ("No available resource packs"). BytePlus λ¬΄λ£ ν¬λ λ§μ LLM(Skylark/DeepSeek) μ μ©. μμμ fal Seedance(μ’
λμ , μ ꡬ맀 λΆμ)μ μ€λ³΅μ΄λΌ κ²°μ μ΄μ μ½ν¨. ν¨ν€μ§ ꡬ맀 μ μ΄λν° μ¦μ λμ.POST https://api.snapgen.ai/uapi/v1/generate (ν€λ x-api-key)/root/.snapgen_key λλ env SNAPGEN_API_KEYSNAPGEN_* env λ‘ λ³΄μ .helper.metaGuide({kind, prompt}) β MCSLA κ°ν ν둬ννΈ + meta.ai μΉ λ¨κ³λ³ κ°μ΄λ μμ±. λ΄λΉμκ° μΉ UI μ λΆμ¬ μμ± ν studio μ
λ‘λ.helper.tiktokGuide({prompt}) β 9:16 μνΌ μ΅μ ν둬ννΈ + Creative Studio λ¨κ³ κ°μ΄λ. κ΄κ³ κ³μ +Symphony μΉμΈ μ μμλ²μ/μλ°νλ Marketing API(github.com/tiktok/tiktok-business-api-sdk)λ‘ μλν κ°λ₯.import { generateVideo, providerStatus, helper } from '/opt/star365-hq/api/video-providers.mjs';
// 무λ£-μ°μ ν΅ν© λΌμ°ν° (dry κΈ°λ³Έ β κ³ΌκΈ 0, live:true λͺ
μν΄μΌ νΈμΆ)
const r = await generateVideo({ kind: 't2v', prompt: 'ν©κΈλΉ μΌλͺ° ν΄λ³', durationSec: 6 });
// ν€ 0κ° β routed_via:'fallback' (fal). Qwen ν€ μμΌλ©΄ β routed_via:'free-first', backend:'qwen'.
// κ°μ©μ± μ€λ
μ· (admin ν¨λ / MCP video_providers λκ΅¬κ° μλΉ)
providerStatus(); // [{id,name,tier,type,available,...}]
// μλ λꡬ ν둬ννΈ + κ°μ΄λ
helper.metaGuide({ kind:'t2v', prompt:'μ€ν365 μλ£ λΈλλ μμ' });
helper.tiktokGuide({ prompt:'μνΌ κ΄κ³ ' });
ν€ μΆκ° ν νμ±ν: ν΄λΉ ν€ νμΌ/env λ§ μ€μ νλ©΄ VIDEO_PROVIDER_CHAIN μμλλ‘ μλ μ°μ μ¬μ©. μ½λ λ³κ²½Β·μ¬λ°°ν¬ λΆνμ(μ΄λν°κ° λ°νμ ν€ μ¬ν΄μ reloadCredentials() μ§μ).
GET /api/video/providers (λ μ§μ€νΈλ¦¬ + κ°μ©μ±)video_providers μ½κΈ°μ μ© MCP λꡬ