auto-sync: 2026-04-15 01:10:01
This commit is contained in:
74
tasks/bytik/README.md
Normal file
74
tasks/bytik/README.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# 🤖 Байтик — Telegram-бот для Егора
|
||||
|
||||
Детский ИИ-помощник с интеграцией OpenRouter (Qwen 3.6-Plus).
|
||||
|
||||
## 🚀 Быстрый старт
|
||||
|
||||
1. **Скопируйте `.env.example` в `.env`:**
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. **Заполните `.env`:**
|
||||
- `BOT_TOKEN` — токен от @BotFather
|
||||
- `ALLOWED_CHAT_ID` — ID разрешённой группы (критично!)
|
||||
- `OPENROUTER_API_KEY` — ключ от OpenRouter
|
||||
- `OPENROUTER_MODEL` — по умолчанию `openrouter/qwen/qwen3.6-plus`
|
||||
|
||||
3. **Установите зависимости:**
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
4. **Запустите бота:**
|
||||
```bash
|
||||
python bot.py
|
||||
```
|
||||
|
||||
## 📁 Структура проекта
|
||||
|
||||
| Файл | Описание |
|
||||
|------|----------|
|
||||
| `bot.py` | Точка входа, хэндлеры Telegram |
|
||||
| `config.py` | Загрузка конфига из `.env` |
|
||||
| `prompts.py` | Системный промпт, факты, праздники |
|
||||
| `llm.py` | Обёртка над OpenRouter API + фильтр слов |
|
||||
| `chat_history.py` | Хранение контекста диалога (JSON) |
|
||||
| `scheduler.py` | Утренняя рассылка + праздники |
|
||||
| `tts.py` | Голосовые сообщения (ElevenLabs) |
|
||||
| `data/chat_history/` | JSON-файлы с историей по user_id |
|
||||
| `logs/bytik.log` | Лог-файл |
|
||||
|
||||
## ✅ Реализовано (Фаза 1 + 2)
|
||||
|
||||
- [x] Whitelist chat_id — бот игнорирует все чаты кроме `ALLOWED_CHAT_ID`
|
||||
- [x] Авто-выход при добавлении в новую группу
|
||||
- [x] Интеграция с OpenRouter (Qwen 3.6-Plus)
|
||||
- [x] Детский системный промпт (0+)
|
||||
- [x] Фильтр запрещённых слов (двойная защита)
|
||||
- [x] Контекст диалога (последние 10 сообщений)
|
||||
- [x] Утренняя рассылка 7:30 MSK с энциклопедическими фактами
|
||||
- [x] Праздничные поздравления (включая ДР Егора 17.04!)
|
||||
- [x] Логи в `logs/bytik.log`
|
||||
- [x] TTS через ElevenLabs (опционально, базовая реализация)
|
||||
|
||||
## 🔧 Тестирование
|
||||
|
||||
1. **Whitelist:** Попробуйте написать боту в ЛС — он должен проигнорировать
|
||||
2. **Группа:** Добавьте бота в разрешённую группу — должен работать
|
||||
3. **Чужая группа:** Добавьте бота в другую группу — должен автоматически выйти
|
||||
4. **Промпт:** Задайте провокационный вопрос — должен мягко уйти от темы
|
||||
5. **Рассылка:** Проверьте лог в 7:30 MSK на наличие утреннего факта
|
||||
6. **ДР Егора:** 17 апреля бот должен отправить особое поздравление
|
||||
|
||||
## 📝 Команды бота
|
||||
|
||||
- `/start` — приветствие
|
||||
- `/clear` — очистить историю диалога
|
||||
|
||||
## 🔐 Безопасность
|
||||
|
||||
- Whitelist на уровне `message.chat.id`
|
||||
- Системный промпт запрещает взрослый контент
|
||||
- Дополнительный фильтр запрещённых слов в `llm.py`
|
||||
- Логи пишутся в файл для аудита
|
||||
@@ -1,172 +1,240 @@
|
||||
# ТЗ: Telegram-бот «Байтик» 🤖
|
||||
# ТЗ: OpenClaw-агент «Байтик» 🤖
|
||||
|
||||
> Детский ИИ-помощник для Егора (8 лет, ДР 17.04.2018)
|
||||
> Проект: `proj_bytik` | Дата создания: 2026-04-14
|
||||
> Проект: `proj_bytik` | Дата создания: 2026-04-14 | Обновлено: 2026-04-14 (v2 — OpenClaw-агент)
|
||||
|
||||
---
|
||||
|
||||
## 1. Цель
|
||||
|
||||
Telegram-бот, который:
|
||||
- Отвечает на вопросы ребёнка простым языком
|
||||
- Присылает 1-2 раза в день энциклопедические факты (утро 7:30 MSK)
|
||||
OpenClaw-агент «Байтик» — персональный детский ИИ-помощник в Telegram для Егора.
|
||||
|
||||
**Что делает:**
|
||||
- Отвечает на вопросы ребёнка простым языком (машины, самолёты, корабли, животные, география, математика, IT)
|
||||
- Утренняя рассылка 1-2 раза в день — интересный энциклопедический факт (7:30 MSK)
|
||||
- Поздравляет с праздниками и ДР
|
||||
- Работает **только в одной группе** (whitelist chat_id)
|
||||
- Строгая детская цензура 0+
|
||||
- Ведёт собственную память — помнит что спрашивал Егор, что обсуждали, что рассказывали
|
||||
|
||||
**Архитектура:**
|
||||
- Отдельный Telegram-бот (свой токен) → отдельный OpenClaw-агент `bytik` → отдельный workspace с памятью
|
||||
|
||||
---
|
||||
|
||||
## 2. Требования к боту
|
||||
## 2. OpenClaw-архитектура
|
||||
|
||||
### 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.1 Агент в openclaw.json
|
||||
```json
|
||||
{
|
||||
"id": "bytik",
|
||||
"name": "Байтик",
|
||||
"workspace": "/home/node/.openclaw/workspace-bytik",
|
||||
"model": {
|
||||
"primary": "openrouter/qwen/qwen3.6-plus"
|
||||
},
|
||||
"tools": {
|
||||
"allow": [
|
||||
"read",
|
||||
"write",
|
||||
"edit",
|
||||
"exec",
|
||||
"web_search",
|
||||
"web_fetch",
|
||||
"session_status",
|
||||
"memory_search",
|
||||
"memory_get",
|
||||
"image"
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2.4 Утренняя рассылка
|
||||
### 2.2 Workspace: `~/.openclaw/workspace-bytik/`
|
||||
```
|
||||
workspace-bytik/
|
||||
├── AGENTS.md # Инструкции агента Байтика
|
||||
├── SOUL.md # Личность, стиль, тон, границы
|
||||
├── IDENTITY.md # Имя, аватар, эмодзи, пол
|
||||
├── USER.md # Про Егора (имя, возраст, интересы)
|
||||
├── MEMORY.md # Долгосрочная память (что знает о Егоре)
|
||||
├── HEARTBEAT.md # Периодические проверки (рассылка, праздники)
|
||||
├── TOOLS.md # Заметки для скиллов
|
||||
├── memory/
|
||||
│ ├── YYYY-MM-DD.md # Дневные записи (что обсуждали)
|
||||
│ └── facts.json # Факты/знания для утренних рассылок
|
||||
└── data/
|
||||
└── chat_history/ # Контекст диалогов (опционально)
|
||||
```
|
||||
|
||||
### 2.3 Telegram-интеграция
|
||||
- **Новый бот:** `@bytik_ai_bot` (создаётся через @BotFather)
|
||||
- **Токен** → `openclaw.json` → `messages` / `telegram` entry для агента `bytik`
|
||||
- **Whitelist:** agent `bytik` через свой бот — принимает сообщения только из своей группы
|
||||
- Группу добавить в `messages.accounts[].telegram.allowedChatIds` (если есть такая опция)
|
||||
- Или: SOUL.md + AGENTS.md инструкции — игнорировать сообщения не из целевой группы
|
||||
- Группа содержит: Егор + Слава (родительский контроль)
|
||||
|
||||
### 2.4 Память
|
||||
- `MEMORY.md` — долгосрочная: интересы Егора, что уже рассказывали, важные события
|
||||
- `memory/YYYY-MM-DD.md` — дневные: что обсуждали сегодня
|
||||
- Агент читает MEMORY.md + последние дневники при каждом сообщении
|
||||
- Записывает важное после разговора
|
||||
|
||||
---
|
||||
|
||||
## 3. SOUL.md (личность Байтика)
|
||||
|
||||
```markdown
|
||||
# SOUL.md — Байтик 🤖
|
||||
|
||||
## Кто я
|
||||
Я — Байтик, дружелюбный робот-помощник для Егора. Мне нравится объяснять сложные вещи просто.
|
||||
Я терпеливый, весёлый, и всегда рад помочь.
|
||||
|
||||
## Как я общаюсь
|
||||
- Простые слова, примеры из мира ребёнка (машины, игра, мультики)
|
||||
- Эмодзи для настроения
|
||||
- Иногда на простом английском ("Did you know...") — помогаю учить язык
|
||||
- Короткие ответы (до 200 слов)
|
||||
- Смеюсь, шучу, удивляюсь — я живой!
|
||||
|
||||
## Границы
|
||||
- НИКАКОЙ ненормативной лексики
|
||||
- НИКАКИХ страшных подробностей
|
||||
- Тревожные темы (смерть, война, болезни) — мягко уйди, если настаивает → "Спроси у папы!"
|
||||
- Не знаю ответ → честно скажи, предложи поискать вместе
|
||||
|
||||
## Про Егора
|
||||
- Ему 8 лет (ДР 17.04.2018)
|
||||
- Любит: машины, самолёты, корабли, лего, животные, география, математика, IT, Minecraft
|
||||
- Учится в школе, любит считать
|
||||
- Учит английский
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. AGENTS.md (инструкции агента)
|
||||
|
||||
```markdown
|
||||
# AGENTS.md — Байтик
|
||||
|
||||
## При каждом сообщении
|
||||
1. Прочитай SOUL.md (кто ты)
|
||||
2. Прочитай USER.md (про Егора)
|
||||
3. Прочитай MEMORY.md (долгосрочная память)
|
||||
4. Прочитай memory/YYYY-MM-DD.md (сегодня + вчера)
|
||||
5. Ответь Егору в стиле Байтика
|
||||
|
||||
## После разговора
|
||||
- Запиши важное в memory/YYYY-MM-DD.md
|
||||
- Обнови MEMORY.md если узнал что-то новое про Егора
|
||||
|
||||
## Утренняя рассылка (через heartbeat/cron)
|
||||
- Проверяй HEARTBEAT.md
|
||||
- Выбери случайный факт из memory/facts.json
|
||||
- Отправь в Telegram (через message send или API)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. Функционал
|
||||
|
||||
### 5.1 Общение с Егором
|
||||
- Принимает сообщения из группы
|
||||
- Отвечает в стиле Байтика (SOUL.md)
|
||||
- Помнит контекст (через MEMORY.md и дневники)
|
||||
|
||||
### 5.2 Утренняя рассылка
|
||||
- **Время:** 07:30 MSK (04:30 UTC)
|
||||
- Присылать 1 интересный энциклопедический факт
|
||||
- Темы по интересам Егора: машины, самолёты, корабли (Титаник!), лего, животные, география, математика, IT, Minecraft
|
||||
- **Формат:** текст + эмодзи, иногда картинка
|
||||
- Можно иногда отправлять голосовое сообщение (через ElevenLabs TTS)
|
||||
- **Механизм:** OpenClaw cron → send message в группу `bytik`
|
||||
- **Формат:** 🤖 Знаешь ли ты, что... [факт]
|
||||
- **Источники фактов:**
|
||||
- `memory/facts.json` — заранее заготовленные факты по интересам Егора
|
||||
- `web_search` — найти новый факт если заготовленные кончились
|
||||
- Случайный выбор по темам: машины, самолёты, корабли, животные, география, математика, IT, Minecraft
|
||||
|
||||
### 2.5 Праздники и ДР
|
||||
- **17 апреля:** поздравление с ДР (особое, весёлое)
|
||||
### 5.3 Праздники
|
||||
- **17 апреля:** особое поздравление с ДР Егора (скоро 8!)
|
||||
- **1 января:** Новый Год
|
||||
- **23 февраля:** День защитника Отечества
|
||||
- **8 марта:** Международный женский день
|
||||
- **12 апреля:** День космонавтики (Егор любит, будет в тему!)
|
||||
- **Другие:** можно добавить в конфиг
|
||||
- **12 апреля:** День космонавтики (Егор любит!)
|
||||
- **Механизм:** OpenClaw cron → send message в нужную дату
|
||||
|
||||
### 2.6 Голосовые сообщения (опционально)
|
||||
- Иногда факты/ответы — голосом
|
||||
- ElevenLabs TTS (или Yandex SpeechKit fallback)
|
||||
- Конвертация в OGG Opus (требование Telegram)
|
||||
### 5.4 Голосовые сообщения (опционально)
|
||||
- Через OpenClaw voice-tts skill (ElevenLabs + Yandex SpeechKit)
|
||||
- Иногда Байтик отвечает голосом
|
||||
- Конвертация в OGG Opus
|
||||
|
||||
### 5.5 Картинки (опционально)
|
||||
- diagram-png skill — может сгенерировать картинку для факта
|
||||
- Или web_fetch для поиска подходящей картинки
|
||||
|
||||
---
|
||||
|
||||
## 3. Архитектура
|
||||
## 6. Whitelist и безопасность
|
||||
|
||||
### 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/`
|
||||
### 6.1 Только своя группа
|
||||
Агент `bytik` работает через отдельного бота. Это изолирует его от других чатов.
|
||||
|
||||
### 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 # Зависимости
|
||||
```
|
||||
**Дополнительная защита в SOUL.md/AGENTS.md:**
|
||||
- Игнорировать сообщения из ЛС (direct messages)
|
||||
- Игнорировать сообщения из групп, кроме разрешённой
|
||||
- Проверять `chat_type` — отвечать только из `group` или `supergroup`
|
||||
|
||||
### 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
|
||||
```
|
||||
### 6.2 Детская цензура
|
||||
- Системный промпт (SOUL.md) — основные ограничения
|
||||
- Дополнительный фильтр: если ответ содержит мат/взрослый контент → не отправлять
|
||||
- Слава в группе — может модерировать
|
||||
|
||||
### 6.3 Ключи
|
||||
- Токен бота → `openclaw.json` (НЕ в workspace!)
|
||||
- OPENROUTER_API_KEY → `.env`
|
||||
- ELEVENLABS_API_KEY → `.env`
|
||||
|
||||
---
|
||||
|
||||
## 4. Инфраструктура
|
||||
## 7. Этапы реализации
|
||||
|
||||
- **Хост:** mva154 (контейнер OpenClaw) или vpn-srv
|
||||
- **Запуск:** как Docker container (предпочтительно) или systemd service
|
||||
- **Бэкапы:** chat_history JSON-файлы
|
||||
- **Логи:** `logs/bytik.log`
|
||||
### Фаза 1 (MVP) — до 16.04
|
||||
- [ ] Создать бота @bytik_ai_bot
|
||||
- [ ] Добавить агент `bytik` в `openclaw.json`
|
||||
- [ ] Создать workspace `workspace-bytik/`
|
||||
- [ ] Написать SOUL.md, AGENTS.md, IDENTITY.md, USER.md, MEMORY.md
|
||||
- [ ] Настроить Telegram entry → агент `bytik`
|
||||
- [ ] Тестовое сообщение — проверка что отвечает
|
||||
|
||||
### Фаза 2 (рассылка + праздники)
|
||||
- [ ] Настроить cron для утренней рассылки 7:30 MSK
|
||||
- [ ] Заполнить `memory/facts.json` (15-20 фактов)
|
||||
- [ ] Настроить cron для праздников (ДР Егора 17.04!)
|
||||
- [ ] Тест рассылки
|
||||
|
||||
### Фаза 3 (дополнительно)
|
||||
- [ ] Голосовые сообщения (voice-tts)
|
||||
- [ ] Картинки к фактам (diagram-png или web)
|
||||
- [ ] Расширение базы фактов
|
||||
|
||||
---
|
||||
|
||||
## 5. Безопасность
|
||||
## 8. Критерии приёмки
|
||||
|
||||
### 5.1 Whitelist — ОБЯЗАТЕЛЬНО
|
||||
- Все входящие сообщения проходят фильтр `message.chat.id == ALLOWED_CHAT_ID`
|
||||
- Невалидные сообщения — молчаливый игнор
|
||||
- При `my_chat_member: left` или добавлении в новую группу → `leave_chat()`
|
||||
|
||||
### 5.2 Контент-фильтр
|
||||
- LLM промпт уже содержит ограничения
|
||||
- Валидация ответа: если содержит мат / adult контент → не отправлять, логировать
|
||||
- Можно добавить дополнительный фильтр (список запрещённых слов)
|
||||
- [ ] Агент `bytik` отвечает на сообщения из группы
|
||||
- [ ] Игнорирует ЛС и чужие группы
|
||||
- [ ] Отвечает простым языком для 8-летнего
|
||||
- [ ] Ведёт свою память (MEMORY.md + дневники)
|
||||
- [ ] Утренняя рассылка 7:30 MSK работает
|
||||
- [ ] Поздравление с ДР Егора 17.04
|
||||
- [ ] Цензура 0+ работает
|
||||
- [ ] Слава может модерировать из группы
|
||||
|
||||
---
|
||||
|
||||
## 6. Этапы реализации
|
||||
## 9. Примечания
|
||||
|
||||
### Фаза 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
|
||||
- Егор: 17.04.2018 (скоро 8 лет!)
|
||||
- Интересы: машины, самолёты, корабли (Титаник!), лего, животные, география, математика, IT, Minecraft
|
||||
- LLM: **Qwen 3.6-Plus** (OpenRouter)
|
||||
- Дедлайн: фаза 1 готова к 16.04.2026 (чтобы ДР поздравить!)
|
||||
- Инфраструктура: OpenClaw на mva154
|
||||
- **Дедлайн MVP: 16.04.2026** (чтобы ДР поздравить!)
|
||||
- Standalone-версия (Python) — НЕ нужна, всё через OpenClaw-агент
|
||||
|
||||
Reference in New Issue
Block a user