Skip to content

Repository files navigation

Nexus

Android-приложение для инженерного ведения проектов и контроля версий аппаратных/программных состояний с автоматическим анализом сбоев с помощью ИИ (локального или облачного).

Назначение проекта

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

Ключевые возможности и архитектура систем

1. Управление снимками состояний (Snapshots)

Снимок в Nexus - это аналог коммита в Git. Он фиксирует состояние проекта на определенный момент времени и содержит:

  • Название и описание выполненных действий.
  • Теги (например, номера контактов, задействованные шины, версии прошивки).
  • Лог ошибки (если снимок фиксирует сбой).
  • Фотографию аппаратной части (с возможностью просмотра в общей галерее).
  • План решения от ИИ (если проводился анализ сбоя).

2. Гибридная оптимизация контекста снимков

Для экономии токенов и ускорения работы ИИ-моделей используется алгоритм сжатия истории снимков:

  • Если у проекта более 4 снимков, все старые снимки (кроме последних 3) сжимаются в лаконичный однострочный формат: [Индекс]. Снимок: "[Название]" (Статус: Ошибка/Успешно) [Теги: ...].
  • Три последних снимка передаются в ИИ в полном объеме (с детальным описанием и предыдущими планами ответов).
  • Сохранение тегов в однострочном формате критически важно: это позволяет ИИ удерживать контекст по схеме распиновки и номерам компонентов, не перегружая контекстное окно лишними деталями.

3. Фоновая суммаризация чата

При активном обсуждении проекта история сообщений может переполнить контекстное окно модели. Для решения этой проблемы в фоне работает механизм суммаризации:

  • Если общая история содержит 10 и более сообщений, а несжатая активная часть - 6 и более сообщений, запускается фоновый поток для сжатия старой части диалога.
  • Сообщения до определенного индекса отправляются ИИ с промптом на создание краткой выжимки на русском языке (в 2-3 предложения).
  • Полученная выжимка записывается в базу данных проекта как chatSummary.
  • При отправке новых запросов ИИ передается только chatSummary и последние 3 активных сообщения.
  • При этом в интерфейсе приложения для пользователя отображается полная переписка без каких-либо сокращений.

4. Кастомный DNS-резолвер для Gemini API

Для обхода региональных ограничений и нестабильного подключения к серверам Google API, в OkHttpClient встроен собственный DNS-резолвер:

  • При обращении к хосту generativelanguage.googleapis.com приложение выполняет UDP-запросы напрямую к DNS-серверам xbox-dns.ru (IP-адреса: 111.88.96.50 и 111.88.96.51) через порт 53.
  • DNS-пакет запроса формируется вручную на байтовом уровне, а ответ парсится для получения IP-адресов A и AAAA записей.
  • При возникновении ошибок или таймаутов приложение автоматически переключается на системный DNS-резолвер.

5. Локальный ИИ (MediaPipe LLM Inference)

Nexus может работать полностью в офлайн-режиме:

  • Поддерживается запуск локальных LLM моделей семейства Qwen (версии 1.5B и 4B) через MediaPipe LLM Inference API.
  • Инференс выполняется на устройстве с использованием аппаратного ускорения (GPU или CPU в зависимости от настроек модели).
  • Модели загружаются в песочницу приложения и инициализируются один раз при первом запросе, после чего остаются в памяти для быстрого ответа.

6. Облачная синхронизация

При авторизации пользователя через Firebase Authentication все данные проектов и снимков синхронизируются с облачной базой Firestore. Фотографии снимков автоматически выгружаются в Firebase Storage. При отсутствии сети приложение работает с локальной базой Room, синхронизируя изменения при восстановлении подключения.


Архитектура кодовой базы

Проект построен по архитектуре MVVM с использованием Dagger Hilt для внедрения зависимостей.

app/src/main/java/ru/mogcommunity/nexus/
|
|- data/
|  |- model/          - сущности Room: Project, Snapshot, ChatMessage
|  |- local/           - база данных AppDatabase, DAO-интерфейсы и LocalAiManager (управление локальным ИИ)
|  |- remote/          - GeminiClient (сетевой клиент с кастомным DNS) и FirebaseManager (синхронизация с облаком)
|  |- repository/      - ProjectRepository (единая точка доступа к локальным и удаленным данным)
|  |- PreferenceManager.java - управление настройками приложения
|
|- di/                 - модуль Hilt (DatabaseModule) для внедрения зависимостей базы данных и репозитория
|
|- viewmodel/          - ProjectViewModel (бизнес-логика проектов, чата и суммаризации), AuthViewModel (авторизация)
|
|- ui/
|  |- SplashActivity, MainActivity, LoginActivity - основные экраны
|  |- ProjectsFragment, GalleryFragment, SettingsFragment - вкладки интерфейса
|  |- CreateProjectBottomSheet, EditProjectBottomSheet, AddSnapshotBottomSheet - диалоговые окна управления
|  |- adapter/         - RecyclerView адаптеры для проектов, снимков и сообщений
|  |- helper/          - утилиты разметки (MarkdownStripper, SpaceItemDecoration)
|  |- view/            - GitBranchLogoView (кастомный элемент отрисовки логотипа в виде ветки Git)

Используемый стек технологий

  • Язык: Java
  • СУБД: Room (SQLite)
  • Синхронизация: Firebase Auth, Cloud Firestore, Firebase Storage
  • Сетевой стек: OkHttp, Gson
  • ИИ-движки: Gemini API (облако), MediaPipe LLM Inference (локально)
  • Загрузка изображений: Glide
  • Внедрение зависимостей: Dagger Hilt
  • Архитектурные компоненты: LiveData, ViewModel, Room, WorkManager
  • UI: Material Design, ViewBinding, ConstraintLayout

Требования для сборки

  • JDK 17
  • Android SDK 35 (мин. версия API 24)
  • Gradle 8.x
  • Настроенный Firebase-проект (требуется файл google-services.json)

Подготовка и запуск приложения

1. Клонирование репозитория

git clone <url-репозитория>
cd Nexus

2. Подключение Firebase

Поместите полученный из консоли Firebase файл google-services.json в корневую директорию модуля app/ (рядом с build.gradle.kts).

3. Сборка и установка

Сборка debug-версии через Gradle Wrapper:

./gradlew assembleDebug

Установка полученного APK-файла на подключенное устройство или эмулятор через ADB:

adb install app/build/outputs/apk/debug/app-debug.apk

Тестирование проекта

Запуск unit-тестов

Запуск всех локальных тестов (модели, репозиторий, вспомогательные классы):

./gradlew testDebugUnitTest

Запуск инструментированных тестов

Запуск UI-тестов на подключенном устройстве или эмуляторе:

./gradlew connectedAndroidTest

Структура тестов

Тесты расположены в директории app/src/test/java/ru/mogcommunity/rbrproject/:

  • data/model/ProjectTest.java - проверка логики инициализации и обновления свойств проектов.
  • data/model/SnapshotTest.java - тестирование состояния снимков и валидации данных.
  • data/model/ChatMessageTest.java - проверка отправки и статусов сообщений в чате.
  • data/repository/ProjectRepositoryTest.java - модульные тесты для репозитория с использованием Mockito (заглушки для DAO и сетевых клиентов).
  • ui/helper/MarkdownStripperTest.java - тестирование корректности удаления Markdown-разметки из текста ответов ИИ.

Лицензия

Проект распространяется под лицензией MIT.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages