Добавлена блокировка реакций на действия бота + обновление системного промпта

- Добавлены паттерны блокировки в 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 <qwen-coder@alibabacloud.com>
This commit is contained in:
Vladimir 2026-03-02 13:34:53 +00:00
parent 09fb020745
commit 107685771c
3 changed files with 183 additions and 7 deletions

View File

@ -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 агент с авто-выбором инструментов |

View File

@ -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:

View File

@ -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