Files
wiki/tasks/bytik/TZ.md
2026-04-15 01:00:01 +03:00

173 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ТЗ: 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 (чтобы ДР поздравить!)