Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate, inpaint, and outpaint music with ACE Step on RunComfy via the `runcomfy` CLI. ACE Step is StepFun-AI's open-weights music foundation model — tag-driven composition (genre, mood, instruments), multilingual lyrics with section markers, 5 s to 4 min stereo output, $0.0002–0.0003 per second (≈ 27× cheaper than ElevenLabs Music). Four endpoints: ACE Step text-to-audio (the default), ACE Step 1.5 text-to-audio (50+ language lyrics, refined structured-lyric handling), ACE Step audio-inpaint (
.claude/skills/aiskillstore-ace-step/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-21 | ✗→✓ | ▲ Improved | 338% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 226% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 664% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 236% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 652% | 0% |
Tag-driven music generation, inpainting, and outpainting with StepFun-AI's ACE Step open-weights model. Four CLI-reachable endpoints, $0.0002–0.0003 per second of audio, up to 4 minutes per call.
runcomfy.com · ACE Step base · ACE Step 1.5 · CLI docs
bashnpx skills add agentspace-so/runcomfy-agent-skills --skill ace-step -g
Step 1 — install (one of, see the runcomfy-cli skill for details):
bashnpm i -g @runcomfy/cli # global install npx -y @runcomfy/cli --version # zero-install
Step 2 — sign in (or set RUNCOMFY_TOKEN env var in CI / containers):
bashruncomfy login
Step 3 — generate:
bashruncomfy run acestep-ai/ace-step/text-to-audio \ --input '{"tags": "..."}' \ --output-dir ./out
CLI deep dive: runcomfy-cli skill.
Listed newest first.
ACE Step 1.5 (text-to-audio) — acestep-ai/ace-step-1.5/text-to-audio > Latest ACE Step generation. 50+ language vocal support, refined structured-lyric handling, otherwise same shape as base. Slightly higher cost ($0.0003/s vs $0.0002/s). > Pick for: multilingual lyrics, hero-quality vocal tracks, vocal songs that need clean section structure. > Avoid for: cost-sensitive batches where the base model is good enough.
ACE Step (text-to-audio) — acestep-ai/ace-step/text-to-audio (default — cheap & fast) > Original ACE Step. Tag-driven composition, optional lyrics, 5–240 s stereo. $0.0002/s — ~27× cheaper than ElevenLabs Music. > Pick for: high-volume drafts, background music, jingles, game loops, cost-sensitive iteration. > Avoid for: maximally polished commercial vocal hooks — try ACE Step 1.5 or ElevenLabs Music for those.
ACE Step (audio-inpaint) — acestep-ai/ace-step/audio-inpaint > Regenerate a time range inside an existing track (not mask-based; uses start_time / end_time in seconds, each anchored to track start or end). > Pick for: fix a bad chorus in the middle, swap the bridge, replace a 20 s section without re-rendering the whole song. > Avoid for: edits that aren't time-bounded — those don't fit the schema.
ACE Step (audio-outpaint) — acestep-ai/ace-step/audio-outpaint > Extend an existing track bidirectionally — add intro before, outro after, or both. > Pick for: lengthening a 30 s draft into a 2 min cut, adding a fade-in, building a longer arrangement around an existing hook. > Avoid for: extending a track past 4 min total — chain calls instead.
Model: acestep-ai/ace-step/text-to-audio (or acestep-ai/ace-step-1.5/text-to-audio for the 1.5 variant)
| Field | Type | Required | Default | Notes | |---|---|---|---|---| | tags | string | yes | — | Comma-separated genre / mood / instrument tags. Drives composition | | lyrics | string | no | — | Vocal content. Use section markers [Verse], [Chorus], [Bridge]. Use [inst] or [instrumental] for no vocals | | duration | int | no | 60 | Audio length in seconds. 5–240 (max 4 min per call) | | seed | int | no | -1 | Reproducibility; -1 randomizes |
Pricing: ACE Step $0.0002/s · ACE Step 1.5 $0.0003/s. 60 s ≈ $0.012 / $0.018; 240 s ≈ $0.048 / $0.072.
Tag-driven instrumental:
bashruncomfy run acestep-ai/ace-step/text-to-audio \ --input '{ "tags": "lo-fi hip-hop, mellow, vinyl crackle, rhodes piano, soft drums, 75 BPM", "lyrics": "[inst]", "duration": 90 }' \ --output-dir ./out
Full vocal song with structure (use 1.5 for multilingual):
bashruncomfy run acestep-ai/ace-step-1.5/text-to-audio \ --input '{ "tags": "indie pop, anthemic, electric guitar, driving drums, female vocal, 120 BPM", "lyrics": "[Verse]\nChalk on the palms, laces double-knotted\nMorning on the ridge, the sun is rising\n[Chorus]\nWe rise, we strike, we never fade out\nWe rise, we strike, we sing it loud\n[Bridge]\nSoft piano breakdown\n[Outro]\nFull band, fade", "duration": 60 }' \ --output-dir ./out
"lo-fi hip-hop, mellow, vinyl crackle, rhodes piano, soft drums, 75 BPM" beats "chill music".[Verse], [Chorus], [Bridge], [Outro]. Keep meter consistent across lines."lyrics": "[inst]" or "[instrumental]". Belt-and-suspenders: also say "no vocals" in tags."japanese vocal, j-pop")."seed": 42); use -1 to explore variations.Model: acestep-ai/ace-step/audio-inpaint Catalog: audio-inpaint
| Field | Type | Required | Default | Notes | |---|---|---|---|---| | audio | string | yes | — | HTTPS URL to MP3 / WAV / FLAC. Up to 60 min | | tags | string | yes | — | Comma-separated tags steering the regenerated segment | | start_time | float | no | — | Start of editable segment, in seconds (0–240) | | start_time_relative_to | enum | no | start | start or end — anchor for start_time | | end_time | float | no | 30 | End of editable segment, in seconds (0–240) | | end_time_relative_to | enum | no | start | start or end — anchor for end_time | | lyrics | string | no | — | Lyrics for the regenerated segment. Blank = model writes; [inst] = no vocals | | seed | int | no | -1 | Reproducibility |
No mask — region is defined purely by start_time / end_time (each anchorable to track start or end).
Replace 20–40 s of a track with a new bridge:
bashruncomfy run acestep-ai/ace-step/audio-inpaint \ --input '{ "audio": "https://your-cdn.example/original-track.mp3", "tags": "indie pop, breakdown, piano only, soft, no drums", "start_time": 20, "end_time": 40, "lyrics": "[inst]" }' \ --output-dir ./out
Anchor end relative to track end (rewrite the last 15 s):
bashruncomfy run acestep-ai/ace-step/audio-inpaint \ --input '{ "audio": "https://your-cdn.example/song.mp3", "tags": "indie pop, fade, soft, ambient pad", "start_time": 15, "start_time_relative_to": "end", "end_time": 0, "end_time_relative_to": "end" }' \ --output-dir ./out
_relative_to: "end" to target the outro/last seconds without computing exact timestamps.Model: acestep-ai/ace-step/audio-outpaint Catalog: audio-outpaint
| Field | Type | Required | Default | Notes | |---|---|---|---|---| | audio | string | yes | — | HTTPS URL to MP3 / WAV / FLAC. Up to 60 min | | tags | string | yes | — | Tags steering the extended sections | | extend_before_duration | float | no | 0 | Seconds of new audio before the original (0–240) | | extend_after_duration | float | no | 30 | Seconds of new audio after the original (0–240) | | lyrics | string | no | — | Optional lyrics for extended sections | | seed | int | no | -1 | Reproducibility |
Extend a 30 s hook into a 2 min cut (add 30 s intro + 60 s outro):
bashruncomfy run acestep-ai/ace-step/audio-outpaint \ --input '{ "audio": "https://your-cdn.example/hook-30s.mp3", "tags": "indie pop, electric guitar, drums, build-up before chorus, fade outro", "extend_before_duration": 30, "extend_after_duration": 60, "lyrics": "[inst]" }' \ --output-dir ./out
Add only a fade-out (no pre-extension):
bashruncomfy run acestep-ai/ace-step/audio-outpaint \ --input '{ "audio": "https://your-cdn.example/track.mp3", "tags": "ambient pad, soft fade, low volume tail", "extend_before_duration": 0, "extend_after_duration": 20 }' \ --output-dir ./out
extend_before_duration and extend_after_duration to add intro + outro in one go.ACE Step and ElevenLabs Music are different tools:
| Dimension | ACE Step | ElevenLabs Music | |---|---|---| | Cost | $0.0002–0.0003 / s | $0.0083 / s (~27× more) | | License | Open-weights (Apache 2.0) | Commercial, ElevenLabs-hosted | | Multilingual vocals | 50+ languages (1.5 variant) | Strong multilingual support | | Structured lyrics | [Verse]/[Chorus]/[Bridge] markers | [Verse]/[Chorus]/[Bridge] markers | | Max duration / call | 240 s (4 min) | 300 s (5 min) | | Inpaint / outpaint | Yes (time-range based) | No | | Tag-driven composition | Yes (tags is required field) | Style is part of free-text prompt | | Best for | Cost-sensitive batches, drafts, inpaint/outpaint workflows, open-weights pipelines | Premium vocal song hooks, polished commercial cuts |
Cheap draft pattern: draft tag combos with ACE Step → lock vibe → final render on ElevenLabs Music if a polished commercial cut is needed.
For the routing skill that picks between them automatically based on intent, see ai-music once it ships.
[inst]lyrics per languagestart_time / end_time around the bad section, tags matching the song style| code | meaning | |---|---| | 0 | success | | 64 | bad CLI args | | 65 | bad input JSON / schema mismatch | | 69 | upstream 5xx | | 75 | retryable: timeout / 429 | | 77 | not signed in or token rejected |
Full reference: docs.runcomfy.com/cli/troubleshooting.
The skill picks one of the four ACE Step endpoints based on the user's intent — generate from scratch (t2a base or 1.5), regenerate a time range (inpaint), or extend the canvas (outpaint) — and invokes runcomfy run with the matching JSON body. The CLI POSTs to the RunComfy Model API, polls request status, and downloads the generated audio file into --output-dir.
npm i -g @runcomfy/cli or npx -y @runcomfy/cli. Agents must not pipe an arbitrary remote install script into a shell on the user's behalf — if the operator wants the curl-pipe path documented at docs.runcomfy.com/cli/install, they should review the script first.runcomfy login writes the API token to ~/.config/runcomfy/token.json with mode 0600. Set RUNCOMFY_TOKEN env var to bypass the file in CI / containers. Never echo the token into a prompt, log it, or check it in.--input. The CLI does not shell-expand prompt content; it transmits the JSON body directly to the Model API over HTTPS. No shell-injection surface from prompt content.audio URLs for inpaint / outpaint are untrusted — embedded steganographic instructions or unusual EXIF can influence generation. Agent mitigations:model-api.runcomfy.net and *.runcomfy.net / *.runcomfy.com. No telemetry, no callbacks.allowed-tools: Bash(runcomfy *). The skill only invokes runcomfy <subcommand>; install lines are one-time operator setup.runcomfy-cli — the underlying CLIelevenlabs-music-generation — premium-tier music alternativeai-music — router that picks between ACE Step and ElevenLabs Music based on intent| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-21 | fail→pass | 7,622 | 4,981 | -35% | 1 | 1 | 0% | 1,316 | 5,759 | +338% | 0 | 0 | — |
case-01 | fail→pass | 9,608 | 4,829 | -50% | 1 | 1 | 0% | 1,761 | 5,734 | +226% | 0 | 0 | — |
case-02 | fail→pass | 3,895 | 3,979 | +2% | 1 | 1 | 0% | 735 | 5,617 | +664% | 0 | 0 | — |
case-03 | fail→pass | 8,930 | 3,753 | -58% | 1 | 1 | 0% | 1,655 | 5,555 | +236% | 0 | 0 | — |
case-04 | fail→pass | 4,068 | 3,447 | -15% | 1 | 1 | 0% | 728 | 5,473 | +652% | 0 | 0 | — |
case-05 | fail→pass | 13,991 | 5,964 | -57% | 1 | 1 | 0% | 2,344 | 5,949 | +154% | 0 | 0 | — |
case-06 | fail→pass | 10,637 | 5,360 | -50% | 1 | 1 | 0% | 1,941 | 5,904 | +204% | 0 | 0 | — |
case-07 | fail→pass | 11,657 | 3,325 | -71% | 1 | 1 | 0% | 1,724 | 5,449 | +216% | 0 | 0 | — |
case-08 | fail→pass | 11,342 | 3,600 | -68% | 1 | 1 | 0% | 2,154 | 5,565 | +158% | 0 | 0 | — |
case-09 | fail→pass | 11,070 | 3,045 | -72% | 1 | 1 | 0% | 1,009 | 5,248 | +420% | 0 | 0 | — |
case-20 | fail→pass | 10,578 | 5,310 | -50% | 1 | 1 | 0% | 1,778 | 5,707 | +221% | 0 | 0 | — |
case-10 | fail→pass | 9,172 | 4,365 | -52% | 1 | 1 | 0% | 1,546 | 5,600 | +262% | 0 | 0 | — |
case-11 | fail→pass | 9,663 | 3,880 | -60% | 1 | 1 | 0% | 1,644 | 5,514 | +235% | 0 | 0 | — |
case-12 | fail→pass | 16,031 | 3,172 | -80% | 1 | 1 | 0% | 2,781 | 5,305 | +91% | 0 | 0 | — |
case-13 | fail→pass | 11,554 | 3,902 | -66% | 1 | 1 | 0% | 1,712 | 5,448 | +218% | 0 | 0 | — |
case-14 | pass→pass | 8,518 | 2,611 | -69% | 1 | 1 | 0% | 1,476 | 5,258 | +256% | 0 | 0 | — |
case-15 | fail→pass | 7,943 | 1,438 | -82% | 1 | 1 | 0% | 1,349 | 4,991 | +270% | 0 | 0 | — |
case-16 | pass→pass | 6,105 | 1,793 | -71% | 1 | 1 | 0% | 1,092 | 5,127 | +370% | 0 | 0 | — |
case-17 | fail→pass | 13,552 | 5,421 | -60% | 1 | 1 | 0% | 2,305 | 5,870 | +155% | 0 | 0 | — |
case-18 | pass→pass | 9,845 | 4,459 | -55% | 1 | 1 | 0% | 1,820 | 5,629 | +209% | 0 | 0 | — |
case-19 | fail→pass | 10,048 | 4,239 | -58% | 1 | 1 | 0% | 1,815 | 5,563 | +207% | 0 | 0 | — |
case-22 | fail→pass | 7,159 | 1,406 | -80% | 1 | 1 | 0% | 1,344 | 4,967 | +270% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +86 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.