Перейти к основному контенту
2026-09-10Журнал разработкиИИ-агентАрхитектура

Снос работающего Agent: месяц замены платформы PureLab

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

Снос работающего Agent: месяц замены платформы PureLab

В августовском отчете мы написали одну фразу: помощник в этой версии пока не открыт.

Это не было ленью. В то время Agent первого поколения уже мог вести диалог на странице организации, искать треки и выдавать предпросмотр; реальной проблемой была сама платформа. Продолжать добавлять функции означало бы намертво зашить оркестрацию, сессии, ключи и музыку в один процесс. Для второго продукта пришлось бы делать всё заново. Мы решили снести ту систему, которая уже могла работать, и заменить ее на среду выполнения (runtime), которую можно встраивать, проверять и изолировать от сбоев.

Эта замена оказалась гораздо сложнее, чем написание окна чата с нуля.

🛠 Первое поколение уже могло работать, и в этом крылась проблема

Июльская версия не была прототипом. Это был полноценный помощник, встроенный в процесс PureLab: многошаговые потоки, сохранение сессий в базу, отмена и последовательные блокировки, собственные ключи модели пользователя, поиск по медиатеке и предпросмотр тегов, а обратная запись по-прежнему шла через собственный шлюз подтверждения продукта. Доменная безопасность была сильной стороной — модель не могла напрямую изменять файлы, пути должны были десенсибилизироваться, а контроль доступа к подпискам не мог быть обойден только из-за использования диалога.

Проблема заключалась не в том, «может ли он общаться», проблема была в архитектуре.

Оркестрация, каналы событий, таблицы сессий, расшифровка ключей, вызовы инструментов — всё это находилось в процессе продукта. Интерфейс распознавал только этот поток событий. При смене библиотеки, переключении панелей или конфликте генерации, конечный автомат (state machine) пришлось бы писать заново как на фронтенде, так и на бэкенде. Хуже того: если следующему десктопному продукту тоже понадобится помощник, это будет означать копирование всего хоста. Это не встраивание, это каждый App выращивает своего собственного Agent.

Мы пытались «оставить старое и подключить новое».

🚧 Более трудный обходной путь: сохранение двух движков ради сравнения, написание четырех тысяч строк дизайна и последующее полное аннулирование

В начале августа был путь, который казался более стабильным: на правой панели одновременно висели «Классический ИИ» и «Умный помощник». Изначально мы оставили старое ядро только для того, чтобы иметь базу для «сравнения результатов» при подключении новой платформы. Мы надеялись, что пока новый изолированный процесс постепенно обретает совместимость с Windows, сборку и каналы ключей, мы сможем проверять качество выдачи модели через старый движок.

На бумаге это называлось плавным переходом, но после внедрения в дизайн это превратилось в катастрофу.

Чтобы поддерживать это «сравнение», нельзя было смешивать две системы команд диалога, нельзя было сверять две сессии, а один и тот же ключ нужно было одновременно скармливать внутрипроцессной оркестрации и изолированному процессу. Хуже всего то, что ключ нельзя было записать в переменные окружения или конфигурационные файлы. Предпросмотр, подтверждение, обратная запись и откат должны были продолжать идти через собственную цепочку безопасности продукта, а новое ядро не могло иметь произвольных прав на файлы. На тот момент Windows полностью закрыл изолированные процессы, но вход все равно должен был оставаться, текст должен был быть читаемым — не пустым и не вызывающим сбои.

Этот дизайн с двумя входами, созданный ради «сравнения результатов», насильно включил в себя более тридцати жестких решений, а основной текст превысил четыре тысячи строк. Еще до начала реализации мы поняли: это не сравнение, это одновременное поддержание двух помощников, двух баз данных и двух зон отказов. Любая мысль о «совместимости со старыми сессиями» заблокировала бы обе стороны.

13 августа весь документ был аннулирован.

В новом контракте было всего несколько строк, но каждая из них стоила дорого: Kit полностью перешел на новый код, новые команды, новые каналы событий. Никакой совместимости со старыми путями, никаких сверок, никакого переноса истории, никаких общих таблиц. «Миссия сравнения» старого Agent была немедленно завершена. При удалении мы убрали только старый вход в продукт, не изменяя новый контракт.

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

⛰️ Замена платформы требовала сдвинуть несколько гор

Аннулирование — это лишь разрешение. Настоящие усилия потребовались для того, чтобы разбить «функцию чата в продукте» на три слоя и подключить их к PureLab за один месяц.

  • 📦 Первая гора — процесс: Цикл модели больше не мог делить одну зону отказов со страницей организации, обратной записью и анализом. Диалоги проходят в изолированном процессе; продукт отвечает только за запуск, мониторинг и возврат в случае сбоя. Если изолированный процесс падает, конвейер медиатеки и тегов должен продолжать работу. И наоборот, продукт ни в коем случае не должен предоставлять модели общий терминал, произвольную файловую систему или внешние инструменты, права на запись в музыкальную библиотеку не принадлежат помощнику.
  • 🔌 Вторая гора — протоколы: Интерфейсу запрещено обращаться к низкоуровневым протоколам сессий, а продукту запрещено вручную собирать цикл «отправка prompt, прослушивание событий, сборка истории». Посередине должен быть стабильный продуктовый протокол: отправка, остановка, список сессий, восстановление, каналы конфигурации. Транспортом могут служить десктопные команды, но сам протокол не принадлежит конкретному App. Второму продукту нужно лишь повесить панель, предоставить идентификацию текущей медиатеки, зарегистрировать доменные возможности, а не реализовывать хост заново.
  • 🔑 Третья гора — ключи: Ключи модели пользователя продолжают храниться в продукте в зашифрованном виде. Этот ключ не должен появляться ни на диске изолированного процесса, ни в переменных окружения. Запросы из изолированного процесса возвращаются к локальному циклу, продукт кратковременно расшифровывает их, передает в заполненный пользователем интерфейс и затем удаляет. Копирование файлов базы данных по-прежнему может позволить восстановить шифротекст, это известный риск, и мы не делаем вид, что уже решили его с помощью системной связки ключей.
  • 🛠 Четвертая гора — доменные инструменты: Помощник может искать в текущей авторизованной библиотеке, читать треки, показывать предпросмотр переименования и патчи тегов, а также генерировать черновики. Но он не может запускать обратную запись, переименование, конвейер или анализ. Бизнес-процесс должен быть таким: сначала предпросмотр 1-5 треков, если результат правильный — генерация до 50 черновиков, затем на рабочей станции появляется окно обратной записи, и только после нажатия Apply файлы изменяются. Модели запрещено придумывать пути, требовать от вас внутренние номера библиотеки или утверждать, что «уже все исправлено».
  • 🚀 Пятая гора — кроссплатформенная сборка: Один и тот же контракт. macOS требует песочницу с подписью, а Windows на некоторое время сделал изолированные процессы недоступными, отображая только «в текущей системе недоступно». Лишь в сентябре в Windows были согласованы домашние директории изолированного процесса, переключатели возможностей и директории для отладки/релиза. Половина работы Agent в десктопном ПО заключается не в диалогах, а в том, чтобы «установиться, запуститься и не уронить основную программу».

Эти пять гор нужно было двигать одновременно. Сначала сделать чат, а потом безопасность, или сначала безопасность, а потом Windows — любой из этих путей вернул бы старый вход во время периода сравнения. Мы удалили даже право вернуть старый вход.

⚙️ На что реально ушел этот месяц

С середины августа до 10 сентября в календаре стояло «подключение». На деле это была череда утомительной работы с граничными случаями:

  • Сплетение каналов и конечных автоматов: В настройках должен быть видимый для человека вход «ИИ-помощник». Без конфигурации панель не может отображаться как готовая; по умолчанию панель чата пустая и на английском, продукт внедряет кнопку «Перейти в настройки», отправляя пользователя на нужную страницу; внутренние коды ошибок не должны просто вываливаться в интерфейс. При смене адреса интерфейса одно время требовалось заново вводить Key, лишь позже разрешили «Key остается, меняется только адрес или модель» — то, что сделал бы реальный человек. Это не проблемы текстов, это автоматы состояний каналов, связанные с расшифровкой ключей.
  • Управление сессиями сложнее окна чата: Создание новой сессии не должно перезаписывать «восстановление последней непустой». При переключении на другую библиотеку список сессий должен меняться, а не смешиваться; закрытие правой панели и повторное открытие в том же сеансе должно просто заполнить экран, а не воспроизводить диалог как печатную машинку; только после закрытия и повторного открытия программы происходит холодное восстановление. При переключении туда-обратно история даже терялась, позже мы сделали запоминание спроецированных событий для каждой сессии. Удаление сессии должно закрывать фоновую сессию и очищать директорию на диске, при этом нельзя позволять случайное удаление во время генерации.
  • Крайне изнурительный механизм обратной записи: Шлюз подтверждения старого Agent был правильным, новая платформа не должна становиться мягче только из-за смены транспорта. В чате больше не будет вопросов «разрешить этот инструмент» — одобренные запросы пропускаются хостом. Лишь в начале сентября мы свели цикл «заполнение параметров → предпросмотр небольшой выборки → генерация черновика → нажатие Apply» в продуктовое событие, а подтверждение изменения файлов осталось в окне обратной записи, а не во всплывающем окне чата. Для переименования нет патчей, сначала выдается сопоставление путей, и вы применяете его после проверки в рабочей зоне. Любая фраза «помощник уже изменил ваши файлы» в этом контракте — баг.
  • Независимость панели и компромиссы встраивания: Сама панель должна выглядеть как рабочая станция, а не как демонстрация. Markdown поддерживает только заголовки и списки, без подсветки синтаксиса; потоковый вывод, ошибки и отмена используют один и тот же рендеринг. Внутри панели жестко зашит английский, продукт может изменить только фразу входа в настройки — это одна из издержек встраивания в три репозитория. Она встроена справа на странице организации, и только недавно была перемещена вниз, чтобы не конфликтовать за внимание с извлечением, заменой и конвейером.

Ни одна из этих вещей не могла быть выпущена отдельно. Изменение протокола требует одновременного обновления хоста, панели и адаптера продукта. Пропуск хотя бы одного компонента приводил к ситуациям вроде «иногда общается, иногда теряет историю, иногда ключи отправляются не туда».

👀 Что вы увидите на рабочей станции сейчас

Продукт уже обновлен до версии 6.0. На странице организации вход для ИИ закреплен внизу панели действий справа. При открытии появляется полноценная диалоговая рабочая станция: поддержка нескольких сессий, возможность восстановления, остановка в любой момент. По сравнению с августовским отчетом 5.0, вход стал постоянным; в этой статье не утверждается, что версия уже выпущена в магазине.

  • Гибкая конфигурация: Сначала перейдите в настройки и введите свой интерфейс, модель и ключ. Мы не привязываем диалоги к какому-то одному облаку и не откатываемся тайно на встроенную модель при отсутствии настроек.
  • Сдержанные доменные возможности: После настройки вы можете обращаться к текущей открытой библиотеке. Например, предварительно посмотреть переименование по исполнителю и альбому, или посмотреть небольшую партию черновиков тегов. Помощник может искать, предварительно просматривать, генерировать черновики; будут ли файлы изменены — по-прежнему решать вам в окне обратной записи или при сопоставлении переименования. Конвейер тегов, запущенный в августе, все еще на месте, помощник не нажмет «Старт» за вас.
  • Жесткие границы: Анализ, обложки, тексты песен, дополнение метаданных из сети — все это на данном этапе ему недоступно. Не потому, что мы об этом не подумали, а потому, что границы должны сначала стать жесткими, а уже потом можно говорить о расширении возможностей.

💡 Затраты, на которые мы готовы пойти, и счета, которые еще не оплачены

Самое дорогое в замене платформы — это не написание нового кода, а признание того, что первое поколение уже работало, что сохранение двух движков ради сравнения казалось стабильным, и все равно решительное аннулирование этого проекта. Отказ от переноса истории — это безответственность по отношению к старым диалогам; перенос истории — это безответственность по отношению к новому контракту. Мы выбрали второе и полностью удалили старый вход в продукте, чтобы избежать вечного сравнения двух помощников.

Мы также должны открыто говорить о неоплаченных счетах. Переход на наш собственный релей, использование системной связки ключей вместо зашифрованного текста базы данных, обеспечение бесперебойной работы Windows-версии на уровне macOS — все это еще впереди. Помощник сейчас — это пилотный проект на рабочей станции, а не рекламный слоган «Умный помощник официально запущен».

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

Только после замены платформы мы сможем говорить о том, что помощник действительно помогает вам с организацией.