Remove AGENTS.md from repo (local only)
This commit is contained in:
parent
16720a035a
commit
24d401943b
1 changed files with 0 additions and 279 deletions
279
AGENTS.md
279
AGENTS.md
|
|
@ -1,279 +0,0 @@
|
||||||
# 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*
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue