чарли: как я строю семейного ai-помощника на deepseek + opus + telethon

13 дней назад я поднял нам с леной семейного бота. зовут чарли, образ собаки — лена взяла из своего детства. живёт в телеге как @CharlieFamilyBot, читает три календаря (мой, лены, адама), пишет утренний и вечерний бриф в общий семейный чат, ловит конфликты типа «у обоих занято с 11 до 13, кто с адамом?». дальше — что внутри, как тренирую и что понял за 13 дней.

зачем

у меня BA, у лены аргентина, у адама садик с 7:30 до 11:50, потом няня (денис), кружки, спорт, перелёты, гости. apple-календарь, google-календарь, имейлы у всех разные, расписание держать в голове двумя взрослыми людьми невозможно. был выбор: либо нанимать секретаря, либо собрать чарли. собрал чарли.

обещание простое: бриф приходит в 7:00 и в 21:00 без напоминаний. конфликты подсвечиваются ДО того, как я создал событие. адам всегда с кем-то, и если на вечер никто не назначен — алерт в семейный чат.

стек

архитектурная идея, которую я давно проговаривал в чатах: директор тупой, исполнители умные.

«можно даже на генерального директора, условно говоря, повесить что-то потупее типа з.ай или дипсик. сотрудников сделать на опусе. все как в жизни, короче.»

ровно это и реализовано. дешёвый дипсик стоит у руля, дорогой опус подключается на корнер-кейсы.

как обучаю — лоботомии

самое важное за 13 дней — это не код, а ритуал лоботомии.

раньше я правил поведение чарли прямо в основном чате. «не делай так», «делай вот так», «запомни». это не работает: правила размываются, противоречат друг другу, теряются в скролле. чарли запомнил, что чередуем вечера пн/ср/пт, и параллельно — что «вечер 2-3 часа каждый». оба активны одновременно.

лоботомия — это отдельная сессия, в которой sub-agent (interviewer bot) проходит со мной по списку грабель, задаёт по одному вопросу за раз, а в конце обновляет ВСЕ файлы скилла разомSKILL.md, MEMORY.md, IDENTITY.md, cron-конфиг. не правка по кускам.

лоботомия №1 случилась 13–15 апреля. в чате накопилось ~300 сообщений, я заскринил всё, попросил: «как бы нам запланировать диалог для того чтобы донастроить твою личность и цели?». чарли сам предложил формат через interviewer-sub-agent.

на выходе — SKILL.md v3.1, identity, базовые правила: apple = read-only основа, семейные → только в family-календарь, preview-карточки с inline-кнопками ✅ / ✏️ / ❌ перед любым create_event, адам всегда с кем-то.

лоботомия №2 идёт сейчас. за неделю работы вылезло 13 новых пунктов. целевая версия — SKILL.md v4.0, MEMORY.md переписан с нуля (не append!), cron реально запущен.

связка с opus — ещё круче. я через telethon-бридж даю клоду задачу: «сходи в чат @CharlieFamilyBot, прочитай 2000 сообщений, найди что не так». opus возвращает отчёт на 300кб. я передаю отчёт другому клоду, который приглядывает за клешнёй. тот делает лоботомию — и чарли работает заметно лучше. я в это время пью чай ☕

самые жирные фейлы

3 примера из ~520 сообщений переписки, чтобы было понятно, что именно ломается у живого ai-помощника.

1. диссоциация личности. на вопрос «кто ты?» (1354061) чарли ответил: «Я — JARVIS, сэр! 🦾». через минуту тот же вопрос (1354065) — «Я — Charlie (Чарли), сэр! 🐕». в других моментах — Pi, Lobster. фикс: один канонический ответ из IDENTITY.md, никакой импровизации.

2. security leak. в 1356710-12 чарли по запросу «дай матон адама» — выдал maton-ключ адама прямо в чат. это полный фейл security модели. правило: НИКОГДА не печатать секреты в чат. только «использую сам / переслать через secure-channel / показать где хранится». теперь работает (1359069-70).

3. дата в прошлом. в 1355587 я попросил «поставь спорт на вторник 15 апреля», когда сегодня уже 16-е и 15-е было средой. чарли молча создал событие. потом ещё раз — 1356695 («ты опять дату проебал»). фикс делается в лоботомии №2: детерминированный python-tool resolve_date(text, today, tz) через dateparser + pytz. llm не должен считать даты в голове. даты — это python.

4. бонус: «где брифинг епта». мы целую неделю переписывались про утренний бриф, чарли честно записал в SKILL.md «отправляю в 7:00». но cron не существовал. это была декларация без реализации. 1358647 — «где мой хартбит епта», 1359008 — «где брифинг епта», 1359377 — «почему ты в HardBit не сказал». главный урок 13 дней: правило в файле ≠ автозапуск. heartbeat — это launchd/cron, а не строчка в .md.

роли vs 1 агент = 1 задача

тут у меня поменялось мнение за 3 недели.

в начале апреля я говорил: оркестрация через ai генерального директора, который большими циклами луп воскрешает сессии сотрудников. tmux + heartbeat + ролевая модель «директор + исполнители». красиво.

на чарли это частично сломалось. как только в роль помещаешь несколько задач (календарь + транскрипция + чат-парсер + бриф) — модель начинает диссоциировать (jarvis ↔︎ charlie ↔︎ pi). память течёт через директора, противоречия накапливаются.

вывод за 13 дней: 1 агент = 1 узкая задача, упакованная в роль + скиллы. директор остаётся, но его задача — не «быть всем», а маршрутизировать. чарли, по большому счёту, должен быть тонкой персоной поверх детерминированных tools:

llm только на текстовый интерфейс и неочевидные кейсы. рутина — на python.

это, кстати, ровно то, что в familycalendar/AUDIT.md пишет автор: «чарли не тупой — тупая обвязка». 80% багов решаются детерминированными tools и обязательным порядком вызовов, а не сменой модели.

что дальше

короткий список:

  1. реально включить cron на брифы (07:00 и 21:00 BA). тест: я не пишу 24 часа → бриф приходит.
  2. переписать MEMORY.md структурноpeople.json, recurring.json, rules.json, pending.json. не плоский .md.
  3. resolve_date как python-tool, обязательный перед любым create_event.
  4. single reply — один запрос = одно сообщение в чат. остальное в лог.
  5. 5-сек buffer на forwarded-burst — когда я пересылаю 5 сообщений за 2 секунды, чарли должен ответить один раз, а не пять.
  6. apple .ics parser напрямую (без maton).
  7. opus-тюнер на telethon-бридже в постоянный режим — пусть гоняет тест-кейсы из истории и сам подкручивает инструкцию по acceptance criteria.

через месяц-два расскажу, удалось ли довести heartbeat до состояния, когда я вообще не вспоминаю про чарли — он просто работает на фоне. это и есть финальный тест семейного ai-помощника: не помнить о его существовании.


p.s. если интересно как поднять такого же — пишите. но имейте в виду: telethon — нежная штука, можно потерять личный аккаунт телеги навсегда. не ставьте на основной.