354 lines
14 KiB
Markdown
354 lines
14 KiB
Markdown
---
|
||
name: suno
|
||
description: Используй когда пользователь просит создать музыку, текст песни, кавер, ремикс, мэшап, видео, или работать с Suno AI Music API. Покрывает генерацию музыки, тексты, разделение вокала/стемов, Persona, стили и конвертацию.
|
||
---
|
||
|
||
# Suno Music API Skill
|
||
|
||
Этот skill описывает MCP-сервер для работы с [Suno API](https://sunoapi.org) через opencode.
|
||
|
||
## Лимиты и цены
|
||
|
||
- **Rate limit**: 20 запросов на 10 секунд.
|
||
- **Стоимость кредита**: $0.005 USD.
|
||
- **Кредиты не истекают**.
|
||
- Сгенерированные файлы хранятся **15 дней**.
|
||
|
||
## Прокси
|
||
|
||
Если сервис недоступен из вашей сети, MCP сервер поддерживает прокси через переменные окружения (в порядке приоритета):
|
||
|
||
```
|
||
SUNO_HTTP_PROXY=http://user:pass@proxy:8080
|
||
HTTPS_PROXY=http://proxy:8080
|
||
HTTP_PROXY=http://proxy:8080
|
||
```
|
||
|
||
## Основные сценарии
|
||
|
||
### 1. Сгенерировать песню с нуля
|
||
|
||
```
|
||
suno_generate_music
|
||
prompt: "Мелодичный инди-фолк с акустической гитарой, мягким вокалом, ностальгическое настроение"
|
||
customMode: false
|
||
instrumental: false
|
||
model: "V4_5ALL"
|
||
```
|
||
|
||
Вернёт `taskId`. Затем нужно подождать и вызвать:
|
||
|
||
```
|
||
suno_get_task_status
|
||
taskId: "..."
|
||
```
|
||
|
||
Результат: 2 трека с `audio_url`, `title`, `tags`, `duration`, `prompt`.
|
||
|
||
### 2. Сгенерировать песню в кастомном режиме
|
||
|
||
```
|
||
suno_generate_music
|
||
prompt: "[Verse] Ночной город, огни витрин..."
|
||
customMode: true
|
||
instrumental: false
|
||
style: "Synthwave, cinematic, 80s"
|
||
title: "Neon Rain"
|
||
model: "V4_5"
|
||
```
|
||
|
||
В `customMode: true` поля `style` и `title` обязательны. Если `instrumental: false` — ещё и `prompt` (он станет точным текстом песни).
|
||
|
||
### 3. Получить текст песни
|
||
|
||
```
|
||
suno_generate_lyrics
|
||
prompt: "Песня о путешествии, вдохновляющая, indie pop"
|
||
```
|
||
|
||
Полученный текст можно передать в `suno_generate_music(prompt=текст, customMode=true)`.
|
||
|
||
### 4. Разделить вокал и музыку
|
||
|
||
```
|
||
suno_separate_vocals
|
||
taskId: "<taskId генерации>"
|
||
audioId: "<id трека>"
|
||
```
|
||
|
||
Для продвинутого разделения по инструментам:
|
||
|
||
```
|
||
suno_separate_stems
|
||
taskId: "<taskId>"
|
||
audioId: "<id трека>"
|
||
```
|
||
|
||
### 5. Сделать кавер существующего аудио
|
||
|
||
```
|
||
suno_upload_and_cover
|
||
uploadUrl: "https://example.com/my-song.mp3"
|
||
customMode: true
|
||
instrumental: false
|
||
style: "Jazz"
|
||
title: "Jazz Version"
|
||
prompt: "[Verse] Smooth jazz arrangement..."
|
||
model: "V4_5ALL"
|
||
```
|
||
|
||
### 6. Создать персону из трека
|
||
|
||
```
|
||
suno_generate_persona
|
||
taskId: "<taskId>"
|
||
audioId: "<id трека>"
|
||
```
|
||
|
||
Бесплатно. Возвращает `personaId`, который потом можно использовать в `suno_generate_music` (`personaId` + `personaModel: style_persona`) для единого стиля.
|
||
|
||
### 7. Узнать промпт по готовому треку
|
||
|
||
```
|
||
suno_get_task_status
|
||
taskId: "<taskId генерации>"
|
||
```
|
||
|
||
В ответе будут поля `prompt`, `title`, `tags` для каждого трека.
|
||
|
||
## Полный список инструментов
|
||
|
||
| Инструмент | Назначение | Кредиты |
|
||
|---|---|:---:|
|
||
| `suno_generate_music` | Генерация музыки | 12 |
|
||
| `suno_generate_lyrics` | Генерация текста | 0.4 |
|
||
| `suno_generate_sounds` | Звуки/амбиенты/лупы | 2.5 |
|
||
| `suno_extend_music` | Продлить трек | 12 |
|
||
| `suno_replace_section` | Заменить фрагмент трека | 5 |
|
||
| `suno_add_vocals` | Добавить вокал на инструментал | 12 |
|
||
| `suno_add_instrumental` | Добавить инструментал к вокалу | 12 |
|
||
| `suno_upload_and_cover` | Загрузить аудио и сделать кавер | 12 |
|
||
| `suno_upload_and_extend` | Загрузить аудио и продлить | 12 |
|
||
| `suno_generate_mashup` | Мэшап из двух аудио | 12 |
|
||
| `suno_separate_vocals` | Вокал + минус | 10 |
|
||
| `suno_separate_stems` | Разделение по инструментам | 20 |
|
||
| `suno_create_video` | Видео из трека | 2 |
|
||
| `suno_create_cover` | Обложка трека | 0 |
|
||
| `suno_convert_to_wav` | Конвертация в WAV | 0.4 |
|
||
| `suno_boost_style` | Улучшить описание стиля | 0.4 |
|
||
| `suno_generate_persona` | Создать персону из трека | 0 |
|
||
| `suno_get_task_status` | Статус и метаданные трека | 0 |
|
||
| `suno_get_timestamped_lyrics` | Текст с таймкодами | 0.5 |
|
||
| `suno_get_lyrics_details` | Детали генерации текста | 0 |
|
||
| `suno_get_wav_details` | Детали конвертации WAV | 0 |
|
||
| `suno_get_vocal_separation_details` | Детали разделения | 0 |
|
||
| `suno_get_video_details` | Детали видео | 0 |
|
||
| `suno_get_credits` | Остаток кредитов | 0 |
|
||
|
||
## Выбор модели
|
||
|
||
| Модель | Длина | Когда использовать |
|
||
|---|---|---|
|
||
| `V4` | до 4 мин | Лучшее качество звука |
|
||
| `V4_5` | до 8 мин | Умные промпты, быстрее |
|
||
| `V4_5PLUS` | до 8 мин | Более насыщенный звук |
|
||
| `V4_5ALL` | до 8 мин | Лучшая структура песни |
|
||
| `V5` | до 8 мин | Высокая музыкальность, скорость |
|
||
| `V5_5` | до 8 мин | Персонализированные голоса |
|
||
|
||
## Лимиты символов в `customMode`
|
||
|
||
| Поле | V4 | V4_5 / V4_5PLUS / V4_5ALL / V5 / V5_5 |
|
||
|---|---|---|
|
||
| `prompt` | 3000 | 5000 |
|
||
| `style` | 200 | 1000 |
|
||
| `title` | 80 | 100 |
|
||
|
||
В `customMode: false` только `prompt`, максимум 500 символов.
|
||
|
||
## Prompt Engineering Guide
|
||
|
||
Когда пользователь просит создать песню, агент должен вести себя как **Suno AI Master Assistant**: профессионально, дружелюбно, на русском языке. Перед генерацией анализируй историю чата и учитывай ранее выбранные жанры и стили.
|
||
|
||
### Три обязательных блока промпта
|
||
|
||
Каждый промпт для `suno_generate_music` (особенно в `customMode: true`) должен состоять из трёх блоков:
|
||
|
||
#### Блок А: Lyrics (текст с мета-тегами)
|
||
|
||
```
|
||
///*****///
|
||
|
||
[Verse]
|
||
Текст куплета
|
||
Четыре строки по 6–10 слогов
|
||
|
||
[Chorus | anthemic chorus | stacked harmonies]
|
||
Текст припева
|
||
Мощный, запоминающийся хук
|
||
|
||
[Bridge]
|
||
Текст бриджа
|
||
Контраст с основной частью
|
||
|
||
[break 0.5]
|
||
|
||
[Chorus]
|
||
Повтор припева
|
||
(RISE UP NOW!)
|
||
```
|
||
|
||
**Правила:**
|
||
- Разделитель `///*****///` в самом верху, чтобы промпт не «протекал» в вокал.
|
||
- Мета-теги: `[Verse]`, `[Chorus]`, `[Bridge]`, `[Pre-Chorus]`, `[Intro]`, `[Outro]`.
|
||
- Уточнение стиля секции через `|`: `[Chorus | anthemic chorus | stacked harmonies]`.
|
||
- Паузы: `[break 0.5]` или `[break 1.0 sek]`.
|
||
- Бэк-вокал в круглых скобках: `(RISE UP NOW!)`.
|
||
- Строка: 6–10 слогов, секция: обычно 4 строки.
|
||
- **Не размечай ударения заглавными буквами** — Suno v5 и v5.5 самостоятельно хорошо ориентируются в ударениях.
|
||
|
||
#### Блок Б: Style (окно стиля)
|
||
|
||
Используй иерархическую структуру, разделённую точками:
|
||
|
||
```
|
||
genre: indie folk rock, 2020s bedroom pop.
|
||
vocal: [baritone male vocal], [raspy vocal tone], emotional delivery.
|
||
instrumentation: [nylon string guitar], [TR-808 kit], [warm analog synth pad].
|
||
recording & mastering: high quality studio recording, balanced EQ, crystal clear vocals, wide stereo image.
|
||
```
|
||
|
||
**Важно:** учитывай лимиты длины `style`:
|
||
|
||
| Модель | Лимит `style` |
|
||
|---|---|
|
||
| V4 | 200 символов |
|
||
| V4_5 / V4_5PLUS / V4_5ALL / V5 / V5_5 | 1000 символов |
|
||
|
||
Если стиль не влезает — сокращай менее важные части, сохраняя жанр и ключевые инструменты.
|
||
|
||
#### Блок В: Negative Prompt (исключения)
|
||
|
||
Передаётся в параметр `negativeTags` как список через запятые **без** слова `no`:
|
||
|
||
```
|
||
trap, male vocals, distortion, sawtooth synths, harsh highs, muddiness
|
||
```
|
||
|
||
### Золотые правила по жанрам
|
||
|
||
| Жанр | Что прописывать |
|
||
|---|---|
|
||
| **Disco** | `[Arrangement: groove-based, repetitive, no development]`, four-on-the-floor kick, lush strings |
|
||
| **Latin** | Фокус на перкуссии: piano montuno, congas, bongos, clave. Меньше акцент на гармонии |
|
||
| **Blues** | 12-bar form, shuffle feel, electric guitar, walking bass. Избегай поп-структур |
|
||
| **Brazilian Funk** | TR-808, tamborim syncopation, monophonic synth bass, Portuguese vocal samples |
|
||
| **Electronic** | Конкретные типы синтеза: FM synthesis bass, wavetable movement, granular pads. Избегай общих «saw synth» |
|
||
| **Rock** | live drum kit, electric guitars, bass guitar, analog saturation |
|
||
| **Jazz** | upright bass, brushed drums, piano trio, warm room reverb |
|
||
|
||
### Управление вокалом
|
||
|
||
| Задача | Что писать в `Style` / `Lyrics` |
|
||
|---|---|
|
||
| Припев выше октавой | Style: `chorus sung ONE OCTAVE HIGHER`. Lyrics: `[Chorus | SING ONE OCTAVE HIGHER]` |
|
||
| Без вокального интро | `NO vocal intro, instrumental intro only, vocal starts with first verse` |
|
||
| Сухой вокал | `dry vocal recording, close-mic vocal, no reverb tails, minimal processing` |
|
||
| Многослойный хор | `stacked harmonies, doubled vocals, group choir backing` |
|
||
| Шёпот | `intimate whisper vocal, breathy tone, close microphone` |
|
||
|
||
### Пример полного промпта
|
||
|
||
Пользователь: «Сделай энергичный рок-трек о восхождении на гору, мужской вокал».
|
||
|
||
**Lyrics (передаётся в `prompt`):**
|
||
|
||
```
|
||
///*****///
|
||
|
||
[Intro]
|
||
[instrumental intro only, no vocal]
|
||
|
||
[Verse]
|
||
Тяжёлый шаг, камень за камнем
|
||
Ветер рвёт дыханье, но не сбить меня
|
||
Каждый метр — битва, каждый вздох — победа
|
||
Вершина ближе, сердце как маяк
|
||
|
||
[Pre-Chorus]
|
||
Тень долины позади
|
||
Там, где страх остался жить
|
||
|
||
[Chorus | anthemic chorus | stacked harmonies]
|
||
Я поднимаюсь выше!
|
||
К небу, к солнцу, к огню!
|
||
Я поднимаюсь выше!
|
||
(RISE UP NOW!)
|
||
Никто не остановит путь мой
|
||
|
||
[break 0.5]
|
||
|
||
[Verse]
|
||
Снег под ногами, холод в руках
|
||
Но внутри пылает жар, что не погасить
|
||
|
||
[Chorus | SING ONE OCTAVE HIGHER]
|
||
Я поднимаюсь выше!
|
||
К небу, к солнцу, к огню!
|
||
Я поднимаюсь выше!
|
||
(RISE UP NOW!)
|
||
```
|
||
|
||
**Style (передаётся в `style`):**
|
||
|
||
```
|
||
genre: anthemic alternative rock, 2010s stadium rock.
|
||
vocal: [powerful male vocal], [baritone lead], raspy emotional tone, shouted gang vocals.
|
||
instrumentation: [live drum kit], [crunch electric guitar], [driving bass guitar], [piano accents], [synth pad layers].
|
||
recording & mastering: high quality studio recording, punchy drums, wide stereo guitars, clear vocal, analog warmth.
|
||
```
|
||
|
||
**Negative Prompt (передаётся в `negativeTags`):**
|
||
|
||
```
|
||
trap, electronic beats, female vocals, jazz chords, muddiness, weak drums
|
||
```
|
||
|
||
### Вызов генерации
|
||
|
||
```
|
||
suno_generate_music
|
||
prompt: "///*****///\n\n[Intro]..."
|
||
customMode: true
|
||
instrumental: false
|
||
style: "genre: anthemic alternative rock..."
|
||
title: "Восхождение"
|
||
negativeTags: "trap, electronic beats, female vocals, jazz chords, muddiness, weak drums"
|
||
model: "V4_5ALL"
|
||
```
|
||
|
||
### Память и предпочтения
|
||
|
||
Если пользователь ранее запрашивал определённые жанры (например, «Philly Disco» или «Funk Carioca»), используй их автоматически в новых запросах, если это уместно.
|
||
|
||
### Проверка перед отправкой
|
||
|
||
- [ ] `customMode`, `instrumental`, `model` указаны
|
||
- [ ] Для `customMode: true` заполнены `style` и `title`
|
||
- [ ] Для вокального трека (`instrumental: false`) заполнен `prompt` с текстом
|
||
- [ ] `style` не превышает лимит символов для выбранной модели
|
||
- [ ] `negativeTags` — список через запятые, без `no`
|
||
- [ ] Ударения **не** размечены заглавными буквами
|
||
|
||
## Обработка ошибок
|
||
|
||
| Код | Причина |
|
||
|---|---|
|
||
| 400 | Неверные параметры |
|
||
| 401 | Неверный API ключ |
|
||
| 429 | Недостаточно кредитов |
|
||
| 430 | Слишком частые запросы |
|
||
| 455 | Технические работы |
|
||
|
||
Если async-задача не завершилась за 15 минут, сервер вернёт таймаут — используй `suno_get_task_status` позже.
|