video-batch-runner
Video Batch Runner
Follow shared release-shell rules in:
postplus-sharedrelease-shell rules
Use this skill after image, script, voice, or prompt-planning work already exists.
This skill is for:
- generating talking-head videos from approved image and audio inputs
- generating Seedance videos from text, images, videos, audio references, or first/last frames
- storing render jobs as local assets with normalized manifests
- preserving traceability from final video back to persona, concept, script, and voice take
- keeping render providers replaceable behind a stable adapter contract
This skill is not for unconstrained video ideation.
Quality Default
When the goal is believable human video, default to the highest practical render quality the provider offers.
Default quality assumption:
- lower render quality can make already-imperfect source faces look more fake
- realism-sensitive talking-head jobs should start from the best available resolution before blaming script or voice
- only step down when the user is explicitly running a cheap draft, a latency test, or a provider-limited experiment
The selected resolution should always be persisted in the request and manifest.
Core Idea
The video layer should be organized around render objects, not around one provider endpoint.
Treat a video render as:
render job- one attempt to produce a video from approved upstream assets
render manifest- the normalized local record of that attempt
video asset- the downloaded output file(s) produced by the render
The main value is not "image plus audio becomes video". The main value is preserving the chain:
campaignconceptpersonascriptvoice takeimage assetrender jobqa report
Fact Rule
Video render inputs must be grounded in approved upstream assets or an explicit prompt plan.
Required upstream inputs depend on route:
talking-head- approved image asset
- approved voice take
- script or concept reference
- render purpose
- local output directory
ark / seedance- prompt or
promptPlan - any required media refs for the chosen mode
- concept reference
- render purpose
- local output directory
- prompt or
Do not let the render stage silently redefine:
- who the persona is
- how the voice should sound
- what the concept is trying to test
If the request is experimenting with a new render style, record that as an explicit render variant.
Source Selection Rule
Start from the active project's approved upstream assets and manifests.
If a current task clearly belongs to one project or client folder, stay within that context first.
Do not assume one client directory is the default home for all renders.
Video Routes
Current routes:
talking-head- model: hosted talking-head capability
- category: image-to-video digital human
seedance(hosted)- endpoint keys:
video-seedance-2-image,video-seedance-2-image-turbo,video-seedance-2-text,video-seedance-2-text-turbo - category: text/image/reference-media to video
- endpoint keys:
ark- direct workspace route for internal video/audio workflows
- category: text/image/video/audio to video
Read references/hosted-video-talking-head.md before implementation or request design.
Read references/hosted-video-generative.md before designing hosted Seedance requests.
Read references/volcengine-seedance-2.md before designing Seedance requests.
If the project should keep related image, audio, and video files under one asset root, use the shared asset model in ../image-batch-runner/references/unified-asset-contract-v1.md.
Hosted Boundary Rule
- keep request files, raw provider responses, and polling state under
<work-folder>/.postplus/video-batch-runner/when they are internal execution state - keep only final user-facing renders outside
.postplus/ - if hosted video capability is unavailable, unauthorized, or returns a stable network error, stop immediately instead of switching to ad hoc shell glue
Render Objects
1. Render Job
One request to a video provider.
Should include:
jobIdcampaignIdpersonaIdconceptIdscriptIdor source pathvoiceTakeIdimageAssetIdassetPurposeprovidermodelstatus
2. Render Manifest
The normalized local handoff object for later review.
Should include:
jobIdcampaignIdpersonaIdconceptIdprovidermodelrequestPathresponsePathpredictionIdproviderStatusassets[]sourceBasisupstreamRefs
3. Video Asset
One downloaded output.
Should include:
assetIdlocalPathremoteUrlmimeTypesourceBasiscreatedAt
Default Workflow
1. Lock the render brief
Before calling any provider, write down:
jobIdcampaignIdpersonaIdconceptIdscriptIdor script sourcevoiceTakeIdimageAssetIdassetPurposetalking_headsinging_avatarfirst_pass_renderrender_fix
sourceBasismustKeepcanVaryfeedback
2. Produce a normalized request record
The local request JSON should contain stable fields even if provider fields change later.
At minimum record:
- provider route
- model
- prompt or prompt plan
- media refs used by the route
- optional mask image
- resolution
- ratio when relevant
- duration or frames when relevant
- seed
- local output directory
When the provider exposes multiple resolution tiers, default to the highest practical tier for realism-sensitive renders.
3. Call the provider and save raw response
Always save:
request.jsonresponse.jsonmanifest.json- downloaded video files under
renders/
Do not use the provider response alone as the durable store.
4. Normalize local outputs
Every run should end with a local manifest containing:
- stable upstream refs
- provider ids
- local asset paths
- source basis
- feedback history
5. Hand off to human QA
Do not auto-approve a render.
The next stage is creative-qa, where a person may record:
- verdict
- what worked
- what failed
- which stage should be rerun
If there is no human feedback yet, the render can remain in review_pending.
Path Selection Rule
Write outputs into the active project's render structure when one already exists.
If no project structure exists yet, choose a clear workspace output path and make it visible in the task summary.
If the chosen location will become the long-term handoff point for a client, prefer confirming the destination with the user.
Example Persistence Convention
One possible project-local layout is:
videos/<job-id>/
request.json
response.json
manifest.json
renders/
qa/
Do not assume this example layout is the universal default.
Keep draft request files, raw provider responses, and polling state under
<work-folder>/.postplus/video-batch-runner/ when they are internal execution
artifacts rather than the final handoff.
Tool Contract
This skill expects these adapters:
generate_video_from_image_audiopoll_predictionfor async providers
For Seedance, the same generate_video_from_image_audio script is used as the normalized submit entrypoint even though the request may be text-to-video or multimodal; the route is chosen by provider.
The normalized request and manifest shapes live in references/tool-contracts.md.
Review Rule
Before calling a video provider, verify:
- for
talking-head, persona is approved - for
talking-head, image asset is approved - for
talking-head, voice take is approved - for
seedance(hosted), request mode is explicit and required media exists - for
ark, request mode is explicit - for
ark, media roles match the intended Seedance mode - for
ark, prompt or prompt plan is concrete enough to constrain the generation - render request is tied to a real concept or asset purpose
- local output path is explicit
After generation, review:
- lip sync acceptability
- persona continuity
- audio and image match
- TikTok-native feel
- ad-like drift
Failure Mode
Stop and say the request is under-specified if any of these are missing:
- for
talking-head, no approved image asset - for
talking-head, no approved voice take - for
seedance(hosted), no prompt or no required first image - for
ark, no prompt or no usablecontent - no asset purpose
- no source basis
- no local output path
Do not compensate for missing upstream approvals by letting the render model improvise.
Seedance Prompt Rule
For Seedance 2.0 work, prefer a structured prompt plan over a single dense paragraph.
The adapter accepts promptPlan and turns it into one compact prompt string in this order:
- subject + action
- scene / environment
- camera / shot / motion
- visual style / realism target
- sound intent
- continuity constraints
- must-keep
- must-avoid
- reference bindings such as
[图1]...,[图2]...
This is a better default than freehand adjective stacks.
Core Scripts
scripts/generate_video_from_image_audio.mjsscripts/poll_prediction.mjs
These scripts take normalized request JSON files and write:
request.jsonresponse.jsonmanifest.json- downloaded videos under
renders/
More from postplusai/postplus-skills
audio-transcription
Transcribe local or remote audio into durable text and timestamp artifacts using hosted Whisper models. Use this when the job is speech-to-text from audio files and you need request/response persistence, optional timestamps, and subtitle-ready outputs.
82google-trends-research
Research Google Trends search-intent signals for topic discovery, keyword momentum, regional interest, and rising queries without treating search trends as the same thing as platform content heat or marketplace demand.
77seedance-submitter
Use when preparing, submitting, polling, or debugging Seedance 2.0 video generation jobs from product images, storyboard images, UGC scripts, voiceover copy, or promptPlan request JSON. Use for splitting scripts into render segments, uploading references, creating request JSON, submitting jobs through the hosted capability, polling predictions, and handing off local render paths.
75social-media-publisher
Prepare and, after explicit approval, publish social posts through the PostPlus platform-owned Postiz workspace.
75facebook-research
Research Facebook pages, public follower or following surfaces, and public posts using hosted collection capability. Use this when the user wants Facebook account research, follower-surface sampling, or public post metrics.
75x-tools
Local execution tools for X/Twitter hosted collection workflows, including actor runs, dataset normalization, tweet ranking, account ranking, audience graph construction, and language clustering.
74