From 4c9b1d520fee5d8e987f7c2e3a1ee5e92de6ca7d Mon Sep 17 00:00:00 2001 From: Stream Date: Wed, 15 Apr 2026 01:10:01 +0300 Subject: [PATCH] auto-sync: 2026-04-15 01:10:01 --- tasks/bytik/README.md | 74 ++++++++++ tasks/bytik/TZ.md | 332 +++++++++++++++++++++++++----------------- 2 files changed, 274 insertions(+), 132 deletions(-) create mode 100644 tasks/bytik/README.md diff --git a/tasks/bytik/README.md b/tasks/bytik/README.md new file mode 100644 index 0000000..921f3a1 --- /dev/null +++ b/tasks/bytik/README.md @@ -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` +- Логи пишутся в файл для аудита diff --git a/tasks/bytik/TZ.md b/tasks/bytik/TZ.md index 78a8256..dfe2107 100644 --- a/tasks/bytik/TZ.md +++ b/tasks/bytik/TZ.md @@ -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= -ALLOWED_CHAT_ID= -OPENROUTER_API_KEY= -OPENROUTER_MODEL=openrouter/qwen/qwen3.6-plus -ELEVENLABS_API_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-агент