# 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 (✅ В основном готово) **Два режима:** 1. **CalDAV** — синхронизация с Baikal сервером 2. **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 правильно работать с календарём:** 1. Обязательно вызвать get_local_time для получения текущего UTC timestamp 2. Использовать формулу: new_timestamp = current_timestamp + (часы * 3600000) + (минуты * 60000) 3. НЕ добавлять случайные минуты! ### Phase 4: Heartbeat (⏳ В очереди) - WorkManager задача (каждые 30 минут) - Active hours (8:00-22:00) ### Phase 5: Email (⏳ В очереди) - IMAP/SMTP клиент (без OAuth) ### Phase 6: API Key Rotation (📋 Запланировано) **Проблема:** - При достижении лимита токенов или блокировке ключа приложение перестаёт работать - Нужна система ротации для отказоустойчивости **Механизм:** 1. **Хранение нескольких ключей:** - До 5 API ключей в EncryptedSharedPreferences - Каждый ключ имеет статус: active, disabled, blocked - Приоритет использования (порядок) 2. **Автоматическая ротация:** - При ошибке 429 (rate limit) → переключить на следующий ключ - При ошибке 401/403 (blocked) → пометить ключ как blocked - При успешном ответе → ключ working 3. **Логика переключения:** ``` При ошибке: - 429 (Too Many Requests) → nextKey() - 401/403 (Unauthorized) → markKeyBlocked(), nextKey() - 500+ → markKeyDisabled(), nextKey() При успехе: - workingCount++ (счётчик успешных использований) ``` 4. **Ручное управление:** - 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` — менеджер tools - `app/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 ```bash 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: ```kotlin 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*