skills/giggle-generation-aimv-30/SKILL.md
Use when the user wants a 30-second AI music video (AIMV)—same pipeline as standard AIMV but fixed 30s output via project type aimv-30. Triggers: 30 second MV, 30s AIMV, 30-second music video, half-minute MV, short AIMV; prompt- or custom-lyrics flows same as giggle-generation-aimv.
npx skillsauth add giggle-official/skills giggle-generation-aimv-30Install 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.
aimv-30)The flow matches giggle-generation-aimv exactly: one execute_workflow call, same submit / poll / pay / wait-to-complete behavior. Only difference: project creation uses API type aimv-30 (30-second AIMV product line) instead of mv.
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, open the left sidebar → API Key (may also appear as API 密钥) and create or copy your key.
Configuration: Set the system environment variable GIGGLE_API_KEY:
export GIGGLE_API_KEY=your_api_keyVerification steps:
GIGGLE_API_KEY is set in the environment.While logged in at giggle.pro → left sidebar → API Key → copy the 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 the music in text |
| Custom | custom | lyrics, style, title | Supply lyrics, style, and title |
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg==". For base64, pass the raw string only; do not prefix with data:image/...;base64,.16:9 or 9:16Prompt mode:
prompt: Music description (required)vocal_gender: male / female / auto (optional, default auto)instrumental: Instrumental only (optional, default false)Custom mode:
lyrics: Lyrics body (required)style: Musical style (required)title: Song title (required)Use execute_workflow for the full workflow—call once and wait. Internally: create project (type: aimv-30) + submit task (merged) → poll (~every 3s) → pay when needed → wait up to ~1 hour.
execute_workflow blocks for the whole pipeline. Do not run ad-hoc shell --query loops yourself.
execute_workflow without making the user ask for progress first.download_url / video_asset; on failure, plain-language error details and project_id if useful for support or manual pay/query.create_and_submit only: if the user only wants IDs first, use that path and query when they follow up.Important:
create_project and submit_mv_task manually—use execute_workflow or create_and_submit.execute_workflow(
music_generate_type: str, # Mode: prompt / custom / upload
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 = "",
# Upload mode
music_asset_id: str = "",
)
reference_image for asset ID; reference_image_url for URL or base64.9:16 for portrait / vertical; otherwise default 16:9.prompt; user supplies lyrics → custom.Prompt mode:
api = MVTrusteeAPI()
result = api.execute_workflow(
music_generate_type="prompt",
aspect="16:9",
project_name="My 30s 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 30s MV",
reference_image="asset_xxx",
lyrics="Verse 1: Spring breeze on my face...",
style="pop",
title="Spring Song"
)
With scene description (user explicitly describes visuals):
result = api.execute_workflow(
music_generate_type="prompt",
aspect="16:9",
project_name="Scene 30s 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) body—same shape as standard AIMV; the project was already created with type: aimv-30.
{
"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) when all steps are done:
{
"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: If pay_status is pending, pay via the pay endpoint. When steps finish, video_asset.download_url is populated—return the complete signed URL, e.g.:
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 parameters. Incorrect (unsigned base 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
}
}
If a step fails, the user may call the retry endpoint with the failed step name:
{
"project_id": "<your-project-id>",
"current_step": "shot"
}
current_step is the step to resume from (e.g. music-generate, storyboard, shot, editor).
To create and submit without waiting for completion, use create_and_submit. Do not call create_project and submit_mv_task as two separate manual steps:
api = MVTrusteeAPI()
r = api.create_and_submit(
project_name="My 30s MV",
music_generate_type="prompt",
aspect="16:9",
reference_image_url="https://...",
prompt="Upbeat pop"
)
# Returns project_id for later manual query/pay
Success:
{
"code": 200,
"msg": "success",
"data": {
"project_id": "...",
"download_url": "https://...",
"video_asset": {...},
"status": "completed"
}
}
On failure, an error message is returned (shape depends on API).
| Scenario | Cause | Solution |
|----------|-------|----------|
| 401 Unauthorized or invalid API key | Missing, expired, or wrong GIGGLE_API_KEY | Copy the key again from giggle.pro → left sidebar → API Key, then export GIGGLE_API_KEY=... |
| 429 Too Many Requests | Rate limited | Wait and retry; avoid bursty parallel submissions |
| Network timeout / connection error | Network or transient API outage | The script retries some network errors (bounded); verify connectivity |
| pay_status: pending | Payment required | Handled inside execute_workflow; if debugging manually, call pay with project_id |
| Task step failed (status: failed) | A pipeline step errored | Retry with current_step set to the failed step name |
| Workflow timeout (> 1 hour) | Job ran too long | Query by project_id; contact support if stuck |
development
Social media publishing and engagement management via X2C Open API. Use when the user needs to publish posts to social media, check linked accounts, manage comments, or upload media. Use cases: (1) Publish text/media posts to TikTok, Instagram, Facebook, YouTube, LinkedIn, Twitter, etc. (2) Schedule posts for future publishing. (3) Manage comments and replies on posts. (4) Upload media files (up to 5GB) and get CDN links. (5) View post history and linked account status. Triggers: post to social media, publish post, social media, schedule post, social publish, upload media, social accounts, comment on post.
tools
Twitter automation core module for trend collection, auto first-reply posting, dashboard updates, comment failure checks, and installation verification.
testing
Use this feature when users want to generate videos, shoot short films, or view available video styles. Triggering keywords: short film, make video, shoot short film, short video, AI video, generate video from story, short drama, narrated video, cinematic video, available video styles.
development
全网热榜聚合 API 服务 — 基于 DailyHotApi 开源项目,本地自动部署,零配置获取 40+ 平台实时热搜数据。覆盖抖音、微博、知乎、B站、百度、今日头条、快手等主流平台。触发词:热点、热搜、趋势、热榜、trending、hot topics。