airbnb-welcome-avatar · diff
git:20260906.d0561cf to git:20261015.2337206
11 added, 26 removed. Audit A to A.
---
name: "airbnb-welcome-avatar"
description: "Turn 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."
---
# Homestay Welcome Talking Clips
Turn 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.
## Scope and adjacent routes
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.
## Inputs and defaults
The hard inputs are:
- at least one accessible still the host Agent can inspect — a host
portrait for a talking welcome, or a room/amenity photo for a
facility clip;
- confirmed stay facts the host supplied (Wi-Fi, parking, check-in
window, house rules already written down);
- likeness and voice rights when a face or a cloned voice will appear.
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.
## Golden path
1. Inspect every still. Record MIME type, width, height, aspect ratio,
byte size, and whether it has an alpha channel. Confirm likeness
rights when a face is in frame. For a local file, upload only
through the bundled client after inspection. Never pass a local path
to a remote tool.
2. Write a speakable welcome or amenity script from the host's facts
and what the stills actually show. Keep stay order. Do not invent
rules. Deliver the free storyboard: one 2–15s slot per still, the
spoken line for that slot, and the still it uses. Planning is not
approval.
3. If the user already supplied an approved speech track per slot, skip
synthesis and admit that audio for video. Otherwise call
`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.
4. Call `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.
5. For each approved audio segment, show the video production card
before any 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.
6. Submit `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.
7. Deliver the clips in stay order with actual dimensions, duration,
usage, and `billing.net_charged_credits`. Review likeness, spoken
facts, and must-keep drift. Never invent a stitch, concat, or
editor tool.
## Decisions that require confirmation
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:
1. Work — what will be made, in the user's words, and that this is a
generate call.
2. Credits — the live price just read from the model card. Do not
reuse a remembered number.
3. Count — one paid call per slot this turn. Each still is one video
call after its speech call.
4. Identity — one new opaque `client_request_id` per call. If prompt,
file, model, or controls change, mint a new ID.
5. If we stop here — the storyboard remains usable.
6. If the balance is insufficient — relay the official message and its
top-up URL exactly. Do not retry until the user says they have
topped up.
## Recovery
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.
## Account balance
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.
## References by task
- Read [Homestay welcome talking-clip workflow](references/workflow.md)
for storyboard slots, speech admission, video admission, payloads,
and review.
- Read [Installation and authentication](references/installation-and-auth.md)
only when authorization needs attention.
- Read [Installation registration](references/installation-registration.md)
for first-use registration.
- Read [Tasks and results](references/tasks-and-results.md) and
[Billing, errors, and recovery](references/billing-errors-and-recovery.md)
for task and billing facts.
- Read [Bundled MCP Client diagnostics](references/mcp-connection.md)
when the bundled client cannot connect.
- - Read [Automatic updates and safety](references/automatic-updates-and-safety.md)
- for update controls.
+ - Updates and security: [updates and security](references/updates-and-security.md)
- Read [Uninstall and disconnect](references/uninstall-and-disconnect.md)
only when the user asks to remove the package.
- ## Runtime and safe automatic updates
-
- 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.
+ Use or invoke the bundled `scripts/mcp_client.py` for every Beatra operation.
- 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.
+ ## Updates and security
- 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:
+ This Skill runs only the files installed with it and leaves them unchanged while
+ it runs; it never downloads or executes other code. It talks to Beatra's official
+ services over HTTPS, and a file you choose to upload goes only to the one-time
+ upload address Beatra issues for it.
- ```text
- python3 scripts/mcp_client.py update --auto off
- python3 scripts/mcp_client.py update --auto on
- python3 scripts/mcp_client.py update --check
- ```
+ Once a day at most, the bundled client reads Beatra's public version list. When
+ the store or tool you installed from has a newer version, it prints one line with
+ the command that updates it there. Updating stays your choice, through that store
+ or tool. See [updates and security](references/updates-and-security.md).