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

12 KiB
Raw Blame History

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

  • 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

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