From 107685771cada0b0f7dbabc83a51add6fa2185b7 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 2 Mar 2026 13:34:53 +0000 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=80=D0=B5=D0=B0=D0=BA=D1=86=D0=B8=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B4=D0=B5=D0=B9=D1=81=D1=82=D0=B2=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=B1=D0=BE=D1=82=D0=B0=20+=20=D0=BE=D0=B1=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B8=D1=81=D1=82?= =?UTF-8?q?=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BF=D1=80=D0=BE=D0=BC?= =?UTF-8?q?=D0=BF=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлены паттерны блокировки в ai_agent.py для ddgs, rss, ssh, cron - Обновлён SYSTEM_PROMPT.md с разделом про блокировку реакций - Обновлён system_prompt.md с версией 0.8.0 - Добавлен приоритет File System tool перед SSH - Обновлена таблица версий Co-authored-by: Qwen-Coder --- SYSTEM_PROMPT.md | 33 ++++++++++--- bot/ai_agent.py | 121 +++++++++++++++++++++++++++++++++++++++++++++++ system_prompt.md | 36 +++++++++++++- 3 files changed, 183 insertions(+), 7 deletions(-) diff --git a/SYSTEM_PROMPT.md b/SYSTEM_PROMPT.md index b2cdf43..33233d2 100644 --- a/SYSTEM_PROMPT.md +++ b/SYSTEM_PROMPT.md @@ -52,6 +52,7 @@ AI агент анализирует запрос пользователя и ** | Триггеры | Инструмент | Пример | |----------|------------|--------| +| "прочитай", "покажи файл", "ls", "cat" | `file_system_tool` | "покажи файлы в директории" | | "найди", "погугли", "узнай" | `ddgs_search` | "найди информацию про asyncio" | | "новости", "rss", "лента" | `rss_reader` | "что нового в Linux?" | | "выполни команду", "ssh" | `ssh_executor` | "проверь нагрузку на сервере" | @@ -76,10 +77,29 @@ AI агент анализирует запрос пользователя и ** При принятии решения AI следует приоритету: -1. **SSH** — явные системные задачи -2. **Cron** — планирование и напоминания -3. **Поиск (DDGS)** — свежие данные из интернета -4. **RSS** — новости из подписанных лент +1. **File System** — если операция с файлами/директориями +2. **SSH** — если явная системная задача на сервере +3. **Cron** — если планирование/напоминание +4. **Поиск (DDGS)** — если нужны свежие данные из интернета +5. **RSS** — если новости из подписанных лент + +## ⚠️ Блокировка: Реакция на действия бота + +**Важное правило:** Не активируй инструменты если пользователь говорит о **прошлых действиях бота**, а не просит сделать что-то новое. + +**❌ НЕ активируй инструменты если пользователь:** +- Комментирует прошлые действия: "ты опять ddgs запустил", "зачем ты rss включил" +- Критикует срабатывание: "перестань", "хватит", "не надо" +- Указывает на ошибку: "баг", "ошибка", "неправильно" +- Говорит о прошлом: "я не просил", "я не говорил" +- Реагирует на результат: "это не то", "я вижу что ты..." + +**✅ Активируй инструменты только если:** +- Пользователь явно просит сделать что-то **новое** ("найди...", "проверь...", "запусти...") +- В запросе есть **триггерные слова** из раздела инструментов +- Пользователь продолжает тему и нужен **новый запрос** к инструменту + +**Правильное поведение при ошибке:** Извиниться кратко, объяснить что исправишь логику, но **не запускать инструмент повторно**. ## 🔄 Обновление промпта @@ -149,8 +169,9 @@ ai_agent.get_user_preference(user_id, 'preferred_tool') | Версия | Изменения | |--------|-----------| -| 0.8.0 | Исправление SSH (wait_and_read_ssh), команда /restart_bot | -| 0.7.0 | Векторная память (ChromaDB RAG), ИИ-агент с памятью | +| 0.8.0 | Исправление OAuth + память файлов + совместимость PTB 20.7+ | +| 0.7.1 | AI Provider Manager (Qwen Code, GigaChat), блокировка на реакции бота | +| 0.7.0 | Векторная память (ChromaDB RAG), ИИ-агент с памятью, File System Tool | | 0.6.0 | Автоматическая установка, SOCKS5 прокси | | 0.5.3 | Базовая реализация системного промпта | | 0.5.2 | AI агент с авто-выбором инструментов | diff --git a/bot/ai_agent.py b/bot/ai_agent.py index 36bf13a..d385699 100644 --- a/bot/ai_agent.py +++ b/bot/ai_agent.py @@ -97,6 +97,31 @@ class AIAgent: message_lower = message.lower() score = 0.0 + # ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем + # Это предотвращает циклические запуски когда пользователь критикует бота + reaction_patterns = [ + r'ты\s+\w+\s+запусти', # "ты ddgs запустил" + r'ты\s+опять', # "ты опять" + r'ты\s+снова', # "ты снова" + r'зачем\s+ты', # "зачем ты" + r'почему\s+ты', # "почему ты" + r'перестань', # "перестань" + r'хватит', # "хватит" + r'не\s+надо', # "не надо" + r'не\s+нужно', # "не нужно" + r'я\s+не\s+просил', # "я не просил" + r'я\s+не\s+говорил', # "я не говорил" + r'реакци', # "реакция", "реакцию" + r'критик', # "критика", "критикуешь" + r'баг', # "баг", "баги" + r'ошибк', # "ошибка", "ошибся" + r'проблем', # "проблема", "проблему" + ] + for pattern in reaction_patterns: + if re.search(pattern, message_lower): + logger.debug(f"Блокировка search: пользователь реагирует на действие бота (паттерн: {pattern})") + return False, 0.0 + # Прямые триггеры — высокий приоритет # Используем паттерн с границами для избежания частичных совпадений for trigger in self.SEARCH_TRIGGERS: @@ -132,6 +157,30 @@ class AIAgent: """ message_lower = message.lower() + # ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем + reaction_patterns = [ + r'ты\s+\w+\s+запусти', # "ты rss запустил" + r'ты\s+опять', # "ты опять" + r'ты\s+снова', # "ты снова" + r'зачем\s+ты', # "зачем ты" + r'почему\s+ты', # "почему ты" + r'перестань', # "перестань" + r'хватит', # "хватит" + r'не\s+надо', # "не надо" + r'не\s+нужно', # "не нужно" + r'я\s+не\s+просил', # "я не просил" + r'я\s+не\s+говорил', # "я не говорил" + r'реакци', # "реакция", "реакцию" + r'критик', # "критика", "критикуешь" + r'баг', # "баг", "баги" + r'ошибк', # "ошибка", "ошибся" + r'проблем', # "проблема", "проблему" + ] + for pattern in reaction_patterns: + if re.search(pattern, message_lower): + logger.debug(f"Блокировка rss: пользователь реагирует на действие бота (паттерн: {pattern})") + return False, 0.0 + # Только прямые фразы-триггеры — высокий порог # Проверяем чтобы триггер был словом/фразой в контексте, а не частью слова for trigger in self.RSS_TRIGGERS: @@ -155,6 +204,30 @@ class AIAgent: message_lower = message.lower() score = 0.0 + # ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем + reaction_patterns = [ + r'ты\s+\w+\s+запусти', # "ты ssh запустил" + r'ты\s+опять', # "ты опять" + r'ты\s+снова', # "ты снова" + r'зачем\s+ты', # "зачем ты" + r'почему\s+ты', # "почему ты" + r'перестань', # "перестань" + r'хватит', # "хватит" + r'не\s+надо', # "не надо" + r'не\s+нужно', # "не нужно" + r'я\s+не\s+просил', # "я не просил" + r'я\s+не\s+говорил', # "я не говорил" + r'реакци', # "реакция", "реакцию" + r'критик', # "критика", "критикуешь" + r'баг', # "баг", "баги" + r'ошибк', # "ошибка", "ошибся" + r'проблем', # "проблема", "проблему" + ] + for pattern in reaction_patterns: + if re.search(pattern, message_lower): + logger.debug(f"Блокировка ssh: пользователь реагирует на действие бота (паттерн: {pattern})") + return False, 0.0 + # Прямые триггеры # Используем паттерн с границами для избежания частичных совпадений for trigger in self.SSH_TRIGGERS: @@ -186,6 +259,30 @@ class AIAgent: message_lower = message.lower() score = 0.0 + # ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем + reaction_patterns = [ + r'ты\s+\w+\s+запусти', # "ты cron запустил" + r'ты\s+опять', # "ты опять" + r'ты\s+снова', # "ты снова" + r'зачем\s+ты', # "зачем ты" + r'почему\s+ты', # "почему ты" + r'перестань', # "перестань" + r'хватит', # "хватит" + r'не\s+надо', # "не надо" + r'не\s+нужно', # "не нужно" + r'я\s+не\s+просил', # "я не просил" + r'я\s+не\s+говорил', # "я не говорил" + r'реакци', # "реакция", "реакцию" + r'критик', # "критика", "критикуешь" + r'баг', # "баг", "баги" + r'ошибк', # "ошибка", "ошибся" + r'проблем', # "проблема", "проблему" + ] + for pattern in reaction_patterns: + if re.search(pattern, message_lower): + logger.debug(f"Блокировка cron: пользователь реагирует на действие бота (паттерн: {pattern})") + return False, 0.0 + # Прямые триггеры # Используем паттерн с границами для избежания частичных совпадений for trigger in self.CRON_TRIGGERS: @@ -211,6 +308,30 @@ class AIAgent: message_lower = message.lower() score = 0.0 + # ❌ БЛОКИРОВКА: Если пользователь реагирует на действие бота — НЕ активируем + reaction_patterns = [ + r'ты\s+\w+\s+запусти', # "ты file_system запустил" + r'ты\s+опять', # "ты опять" + r'ты\s+снова', # "ты снова" + r'зачем\s+ты', # "зачем ты" + r'почему\s+ты', # "почему ты" + r'перестань', # "перестань" + r'хватит', # "хватит" + r'не\s+надо', # "не надо" + r'не\s+нужно', # "не нужно" + r'я\s+не\s+просил', # "я не просил" + r'я\s+не\s+говорил', # "я не говорил" + r'реакци', # "реакция", "реакцию" + r'критик', # "критика", "критикуешь" + r'баг', # "баг", "баги" + r'ошибк', # "ошибка", "ошибся" + r'проблем', # "проблема", "проблему" + ] + for pattern in reaction_patterns: + if re.search(pattern, message_lower): + logger.debug(f"Блокировка file_system: пользователь реагирует на действие бота (паттерн: {pattern})") + return False, 0.0 + # Прямые триггеры # Используем паттерн с границами для избежания частичных совпадений for trigger in self.FILE_SYSTEM_TRIGGERS: diff --git a/system_prompt.md b/system_prompt.md index 1c5c6d7..e4cd6df 100644 --- a/system_prompt.md +++ b/system_prompt.md @@ -177,6 +177,40 @@ file_system_tool(operation='copy', source='file.txt', destination='backup/file.t 4. **Поиск (DDGS)** — если нужны свежие данные из интернета 5. **RSS** — если новости из подписанных лент +### 5. **⚠️ БЛОКИРОВКА: Реакция на действия бота** + +**ГЛАВНОЕ ПРАВИЛО:** Не активируй инструменты если пользователь говорит о **прошлых действиях бота**, а не просит сделать что-то новое. + +**❌ НЕ активируй инструменты если пользователь:** + +| Тип сообщения | Примеры | Реакция | +|--------------|---------|---------| +| **Комментирует прошлые действия** | "ты опять ddgs запустил", "зачем ты rss включил", "ну и снова ты cron включил" | ❌ Не запускать инструмент | +| **Критикует срабатывание** | "перестань", "хватит", "не надо", "отстань" | ❌ Не запускать инструмент | +| **Указывает на ошибку** | "баг", "ошибка", "неправильно", "глюк" | ❌ Не запускать инструмент | +| **Говорит о прошлом** | "я не просил", "я не говорил", "я не это имел в виду" | ❌ Не запускать инструмент | +| **Реагирует на результат** | "это не то", "зачем мне это", "я вижу что ты..." | ❌ Не запускать инструмент | + +**✅ Активируй инструменты только если:** +- Пользователь явно просит сделать что-то **новое** ("найди...", "проверь...", "запусти...") +- В запросе есть **триггерные слова** из раздела инструментов +- Пользователь продолжает тему и нужен **новый запрос** к инструменту + +**Примеры правильной реакции:** + +| Сообщение пользователя | Действие | +|----------------------|----------| +| "ты опять ddgs запустил" | ❌ Извиниться, не запускать | +| "найди информацию про Python" | ✅ Запустить ddgs_search | +| "перестань запускать cron" | ❌ Извиниться, не запускать | +| "запланируй напоминание на завтра" | ✅ Запустить cron_manager | +| "баг в твоей логике" | ❌ Извиниться, спросить что исправить | +| "покажи последние новости" | ✅ Запустить rss_reader | +| "я не просил искать новости" | ❌ Извиниться, не запускать rss_reader | +| "что нового в Linux?" | ✅ Запустить rss_reader | + +**Правильное поведение при ошибке:** Извиниться кратко, объяснить что исправишь логику, но **не запускать инструмент повторно**. + --- ## 📋 ФОРМАТ ОТВЕТОВ @@ -264,7 +298,7 @@ Filesystem Size Used Avail Use% Mounted on ## 🎯 ТЕКУЩАЯ ВЕРСИЯ -**Bot Version:** 0.7.1 +**Bot Version:** 0.8.0 **AI Provider Manager:** Поддержка multiple AI providers (Qwen Code, GigaChat) **Memory:** ChromaDB RAG + Vector Memory **Tools:** ddgs_tool, rss_tool, ssh_tool, cron_tool, file_system_tool