vidjutsu-clone
Recreate a TikTok video's motion on a new character end to end, driving only the VidJutsu API. Every step in this skill — download, cloneability check, character generation, starting-image generation, motion clone, and status poll — is a deterministic VidJutsu endpoint. VidJutsu holds the WaveSpeed and Gemini credentials on its own side; you never see or hold them.
When to invoke
- The user has a TikTok URL and wants that video's motion recreated on a different character (a new face/persona doing the same moves, same sound)
- They want the full chain run for them — download through a finished, hosted video URL — without touching a provider SDK directly
- The source clip is 15 seconds or shorter (VidJutsu caps clone sources at 15s)
This is not the same job as clone-ad (sibling skill, same repo). clone-ad
clones an ad's pacing and shot structure for a different product using
Gemini + Wavespeed directly, producing a fresh multi-shot 15s spot.
vidjutsu-clone clones a single performer's motion from one source clip
onto one character image, through VidJutsu's motion-clone endpoints only. If
the user wants a multi-shot product ad, use clone-ad. If they want "make
this TikTok but with a different person doing it," use this skill.
Required environment variables
VIDJUTSU_API_KEY— required. This is the only key this skill uses. Set it once viavidjutsu auth(writes~/.vidjutsu/config.json) or export it asVIDJUTSU_API_KEYin the shell. Do not ask the user for a WaveSpeed key, a Gemini/GOOGLE_ key, or any other provider credential — VidJutsu's clone endpoints call those providers server-side under VidJutsu's own request-scoped credentials and never expose them to the caller.
Stop before running anything if VIDJUTSU_API_KEY isn't set. Point the user
to curl -fsSL https://vidjutsu.ai/install.sh | bash followed by
vidjutsu subscribe --email you@example.com (see below) rather than
attempting a partial run.
Output
Save the download source, character image, starting image, and final clone
video URL as a JSON manifest under CWD/vidjutsu-clone-<timestamp>/result.json
so a run is never overwritten and outputs are easy to find and clean up.
Primary path: the CLI (vidjutsu clone run)
Prefer this. It is the same deterministic chain described below, wrapped in one command:
vidjutsu clone run "https://www.tiktok.com/@handle/video/1234567890" \
--character-prompt "A neutral, camera-ready presenter" \
--model kling
What it does, in order:
POST /v1/videos/download/tiktok— pulls the TikTok video onto VidJutsu's CDN and returns a stableurl+assetId.POST /v1/clones/check— scores cloneability. Prints the verdict, a 0–100 score, and evidence. If the verdict isweak, the command stops before spending anything on generation and exits nonzero. Pass--forceonly if the user explicitly wants to proceed anyway, and say so out loud — a weak verdict means the clone is unlikely to look good.POST /v1/characters— generates a reusable character identity image from--character-prompt(default: "A neutral, camera-ready presenter" if the user hasn't described one).POST /v1/clones/starting-image— composes a clean, text-free opening frame that swaps the character into the source video's framing and pose.POST /v1/clones/video— submits the motion clone. Kling motion control is the default model (puppets the character image with the source video's motion, keeps the original sound). Pass--model seedancefor the alternate model (480p, 9:16, VidJutsu can rewrite the prompt).- Polls
GET /v1/clones/video/{id}untilstatusiscompleted(orfailed), then prints the finalvideoUrl.
Install if the CLI isn't present yet:
curl -fsSL https://vidjutsu.ai/install.sh | bash
vidjutsu subscribe --email you@example.com # only if not already subscribed
The CLI resolves the key from VIDJUTSU_API_KEY, then
~/.vidjutsu/config.json — nothing else to configure.
Fallback path: raw curl chain
Use this only if the CLI isn't installed and installing it isn't an option.
Every call needs Authorization: Bearer $VIDJUTSU_API_KEY.
# 1. Download the TikTok source onto VidJutsu's CDN
download=$(curl -fsS -X POST https://api.vidjutsu.ai/v1/videos/download/tiktok \
-H "Authorization: Bearer $VIDJUTSU_API_KEY" -H "Content-Type: application/json" \
-d "{\"url\":\"$TIKTOK_URL\"}")
source_url=$(echo "$download" | jq -r '.url')
# 2. Cloneability check — branch on the verdict before spending on generation
check=$(curl -fsS -X POST https://api.vidjutsu.ai/v1/clones/check \
-H "Authorization: Bearer $VIDJUTSU_API_KEY" -H "Content-Type: application/json" \
-d "{\"videoUrl\":\"$source_url\"}")
verdict=$(echo "$check" | jq -r '.verdict')
if [ "$verdict" = "weak" ]; then
echo "Cloneability verdict is weak — stopping. Evidence:"
echo "$check" | jq -r '.evidence[]'
exit 1
fi
# 3. Generate the character
character=$(curl -fsS -X POST https://api.vidjutsu.ai/v1/characters \
-H "Authorization: Bearer $VIDJUTSU_API_KEY" -H "Content-Type: application/json" \
-d "{\"prompt\":\"A neutral, camera-ready presenter\"}")
character_url=$(echo "$character" | jq -r '.imageUrl')
# 4. Generate the starting image (character swapped into the source framing)
starting=$(curl -fsS -X POST https://api.vidjutsu.ai/v1/clones/starting-image \
-H "Authorization: Bearer $VIDJUTSU_API_KEY" -H "Content-Type: application/json" \
-d "{\"characterImageUrl\":\"$character_url\",\"prompt\":\"Match the framing and pose of the source video's opening frame\",\"sourceVideoUrl\":\"$source_url\"}")
starting_url=$(echo "$starting" | jq -r '.imageUrl')
# 5. Submit the motion clone (kling is the default model; pass "model":"seedance" for the alternate)
submit=$(curl -fsS -X POST https://api.vidjutsu.ai/v1/clones/video \
-H "Authorization: Bearer $VIDJUTSU_API_KEY" -H "Content-Type: application/json" \
-d "{\"startingImageUrl\":\"$starting_url\",\"sourceVideoUrl\":\"$source_url\",\"model\":\"kling\"}")
task_id=$(echo "$submit" | jq -r '.id')
# 6. Poll to completion
while true; do
status=$(curl -fsS https://api.vidjutsu.ai/v1/clones/video/$task_id \
-H "Authorization: Bearer $VIDJUTSU_API_KEY")
state=$(echo "$status" | jq -r '.status')
[ "$state" = "completed" ] && { echo "$status" | jq -r '.videoUrl'; break; }
[ "$state" = "failed" ] && { echo "$status" | jq -r '.error'; exit 1; }
sleep 3
done
Do not poll in a tight loop with no delay — 3s between checks is enough and avoids hammering the endpoint.
Model choice
- Kling motion control (default) — puppets the character with the source's motion and keeps the original audio untouched. Preserve its output exactly as returned; don't resize, transcode, or otherwise normalize the pixels.
- Seedance (alternate,
--model seedance) — video-edit model, submitted at 480p / 9:16. Accepts an optional prompt override for the identity swap if the default composition instruction isn't specific enough.
Don't switch models mid-run once one has been picked — regenerating with a different model after a failure should be a deliberate retry, not a silent fallback.
Constraints
- Source clips are capped at 15 seconds. Longer TikToks will fail the download or check step — tell the user to trim first if their source is longer.
- Stop on a weak cloneability verdict. Don't spend on character,
starting-image, or video generation past a
weakverdict unless the user has explicitly said to proceed anyway. - One motion-clone attempt at a time per source. If a clone comes back wrong, retry the same model at most twice before telling the user it isn't working and asking how they want to proceed — don't loop indefinitely.
Cost
Every call in this chain — download, check, character, starting-image,
video, and the status poll — is metered against your VidJutsu account, not
billed separately per provider. VidJutsu is a flat monthly subscription with
per-endpoint daily rate limits (reset 00:00 UTC), not a pay-per-call credit
system. GET /v1/pricing (or vidjutsu pricing if the CLI exposes it) is
the current source of truth for the subscription price and daily limits per
endpoint — check it before running this at volume so you don't hit a 429
mid-chain. Status polls (GET /v1/clones/video/{id}) are not billed.
The chain takes about 5 minutes end to end once submitted, mostly waiting on the motion-clone step.
No provider keys, ever
This skill talks to api.vidjutsu.ai only, authenticated with
VIDJUTSU_API_KEY. VidJutsu's clone endpoints call WaveSpeed (character and
starting-image generation, Kling/Seedance motion clone) and other model
providers on its own side, using its own request-scoped credentials. Never
ask the user to set WAVESPEED_API_KEY, GEMINI_API_KEY, a GOOGLE_*
variable, or any other provider key for this skill — if a step ever appears
to need one, that's a sign the wrong endpoint is being called.