Автопилот · технический разбор

«Сменные мозги» — что это значит на уровне кода

Обещание «заблокируют одну модель — переключим на другую» стоит ровно столько, сколько стоит проверка за ним. Поэтому — разбор: где переключение реально ломается, что у нас собрано, и что мы пока не проверили.

Откуда взялась задача

Это не гипотеза с рынка, а история нашего же клиента. Человек настроил личного агента, месяц спокойно им пользовался — потом доступ к модели из России отвалился, и агент замолчал. Работа встала не потому, что что-то сломалось в самом агенте: сломался канал к «мозгам».

Вывод простой: модель должна быть сменной деталью, а не фундаментом. Дальше — что мешает сделать её сменной на самом деле.

Три места, где переключение ломается

1Разные движки по-разному помнят разговор

Агент без памяти диалога бесполезен — каждый раз объяснять контекст заново никто не будет. У разных движков память устроена по-разному: одному идентификатор разговора можно назначить заранее, другой чеканит его сам, и подставить свой нельзя.

Схема «сгенерировали номер разговора заранее и работаем с ним» на втором движке просто не запускается. Правильно так: первый ход идёт без номера, номер вылавливается из ответа движка и сохраняется, дальше разговор продолжается по нему. Мелочь на словах — но именно на ней ломается перенос.

2Разные движки по-разному сообщают об ошибке

Самая неприятная ловушка, и мы в неё попались на первой версии. Один движок при провале авторизации возвращает код успеха — формально «всё хорошо». Другой возвращает код ошибки, но текст ошибки кладёт туда же, куда обычные ответы.

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

3Разные движки по-разному ограничиваются в правах

Агент работает с вашими файлами и данными, поэтому важно, что ему разрешено. Здесь движки честно неравноценны: у одного есть точный список разрешённых действий, у другого — только грубые режимы: «только чтение», «запись в рабочей папке», «полный доступ».

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

Что собрано и чем проверено

  • Единый интерфейс к обоим движкам. Бот не знает, с какой моделью говорит, — переключение делается одной настройкой, без переписывания логики.
  • 69 автотестов, все проходят. Покрыты обе схемы памяти диалога и обе схемы ошибок — включая ту ловушку из пункта 2. Было 14 — остальные 55 выросли из найденных дефектов: каждый пойманный сбой превращается в тест, чтобы он не вернулся.
  • Эмулятор движка. Повторяет формат ответов настоящего, позволяет прогонять всю обвязку целиком, не тратя на это платную подписку.
  • Диагностика одной командой. Если агент замолчал, отдельный скрипт за секунды называет причину из пяти возможных и печатает готовую команду лечения — вместо переписки «а что у вас в логах».
  • Память и настройки переносятся. При смене модели ваш контекст, сценарии и правила остаются — перенастраивать с нуля не нужно.

Самая полезная поломка, которую мы нашли у себя

Все 66 тестов были зелёными. Продукт при этом ломался с первого сообщения

8 августа мы запустили сборку не против эмулятора, а против настоящего движка. И увидели то, чего не видел ни один тест.

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

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

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

Что мы пока НЕ проверили

Основной движок — проверен вживую 9 августа. Резервный — ещё нет

Что изменилось. До сегодняшнего дня вся цепочка была проверена только против эмулятора, и мы честно писали здесь, что настоящего ответа модели в этой обвязке не видели ни разу. Теперь видели: живой прогон на основном движке (Claude) прошёл целиком — агент отвечает, помнит предыдущий ход в том же диалоге, а сгоревшая сессия восстанавливается сама, вместо того чтобы намертво заклинить переписку. Три проверки из трёх, ни одной осечки.

Обновление 10 августа: резервный мозг отвечает. Шесть кругов приёмки подряд резервным движком у нас числился Codex — и все шесть он молчал, потому что под него нет платного аккаунта. Мы держали это за внешний блокер. Оказалось, дело не в аккаунте, а в том, что мы упёрлись в одного поставщика: взяли другого, у которого доступ уже был, и провели такой же живой прогон — три хода из трёх, ответ по-русски, контекст между ходами держится, отклик 0,2–0,5 секунды. Резервный мозг существует и работает.

Что по-прежнему НЕ сдано. Этот прогон сделан на уровне движка, а не в клиентской поставке: автоматического переключения «основной упал → включился резервный» в коробке у клиента ещё нет, его собираем сейчас. Пока не собрано — резервный мозг считаем проверенным, но не сданным, и на странице это написано прямо. Отдельно: ветку Codex мы из обещаний убрали до тех пор, пока не увидим её живой ответ своими глазами.

Мы пишем такие вещи, а не умалчиваем, по простой причине: если в чём-то есть подвох, вы узнаете о нём от нас, а не из собственного сломавшегося агента.

11 августа: дверь, в которую вы входите, два дня была глухой — и мы узнали это не от клиента

Что было. Три кнопки на этом сайте ведут в наш Telegram-бот. В коде стояла проверка «свой или чужой», и на публичный режим её никто ни разу не применил. Результат: бот отвечал только владельцу, а любой пришедший с сайта получал полную тишину. Бот при этом был жив, процесс работал, в журнале ни одной строки об ошибке. Сторож, который следил за тем, что процесс не умер, такую поломку не видит по устройству.

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

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

В тот же день, тем же способом, нашли второе. Мы обновили боевую копию нашей же поставки — так, как это сделает клиент, — и обновление отказалось завершаться: «копия не проходит собственные тесты». Разобрали по одному: тесты проходят, врал отчёт. Один набор проверяет установщик, которого в копии клиента нет по замыслу, и потому не может пройти там никогда; второй был убит по таймауту, а назван упавшим. То есть путь обновления у клиента не работал бы вообще, при полностью исправном коде. Чиним. Пишем об этом до того, как кто-то купил, а не после.

Что это значит для вас

  • Агент собирается сразу под смену модели, а не «переделаем, когда прижмёт». Переделка потом стоит дороже, чем закладка сразу.
  • Если канал к модели отвалится — переключение занимает вечер, а не пересборку с нуля.
  • Подписка на модель оформляется на вас: мы не перепродаём чужой доступ, вы владеете аккаунтом и не привязаны к нам.

Пакеты и цены — на странице услуги. Если хотите обсудить свой случай, напишите пару слов о том, чем занимаетесь.

Личный AI-агент: пакеты и цены