Skip to content

Mobile App

shaerware edited this page May 3, 2026 · 9 revisions

Mobile App (Мобильное приложение)

Нативное Android-приложение для чата с ИИ-ассистентом. Подключается к серверу ai-sekretar24.ru, предоставляет ролевой UX: админы получают полный контроль, обычные пользователи — предварительно настроенный опыт.

Текущая версия

Параметр Значение
versionName 2.2
versionCode 25
Дата релиза 2026-05-03
GitHub Release mobile-v2.2

📲 Скачать ai-secretary-2.2.apk

Версии 2.0/2.1 устарели — push-уведомления на них не показывались в трее из-за бага с Android notification channel. Обновитесь до 2.2 чтобы новости о релизах и сообщения от системы реально приходили.

Что нового в 2.2

  • Fix: пуш-уведомления теперь реально доходят до пользователя. На v2.0/v2.1 сервер слал FCM-сообщение, Firebase его принимал (всё «200 OK» в логах), но Android тихо отбрасывал — потому что приложение не создавало канал уведомлений с id default, а сервер отправлял channel_id="default". На Android 8+ это означает мгновенный drop без следов.
  • В usePush.ts теперь PushNotifications.createChannel({id: "default", importance: 5, sound, lights, vibration}) вызывается перед register(), после grant permission. Канал создаётся явно, с приоритетом HIGH (heads-up).
  • В AndroidManifest.xml добавлен fallback meta-data com.google.firebase.messaging.default_notification_channel_id="default" — если сервер пришлёт payload без channel_id, Firebase SDK не свалится на низкоприоритетный «Miscellaneous».
  • После установки система спросит permission на уведомления (Android 13+) — обязательно разреши, без этого push'ей не будет.

Что нового в 2.1

  • Панель «Аккаунт» в списке чатов — кнопка-шестерёнка в шапке ChatListView (а также в welcome-экране для не-админов и в footer-кнопке) теперь открывает ту же account-панель, что в чате, прямо поверх списка. Не нужно уходить на отдельный /settings экран.
  • Тот же resize-механизм, что в ChatView: portrait — bottom sheet с ручкой, landscape — правая панель.
  • В меню чата убрана дублирующаяся кнопка-шестерёнка — она вела на /settings, перекрывалась с уже работающей account-панелью рядом.
  • Иконка кнопки «Аккаунт» в шапке чата стала шестерёнкой (раньше человечек) — для визуальной согласованности с кнопкой-шестерёнкой в списке.

Что нового в 2.0

  • В шапке чата справа от кнопки настроек сессии появилась кнопка-«человечек» — тап открывает пятую panel с настройками аккаунта, не покидая чата.
  • В панели «Аккаунт» — никнейм (display_name), смена пароля, Google (Drive/Docs/Sheets/Gmail) с подключением через _system браузер и отключением, и выход из аккаунта.
  • Тот же resize-механизм, что у других четырёх панелей: portrait — сверху во всю ширину, landscape — справа во всю высоту, размер тянется пальцем (100–90% экрана).
  • Профиль и google-статус подгружаются автоматически при каждом открытии панели — не нужно нажимать «обновить».

Что было в 1.9

  • Chevron-↓ справа от названия чата → открывает resizable-панель ассистентов
  • Кнопка «Создать нового ассистента» в той же панели
  • В портрете — сверху во всю ширину, в ландшафте — справа во всю высоту

Что было в 1.8

  • Кнопка «+» (новая ветка) слева от названия ассистента
  • LoginView показывает реальную причину ошибки логина

Установка через APK поверх 1.9 проходит без ручного удаления; при INSTALL_FAILED_UPDATE_INCOMPATIBLEadb uninstall com.shaerware.aisecretary.

Скриншот

Mobile App

Концепция

Мобильное приложение — это отдельный Android-клиент (Vue 3 + Capacitor), не PWA-обёртка админ-панели:

  • Hardcoded серверhttps://ai-sekretar24.ru, без настройки URL
  • JWT-аутентификация — токен хранится в Capacitor Preferences (не localStorage)
  • Ролевой интерфейс — админ видит все чаты и контролы, обычный пользователь — только расшаренные чаты
  • Mobile Instances — админ создаёт предварительно настроенные экземпляры (LLM, голос, промпт, RAG), назначает пользователям через ResourceShare
  • Стриминг — SSE-потоковая генерация ответов
  • TTS — озвучка сообщений для всех ролей
  • Тема — Night-eyes (тёплый коричневый/янтарный/золотой), без переключения

Экраны приложения

Login (Вход)

  • Поля: имя пользователя + пароль
  • Нет настройки URL сервера
  • При входе автоматически загружается конфиг назначенного Mobile Instance (GET /admin/mobile/my-config)
  • При успехе — редирект на /chats

Chat List (Список чатов)

Для админа:

Элемент Описание
Список сессий Карточки: название, последнее сообщение, количество, дата
FAB (Floating Action Button) Создание нового чата
Удаление Кнопка удаления на каждой карточке (с подтверждением)
Настройки Кнопка перехода в Settings

Для обычного пользователя:

Элемент Описание
Приветствие Центрированное «Привет, {username}» в стиле Claude
Поле ввода Отправка первого сообщения сразу с экрана
Расшаренные чаты Карточки только расшаренных сессий (is_shared_with_me)
Авто-маршрутизация 1) Дефолтная мобильная сессия → 2) Первый расшаренный чат → 3) Создание нового

Chat (Чат)

Основной экран стриминговой беседы с ИИ-ассистентом.

Тулбар

Кнопка Доступ Описание
Назад Админ Возврат к списку чатов
LLM-провайдер Админ Выпадающий список: Default / vLLM (Local) / ☁️ Cloud providers
RAG-коллекции Админ Мультиселект коллекций базы знаний
Экспорт Админ Копировать / Скачать .md / Скачать .json
Новая ветка Все Создание новой ветки разговора
Настройки чата Все Панель с контекстными файлами и системным промптом
Ветки Все Дерево веток разговора

Действия с сообщениями

Действие Админ Обычный
TTS (озвучка)
Копировать
Редактировать
Регенерировать (user msg)
Сохранить в контекст (assistant msg)
Суммаризация ветки
Удалить от этого сообщения

Панели (боковые/нижние)

Панель Описание
Ветки Дерево сообщений с навигацией, переключение между ветками
Контекстные файлы Загрузка файлов (.txt, .md, .json, .csv, .py, .js, .ts и др.), прикрепление к контексту
Промпт Несколько именованных промптов («ролей») с переключением: чипы сверху + текстовое поле, кнопка + создаёт новый, активный промпт меняет поведение ассистента без потери истории. Доступно всем пользователям, включая не-админов с write-share на чат.
  • В портретном режиме панели появляются внизу (горизонтальный ресайз)
  • В ландшафтном — сбоку (вертикальный ресайз)

Индикатор использования

Под полем ввода — два индикатора потребления:

  • Контекст (полоска с градиентом): сколько токенов в текущем диалоге занято от лимита окна модели. Зелёный → жёлтый → красный по мере приближения к лимиту.
  • Период Claude (тонкая оранжево-красная полоска снизу): общее число токенов которое юзер потратил за текущий период тарифа Anthropic (с 30-го по 30-е числа). Чисто информативно, без лимитов и блокировок. Источник: GET /admin/usage/me.

Ввод сообщений

  • Автоматически растягивающийся textarea (макс. 120px)
  • Enter = отправить, Shift+Enter = перенос строки
  • Вставка кода — определяется автоматически, показывается как chip с языком и количеством строк
  • Кнопка Stop при стриминге

Загрузка файлов (v1.5+)

Кнопка-скрепка расположена между полем ввода и кнопкой отправки (как в веб-версии).

Формат Обработка
Изображения (JPEG, PNG, WebP, GIF) OCR (pytesseract, ru+en)
PDF Извлечение текста (pdfplumber, до 50 стр.)
Excel (.xlsx, .xls) Извлечение данных (openpyxl, до 10 листов × 500 строк)
Word (.docx, .doc) Извлечение текста (python-docx)
Текстовые (.txt, .csv, .md, .json, .xml, .html, .log, .yaml, .yml) Чтение как UTF-8
  • Максимальный размер файла: 10 МБ
  • Несколько файлов одновременно
  • Прикреплённые файлы отображаются как chips с именем и миниатюрой
  • При отправке сообщения бэкенд подставляет извлечённый текст в контекст LLM
  • Используется тот же endpoint что и в веб-версии: POST /admin/chat/sessions/{id}/upload-image

Settings (Настройки)

  • Имя пользователя и роль (read-only)
  • Кнопка выхода
  • Информация о версии

Mobile Instances (Управление в админ-панели)

Администратор создаёт и настраивает экземпляры мобильного приложения через страницу Mobile App в админ-панели (MobileAppView).

Список инстансов

Элемент Описание
Индикатор Зелёный = включён, серый = отключён
Название Имя инстанса
Описание Краткое описание
Шаринг Иконка Users + количество назначенных пользователей

Создание / Редактирование инстанса

Параметр Описание По умолчанию
Название* Имя инстанса
Описание Описание
LLM Backend Выпадающий список: Local vLLM / ☁️ Cloud providers vllm
Персона Имя персоны (anna, marina и др.) anna
Системный промпт Кастомный промпт для ассистента
TTS Engine Движок синтеза речи (xtts, piper, openvoice) xtts
TTS Voice Голос для озвучки anna
RAG Mode Режим RAG: all / selected / off all
Коллекции знаний Мультиселект коллекций (при mode=selected)
Rate Limit Ограничение запросов (кол-во / часов) Без ограничений

Вкладки деталей

Вкладка Содержимое
Settings ID, название, описание, TTS, rate limit
AI LLM backend, персона, системный промпт
RAG Режим RAG, список коллекций (бейджи)

Назначение пользователей (ResourceShare)

Кнопка "Поделиться" открывает диалог ResourceShareDialog:

  • Выбор пользователя из списка
  • Уровень доступа: view (только чтение) или edit (редактирование)
  • Назначенный пользователь видит инстанс через GET /admin/mobile/my-config
  • Один пользователь может быть назначен только одному инстансу

Потоки данных

Авторизация

LoginView → POST /admin/auth/login → JWT
         → Capacitor Preferences.set("token", jwt)
         → Decode JWT → {user_id, role, workspace_id}
         → GET /admin/mobile/my-config → MobileInstanceConfig
         → router.push("/chats")

Отправка сообщения (админ с LLM-оверрайдом)

ChatInput → sendMessage(content)
         → overrides: {llm_backend: "cloud:123", rag_mode: "selected", knowledge_collection_ids: [1,2]}
         → POST /admin/chat/sessions/{id}/stream (SSE)
            body: {content, mobile_instance_id, ...overrides}
         → SSE chunks: "chunk" → streamingContent accumulates
         → SSE "assistant_message" → commit to messages array

Загрузка файла в сообщение

ChatInput (📎) → выбор файлов → chatApi.uploadImage(sessionId, file)
             → POST /admin/chat/sessions/{id}/upload-image (FormData)
             → Бэкенд: сохранение + извлечение текста (OCR/PDF/Word/Excel)
             → Ответ: {image: {id, url, ocr_text, original_name, ...}}
             → Отображение chip-а с именем файла
             → sendMessage(content) → streamMessage({content, image_ids: [...]})
             → Бэкенд: текст файлов инжектится в контекст LLM

Назначение пользователю

Admin: POST /admin/mobile/instances → создание инстанса
Admin: POST /admin/mobile/instances/{id}/shares → {user_id, permission: "edit"}
User:  GET /admin/mobile/my-config → {id, name, llm_backend, system_prompt, ...}
User:  Defaults applied to all new chat sessions (source="mobile", source_id=instanceId)

API (Mobile Module)

Инстансы

Метод Путь Описание Доступ
GET /admin/mobile/instances Список инстансов channels:view
POST /admin/mobile/instances Создание инстанса channels:edit
GET /admin/mobile/instances/{id} Получить инстанс channels:view
PUT /admin/mobile/instances/{id} Обновить инстанс channels:edit
DELETE /admin/mobile/instances/{id} Удалить инстанс (каскадно удаляет shares) channels:edit

Конфигурация пользователя

Метод Путь Описание Доступ
GET /admin/mobile/my-config Конфиг назначенного инстанса для текущего юзера chat:view

Шаринг (ResourceShare)

Метод Путь Описание Доступ
GET /admin/mobile/instances/{id}/shares Список назначений channels:view
POST /admin/mobile/instances/{id}/shares Назначить пользователя channels:edit
PUT /admin/mobile/instances/{id}/shares/{user_id} Изменить уровень доступа channels:edit
DELETE /admin/mobile/instances/{id}/shares/{user_id} Снять назначение channels:edit

Стек технологий

Компонент Технология
Framework Vue 3 + Composition API + TypeScript
Build Vite 7
Native Capacitor 8 (Android)
CSS TailwindCSS 4
State Pinia
Router Vue Router (hash history)
Markdown marked + DOMPurify

Сборка и деплой

cd mobile && npm install           # Установка зависимостей
cd mobile && npm run build         # Сборка (vue-tsc + vite)
cd mobile && npx cap sync android  # Синхронизация с Android-проектом
cd mobile && npx cap open android  # Открыть в Android Studio → Build APK

App ID: com.shaerware.aisecretary Размер: ~77KB gzipped (vs ~2MB админ-панель)

Отличия от админ-панели

Характеристика Админ-панель Мобильное приложение
Платформа PWA (браузер) Нативный Android (Capacitor)
URL сервера Настраивается Hardcoded (ai-sekretar24.ru)
Хранение JWT localStorage Capacitor Preferences
Функции Полное управление системой Только чат
Демо-режим Есть (VITE_DEMO_MODE) Нет
Темы Светлая/тёмная Только Night-eyes
i18n ru/en/kk Только ru
Размер ~2MB gzipped ~77KB gzipped

См. также: Chat, Chat-Sharing, RBAC, Cloud-LLM-Providers, Wiki-RAG

Clone this wiki locally