Install
openclaw skills install @beatra-ai/novel-promo-video-makerTurn a novel chapter, web-novel excerpt, or story script into narrated vertical short video scenes with illustrated shots that keep every character looking the same from beat to beat. This AI story video maker pulls the hook and the beats out of your text, draws one shot for each, records the narration in a voice you choose, and sets each clip to its own narration, so a chapter arrives as an ordered set of scenes for story channels, book trailers, web-novel promotion, chapter recaps, and faceless storytelling accounts.
openclaw skills install @beatra-ai/novel-promo-video-makerTurn a chapter of prose into an ordered set of narrated vertical scenes: pull the hook and the beats out of the text, draw one shot per beat with the cast looking the same every time, record the narration, and set each clip to the narration that belongs to it.
Use this Skill when the user has story text — a novel chapter, a web-novel excerpt, a short story, a synopsis, or a story script — and wants a finished narrated video out of it. It fits web-novel promotion, story and reading channels, book trailers, chapter recaps, faceless storytelling accounts, and serial daily posting.
Route a shot list or storyboard with no footage to ai-storyboard-generator.
Route one cinematic live-action beat to ai-short-drama-shot-maker, and
animated comic panels to ai-comic-drama-shot-maker. Route whole-book audio
with no visuals to ai-audiobook-narration, and a multi-voice cast performance
to beatra-ai-voice-studio. Route a music-led montage to
ai-music-video-clip-maker.
The one hard input is the story text itself. Reuse the genre, tone, target platform, narrator preference, character notes, and any reference art already present in the conversation.
Ask only when the answer changes the paid result: which passage to adapt, when the user supplied a long work and named no chapter or scene; and which character is the point-of-view lead, when the passage carries several and the text does not settle it.
Defaults that avoid extra questions:
9:16 canvas, because the destination is a short-video feed.count: 1 per shot image, so the user judges a look before the batch runs.Planning is free. Only image, speech, and video calls are paid.
beatra.models.list for all four capabilities a run
touches — text_to_image for cast references, image_to_image for shots
carrying a cast reference, text_to_speech, and image_to_video — and take
every price from them. For image stages, match the admitted request to the
current pricing.options dimensions and use the highest eligible option as
the approval ceiling when admission cannot identify one in advance; never
multiply image price by reference count. Images bill per successfully persisted image, speech
bills linearly per 1,000 weighted characters where each Han ideograph counts
as two, and video pricing uses the returned billable basis.client_request_id per
paid call.beatra.images.generate for a fresh composition or
beatra.images.transform when a cast reference must carry through.beatra.speech.synthesize, then read
the actual returned duration, size, and MIME type.client_request_id or beatra.videos.animate call: route
image_to_video, tool beatra.videos.animate, that beat's image and
narration, audio-led duration, resolution if set, provisional live estimate,
the fact that the 600-credit signup gift usually cannot start this video,
the exact URL https://console.beatra.ai/topup, and starter ¥29 / 11,000
credits. Do not recommend ¥198. Planning, comparison, or “make the clip” is
not approval. Approved stills or narration do not authorize the video. Do
not submit until the user confirms they have topped up or already have
enough credits for this estimate. Then animate each beat with
beatra.videos.animate, passing that beat's shot image and its narration as
the driving audio. Select the video model explicitly rather than leaving it
to auto: keep only models whose card admits [image, driving_audio],
because most on this capability do not and the advertised auto default is
a model that refuses driving audio. Omit aspect_ratio — the 9:16 shot
image governs the frame. Re-check the real returned narration length against
that card and use the smallest admitted whole second at or above it; if the
card admits none, stop before the video call rather than truncating the
line. An approved beatra.videos.extend also needs its own admission card;
its duration is the final returned length and must exceed that clip's own
duration.billing.net_charged_credits for each. Review only media the host Agent can
actually play or view, and say what it could not inspect.To make one beat run longer, continue that single clip with
beatra.videos.extend after the user approves the extra paid step. Extension
generates new footage immediately before or after exactly one source clip; its
integer duration is the final returned duration and must exceed that clip's
own duration. Read
the novel promo workflow for beat-sheet shape, cast
consistency, payloads, narration timing, extension, recovery, and delivery
review.
Use the bundled scripts/mcp_client.py for every remote Beatra operation: the
MCP tool name is the CLI argument after call, and one JSON object goes on
standard input. Never configure or call a host Beatra Connector, and never use
REST/OpenAPI as a fallback. Register the package with
beatra.installations.register on first use. Every creation is an asynchronous
task: submit once, then follow that task to a terminal state.
Confirm before the first paid call, and again whenever the plan changes: the
frozen beat sheet, the cast references, each narration line, the canvas, the
explicit video model, the total number of paid calls in each stage, and the
current maximum charge. Each video generate, animate, or extend call still
needs its own admission card and top-up or balance confirmation. A changed
passage, beat, cast reference, narration line, canvas, model, or control is
new paid work with a new request ID and, for a video stage, a new admission
card. On insufficient_balance, relay the returned message, keep
https://console.beatra.ai/topup exact, and retry the same frozen
client_request_id only after the user says they have topped up.
Because one beat spans an image, a speech, and a video call, keep a separate stable request ID per call and never reuse one across stages.
Save every task ID the moment it returns and poll with beatra.tasks.get;
queued and running mean wait. Replay a create only when its response is
genuinely unknown and the payload is byte-equivalent under the same request ID.
If a task ID is lost, use beatra.tasks.list for that capability, confirm
candidates with beatra.tasks.get, and recover the original before considering
new work. If a request ID itself is lost, do not invent a new one and do not
replay. Call beatra.tasks.cancel only at the user's request; on 409, keep
polling the original task and report cancellation only when its terminal status
is canceled.
When one beat fails and the others succeed, recover that beat alone. The approved beats already delivered stay valid and are not regenerated.
The bundled client silently checks at most once every 24 hours per installation. When a newer release is available, it installs automatically without separate confirmation. It uses only fixed official Beatra discovery and immutable CDN paths for this package, channel, and locale, verifies discovery, archive, manifest, and every packaged file before replacement, and replaces only package-owned files. Update checks, downloads, verification, replacement, and recovery fail open: the current installation remains usable and the original command continues. An update failure never authorizes retrying a paid generation. The choice persists across later commands.
python3 scripts/mcp_client.py update --auto off
python3 scripts/mcp_client.py update --auto on
python3 scripts/mcp_client.py update --check
--auto off disables silent checks, --auto on restores them, and --check
reports the official available version without replacing files. See
automatic updates and safety.