Игорь Градов
Игорь Градов
6 мин
ai

Ассистент с удалённым доступом по локальной сети: 29 000 строк монолита разрезаны на 8 модулей за 8 дней

Локальный ассистент для видеозвонков получил модульную архитектуру: разработчик из России 19 сентября начал рефакторинг монолита из 29 тысяч строк и за восемь дней разрезал его на переиспользуемые пакеты с автоматической проверкой зависимостей.

Ассистент с удалённым доступом по локальной сети: 29 000 строк монолита разрезаны на 8 модулей за 8 дней
Почему это важно

Впервые описан полный паттерн разделения локального ИИ-приложения на независимые модули с собственным «сторожем» импортов, и весь процесс воспроизводим на любом Python-проекте.

Речь о «Чароите», локальном ассистенте для видеозвонков, который работает без облака, по локальной сети. Разработчик опубликовал подробный отчёт о том, как монолит из 60 файлов без единого пакета превратился в набор изолированных модулей. Источник: авторский пост разработчика «Чароита». Для тех, кто пишет на Python крупные проекты, это готовый рецепт: как организовать зависимости так, чтобы каждый модуль можно было установить, протестировать и переиспользовать отдельно.

Что Когда Кто выпустил Цена
Рефакторинг «Чароита» (локальный ассистент для видеозвонков) из монолита в 8 модулей 19 сентября (начало), 8 дней работы Независимый российский разработчик Не указана

Что поменялось в архитектуре?

  • Монолит разрезан на 8 модулей. Было: 29 тысяч строк в одной папке src/, около 60 файлов, ноль пакетов. Стало: 8 файлов в отдельном пакете charoite_graph, импорты обновлены в 53 потребителях (74 файла).

  • Собственный «сторож» зависимостей вместо стандартного import-linter. Стандартный инструмент import-linter требует уже готового импортируемого пакета, а его-то и не было. Разработчик написал свой: сторож проходит по AST (дереву разбора, описанию структуры кода), собирает граф импортов и сверяет его с файлом layout.json. У каждого модуля есть слой, у слоёв порядок. Импорт «против течения» разрешён только с номером карточки-задачи.

  • Ядро core разделено на base и runtime. Выяснилось, что половина «ядра» зависит от окружения машины (пути, конфиг), а половина не знает о машине ничего. Сторож теперь проверяет, что base не импортирует ничего из окружения.

  • Данные больше не привязаны к расположению файла. Раньше модули вычисляли корень данных через __file__ (путь к собственному файлу). После рефакторинга корень данных задаётся в одном месте, а точки входа обязаны указать его явно. Это позволяет свободно перемещать файлы.

  • Пакет графа работает без основного приложения. Поиск по графу ссылок с русской морфологией запускается отдельно, без установки всего «Чароита». Модель эмбеддингов (числовых представлений слов для поиска похожих фрагментов) пакет получает снаружи как значение, сам он не знает ни об Ollama, ни об адресе сервера.

  • Механический переезд файлов выполнял DeepSeek. Нейросеть работала в песочнице под отдельной учёткой, без токена хостинга и без доступа к чужим каталогам. На входе задание, на выходе патч. Допуск и пуш делал человек.

Как порядок фаз изменился на практике?

Исходный план предполагал шесть фаз и один день работы. На практике ушло восемь дней, а порядок поменялся в первый же день. Вместо «переехать, потом развязать» получилось наоборот: сначала развязки зависимостей, потом физический переезд файлов.

Логика такая: двигать файлы с перепутанными связями означает переносить путаницу в новые папки. Разработчик сначала поставил «забор» (сторожа импортов), затем разрезал зависимости, и только потом перенёс код.

Каждая задача проходила внешнее ревью ДО первой строки кода. Схема папок хранилища прошла 24 входных круга проверки, форма пакета 11 кругов. Следующий круг запускался, только если предыдущий обнаруживал ошибку уровня Critical.

Как «Чароит» проверяет изоляцию пакета?

Тест-проба копирует 8 файлов пакета во временную папку и запускает их отдельным процессом с «отравленным» окружением: домашняя папка, корень данных, каталог графа и TMPDIR указывают в ловушку. Пользовательских путей Python нет, байткод не пишется.

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

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

Как попробовать?

  1. Клонируйте репозиторий «Чароита» (ссылка в авторском посте разработчика).
  2. Изучите файл layout.json в docs/design/ и скрипт сторожа импортов: это готовый шаблон для вашего Python-проекта.
  3. Примените паттерн к собственному монолиту: опишите слои, расставьте порядок, запустите сторожа на CI.

Есть ли похожие инструменты в России?

Сам «Чароит» и есть российский продукт. Для тех, кто ищет локальный ассистент удалённого доступа по локальной сети с ИИ-функциями, ближайшие облачные аналоги в РФ, это YandexGPT и GigaChat, но они работают через облако, а не локально. «Чароит» принципиально другой: он обрабатывает звонки и строит граф связей на вашей машине, данные не уходят на сторонний сервер.

Параметр «Чароит» YandexGPT / GigaChat
Где работает Локально, на машине пользователя Облако
Данные покидают устройство Нет (по умолчанию) Да
Поиск по графу связей Есть, с русской морфологией Нет
Модульная архитектура 8 пакетов, сторож зависимостей Закрытая модель, архитектура не раскрыта
Мнение редакции dzen.guru

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

Во-первых, собственный сторож импортов проще, чем кажется. Стандартные инструменты вроде import-linter требуют уже готовой структуры. Написать свой на базе AST, это задача на день, а польза на годы.

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

В-третьих, внешнее ревью до кода, а не после, это практика, которую я рекомендую всем авторам dzen.guru, работающим с ИИ-инструментами. 24 круга проверки звучит избыточно, но каждый круг находил ошибку уровня Critical.

Оговорка: отчёт описывает начало рефакторинга, пакет ещё не опубликован как отдельное колесо pip. Результат промежуточный.

Что сделать сегодня: откройте свой крупный Python-проект, нарисуйте граф импортов (хотя бы вручную) и посчитайте «рёбра против течения», зависимости, которые идут от верхнего слоя к нижнему. Если их больше трёх, у вас та же проблема, и этот паттерн подходит.

Частые вопросы

Нужно ли ставить весь «Чароит», чтобы использовать паттерн рефакторинга?

Нет. Паттерн (сторож импортов + файл layout.json со слоями + тест-проба с отравленным окружением) применим к любому Python-проекту. Код сторожа описан в отчёте и доступен в репозитории.

Зачем модель эмбеддингов передаётся снаружи, а не встроена в пакет?

Чтобы пакет графа не тянул за собой Ollama, onnxruntime и другие тяжёлые зависимости. Пользователь сам выбирает модель или подставляет заглушку для тестов. Это и есть суть изоляции: пакет делает одно дело и не навязывает инфраструктуру.

DeepSeek писал архитектуру или только двигал файлы?

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

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

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Engram за $675: нейросеть для генерации музыки превращает ошибки ИИ в звуки
ai

Engram за $675: нейросеть для генерации музыки превращает ошибки ИИ в звуки

Почему это важно Впервые аппаратный музыкальный инструмент использует «сломанные» галлюцинации (когда ИИ уверенно выдумывает то, чего не было) локальной…

4 мин
Теория возможностей в машинном обучении: третья зона между «да» и «нет» снижает галлюцинации ИИ
ai

Теория возможностей в машинном обучении: третья зона между «да» и «нет» снижает галлюцинации ИИ

Современные генеративные модели опираются на теорию вероятностей, но профессор Жереми Уссино из Наньянского технологического университета в Сингапуре…

5 мин
Muse от Meta ищет деньги на вашем телефоне: ИИ-агент против корпоративного курса OpenAI
ai

Muse от Meta ищет деньги на вашем телефоне: ИИ-агент против корпоративного курса OpenAI

Почему это важно Meta сделала ставку на массового пользователя в тот момент, когда OpenAI и Anthropic уходят в корпоративный сегмент: для авторов и…

5 мин