173 lines
8.4 KiB
Markdown
173 lines
8.4 KiB
Markdown
# ТЗ: Telegram-бот «Байтик» 🤖
|
||
|
||
> Детский ИИ-помощник для Егора (8 лет, ДР 17.04.2018)
|
||
> Проект: `proj_bytik` | Дата создания: 2026-04-14
|
||
|
||
---
|
||
|
||
## 1. Цель
|
||
|
||
Telegram-бот, который:
|
||
- Отвечает на вопросы ребёнка простым языком
|
||
- Присылает 1-2 раза в день энциклопедические факты (утро 7:30 MSK)
|
||
- Поздравляет с праздниками и ДР
|
||
- Работает **только в одной группе** (whitelist chat_id)
|
||
- Строгая детская цензура 0+
|
||
|
||
---
|
||
|
||
## 2. Требования к боту
|
||
|
||
### 2.1 Whitelist (критично)
|
||
- **Разрешённый chat_id:** будет прописан в `.env` (`ALLOWED_CHAT_ID`)
|
||
- Бот принимает сообщения **только** из этой группы
|
||
- Сообщения из ЛС и других групп — **полный игнор** (без ответа)
|
||
- При добавлении в новую группу — автоматически `leave_chat`
|
||
- Проверка: `message.chat.id` для text, `callback_query.message.chat.id` для inline
|
||
|
||
### 2.2 Обработка сообщений
|
||
- Получает текст от пользователя в разрешённом чате
|
||
- Отправляет промпт в LLM (OpenRouter API, Qwen 3.6-Plus)
|
||
- Получает ответ → отправляет в Telegram
|
||
- Поддерживает диалог (хранит последние 5-10 сообщений как контекст)
|
||
|
||
### 2.3 Системный промпт (обязателен)
|
||
```
|
||
Ты — Байтик, дружелюбный робот-помощник для мальчика Егора (8 лет).
|
||
|
||
Правила:
|
||
- Объясняй сложные вещи просто, с примерами, которые понятны 8-летнему
|
||
- Используй эмодзи, чтобы было весело
|
||
- Если спрашивают на русском — отвечай на русском
|
||
- Иногда (когда уместно) отвечай на простом английском, по типу "Did you know..." — это помогает учить язык
|
||
- Если вопрос про что-то тревожное (смерть, война, болезни): мягко уйди от темы, а если настаивает — скажи "Это серьёзный вопрос, лучше спроси у папы!"
|
||
- НИКОГДА не используй ненормативную лексику, страшные подробности, или взрослые темы
|
||
- Если не знаешь ответа — честно скажи, но предложи "давай поищем вместе!"
|
||
- Иногда используй смешные факты и шутки
|
||
- Будь терпелив — ребёнок может задавать один и тот же вопрос много раз
|
||
- Используй короткие ответы для детей до 12 лет, не более 200 слов
|
||
```
|
||
|
||
### 2.4 Утренняя рассылка
|
||
- **Время:** 07:30 MSK (04:30 UTC)
|
||
- Присылать 1 интересный энциклопедический факт
|
||
- Темы по интересам Егора: машины, самолёты, корабли (Титаник!), лего, животные, география, математика, IT, Minecraft
|
||
- **Формат:** текст + эмодзи, иногда картинка
|
||
- Можно иногда отправлять голосовое сообщение (через ElevenLabs TTS)
|
||
|
||
### 2.5 Праздники и ДР
|
||
- **17 апреля:** поздравление с ДР (особое, весёлое)
|
||
- **1 января:** Новый Год
|
||
- **23 февраля:** День защитника Отечества
|
||
- **8 марта:** Международный женский день
|
||
- **12 апреля:** День космонавтики (Егор любит, будет в тему!)
|
||
- **Другие:** можно добавить в конфиг
|
||
|
||
### 2.6 Голосовые сообщения (опционально)
|
||
- Иногда факты/ответы — голосом
|
||
- ElevenLabs TTS (или Yandex SpeechKit fallback)
|
||
- Конвертация в OGG Opus (требование Telegram)
|
||
|
||
---
|
||
|
||
## 3. Архитектура
|
||
|
||
### 3.1 Технологии
|
||
- **Язык:** Python 3.11+
|
||
- **Telegram:** `aiogram` 3.x
|
||
- **LLM:** OpenRouter API (`openrouter/openrouter/auto` или явно `openrouter/qwen/qwen3.6-plus`)
|
||
- **TTS (опционально):** ElevenLabs API / Yandex SpeechKit
|
||
- **Конфиг:** `.env` (python-dotenv)
|
||
- **Хранение диалога:** JSON-файлы по user_id в `data/chat_history/`
|
||
|
||
### 3.2 Структура проекта
|
||
```
|
||
bytik/
|
||
├── bot.py # Точка входа
|
||
├── config.py # Загрузка конфига из .env
|
||
├── prompts.py # Системный промпт + факты
|
||
├── llm.py # Обёртка над OpenRouter API
|
||
├── tts.py # Голосовые сообщения
|
||
├── scheduler.py # Планировщик (рассылка + праздники)
|
||
├── chat_history.py # Хранение контекста диалогов
|
||
├── facts.json # Энциклопедические факты
|
||
├── holidays.json # Праздники
|
||
├── data/
|
||
│ └── chat_history/ # JSON файлы с историей
|
||
├── .env # Секреты
|
||
├── .env.example # Пример
|
||
└── requirements.txt # Зависимости
|
||
```
|
||
|
||
### 3.3 .env.example
|
||
```
|
||
BOT_TOKEN=<telegram_bot_token>
|
||
ALLOWED_CHAT_ID=<group_chat_id>
|
||
OPENROUTER_API_KEY=<key>
|
||
OPENROUTER_MODEL=openrouter/qwen/qwen3.6-plus
|
||
ELEVENLABS_API_KEY=<key> # optional
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Инфраструктура
|
||
|
||
- **Хост:** mva154 (контейнер OpenClaw) или vpn-srv
|
||
- **Запуск:** как Docker container (предпочтительно) или systemd service
|
||
- **Бэкапы:** chat_history JSON-файлы
|
||
- **Логи:** `logs/bytik.log`
|
||
|
||
---
|
||
|
||
## 5. Безопасность
|
||
|
||
### 5.1 Whitelist — ОБЯЗАТЕЛЬНО
|
||
- Все входящие сообщения проходят фильтр `message.chat.id == ALLOWED_CHAT_ID`
|
||
- Невалидные сообщения — молчаливый игнор
|
||
- При `my_chat_member: left` или добавлении в новую группу → `leave_chat()`
|
||
|
||
### 5.2 Контент-фильтр
|
||
- LLM промпт уже содержит ограничения
|
||
- Валидация ответа: если содержит мат / adult контент → не отправлять, логировать
|
||
- Можно добавить дополнительный фильтр (список запрещённых слов)
|
||
|
||
---
|
||
|
||
## 6. Этапы реализации
|
||
|
||
### Фаза 1 (MVP)
|
||
- Бот принимает сообщения из whitelist группы
|
||
- Отправляет в LLM, получает ответ, шлёт в Telegram
|
||
- Системный промпт с детской цензурой
|
||
|
||
### Фаза 2
|
||
- Утренняя рассылка (7:30 MSK)
|
||
- Праздничные поздравления
|
||
- Контекст диалога (последние N сообщений)
|
||
|
||
### Фаза 3
|
||
- Голосовые сообщения (TTS)
|
||
- Картинки (генерация или подбор)
|
||
|
||
---
|
||
|
||
## 7. Критерии приёмки
|
||
|
||
- [ ] Бот отвечает только в разрешённой группе
|
||
- [ ] Игнорирует ЛС и другие группы
|
||
- [ ] Системный промпт блокирует взрослый контент
|
||
- [ ] Утренняя рассылка в 07:30 MSK
|
||
- [ ] Поздравление с ДР Егора (17.04)
|
||
- [ ] Ответы простые, понятные 8-летнему
|
||
- [ ] Контекст диалога сохраняется
|
||
- [ ] Логи пишутся в файл
|
||
|
||
---
|
||
|
||
## 8. Примечания
|
||
|
||
- День рождения Егора — 17.04.2018 (скоро 8 лет!)
|
||
- Интересы: машины, самолёты, корабли, лего, животные, география, математика, IT, Minecraft
|
||
- LLM: **Qwen 3.6-Plus** (OpenRouter)
|
||
- Дедлайн: фаза 1 готова к 16.04.2026 (чтобы ДР поздравить!)
|