Install
openclaw skills install @beatra-ai/listing-room-video-packTurn listing photos into a labeled set of listing room video clips, one room at a time. This listing video pack and real estate room video studio animates each listing photo into a short property video so buyers can preview the living room, bedroom, kitchen, and more as separate room clips. Use it for property room video, listing photo video, real estate listing video, and a labeled room video pack that keeps each space easy to scan. Add optional agent narration files beside the clips, or a talking-head intro and outro when you bring an agent portrait and a short script.
openclaw skills install @beatra-ai/listing-room-video-packTurn listing photos into a labeled set of room clips. Each room photo becomes its own short motion clip. Optional agent narration files sit beside those clips. An optional talking-head intro or outro is a separate product when the user brings an authorized agent portrait and script.
Use this Skill when an agent or listing team wants a labeled set of room clips from listing photos.
Route one product photo that should sell as one clip to
product-video-studio. Route a generic still that is not a listing
room to image-to-motion. Route weekly founder thought-leadership to
founder-ip-avatar-studio.
The primary deliverable is one labeled clip per room. Do not invent a stitch, concat, or editor tool.
The hard input is at least one accessible listing photo the host Agent can inspect. Ask only for a missing hard input.
Reuse known address, room labels, language, and destination. Default to
one beatra.videos.animate call per room, model: "auto", the photo as
the strict first frame, and a source-derived aspect ratio. Choose a
supported integer video duration in the 2–15s SKU range with the user.
Skip room labeling when the user already named each photo.
Optional second product: separate agent narration files via
beatra.speech.synthesize. Never mix those files into a room clip.
Optional third route: a talking-head listing intro or outro only when the
user brings an authorized agent portrait plus a script. Same likeness,
voice, audio-review, and video admission rules as
founder-ip-avatar-studio. Use a catalog voice unless the user already
has an approved speech track.
beatra.models.list with
{"capability":"image_to_text"}. Show the understand estimate
(currently 5 credits per admitted image, one to eight images per
call, each image no larger than 10 MiB) and one
client_request_id before beatra.images.understand. Submit exactly
once per batch, poll with beatra.tasks.get until terminal, and
label each photo from the returned text. Skip this step when labels
already exist.beatra.models.list with {"capability":"image_to_video"}.
Admit each photo against a current card that accepts a first-frame
image without driving audio. Compare every image fact with advertised
constraints. Confirm duration as a supported 2–15s SKU chosen with
the user. If any required media fact is unavailable or incompatible,
stop before video.client_request_id or beatra.videos.animate call: route
image_to_video, tool beatra.videos.animate, admitted photo,
prompt, chosen duration, resolution if set, output count,
provisional live estimate, the fact that the 600-credit signup gift
usually cannot start this video, and what happens if the balance is
short. Do not submit until the user confirms they have topped up or
already have enough credits. One animate per room. Do not attach
driving_audio on this primary route.beatra.videos.animate exactly once per admitted room photo.
Do not configure a host Beatra Connector. Do not use REST/OpenAPI as
a fallback. Poll each video task with beatra.tasks.get until
terminal.beatra.models.list with {"capability":"text_to_speech"} and
beatra.voices.list when a catalog voice still needs to be selected.
Never put a display name in voice. Show the narration arguments and
paid boundary. Freeze the script, voice, format, and one speech
client_request_id per file. Submit beatra.speech.synthesize
exactly once per file. Poll until terminal and read actual
task.output.audio.mime_type, duration_seconds, and size_bytes.
Deliver those audio files beside the room clips. Do not send them as
driving_audio on a room-photo animate call. There is no mix tool.[image, driving_audio] on a live card, synthesize or admit speech,
poll narration to terminal and read actual audio MIME, duration, and
size, then show a separate video admission card before any talking-
head client_request_id. Live driving-audio i2v (wan2.7-i2v) SKUs
are 2–15s. Split a script longer than one containable clip into
sequential segments. Each segment is its own paid speech call and
its own paid video call. Do not shorten words to cheapen a clip. Do
not silently change the audio format. Use the smallest supported
integer video duration at or above the actual speech length.
Approved narration does not authorize the video call.billing.net_charged_credits. Review room identity, motion, and
must-keep drift. Never invent a stitch, concat, or editor tool.Photo-motion admission, optional understand batches, optional narration, talking-head likeness and voice rights, and the talking-head video admission card each require their own confirmation.
Each paid stage has its own frozen payload and ID. Recover a lost create
response only with that stage's identical payload. Recover a lost task
ID through beatra.tasks.list and beatra.tasks.get. Call
beatra.tasks.cancel only when the user asks to cancel that stage; on
409 keep polling. On insufficient_balance, keep the top-up URL inside
the balance error exact and retry the same frozen ID only after the user
says they have topped up. If a create returns no task_id, do not poll;
reconcile before minting a new ID.
When the user asks how many credits remain or whether a live estimate fits,
call beatra.wallet.get. When they ask what was charged, call
beatra.wallet.ledger. Both are read-only. Do not invent an account-balance or
top-up tool. Do not make wallet.get a required step before every paid submit.
When a model card comes back carrying a top_up block, relay its tiers as the
card lists them and in that order. Do not rank them, do not talk one down, and
do not pick one for the user. Which tier suits them is their call, made on
the wallet page with the whole list in front of them. Never quote a tier from
memory.
Use or invoke the bundled scripts/mcp_client.py for every Beatra operation.
Before ordinary commands it silently checks for a newer release at most once
every 24 hours per installation. Silent checks are enabled by default, and a
newer release installs without separate confirmation.
The updater accepts only the fixed official discovery address and immutable Beatra CDN path embedded for this package, channel, and locale. It verifies the discovery data, archive, manifest, and every file's size and checksum before replacement. It replaces only package-owned files and rejects redirects, downgrades, wrong package/channel/locale/version data, unexpected URLs, unsafe archives, and files outside the owned destination.
Update checks, downloads, verification, replacement, rollback, and recovery fail open: the current installation remains usable and the user's original command continues. An update failure never authorizes retrying a paid generation. The automatic-update choice persists across later commands for this installation:
python3 scripts/mcp_client.py update --auto off
python3 scripts/mcp_client.py update --auto on
python3 scripts/mcp_client.py update --check