Есть ли смысл разрабатывать десктоп-ассистента с модульной (плагинной) архитектурой, где каждая функция реализуется отдельным подключаемым модулем?

Я хочу нормальный десктопный AI‑ассистент — не веб‑морду (чтобы не держать браузер открытым), не контейнер на 2–3+ GB с Open WebUI и не очередной Electron‑монстр, жрущий сотни мегабайт ради одного поля ввода. <br/> Простая программа на рабочем столе: спрашиваешь — отвечает; умеет работать с файлами, искать в интернете и набрасывать документы. <br/> Всё, что я нашёл, тащит за собой «пол‑интернета»: Docker‑образы под 2 GB, «лёгкие» клиенты на Electron с целым браузером внутри. По сути нужны лишь список сообщений, поле ввода и десяток простых инструментов. <br/> Кроме того, если не устраивает интерфейс или хочется добавить другого провайдера, приходится переписывать половину приложения. <br/> Моя идея — создать модульный десктоп‑агент, где всё опционально: GUI/TUI, серверный режим или интеграция с Telegram подключаются и отключаются модулями. <br/> Хочу, чтобы опыт использования был близок к vim; философия разработки — что‑то вроде Arch. <br/> Интересует мнение сообщества: есть ли смысл в такой идее и какие замечания или советы у вас есть? Буду рад любой критике — как конструктивной, так и не очень, главное по теме.
  • 12 июля 2026 г. 13:00
Ответы на вопрос 1
Коротко — да, идея имеет смысл. Модульная (плагинная) архитектура хорошо подходит под вашу цель — лёгкий, расширяемый десктоп‑ассистент «как vim/Arch», где ничего не грузится лишнего и можно легко подменять провайдеров или интерфейсы. Но есть и подводные камни. Ниже — обзор плюсов/минусов, практические советы по архитектуре, выбор технологий и заметки по безопасности/распространению.

1) Почему это хорошая идея
- Малый базовый вес: минимальное ядро без UI и без моделей — пара сотен KB/MB вместо гигабайтов.
- Гибкость: пользователи берут только нужные плагины (GUI, Telegram, LLM-провайдер, веб‑поиск, OCR и т. д.).
- Замена частей без переписывания всего приложения: чётко определённый API для плагинов.
- Безопасность и приватность: можно по умолчанию отключать плагины, которые имеют сетевые/файловые права.
- Коммьюнити и экосистема: другие могут писать плагины (если API удобный).

2) Минусы и риски
- Сложность: проект становится сложнее из‑за управления жизненным циклом плагинов, совместимости версий, API стабилизации.
- UX‑фрагментация: разные плагины могут давать разный пользовательский опыт; надо хорошо продумать общие UX‑контракты.
- Безопасность: плагины — потенциальная угроза; нужен модель разрешений и/или песочница.
- Экосистема: вы потенциально создаёте ещё один стандарт — трудно привлечь разработчиков, пока API не стабилен и нет примеров.

3) Рекомендуемая архитектура (высокоуровнево)
- Ядро (agent core): отвечает за хранение состояний разговоров, маршрутизацию сообщений, менеджмент плагинов, базовые политики безопасности и конфигурацию.
- Интерфейсный слой: UI как отдельный плагин/клиент (TUI/GUI/tray/HTTP/Telegram).
- Инструменты (tools): плагины «инструменты» — доступ к файлам, поиск, генерация документов, запуск кода, браузерная автоматизация.
- Провайдеры LLM: плагины для разных моделей (OpenAI, Anthropic, локальные llama.cpp/ggml, remote self‑hosted) — единый адаптирующий интерфейс (prompt/streaming/stop tokens/metadata).
- IPC / контракт: JSON-RPC / gRPC / protobuf / простая HTTP/Unix-socket + well‑documented schema.
- Плагины как изолированные процессы или WASM: чтобы проще держать безопасно и кроссплатформенно.

4) Конкретные технические рекомендации
- Язык ядра: Rust или Go. Причины: статические бинарники, малая зависимость рантайма, хорошая поддержка cross‑compile, производительность и безопасность. (Если вам важна скорость разработки и экосистема библиотек — Python, но вес будет больше и нужно продумывать упаковку.)
- Plugin model:
  - Рекомендуемый способ: процессы + JSON-RPC по stdio/Unix sockets. Простая отладка, отдельная память, можно писать плагины на любом языке.
  - Более безопасный и переносимый вариант: WASM (wasmtime/wasmer) — строгая изоляция, детерминированность, но нужно проектировать API для host → WASM (и управлять ограничениями).
  - Нативные динамические библиотеки (dlopen) — быстрее, но опасно и сложно в кроссплатформенности/безопасности.
- Дисковое размещение плагинов: каталог ~/.local/share/youragent/plugins с манифестом (yaml/json). Манифест описывает версии, разрешения (files, network, shell), входные точки.
- Discovery & sandboxing: проверка цифровой подписи плагинов, запрос прав у пользователя при установке (разрешения granular).
- Протокол между ядром и UI: текстовые сообщения + streaming (для генерации LLM). JSON-RPC с поддержкой chunked streaming удобно.
- Структура данных разговоров: сообщения с метаданными (role, tool use, tool results, embeddings, timestamps). Плагин памяти — опциональный backend (SQLite + векторный индекс).
- Векторное хранилище: иметь опциональный lightweight backend (SQLite + Faiss/Annoy bindings) и возможность подключать внешние vector DB плагины.
- LLM abstraction: единый adapter API: send_prompt(prompt, history, options) → stream/complete; провайдеры реализуют mapping. Позволяет легко подменять OpenAI на llama.cpp.

5) GUI/TUI рекомендации
- TUI: tui-rs (Rust) или Python curses — отлично для минималистичного интерфейса.
- Нативный GUI (без Electron): 
  - Rust: egui (native), iced — лёгкие и статические.
  - Qt/GTK: полноценные, но тяжелее; подходят если нужны rich widgets.
  - Если хочется webview, но не Electron: Tauri (вроде лёгкий, использует системный webview), но у некоторых это всё же «web».
- Минимализм: небольшое окно с history, поле ввода, командная палитра (fuzzy), хоткеи, system tray для поднимания агента.

6) Работа с вебом и automation
- Поиск: не надо тащить headless Chromium; используйте SerpAPI/Bing API/DuckDuckGo-html-scraper (легковесно), плагины можно конфигурировать.
- Для сложной автоматизации (form filling, screenshots) — отдельный опциональный плагин, который может запускать headless browser как отдельный процесс (пользователь включил/установил).
- OCR/Document parsing — плагины, зависящие от tesseract/свободных библиотек.

7) Местные модели vs облачные
- Поддерживайте оба варианта через плагины:
  - облачные провайдеры: OpenAI, Anthropic, т. п. — простой.
  - локальные: llama.cpp/ggml, ggmlquant, llmsrv — для оффлайн работы. Локальные модели всё ещё требуют место и сильную оптимизацию (квантование).
- Продумайте формат кэширования и управления моделями (где хранить большие файлы, удобный менеджер скачивания плагина‑модели).

8) Безопасность и приватность
- Capability-based permissions: плагины заявляют права; пользователь подтверждает; ядро ограничивает.
- Песочница: отдельные процессы, или WASM, или контейнеры для мощных/опасных плагинов.
- Не включайте сетевой доступ по умолчанию.
- Обработка конфиденциальных данных: ясно документировать какие плагины отправляют данные в сеть. Предусмотрите просмотр логов запросов/ответов.

9) UX и экосистема
- Сделайте хорошую CLI/TUI для управления плагинами (install/remove/upgrade).
- Хранилище плагинов (registry) — опционально, но сильно упрощает распространение.
- Документация: примеры плагинов, шаблон «hello world».
- Конфиг как код: текстовые конфиги (toml/yaml), поддержка dotfiles.
- Сильный фокус на клавиатуре, быстрое переключение контекста, macros/command palette.

10) Планы по реализации (пошагово, MVP)
- Мини‑ядро: message bus, plugin loader (процессы через stdio + JSON-RPC), simple permissions, simple history store (SQLite), config.
- Один LLM провайдер: OpenAI plugin (HTTP) + basic streaming.
- Один UI: TUI с историей + ввод.
- Один tool: File tool (чтение/поиск в файлах) с правами.
- Тесты: unit + e2e для плагинов.
- Затем: добавить локальную модель плагин (llama.cpp wrapper), Telegram plugin, tray GUI, manager plugin registry.

11) Практические подсказки по реализации
- Проектируйте API плагина с версионностью (v1, v2…).
- Логирование и tracing: может сильно помочь при отладке плагинов.
- Горячая перезагрузка плагинов: поддержите, но аккуратно с stateful плагинами.
- Сохраняйте conversation context отдельно от плагинов (чтобы при обновлении плагина диалоги не ломались).
- Обеспечьте возможность тестировать плагины: mock ядра / тест harness.

12) Примеры и похожие проекты (чтобы вдохновиться)
- Есть ассистенты и лаунчеры (Raycast/Alfred/Ueli), локальные LLM оболочки (llama.cpp/llm.cpp), а также проекты, использующие плагинные архитектуры. Изучите их подходы к интеграции плагинов и безопасности.

13) Итог
- Концепция имеет сильный смысл: даст легковесность, гибкость и контроль за зависимостями.
- Главное — продумать API плагинов, изоляцию/разрешения и UX для конечного пользователя.
- Технически рекомендую Rust/Go для ядра, процессную модель плагинов + JSON-RPC или WASM-плагины для безопасности и переносимости, и постепенно расширять экосистему плагинов.

Если хотите, могу:
- помочь набросать API JSON‑RPC для плагина (например, контракт для LLM‑провайдера и для инструментов);
- предложить конкретный стек (библиотеки Rust/Go) для реализации MVP;
- или сделать пример архитектуры/пакета для одного простого плагина (файл‑поиск или OpenAI provider).

Какая платформа вам приоритетнее (Linux/macOS/Windows)? На каком языке вам удобнее писать ядро и плагины?
Похожие вопросы