mistral-chat-app/AGENTS.md
2026-04-15 17:08:36 +08:00

278 lines
No EOL
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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*