Разбор по коду · 08.10.2026 · Repowise 0.55.0
chat-agent: понять связи и убрать лишнее
Сервис уже разделён на несколько частей. Риск появляется там, где один обработчик управляет слишком многими состояниями. Ниже — короткий разбор и проверка, какие схемы Repowise умеет строить сам.
Состав стэка · Repowise CLI · Только исходники; production здесь не проверяли
Основной путь · подтверждён исходниками
Пять ролей вместо большой схемы
Core принимает запрос. Agent управляет его выполнением и выбирает инструменты; LLM gateway вызывает удалённую модель. RPC идёт через chat_nats, а части ответа приходят в браузер отдельными событиями — HTTP не держится открытым до конца ответа.
Приём запроса · Agent → LLM · LLM → vLLM
Голос · два владельца и два брокера
Аудио идёт по отдельной шине
Медиасервис передаёт PCM в старый audio_nats. Whisper возвращает распознанный текст через ту же шину; Core запускает Agent по финальной фразе. В сообщениях сохраняются session_id и stream_id. Интерфейс получает одну финальную транскрипцию, а ответ ассистента — по частям.
PCM · ASR final · Обе шины и удалённый ASR
Отдельный HTTP-путь · данные для пользователя и агента
Карта и погода идут напрямую
Браузер читает каталог и сохраняет положение или состояния через API gateway. Он получает OpenWeather, хранит кеш погоды и состояния в PostgreSQL. Перед запуском Agent эти данные попадают в снимок запроса. Поэтому инструменты видят согласованный набор, даже если карту изменили во время ответа.
Agent · данные · подтверждение
Инструменты читают снимок запроса
Положение самолёта, аэропорты и погода фиксируются перед постановкой в очередь. Восемь инструментов чтения доступны через Monty; три отдельные команды показывают карту и предлагают план. Запись плана требует решения человека. Старые pending-сценарии пока продолжает Ruby — это совместимость, а не скрытый fallback.
Инструменты · Snapshot и approval · Выбор нового / legacy пути
Подтверждено кодом · последствие следует из порядка запуска
Первое исправление: отвязать vLLM от Ollama
Новый агент использует vLLM. Но при старте gateway всё равно проверяет старый Ollama и tokenizer до подписки на запросы. Поэтому отказ старого провайдера способен остановить новый путь. Предлагаю инициализировать legacy-режим отдельно или только при его первом вызове.
Порядок запуска · Подписка после on_run · Проверка Ollama
Agent и интерфейс · риск сопровождения
Второе исправление: разделить управление состоянием
Приём, отмена, edit и восстановление работают с одним жизненным циклом. Сейчас AgentServer и AssistantApp держат много этой логики в больших обработчиках. Предлагаю выделить admission, переходы состояния и обработчики UI-событий, сохранив транзакции и fencing. Прямые тесты контроллера должны ловить поздние события и гонки.
Admission · UI-события · Что запускается в checks
Причина → последствие → ограниченная правка
Ещё четыре небольших, но полезных изменения
| Что видим | Почему это важно | Что предлагаем |
|---|---|---|
| Сборка может измениться сама | Часть Python-пакетов без точной версии; otel из Git без SHA. | Закрепить зависимости и commit helper. |
| Удалённому LLM достаётся локальный движок | В образ устанавливаются llama-cpp, CMake и компилятор. | Отдельная опция сборки local. Размер измерить после. |
| ICE зависит от внутренностей библиотек | Trickle использует private API aiortc / aioice. | Сохранить точные версии и media-тесты перед обновлением. |
| Legacy неверно объясняет погоду | Prompt называет её демоданными, get_weather читает OpenWeather. | Исправить описание источника в старом режиме. |
Здесь не требуется переписывать чат целиком. Каждая правка уменьшает конкретную зависимость или убирает расхождение между инструкцией и кодом. Ускорение и уменьшение образа пока не измерены; обещать проценты по статическому анализу нельзя.
Python / otel · Состав образа · Private ICE · Реальная погода
Статический сигнал ≠ разрешение удалить
Неиспользуемый код: три кандидата, без массовой чистки
| Код | Что проверено | Решение |
|---|---|---|
| NatsPublisher в LLM | В проверенных исходниках не найдено использования. | Кандидат на маленькую очистку. |
| get_params в ICE | Offer разбирается в main.py; старый helper не вызывается. | Кандидат на маленькую очистку. |
| setMicEnabled | Общий экспорт вызывает две функции, но сам не вызывается. | Кандидат на удаление всей старой цепочки. |
| Frontend, worklet, gateway, Ruby | Repowise ошибочно пометил их как неиспользуемые. | Использование подтверждено; оставить. |
Repowise не выдал ни одного безопасного автоматического удаления. Поиск вызовов подтвердил три небольших кандидата. Альтернативные runtimes занимают около 5 600 непустых строк, но нужны локальным профилям. Предупреждение о пароле в release-script тоже оказалось ложным: код читает environment.
Publisher · get_params · Старая mic-цепочка · Локальные profiles
Штатная функция · реально выполнено на нашем проекте
Repowise уже умеет строить C4
repowise export --format structurizr --standalone \
--components --no-externals -o architecture.dslMermaid: содержимое .mmd вставить в Code. В Config оставить {} или вставить скачанный JSON. Structurizr: файл .dsl открыть в Structurizr; Mermaid и LikeC4 его не читают. Эти схемы показывают связи исходников, а не весь работающий стэк.
Официальный Structurizr export · C4 / Mermaid API · Результат export на c0738a6
Ограничения проверены на экспорте нашего проекта
Автоматический граф требует смысловой проверки
| Автоматическое правило | Что получили здесь | Как довести до правды |
|---|---|---|
| Каталог → блок | Нативный экспорт включает неактивный src_langgraph. | По DRS различать production, local и legacy. |
| Import → стрелка | Внутренние вызовы видны лучше, чем NATS request/reply. | Добавлять subjects, producers и consumers по коду. |
| Библиотека → внешняя система | Mermaid показывает Asyncpg, а не нашу topology PostgreSQL. | Разделять пакет, процесс, БД и удалённый API. |
| Набор файлов → архитектура | Экспорт без externals не содержит audio_nats, chat_nats и Whisper. | Подключать проверенные ingress / DRS / ownership-связи. |
Сам Repowise не восстановил полную рабочую топологию. Если сразу красиво оформить его граф, часть важных связей пропадёт, а лишние блоки останутся. Поэтому сначала сверяем роли и протоколы с кодом, затем строим отдельные виды для текста, аудио и инструментов.
Как каталоги превращаются в C4 · Наши реальные роли и маршруты · Фактические DSL / Mermaid доступны на предыдущей странице
Возможность и предложение · интеграция пока не реализована
Для наших схем подходит Repowise + LikeC4
Быстрее всего начать со штатных C4 и Structurizr. Для схем в нашем стиле лучше отделить данные от оформления: один согласованный набор элементов и связей, несколько видов. LikeC4 умеет такую модель и динамические процессы; нужен перевод в его DSL. Наш автономный HTML остаётся отдельной подборкой понятных SVG.
LikeC4: model / views · Динамические виды · CLI и форматы экспорта
Предлагаемый порядок · приложение не меняли
Начать с малого, без полного переписывания
Сначала убрать лишнюю зависимость запуска, затем проверить и удалить три небольших остатка. После этого разделять управление запросами и UI-событиями, сохраняя контракт и поведение. Для схем используем три понятных процесса; полный граф остаётся средством поиска кода, а не первой страницей объяснения.
Первое исправление · Состояние запроса · События UI · Предложения, не выполненные изменения
Как смотреть
← / →, Page Up / Page Down и пробел переключают страницы. Home и End — начало и конец. F — полный экран, Escape — выход. Блоки с наведением ведут к подробностям; источники открываются отдельно. Скачать модель можно на странице 10.