skills/giggle-generation-aimv/SKILL.md
Use when the user wants to create AI music videos (MV)—including generating music from text prompts or using custom lyrics. Before blocking on execute_workflow, tell the user the MV pipeline is running until completion; after return, immediately forward the result—user need not ask for progress. Triggers: generate MV, music video, make video for this song, lyrics video, create MV, AI music video, music+video, generate video from lyrics.
npx skillsauth add giggle-official/skills giggle-generation-aimvInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Calls the MV trustee mode API to run the full MV generation workflow. Project creation and task submission are merged into one step in the script—call execute_workflow once only; never call create and submit separately.
Please review before installing. This skill will:
Requirements: python3 (>=3.6), GIGGLE_API_KEY (system environment variable), pip packages: requests
No Retry on Error: If script execution encounters an error, do not retry. Report the error to the user directly and stop.
Before performing any operation, confirm the user has configured the API Key.
API Key: Log in to giggle.pro. On the main site, use the left sidebar → API Key (API 密钥) section to create or copy your key.
Configuration: Set system environment variable GIGGLE_API_KEY
export GIGGLE_API_KEY=your_api_keyVerification steps:
GIGGLE_API_KEY in system environmentOpen giggle.pro while logged in → left sidebar → API Key / API 密钥 → copy your key, then run
export GIGGLE_API_KEY=your_api_keyin the terminal.
| Mode | music_generate_type | Required params | Description |
|------|---------------------|-----------------|-------------|
| Prompt | prompt | prompt, vocal_gender | Describe music in text |
| Custom | custom | lyrics, style, title | Provide lyrics, style, and title |
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==". For base64: pass the raw Base64 string directly; do not add the data:image/xxx;base64 prefix.16:9 or 9:16Prompt mode:
prompt: Music description (required)vocal_gender: Vocal gender — male / female / auto (optional, default auto)instrumental: Instrumental only (optional, default false)Custom mode:
lyrics: Lyrics content (required)style: Music style (required)title: Song title (required)Use execute_workflow to run the full workflow—call once and wait. Internally: create project + submit task (merged) → poll progress (every 3 sec) → detect and pay pending items → wait for completion (max 1 hour).
execute_workflow blocks for the full MV pipeline: create/submit (merged), poll (~every 3s), pay if needed, up to ~1 hour. You do not run shell --query yourself.
execute_workflow without waiting for the user to ask for a status check first.download_url / video_asset on success or the error payload in plain language; include project_id when useful for support or manual pay/query.create_and_submit only: if they only want ids up front, use that path and query later when they ask.Important:
create_project and submit_mv_task separately—always use execute_workflow or create_and_submitexecute_workflow(
music_generate_type: str, # Mode: prompt / custom
aspect: str, # Aspect ratio: 16:9 or 9:16
project_name: str, # Project name
reference_image: str = "", # Reference image asset_id (mutually exclusive with reference_image_url)
reference_image_url: str = "", # Reference image URL or base64 (mutually exclusive with reference_image)
scene_description: str = "", # Scene description, default empty
subtitle_enabled: bool = False, # Subtitle toggle, default False
# Prompt mode
prompt: str = "",
vocal_gender: str = "auto",
instrumental: bool = False,
# Custom mode
lyrics: str = "",
style: str = "",
title: str = "",
)
reference_image for asset_id; use reference_image_url for image URL or base64.9:16 when the user mentions portrait/vertical/9:16; otherwise default 16:9.Prompt mode:
api = MVTrusteeAPI()
result = api.execute_workflow(
music_generate_type="prompt",
aspect="16:9",
project_name="My MV",
reference_image_url="https://example.com/ref.jpg",
prompt="Upbeat pop, sunny beach vibe",
vocal_gender="female"
)
Custom mode (user provides lyrics):
result = api.execute_workflow(
music_generate_type="custom",
aspect="9:16",
project_name="Lyrics MV",
reference_image="asset_xxx",
lyrics="Verse 1: Spring breeze on my face...",
style="pop",
title="Spring Song"
)
With scene description (when user explicitly describes the scene):
result = api.execute_workflow(
music_generate_type="prompt",
aspect="16:9",
project_name="Scene MV",
reference_image_url="https://...",
prompt="Electronic dance music",
scene_description="City nightscape, neon lights, flowing traffic"
)
Submit endpoint (/api/v1/trustee_mode/mv/submit) request body:
{
"project_id": "<your-project-id>",
"music_generate_type": "prompt",
"prompt": "A cheerful pop song",
"vocal_gender": "female",
"instrumental": false,
"reference_image_url": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAkGBxMTEhUT...(base64 image data)",
"scene_description": "A romantic beach walk at sunset, waves gently lapping the shore, pink sky gradient",
"aspect": "16:9",
"subtitle_enabled": false
}
Note: reference_image (asset_id) and reference_image_url (URL or base64) are mutually exclusive.
Custom mode:
{
"project_id": "<your-project-id>",
"music_generate_type": "custom",
"lyrics": "Verse 1:\nStanding by the sea watching the sunset\nMemories rush in like waves\n\nChorus:\nLet the sea breeze blow away all worries\nIn this golden moment\nWe found each other\n",
"style": "pop ballad",
"title": "Seaside Memories",
"reference_image": "<asset_id>",
"scene_description": "A couple walking on the beach at dusk, long shadows, orange-red sky gradient",
"aspect": "9:16",
"subtitle_enabled": false
}
Query endpoint (/api/v1/trustee_mode/mv/query) response (all steps completed):
{
"code": 200,
"msg": "success",
"uuid": "<response-uuid>",
"data": {
"project_id": "<your-project-id>",
"video_asset": {
"asset_id": "<asset_id>",
"download_url": "https://assets.giggle.pro/private/...",
"thumbnail_url": "https://assets.giggle.pro/private/...",
"signed_url": "https://assets.giggle.pro/private/...",
"duration": 0
},
"shot_count": 0,
"current_step": "editor",
"completed_steps": "music-generate,storyboard,shot,editor",
"pay_status": "paid",
"status": "completed",
"err_msg": "",
"steps": [...]
}
}
Note: When pay_status is pending, call the pay endpoint. When all steps are done, video_asset.download_url will have a value—return the full signed URL. Correct format:
https://assets.giggle.pro/private/ai_director/348e4956c7bd4f763b/qzjc7gwkpf.mp4?Policy=...&Key-Pair-Id=...&Signature=...&response-content-disposition=attachment
Do not strip response-content-disposition=attachment or other query params from the URL. Wrong (unsigned URL only):
https://assets.giggle.pro/private/ai_director/348e4956c7bd4f763b/qzjc7gwkpf.mp4
Pay endpoint (/api/v1/trustee_mode/mv/pay):
Request body:
{
"project_id": "<your-project-id>"
}
Response:
{
"code": 200,
"msg": "success",
"uuid": "<response-uuid>",
"data": {
"order_id": "<order-id>",
"price": 580
}
}
When a step fails, guide the user to call the retry endpoint to resume from that step:
{
"project_id": "<your-project-id>",
"current_step": "shot"
}
Note: current_step is the step name to retry (e.g. music-generate, storyboard, shot, editor).
If you only need to create the project and submit the task without waiting for completion, use create_and_submit. Never call create_project and submit_mv_task separately:
api = MVTrusteeAPI()
r = api.create_and_submit(
project_name="My MV",
music_generate_type="prompt",
aspect="16:9",
reference_image_url="https://...",
prompt="Upbeat pop"
)
# Returns project_id for manual query/pay later
Success:
{
"code": 200,
"msg": "success",
"data": {
"project_id": "...",
"download_url": "https://...",
"video_asset": {...},
"status": "completed"
}
}
Returns error message on failure.
| Scenario | Cause | Solution |
|----------|-------|----------|
| 401 Unauthorized or "invalid API key" | GIGGLE_API_KEY is missing, expired, or incorrect | Re-copy the key from giggle.pro → left sidebar → API Key / API 密钥, then re-export: export GIGGLE_API_KEY=your_api_key |
| 429 Too Many Requests | API rate limit exceeded | Wait a few minutes and retry; avoid submitting multiple projects in rapid succession |
| Network timeout / connection error | Unstable network or API service temporarily unavailable | The script auto-retries up to 5 times with 5-second intervals; check your network if it still fails |
| pay_status: pending | The project requires payment before proceeding | The workflow function handles this automatically; if running manually, call the pay endpoint with the project_id |
| Task step failed (status: failed) | A generation step (e.g. music-generate, shot) encountered an error | Use the retry endpoint: {"project_id": "<your-project-id>", "current_step": "<failed-step>"} to resume from the failed step |
| Workflow timeout (> 1 hour) | MV generation took too long | Query progress manually with the project_id to check current status; contact support if the task is stuck |
development
Talking-head video from image + driving audio: submit tasks via the wrapped generation API and poll for results; requests go through the Giggle gateway.
development
Discord-specific markdown syntax for formatting message strings. Use when constructing strings that will be sent as Discord messages, including: text formatting (bold, italic, underline, strikethrough, spoilers), headers, subtext, code blocks, block quotes, lists, and masked links.
development
Discord bot development - community management, moderation, notifications, and AI integration
development
Auto-deploy a Discord AI bot connected to OpenClaw Gateway. Handles Node.js bot setup, PM2 process management, and Gateway API integration. Use when the user has completed Discord Bot onboarding and needs the bot deployed and running.