12 KiB
Mistral Chat App - Development Context
Project Overview
Android-приложение для чата с Mistral AI. Перспективный проект с развитием в сторону AI-агента с памятью, tools и автономной работой.
Основные технологии:
- Kotlin + Android (minSdk 26, targetSdk 34)
- Room + SQLCipher (encrypted database)
- OkHttp для API
- Material Design 3
- Russian language UI
Расположение проекта:
/Users/alexabudaev/Documents/Zed/mistral-chat-app/
⚠️ ВАЖНО: Принципы разработки
- Приложение должно работать БЕЗ платных подписок и инвестиций
- Всегда использовать собственные разработки или бесплатные решения
- Не рассчитывать на имеющиеся платные API при планировании функций
- Сначала находим бесплатное решение, потом реализуем
- Если что-то невозможно сделать без платных API или ты не можешь понять задачу - говори честно!
- При планировании любого следующего этапа следует тщательно анализировать возможность реализовать ту или иную функцию не только исходя из программной совместимости, но и с учётом наличия бесплатных версий необходимых сервисов, API и других продуктов (или возможности написать собственное решение)
Completed Work
✅ Core Features
- Чат с Mistral API (Chat Completion)
- Управление профилями (до 10 профилей)
- Управление сессиями (множественные чаты)
- Генерация названия сессии - после 2-го сообщения AI генерирует краткое название (3-5 слов)
- Шифрованное хранилище (SQLCipher + EncryptedSharedPreferences)
- Валидация API ключа (32+ символов, A-Z, a-z, 0-9)
- Левое drawer-меню с диалогами
- Тёмная/светлая тема
✅ UI/UX
- Material Design 3
- Русский язык интерфейса
- Отступы в поле ввода (12dp)
- Прокрутка к новым сообщениям
- Долгий тап на сообщение - меню Копировать/Редактировать/Удалить
- Скролл в поле system prompt - multiline text field scrollable
- Адаптивные цвета AlertDialog - Material Design 3 colors
✅ Bug Fixes
- Исправлена ошибка "ответ в Toast вместо чата" - теперь только явные ошибки показываются через Toast
- Сортировка drawer меню - профили, настройки, остальное
- WakeLock - приложение остаётся активным при выключенном экране (ожидание ответа API)
- Timeout 120 сек - увеличен с 60 до 120 секунд для больших ответов
- Foreground Service - приложение продолжает работу в фоне при выключенном экране (ожидание ответа API)
✅ Security
- API ключ: EncryptedSharedPreferences (AES-256-GCM)
- Ключ БД: EncryptedSharedPreferences (AES-256-SIV + AES-256-GCM)
- Профили, сессии, сообщения: SQLCipher
- CalDAV данные: зашифрованы (url, username, password)
⚠️ ВАЖНО: Все чувствительные данные должны храниться в EncryptedSharedPreferences:
- API ключи, пароли (CalDAV, email), ключи БД, токены
Tools
🌐 Web Search
- ✅ Russian Wikipedia API (бесплатно, без API ключа)
- ✅ English Wikipedia API
- Ограничение: 4000 символов на ответ
🌤️ Weather
- ✅ Open-Meteo API (полностью бесплатно)
- Geocoding API + Weather API
- Текущая погода + прогноз на 7 дней
🔗 OpenUrlTool
- ✅ HTTP GET к любому URL
- ✅ RSS/Atom парсинг (lenta.ru, kommersant.ru)
- Ограничение: 4000 символов, таймаут 10 сек
⏰ Time Tools
- ✅ get_local_time - возвращает timestamp в миллисекундах
- ✅ get_date - текущая дата
📅 CalDAV Calendar
- ✅ calendar_add_event - создание событий с VALARM (уведомления)
- ✅ calendar_get_events - получение списка событий
- ✅ calendar_delete_event - удаление событий
- Баikal сервер интеграция
💾 Memory Tools
- ✅ memory_store, memory_learn, memory_forget
- ✅ memory_reinforce, memory_preference
Tool Execution Parameters
| Параметр | Значение |
|---|---|
| Max iterations | 15 |
| Timeout на итерацию | 120 сек |
| Retry при CANCEL | до 2 раз |
| Result truncation | 2000 символов |
| WakeLock | ✅ для длительных запросов |
Active Plan
Phase 3: CalDAV Calendar + Local Reminders (✅ В основном готово)
Два режима:
- CalDAV — синхронизация с Baikal сервером
- Local — автономная напоминалка в памяти AI
CalDAV Status:
| Задача | Статус |
|---|---|
| Подключение к Baikal | ✅ |
| calendar_add_event | ✅ Работает (с VALARM) |
| calendar_get_events | ✅ Работает (лимит 100 событий) |
| calendar_delete_event | ✅ Работает (только свои события) |
| VALARM (уведомления) | ✅ Добавляются к событиям |
| UID consistency | ✅ Исправлено |
| Timestamp (time_string) | ✅ AI передаёт строку, сервер парсит |
Нерешённые проблемы:
- При переустановке app старые события становятся "чужими" (новый UUID)
Как помочь AI правильно работать с календарём:
- Обязательно вызвать get_local_time для получения текущего UTC timestamp
- Использовать формулу: new_timestamp = current_timestamp + (часы * 3600000) + (минуты * 60000)
- НЕ добавлять случайные минуты!
Phase 4: Heartbeat (⏳ В очереди)
- WorkManager задача (каждые 30 минут)
- Active hours (8:00-22:00)
Phase 5: Email (⏳ В очереди)
- IMAP/SMTP клиент (без OAuth)
Phase 6: API Key Rotation (📋 Запланировано)
Проблема:
- При достижении лимита токенов или блокировке ключа приложение перестаёт работать
- Нужна система ротации для отказоустойчивости
Механизм:
-
Хранение нескольких ключей:
- До 5 API ключей в EncryptedSharedPreferences
- Каждый ключ имеет статус: active, disabled, blocked
- Приоритет использования (порядок)
-
Автоматическая ротация:
- При ошибке 429 (rate limit) → переключить на следующий ключ
- При ошибке 401/403 (blocked) → пометить ключ как blocked
- При успешном ответе → ключ working
-
Логика переключения:
При ошибке: - 429 (Too Many Requests) → nextKey() - 401/403 (Unauthorized) → markKeyBlocked(), nextKey() - 500+ → markKeyDisabled(), nextKey() При успехе: - workingCount++ (счётчик успешных использований) -
Ручное управление:
- UI для добавления/удаления ключей
- Просмотр статуса каждого ключа
- Ручное переключение
UI реализация:
- Настройки профиля → "API ключи" → список ключей
- Статус: ✅ рабочий, ⚠️ лимит, ❌ заблокирован
- Возможность добавить/удалить/переключить
Files to modify:
EncryptedPrefs.kt- хранение нескольких ключейMistralClient.kt- логика ротации- UI: dialog_settings.xml или новое диалоговое окно
Key Files
app/src/main/java/com/mistral/chat/ui/MainActivity.kt— главная активностьapp/src/main/java/com/mistral/chat/api/MistralClient.kt— API клиентapp/src/main/java/com/mistral/chat/api/ToolExecutor.kt— менеджер toolsapp/src/main/java/com/mistral/chat/api/CalDavClient.kt— CalDAV клиентapp/src/main/java/com/mistral/chat/data/ChatDatabase.kt— база данных
Model Selection
- Default: mistral-medium-latest
- OkHttp timeouts: connect 60s, read 120s, write 60s
⚠️ ВАЖНЫЕ ПРАВИЛА РАЗРАБОТКИ
Запрет на удаление реализованных функций
НИКОГДА не удаляй уже реализованные функции!
Запрет на хардкодинг
НИКОГДА не хардкодь значения, которые должны быть динамическими!
Сборка APK
JAVA_HOME=/opt/homebrew/opt/openjdk@17 ./gradlew assembleDebug
# Путь: app/build/outputs/apk/debug/app-debug.apk
📋 Контекст сессии и оптимизация (📋 Запланировано)
Текущая реализация
При каждом запросе отправляется полный контекст. При росте сессии возможны 503 ошибки.
План реализации (Kai 9000 style)
Источник: https://kai9000.com/docs/features/tools/
Часть 1: Trimming (меж-итеративный)
- Обрезать историю ПОСЛЕ КАЖДОГО tool вызова
- После каждого tool execution - проверить размер контекста
- Если > MAX_CONTEXT - удалить старые сообщения (кроме system prompt)
- MAX_CONTEXT = ~16000 токенов (50% от лимита mistral-medium)
Часть 2: Compaction (AI summary)
- При 70% лимита (~22000 токенов) - запустить AI summary
- Последние 4 user обмена - оставить verbatim
- Остальное - одно summary message
- Сохранить summary в БД для персистентности
Реализация
ToolExecutor.kt → модифицировать loop:
while (toolCalls.isNotEmpty()) {
result = executeTool()
messages.add(result)
// Trimming после каждого tool
if (getTokenCount(messages) > MAX_CONTEXT) {
trimOldMessages()
}
}
Files to modify
- ToolExecutor.kt - добавить trimming в loop
- MistralClient.kt - добавить getTokenCount, trimOldMessages
Conversation Context (for AI Agent)
При начале новой сессии: Прочитай файл AGENTS.md для понимания текущего контекста.
При запросе "продолжаем": Мы работаем над Phase 3 - CalDAV календарь. Тестируем: создание событий, получение списка, исправление timezone.
Важно:
- Пушить в GitHub только после подтверждения пользователя
- Не делать push автоматически
Last updated: 2026-04-12 Version: 1.11