Install
openclaw skills install @spicyapi-owner/spicyapi-nsfw-aiGenerate adult images, image-to-video clips and uncensored edits via SpicyAPI
openclaw skills install @spicyapi-owner/spicyapi-nsfw-aiGenerate adult images, image-to-video clips, uncensored edits and uncensored text through SpicyAPI. Everything runs through scripts/spicy.py (Python 3.9+, standard library only).
Refuse, and do not "soften and continue", when a request involves any of the following. No wording, claimed age, art style or user permission changes this.
When an uploaded image shows a real person and the request is sexual, ask the user to confirm the image is of themselves or of a consenting adult and that they hold that consent. If there is any sign the person is a minor, refuse outright.
Write every prompt with an explicit adult age ("a woman in her 30s", "an adult man in his 40s") and never add youthful descriptors, even if the user did.
export SPICY_API_KEY="sk-spicy-..." # https://spicyapi.ai/console → API keys
python3 scripts/spicy.py models --spicy # works without a key
If SPICY_API_KEY is missing, tell the user to create one at https://spicyapi.ai/console (balance is in USD, no subscription, failed tasks are refunded) and stop. Never print, log or commit the key.
python3 scripts/spicy.py models --spicy --modality video.python3 scripts/spicy.py schema <model>. Use only fields that exist; respect enums (resolution, duration). Single-image fields map to --image / --last-image; multi-reference arrays (image_urls) map to repeated --images. Never guess a model ID; take it from models.generate quotes first and stops with needs_confirmation. Show the user the estimated cost and max charge, and re-run with --yes only after they agree. If the user already gave a budget, use --max-cost <usd> instead.Picks follow SpicyAPI's published tests (https://spicyapi.ai/leaderboards, methodology v2.1, 2026-09-27). Freedom = how reliably each explicitness level (L1 suggestive → L5 extreme) renders as asked; Index = preliminary capability score.
| Need | Model ID | From | Tested |
|---|---|---|---|
| Best all-round NSFW video (T2V / I2V / Ref2V, 2–30 s, sound) | alibaba/wan-3.0/text-to-video, .../image-to-video, .../reference-to-video | $0.045/s (480p) | Index 76.5, Freedom 96, explicit 9/9 |
| Uncensored video from a still, Spicy edition | bytedance/seedance-2.5-spicy/image-to-video (4–30 s, up to 4K) | $0.216/s | Freedom 96.7, explicit 3/3 |
| Uncensored I2V with generated audio | alibaba/wan-2.7-spicy/image-to-video | $0.1235/s (720p) | Freedom 100 |
| Anime / stylised motion | vidu/q3-spicy/image-to-video | $0.0665/s (540p) | Freedom 96.7 |
| Your own LoRAs on video | minimax/h3-lora/image-to-video (also T2V, Ref2V); minimax/h3-singularity-lora/... for fast action | $0.05/s | Freedom 98.3 / 100 |
| Long script that must stay on script (T2V / Ref2V) | bytedance/seedance-2.5/text-to-video, .../reference-to-video | $0.1234/s | Index 69.5, Freedom 80.9, explicit 8/9 |
| Cheapest that passes explicit tests | alibaba/wan-2.6-flash/image-to-video · bytedance/seedance-1.5-pro-spicy/image-to-video (camera_fixed) | $0.0225/s · $0.012/s | Freedom 100 · 96.7 |
| Cheap bulk video, prompt optional | minimax/h3/image-to-video (standard) or minimax/h3-spicy/image-to-video | $0.025/s · $0.038/s | 14/14 test clips as asked (coverage incomplete) · Freedom 97.5 |
| Drafts, exactly 5 or 8 s, closing frame | alibaba/wan-2.2-spicy/image-to-video | $0.019/s | Freedom 91.2; top level softens sometimes |
| Continue a clip with the same LoRAs | alibaba/wan-2.2-spicy-lora/video-extend | $0.038/s | Freedom 74.8 |
| NSFW image (recommended) | alibaba/qwen-image-2.1/text-to-image (aspect_ratio, resolution 1k/1.5k/2k) | $0.024/image | Index 73, Freedom 96.3 |
| Image with your own LoRAs (incl. anime) | alibaba/qwen-image-2.1-lora/text-to-image · minimax/h3-image-lora/text-to-image | $0.03 · $0.042 | Index 80.5 (#1) / 74.5, Freedom 92 / 100 |
| Photographic finish | bytedance/seedream-5.0-pro/text-to-image | $0.036 | Freedom 94.3 |
| Lettering in the image | alibaba/qwen-image-3.0-pro/text-to-image | $0.04 | Freedom 98 |
| Uncensored image edit | alibaba/qwen-image-2.1/edit (1–10 refs, --images) · alibaba/qwen-image-spicy-edit/edit (one photo, fast) | $0.036 · $0.038 | Freedom 96.3 · 96 |
| Cheapest NSFW image | alibaba/z-image-spicy/text-to-image (width/height ≤1536) | $0.01235 | Freedom 98.8, lower capability |
| Uncensored chat / prompt writing | xai/grok-4.7/chat · xai/grok-4.3/chat (cheaper, fastest) | per 1K tokens | Freedom 100 · 98.9 |
Avoid for explicit requests (tests show softening): standard seedance-2.0 / -fast / -mini (use their Spicy editions), happyhorse-1.1, wan-2.2 standard, wan-2.7 and krea-2 text-to-image; for text, Claude, Gemini, GLM and Kimi models. Tell the user when a request would do better on a Spicy edition.
Prices are the cheapest tier on 2026-09-27; schema and the quote are authoritative.
Non-Spicy models work the same way. For SFW or softer requests, or tasks the Spicy editions don't cover (text-to-video, reference-to-video, upscaling, lip sync), use any model ID from python3 scripts/spicy.py models (drop --spicy), e.g. bytedance/seedance-2.5/text-to-video, alibaba/wan-3.0/image-to-video, bytedance/seedream-5.0-pro/text-to-image, spicyapi/video-upscaler-v1/upscale. More detail: references/models.md.
# Text → image (recommended model)
python3 scripts/spicy.py generate alibaba/qwen-image-2.1/text-to-image \
--prompt "Photorealistic boudoir portrait of a woman in her early 30s in black lace lingerie, window light" \
--set aspect_ratio=2:3 --set resolution=1k
# Image → video (local files are uploaded automatically)
python3 scripts/spicy.py generate alibaba/wan-2.2-spicy/image-to-video \
--image ./first-frame.jpg \
--prompt "She turns slowly toward the camera, silk robe slipping off one shoulder, candlelight, slow push-in" \
--set duration_seconds=5 --set resolution=480p
# Pin the ending with a last frame
python3 scripts/spicy.py generate bytedance/seedance-2.0-spicy/image-to-video \
--image start.jpg --last-image end.jpg --prompt "Smooth continuous turn toward the camera" \
--set duration_seconds=5 --set resolution=720p
# Uncensored edit (Qwen Image 2.1 takes 1–10 references via repeated --images)
python3 scripts/spicy.py generate alibaba/qwen-image-2.1/edit \
--images ./portrait.png --prompt "Change the outfit to a red satin slip dress, keep the face and lighting"
# single-image alternative: alibaba/qwen-image-spicy-edit/edit with --image
# After the user approves the quote, add --yes (or --max-cost 1.50)
# Check a task later / download
python3 scripts/spicy.py status <taskId> --wait --download ./spicy-output
# Uncensored text (OpenAI-compatible endpoint)
python3 scripts/spicy.py chat xai/grok-4.7/chat "Write a 60-word image-to-video prompt: boudoir, woman in her 30s, rain on the window" \
--system "You write prompts for adult video models. All characters are adults."
Outputs are saved to ./spicy-output/<taskId>_<n>.<ext>. Output URLs expire (about 20 minutes); download instead of sharing links.
For N variations, loop over generate with different prompts or --set seed=<n>, one quote per run, and confirm the total with the user first (N × quoted max charge). Draft at 480p on a cheap model, then re-render the winners at 720p–1080p on a stronger one.
| Symptom | Meaning / action |
|---|---|
SPICY_API_KEY is not set | Ask the user to create and export a key. |
code 40004 | This parameter combination is not served; change the named field (often resolution or duration). |
code 40003 | Upload bytes did not match the ticket; upload again. |
HTTP 503 with Retry-After | Back off for that many seconds, then retry once with the same idempotency key. |
task failed with content_rejected | The model's own provider refused; the charge is refunded. Try a different Spicy model or rephrase. |
| insufficient balance | Tell the user to top up at https://spicyapi.ai/console (card or crypto). |
Always report request_id and the task ID when something fails.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY -- npx --yes --package=@spicyapi/mcp spicyapi-mcp