Files
angel 4c3026a80f
Tests / test (push) Has been cancelled
Tests / test-max-bot (push) Has been cancelled
v1.8.2: AGENTS.md, consent revocation, delete bot users, dialogues fix, intent improvements, CI for max_bot
2026-06-02 18:22:45 +03:00

7.8 KiB
Raw Permalink Blame History

Changelog — AegisOne MAX Bot

1.8.2 (02.06.2026)

Новые функции

  • AGENTS.md: правила проекта для AI-агентов
  • Отзыв согласия: handle_revoke_consent(), паттерн «отозвать согласие» в handle_message
  • Удаление бот-пользователей: DELETE /api/bot/users/{user_id} (каскад: user + conversations + messages + logs)
  • consent_revoked_date: поле в BotUser для фиксации даты отзыва согласия

Исправления

  • Диалоги: одна переписка = одна карточка (убрано создание new conv при completed/escalated)
  • Analyze intent: агрессивное определение ticket по ключевым словам услуг, улучшен промпт
  • Clarify intent: ограничение 1 раз за диалог (prev_intent == unknown), маркерные слова пропускают уточнение
  • History context: фильтр по времени (10 мин) вместо лимита 10 сообщений
  • Быстрые правила: ticket-паттерны и приветствие до NLP
  • Send message: параметр conversation_id + сохранение исходящих сообщений в BotMessage

1.8.1 (01.06.2026)

Новые функции

  • YandexGPT-only NLP: удалены Groq/Gemini, YandexGPT единственный провайдер
  • Unknown questions: BotUnknownQuestion, автогенерация KB-карточки при 3+ уникальных пользователях, UI
  • Callback dedup: processed_callbacks set в main.py — пропуск дублей callback_id, очистка при 1000
  • Consent flow: split-based word matching (_matches_any), refuse words до quick_intent, operator handler
  • DELETE conversations: каскадное удаление (BotMessage + BotProcessingLog + BotConversation)
  • UTC+3: moscow_now() в greeting.py и inquiry.py
  • Bot tickets: contact_name, contact_phone, contact_email в BotTicket
  • Payload parsing: message_created из body.message.body.text, message_callback из body.callback.payload + recipient.user_id

Исправления

  • Plain text phones: MAX Platform не рендерит markdown-ссылки — 📞 +7 (xxx) xxx-xx-xx
  • Webhook secret: _verify_secret() возвращает True если заголовок пуст (optional)
  • Nginx: добавлен /webhook proxy на HTTP порт 80

1.8.0 (01.06.2026)

Новые функции

  • Consent keyboard: consent_keyboard(), contact_keyboard(), return_to_consent_keyboard()
  • Escape hatch: locked states проверяют analyze_intent — «question» → analyze_and_respond
  • Completed state: completed/escalated → анализируем и создаём новый диалог
  • handle_greeting fix: убран analyze_and_respond после приветствия, state=awaiting_input
  • Auto-detect sidebar: parse_sidebar_menu() определяет пункты меню через API

Исправления

  • handle_message: refuse слова проверяются ДО analyze_intent в состояниях consent
  • operator_words: «оператор» → contacts вместо analyze_intent
  • handle_manual_contact: refuse words → consent_refused
  • clarify_intent: temperature 0.1, пост-обработка удаление приветствий, anti-AI-signs

1.7.1 (29.05.2026)

Новые функции

  • Тестовый прогон: мок MAX API для test user_id (>=999999000) — сообщения не уходят в MAX

Исправления

  • P1 (CRITICAL): _add_column_if_not_exists — async def + await, миграции выполняются
  • P2 (CSS): bot_consent, bot_tickets, bot_kb, bot_settings — var(--light-bg) → var(--bg-card), хардкод цвета → CSS-переменные
  • P3 (Event loop): email_sender.send_ticket_escalation — обёрнут в run_in_executor
  • P4 (SQL injection): _add_column_if_not_exists — валидация _validate_sql_name/type
  • C1 (CRITICAL): BotConversation импортирован в main.py
  • C2 (VCF N-field): regex исправлен, захватывает полную строку N:
  • C3 (Email typo): contact.py — user.email вместо user.phone
  • C4 (None user): inquiry.py — проверка user is None
  • C5 (Висячий тикет): inquiry.py — flush + единый commit
  • C6 (Secrets): docker-compose.yml — переменные через .env
  • H1 (Prompt injection): yandex_gpt.py — instruction boundary, _sanitize_input
  • H2 (Дубль BotMessage): contact.py — удалён дублирующий save
  • H3 (VCF phone regex): расширен захват полного номера
  • H4 (Race condition): greeting.py — try/except + rollback при IntegrityError
  • H5 (Silent error): email_sender.py — logger.error добавлен
  • M1 (TOCTOU): main.py — audit-log только при изменении статуса
  • M2 (Двухсессионный дизайн): inquiry.py — единая транзакция
  • M3 (Stale state): greeting.py — conv из текущей сессии
  • M4 (Double-load race): settings_cache.py — asyncio.Lock
  • M5 (ORG regex): захват полного ORG без обрезки по ;
  • M7 (bot_test.html): тема наследуется через CSS-переменные + скрипт инициализации
  • bot_test.html: исправлен ключ localStorage (theme → aegisone_service_theme), var(--bg-page) → var(--bg-body), добавлена стилизация скроллбара
  • L1 (Dead code): _extract_name_from_vcf удалена
  • L2 (Импорты): неиспользуемые Optional, json, config_reader удалены
  • L3 (.gitignore): .opencode/, .env.example добавлены

1.7.0 (29.05.2026)

Новые функции

  • Рефакторинг архитектуры: плоская структура модулей (models.py, yandex_gpt.py, keyboards.py, email_sender.py, config_reader.py) вместо вложенных пакетов
  • VCF + User Model (Q2):
    • BotUser расширен: patronymic, email, organization, address, vcf_raw, contact_hash, phone_verified, email_verified
    • VCF-парсер: FN, N, TEL, EMAIL, ORG, ADR — все поля сохраняются
    • Upsert пользователя при повторном контакте (greeting.py)
    • total_conversations инкремент, last_interaction обновление
    • handle_contact_share сохраняет все VCF-поля (handoff.py)
    • total_tickets инкремент в _finalize_ticket (inquiry.py)
  • NLP history context: _get_user_history_context() — последние 10 сообщений + открытые заявки → YandexGPT
  • Broadcast с превью и таймером (Q1): модалка подтверждения с таймером 10 секунд
  • CSS-переменные (Q3): var(--white)→var(--bg-card), var(--text)→var(--text-primary)
  • bot_settings (Q4): showNotification(), max_bot_id редактируемый
  • Webhook secret (Q5): проброс X-Max-Bot-Api-Secret через прокси
  • Маскировка sensitive API-ключей в /api/bot/settings
  • dialog_cleared handler — сброс состояния диалога
  • Миграции через _add_column_if_not_exists() — новые колонки BotUser
  • Rate limit в broadcast: asyncio.sleep(0.5) после каждых 10
  • Уточнение сообщения (contact.py) с учётом conv.intent
  • Тесты: test_yandex_gpt.py, test_email_sender.py