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).
GROQ_API_KEY qui: https://www.val.town/x/boh/ai-video-editor/environment-variables?key=GROQ_API_KEYSHOTSTACK_API_KEY qui: https://www.val.town/x/boh/ai-video-editor/environment-variables?key=SHOTSTACK_API_KEYSHOTSTACK_STAGE= prod per 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).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.
GET /media/:id/output ne garantisce disponibilità.serve).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.