Install
openclaw skills install @beatra-ai/airbnb-welcome-avatarTurn authorized host or room stills and confirmed stay facts into one homestay welcome talking clip per still. This homestay welcome talking-clip studio writes a speakable check-in and amenity script, then animates each still into a 2–15s welcome or facility clip in stay order. Use it for homestay welcome videos, Airbnb check-in greetings, amenity explainers, and guest arrival talking clips that stay one photo, one clip.
openclaw skills install @beatra-ai/airbnb-welcome-avatarTurn authorized stills and confirmed stay facts into one welcome or amenity talking clip per still. Deliver the clips in stay order. Do not stitch them.
Use this Skill when a host or property manager wants check-in welcome and facility talking clips from stills they can authorize.
Route silent labeled room clips to listing-room-video-pack. Route a
generic presenter clip that is not a stay welcome to
talking-avatar-video. Route hiring videos to hiring-avatar-studio.
Route an overnight livestream avatar to unattended-live-avatar. Route
a buyer walk-in talking tour to rental-walkin-avatar when that
package is public.
The hard inputs are:
Do not invent house rules, fees, lockbox codes, or amenities that are
not in the stills or the host's facts. Reuse language, stay order, and
a frozen voice_id from earlier clips for the same listing. Default to
one beatra.videos.animate call per still, model: "auto", the still
as the strict first frame, and a source-derived aspect ratio. Ask only
for a missing hard input.
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 speech production card
before any speech client_request_id or beatra.speech.synthesize
call. Submit exactly once per slot. Poll with beatra.tasks.get
until terminal and read actual task.output.audio.mime_type,
duration_seconds, and size_bytes. Never treat a script preview
as the audio review.beatra.models.list with {"capability":"image_to_video"}.
Confirm a current card admits [image, driving_audio]. Compare
every image fact and the real audio MIME, duration, and byte size
with advertised constraints. Live driving-audio i2v SKUs are 2–15s.
If a spoken slot is longer than the longest containable clip, split
it into sequential containable segments. Each segment is its own
paid speech call and its own paid video call, each with a new
client_request_id. Do not shorten words to cheapen a clip. Do not
silently change the audio format. 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,
approved still and speech artifacts, prompt, audio-led 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. Approved narration does not authorize the video call.beatra.videos.animate exactly once per approved audio
segment through bundled scripts/mcp_client.py. 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.billing.net_charged_credits. Review likeness, spoken
facts, and must-keep drift. Never invent a stitch, concat, or
editor tool.Planning, the stay-order storyboard, and live price quotes are free. They are not approval.
Speech synthesis and video animate each need their own current production card. Likeness and voice rights are a hard stop, not a card. File access is not consent.
Before every paid call, show a current production card and wait:
client_request_id per call. If prompt,
file, model, or controls change, mint a new ID.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. A changed script,
still, voice, duration, or model is new work and a new card.
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