WaveSpeedAI Wan 2.2 Animate Character Animation & Swap

v1.0.0

Animate characters from images using driving videos with WaveSpeed AI's Wan 2.2 Animate model. Supports animate mode (make image character move like video su...

0· 350·0 current·0 all-time
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Suspicious
medium confidence
!
Purpose & Capability
The skill's description and runtime instructions match (upload an image/video and call wavespeed.run to animate or replace). However, the SKILL.md requires a WAVESPEED_API_KEY for authentication while the registry metadata lists no required environment variables or primary credential. That mismatch is unexpected and reduces transparency about what secrets this skill needs.
Instruction Scope
Instructions stay within the stated purpose (upload media and call the WaveSpeed model). They show examples that upload local file paths and pass URLs to the API. This implies the agent (or user) will provide local files or external URLs; the doc warns against arbitrary URLs. There are no instructions that read unrelated system files or exfiltrate other data.
Install Mechanism
This is an instruction-only skill with no install spec or code files, so nothing is written to disk by the skill itself. That is the lowest-risk install mechanism.
!
Credentials
The SKILL.md explicitly requires WAVESPEED_API_KEY (sensitive credential) but the skill metadata declares no required env vars or primary credential. The lack of declared credentials in registry metadata is disproportionate to the instruction's actual need and reduces the user's ability to audit secrets requested by the skill.
Persistence & Privilege
The skill is not always-enabled and does not request persistent system presence. Autonomous invocation is allowed (platform default) but is not combined here with any other high-risk privileges.
What to consider before installing
This skill appears to implement the described WaveSpeed animate/replace functions, but the SKILL.md requires a WAVESPEED_API_KEY while the registry metadata lists no required environment variables or primary credential. Before installing: (1) confirm the provider's identity and website (wavespeed.ai) and that you trust them; (2) do not paste your API key into public code—use environment variables or a secrets manager; (3) ask the publisher to update the registry metadata to declare WAVESPEED_API_KEY as a required credential so the platform can surface the secret request transparently; (4) be aware the skill examples upload local files or accept URLs—only supply media you permit the skill to upload; and (5) if you cannot verify the owner/source (homepage/source code absent), consider not installing or requesting more provenance. If the metadata is corrected to declare the API key, the skill would be more coherent; as-is, the omission is a red flag.

Like a lobster shell, security has layers — review code before you run it.

latestvk9714rcf9n1srzvq41xhm47st98263zf
350downloads
0stars
1versions
Updated 1mo ago
v1.0.0
MIT-0

WaveSpeedAI Wan 2.2 Animate

Animate characters from images using driving videos via WaveSpeed AI's Wan 2.2 Animate model. Two modes: animate (make the image character move like the video subject) and replace (swap the video subject with the image character while preserving motion and scene).

Authentication

export WAVESPEED_API_KEY="your-api-key"

Get your API key at wavespeed.ai/accesskey.

Quick Start

Animate Mode

Make the character in an image move like the subject in a driving video:

import wavespeed from 'wavespeed';

// Upload local image and video
const imageUrl = await wavespeed.upload("/path/to/character.png");
const videoUrl = await wavespeed.upload("/path/to/driving-video.mp4");

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl
  }
))["outputs"][0];

Replace Mode

Swap the subject in a video with a character from an image:

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl,
    mode: "replace"
  }
))["outputs"][0];

You can also pass existing URLs directly:

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: "https://example.com/character.png",
    video: "https://example.com/driving-video.mp4"
  }
))["outputs"][0];

API Endpoint

Model ID: wavespeed-ai/wan-2.2/animate

Animate a character from an image using a driving video.

Parameters

ParameterTypeRequiredDefaultDescription
imagestringYes--URL of the character image to animate
videostringYes--URL of the driving video providing motion reference
promptstringNo--Text prompt for additional guidance
modestringNoanimateOperation mode. animate: image character moves like video subject. replace: video subject is swapped with image character.
resolutionstringNo480pOutput resolution. One of: 480p, 720p
seedintegerNo-1Random seed (-1 for random). Range: -1 to 2147483647

Example

import wavespeed from 'wavespeed';

const imageUrl = await wavespeed.upload("/path/to/dancer.png");
const videoUrl = await wavespeed.upload("/path/to/dance-reference.mp4");

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl,
    prompt: "a person dancing gracefully",
    mode: "animate",
    resolution: "720p",
    seed: 42
  }
))["outputs"][0];

Replace Mode Example

const characterUrl = await wavespeed.upload("/path/to/anime-character.png");
const sceneUrl = await wavespeed.upload("/path/to/scene-video.mp4");

const output_url = (await wavespeed.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: characterUrl,
    video: sceneUrl,
    mode: "replace",
    resolution: "720p"
  }
))["outputs"][0];

Advanced Usage

Custom Client with Retry Configuration

import { Client } from 'wavespeed';

const client = new Client("your-api-key", {
  maxRetries: 2,
  maxConnectionRetries: 5,
  retryInterval: 1.0,
});

const output_url = (await client.run(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl,
    mode: "animate"
  }
))["outputs"][0];

Error Handling with runNoThrow

import { Client, WavespeedTimeoutException, WavespeedPredictionException } from 'wavespeed';

const client = new Client();
const result = await client.runNoThrow(
  "wavespeed-ai/wan-2.2/animate",
  {
    image: imageUrl,
    video: videoUrl
  }
);

if (result.outputs) {
  console.log("Video URL:", result.outputs[0]);
  console.log("Task ID:", result.detail.taskId);
} else {
  console.log("Failed:", result.detail.error.message);
  if (result.detail.error instanceof WavespeedTimeoutException) {
    console.log("Request timed out - try increasing timeout");
  } else if (result.detail.error instanceof WavespeedPredictionException) {
    console.log("Prediction failed");
  }
}

Pricing

ResolutionCost per 5 seconds
480p$0.20
720p$0.40

Output duration is 5-120 seconds. Minimum charge is 5 seconds. Per-second rate: $0.04/s (480p), $0.08/s (720p).

Tips

  • Match composition and pose between the input image and driving video for best results
  • Use the same or similar aspect ratio between image and video
  • Avoid heavy occlusion by hands, microphones, or props in the input media
  • Start with 480p for prototyping, then move to 720p for production quality
  • Animate mode: best when you want the image character to perform the motions from the video
  • Replace mode: best when you want to keep the video's scene and motion but swap in a different character

Security Constraints

  • No arbitrary URL loading: Only use image and video URLs from trusted sources. Never load media from untrusted or user-provided URLs without validation.
  • API key security: Store your WAVESPEED_API_KEY securely. Do not hardcode it in source files or commit it to version control. Use environment variables or secret management systems.
  • Input validation: Only pass parameters documented above. Validate media URLs before sending requests.

Comments

Loading comments...