The Video Studio integrates PraisonAI Video as an external Node render engine. PraisonAIUI provides the dashboard shell, project files, YAML editor, job UX, and HTTP proxying. The video engine handles parse, compile, lint, and MP4 export. Agents live in PraisonAI (Chat + tools), not inside the renderer.
1. Install PraisonAI Video CLI (praisonai-video) or run from the monorepo.
praisonai-video
2. Start the engine sidecar (recommended):
3. Run the example app:
Open the Video tab, create a project, edit scene.yaml, and use Lint / Render.
scene.yaml
For Chat to edit scenes, install praisonaiagents and set OPENAI_API_KEY. Optional: VIDEO_STUDIO_PROJECT_ID to target a specific project.
praisonaiagents
OPENAI_API_KEY
VIDEO_STUDIO_PROJECT_ID
| Variable | Default | Purpose |
|----------|---------|---------|
| VIDEO_ENGINE_URL | http://127.0.0.1:3921 | HTTP API base URL |
VIDEO_ENGINE_URL
http://127.0.0.1:3921
| VIDEO_ENGINE_TOKEN | (none) | Optional Bearer token forwarded to the engine |
VIDEO_ENGINE_TOKEN
| PRAISONAI_PROJECTS_DIR | ~/.praisonai/projects | On-disk project roots |
PRAISONAI_PROJECTS_DIR
~/.praisonai/projects
| PRAISONAI_VIDEO_CLI | (auto-detect) | Path to praisonai-video or dist/cli.js for subprocess fallback |
PRAISONAI_VIDEO_CLI
dist/cli.js
| VIDEO_STUDIO_PROJECT_ID | (auto) | Active project for agent tools when not passed explicitly |
| PRAISONAI_MODEL | gpt-4o-mini | LLM for Video Editor agent in the example app |
PRAISONAI_MODEL
gpt-4o-mini
Python API:
Each project is a directory containing:
scene.visual-test.yaml
.praisonai/project.json
exports/
All routes are under /api/video/:
/api/video/
GET /health
POST /lint
POST /compile
GET /preview-url
POST /preview/start
POST /render
type: video_render
backend
playwright
remotion
render.backend
GET /jobs/{id}
GET|POST /projects
GET /projects/{id}/studio-refresh
refresh: true
When the HTTP sidecar is unavailable, lint and render fall back to subprocess calls to praisonai-video.
The UI lives in dashboard-plugins/video-studio/ (built-in) or ~/.praisonai/dashboard-plugins/video-studio/ for overrides. It uses window.aiui.sdk.fetchJSON.
dashboard-plugins/video-studio/
~/.praisonai/dashboard-plugins/video-studio/
window.aiui.sdk.fetchJSON
Frame-by-frame composition preview is hidden in the dashboard (SHOW_COMPOSITION_PREVIEW = false) until serve preview + seek are reliable. Use Render MP4 and the Your video player for output. Set the flag to true in index.js to re-enable the optional iframe scrubber.
SHOW_COMPOSITION_PREVIEW = false
true
index.js
After agent tool writes, the editor reloads via video-studio:refresh (custom event) or polling studio-refresh.
video-studio:refresh
studio-refresh
1. Open Chat with the Video Editor agent (example app registers tools when praisonaiagents is installed).
2. Agent calls video_get_scene / video_update_scene / video_lint_scene / video_render_project (same outcomes as UI buttons).
video_get_scene
video_update_scene
video_lint_scene
video_render_project
3. Video Studio tab picks up changes automatically.
Tools are defined in praisonaiui/video_agent_tools.py. For Cursor/Codex outside the UI, use the skill at skills/praisonai-video/SKILL.md in the PraisonAI Video repo.
praisonaiui/video_agent_tools.py
skills/praisonai-video/SKILL.md
Default is Playwright (no render: block in scene.yaml). Use Remotion only when required:
render:
video_render_project(backend="playwright") overrides YAML for one agent run. Hyperframes is deferred.
video_render_project(backend="playwright")
The text box edits the same scene.yaml the CLI uses. Equivalent commands (from the video repo):
Lint editor text without saving: praisonai-video lint --stdin < scene.yaml
praisonai-video lint --stdin < scene.yaml
See docs/integrations/praisonaiui.md in the PraisonAI Video repo for the full mapping table.
docs/integrations/praisonaiui.md
registerView
@aiui.page