Pipeline serverless su Val Town che orchestra l'editing video professionale tramite AI: upload diretto del filmato, trascrizione con Whisper, proposta di montaggio generata da un LLM (flusso assistito con approvazione) o rendering diretto da una timeline JSON (flusso direct), e consegna del video pronto via Shotstack.
Rendering mermaid diagram...
main.ts— router HTTP (Hono): API REST, webhook, media host.lib/db.ts— state machine dei job su SQLite (project-scoped).lib/transcribe.ts— Whisper via URL (Groq default, fallback OpenAI), con timestamp.lib/director.ts— LLM che individua i momenti migliori e genera la timeline Shotstack.lib/renderer.ts— client Shotstack (submit + poll); provider astratto per Creatomate.lib/pipeline.ts— orchestrazione (analisi, render, reconcile, notifiche).lib/notify.ts— notifiche Slack / Discord / Telegram / webhook generico.cron.ts— reconcile dei render attivi + retry analisi impantanate.
| Metodo | Route | Descrizione |
|---|---|---|
| POST | /jobs | Crea un job (multipart: file, mode, instructions, timeline). |
| GET | /jobs | Elenca gli ultimi 50 job. |
| GET | /jobs/:id | Stato del job. |
| GET | /jobs/:id/proposal | Proposta di montaggio (summary, hooks, sottotitoli, timeline). |
| POST | /jobs/:id/approve | Approva la proposta → avvia il rendering. |
| POST | /jobs/:id/decline | Declina la proposta. |
| POST | /jobs/:id/cancel | Annulla un job in coda/rendering/analisi. |
| POST | /jobs/:id/retry | Re-avvia analisi/render dopo un errore. |
| GET | /media/:id/source | Servirà il video sorgente (media host). |
| GET | /media/:id/output | Servirà il video renderizzato. |
| POST | /webhooks/render | Callback readiness → reconcile su richiesta. |
| GET | /health | Health check. |
created → analyzing → proposal → (approve) → queued → rendering → done
created → (direct) → queued → rendering → done
proposal → (decline) → declined · … → failed · … → cancelled
Env var del val. Impostane almeno GROQ_API_KEY (trascrizione) e SHOTSTACK_API_KEY (render).
- 👉 Aggiungi
GROQ_API_KEYqui: https://www.val.town/x/boh/ai-video-editor/environment-variables?key=GROQ_API_KEY - 👉 Aggiungi
SHOTSTACK_API_KEYqui: https://www.val.town/x/boh/ai-video-editor/environment-variables?key=SHOTSTACK_API_KEY SHOTSTACK_STAGE=prodper usare credits reali (default: sandbox/stage, gratuita e watermarked).AI_API_KEY/AI_MODEL/AI_BASE_URL— override per l'LLM del regista (default: key OpenAI/Groq,gpt-4o-mini/llama-3.3-70b-versatile).- Notifiche (optional):
SLACK_WEBHOOK_URL,DISCORD_WEBHOOK_URL,TELEGRAM_BOT_TOKEN+TELEGRAM_CHAT_ID,GENERIC_WEBHOOK_URL.
Upload diretto in modalità assistita (il backup consiglia e attende approvazione):
curl -X POST https://ai-video-editor.val.run/jobs \ -F "file=@boh/export.mp4" \ -F "mode=assisted" \ -F "instructions=Mantieni solo i momenti più energici, max 60 secondi, aggiungi sottotitoli"
Verifica proposta e approva:
curl https://ai-video-editor.val.run/jobs/<id>/proposal curl -X POST https://ai-video-editor.val.run/jobs/<id>/approve
Rendering diretto da timeline JSON (v. schema Shotstack):
curl -X POST https://ai-video-editor.val.run/jobs \ -F "file=@clip.mp4" \ -F "mode=direct" \ -F 'timeline={"timeline":{"background":"#000","tracks":[{"clips":[{"asset":{"type":"video","src":"SOURCE_URL"},"start":0,"length":10}]}]},"output":{"format":"mp4","resolution":"sd"}}'
Il
srcdella timeline viene sovrascritto automaticamente con l'URL del media host, quindi puoi inserire un placeholder.
- Blob free tier: 10 MB — i video oltre questa soglia richiedono Pro (1 GB). Per la sandbox ok.
- L'URL temporaneo di Shotstack scade dopo 24 h: la copia duplicata su blob hostato in
GET /media/:id/outputne garantisce disponibilità. - Cron minimo su free tier = 15 min: il reconcile in produzione su Pro può scendere a ogni minuto (Shotstack espone comunque webhook
serve). - Non usare WebSocket: il flusso è polling + webhook.
Il val è già pronto come backend azionabile via webhook/bot (Discord/Telegram/Slack):
la pipeline espone endpoint idempotenti e notifiche per canale. Con boh/bubble hai anche un
frontend a cui collegare la creazione job via HTTP.