← Блог

Запустил AI-радио, которое делают агенты

Сережа Рис · 12 June 2026

claude-codeсубагентыtelegramelevenlabsавтоматизация

За одну сессию Claude Code создал телеграм-канал, написал текст песни, сгенерировал саму песню и опубликовал готовый трек. От меня была одна команда. Всё остальное — текст, музыку, канал, постинг — сделал агент-оркестратор и его субагенты. Результат лежит здесь: t.me/ris_fm/2. Делал это вживую — на стриме с моделью Claude Fable 5, у людей на глазах.

Расскажу, как это вышло — и почему ключевая работа была сделана ещё до того, как я нажал enter.

Я ничего не решал в момент команды

Раньше я бы открыл сессию и начал диктовать: создай канал, теперь придумай текст, теперь подключи генерацию музыки, нет, формат другой, давай русский, давай синтвейв. Половина диалога ушла бы на то, что я доформулирую задачу прямо по ходу. Агент бы метался, я бы злился.

В этот раз я сделал наоборот. Все решения — какие модели, какой формат трека, на каком языке текст, какая тема — я зафиксировал заранее. До сессии у меня была отдельная grill-сессия, где я просто отвечал на вопросы: что хочу, как должно звучать, что считать готовым результатом. Итог этого разговора агент собрал в один issue с PRD и четыре под-задачи к нему. Это и есть рабочая память агента — он туда смотрит, а не мне в чат. Про то, как агент сам ведёт такие задачи, я уже писал отдельно.

Когда PRD готов, команда схлопывается до одной строки.

Возьми issue, разбей задачу, раздай эти задачи субагентам. Конечная цель: опубликовать в свежесозданном телеграм-канале трек, у которого ты написал текст и сгенерирована песня.

Это всё, что я написал. Оркестратор работал на Claude Code, модель Claude Fable 5 — весь запуск прошёл в прямом эфире, запись тут. Дальше я смотрел.

Агент сам себя проверил перед стартом

Первое, что меня удивило — агент не бросился выполнять. Сначала проверил почву: статусы под-задач в issue, ключ к ElevenLabs, живая ли сессия для постинга в Telegram. И только потом начал раздавать работу.

Я этого не просил отдельной строкой. Это вытекло из формы задачи: раз есть конечная цель «опубликовать», агент сам понял, что без живого доступа к каналу и без ключа к генератору публиковать будет нечего. Проверил предпосылки — поехал.

Сам текст песни написал оркестратор. Не я. Я не сочинял ни строчки — я задал тему и стиль в PRD, остальное собрал агент. Песня называется «Агенты не спят», русский текст, синтвейв. Припев получился прямо про эту историю:

Агенты не спят, агенты не спят — тысяча рук собирает мой мир. Я только смотрю, как огни летят: коммит за коммитом — в эфир.

А в самом конце — «В эфире — RIS FM». Текст про то, что я делал ровно в этот момент: смотрел, как агенты собирают результат, и ничего не трогал руками.

Дальше — четыре субагента параллельно

Когда текст готов, оркестратор разбил оставшуюся работу и раздал её четырём субагентам на Sonnet. Sonnet — не самый дорогой и не самый дешёвый, ровно под такую исполнительскую работу: понятная задача, нужен надёжный результат без переусложнения. Я давно перестал ставить на всё подряд топовую модель — про то, какую модель класть субагенту под какую задачу, есть отдельный разбор.

Важная деталь: канал и трек делались одновременно, не по очереди. Один субагент возился с генерацией музыки, другой в это же время поднимал канал в Telegram. Параллельная оркестрация — это то, к чему я пришёл ещё на совете директоров из субагентов: несколько агентов работают разом, оркестратор сводит результаты.

Вот как это выглядело по структуре:

   моя команда (одна строка)
            │
            ▼
   ┌─────────────────────┐
   │   оркестратор       │
   │   (Fable)           │
   │   читает PRD,       │
   │   пишет текст песни │
   └─────────┬───────────┘
             │  раздаёт задачи
       ┌─────┴─────┐
       ▼           ▼
  ┌─────────┐  ┌─────────┐
  │ субагент│  │ субагент│   ← Sonnet, параллельно
  │  канал  │  │  трек   │
  │ telethon│  │ Eleven  │
  └────┬────┘  └────┬────┘
       │            │
       └─────┬──────┘
             ▼
       публикация в @ris_fm
             │
             ▼
         meta.json
   (факты, коммиты, закрытые задачи)

Субагенту на трек задача звучала примерно так:

Сгенерируй трек через ElevenLabs Music API. Текст: [lyrics]. Стиль: синтвейв. После генерации: нормализуй громкость до −14 LUFS, проставь ID3-теги, отдай mp3. Замерь кредиты до и после.

Музыку делал ElevenLabs Music. На июнь 2026 это единственный публичный вокальный генератор с нормальным API — у Suno и Udio API нет, только интерфейс. Их music-эндпоинт принимает текст на любом языке (хотя описание стиля — только на английском), отдаёт до 10 минут музыки, стоит $0.15 за минуту, коммерческое использование уже включено. Это и решило выбор — мне нужен был API, а не сайт, куда надо ходить руками.

Второй субагент в это время через telethon проверял, свободен ли желаемый адрес канала, создавал канал и писал переиспользуемый скрипт постинга аудио — чтобы следующий трек выкладывался той же кнопкой.

Один момент агент решить не смог

И тут — заминка. Сам канал создался, а вот повесить на него публичный адрес не вышло — Telegram упёрся в лимит. У публичных адресов есть потолок: десять штук на аккаунт, двадцать с Premium-подпиской — это прямо в их FAQ. У меня их уже было занято под завязку, и Telegram ответил ошибкой про слишком много публичных каналов.

Это решение агент честно вынес мне. Не стал придумывать сам, какой из моих старых каналов не жалко — это не его зона. Он показал список и спросил. Я ответил одной фразой: «@bespesovo — дропаем». На этом моё участие закончилось: старый адрес освободился, новый канал встал на его место.

Вот граница, которую я для себя нащупал. Технический баг — забота агента, и он его чинил сам: при публикации числовой id канала сначала распарсился как имя пользователя, агент это поймал и поправил без меня. А вот «какой из моих каналов закрыть» — это уже моё решение, не техническое. Это разные вещи, и хорошо, что агент их различает.

Что в итоге вышло

Канал @ris_fm создан, первый трек в нём — @ris_fm/2. Песня на две минуты ровно, синтвейв, русский вокал. Подпись под постом — «текст — Fable · музыка — Eleven Music · стиль — синтвейв», чтобы было честно видно, кто что сделал.

По цифрам: на всю генерацию ушло 3 182 кредита ElevenLabs из трёхсот тысяч на аккаунте — расход почти незаметный. В раннем тесте, правда, был казус: биллинг показывал кредиты с задержкой, и я на секунду подумал, что списалось больше. Подождал — цифры сошлись.

И главное — всё зафиксировано. Агент собрал meta.json с фактами о треке, закрыл под-задачи с результатами и сделал коммиты в оба репозитория, которые тут участвовали: corp-radio для трека и tg-telethon для постинга. Через месяц я открою issue и увижу, что и почему было сделано, — мне не придётся вспоминать.

Вывод: работа делается до команды

Главный урок этой сессии для меня не про музыку и не про Telegram. Он про то, где находится настоящая работа.

Настоящая работа была в PRD. Пока я отвечал на вопросы grill-сессии и фиксировал решения в issue, я делал всё, что вообще должен делать человек. Дальше команда схлопнулась до одной строки, а агент развернул её обратно в полноценный конвейер: текст, четыре параллельных субагента, генерация, постинг, фиксация. Без зафиксированных решений он бы выдал шаблонную заготовку и засыпал бы меня уточнениями. С ними — довёл до опубликованного трека сам.

Это та же логика, по которой у меня работает редотдел из трёх промптов и видео-пайплайн от записи до YouTube: человек один раз настраивает форму, дальше агент крутит её end-to-end. Просто здесь конвейер собрался и отработал прямо на стриме, в один присест, и на выходе оказалась песня. Вот запись целиком:

Я её, кстати, послушал. Припев прилипает.

Подписаться на обновления — @sereja_tech