Зачем это вообще
У меня одновременно идёт работа над несколькими проектами, и в каждом — клиент в Telegram, который пишет в любое время. Часть сообщений — реальные запросы и факты. Часть — пожелания, идеи, обновления. Часть — общение, которое можно отложить.
Я не успеваю отвечать в моменте. Если отвечать пачкой раз в день — теряется свежий контекст, клиент чувствует «меня игнорируют». Если посадить живого ассистента — это $1500/мес и нагрузка управлять.
Решение: AI ведёт диалог за меня. Не бот в стиле «выберите пункт 1-2-3», а реальный собеседник, который читает сообщения, отвечает по сути, фиксирует факты в карточке клиента и эскалирует только то, что требует моего решения.
Я называю этот паттерн Live Session. У меня он работает с двумя клиентами параллельно через одну архитектуру.
Архитектура: что под капотом
Три компонента, каждый — отдельный простой инструмент.
1. Чтение чата (tg_read.py)
Скрипт на Telethon (user-account API, не Bot API), который заходит в указанный чат и забирает все новые сообщения с момента предыдущей сессии. Возвращает JSON.
Почему Telethon, а не Bot API: бот в Telegram не может читать историю чата как пользователь. Только сообщения, которые приходят боту напрямую. Если ты хочешь, чтобы AI работал в чате как живой человек — нужен user-account через Telethon.
Дополнительно: голосовые сообщения сразу транскрибируются через whisper-cli (whisper.cpp + ggml-large-v3-turbo) — текст добавляется в JSON. Никаких кнопок «послушать», AI читает голос как обычный текст.
2. Принятие решения (Claude Code в режиме /loop)
Каждые 30-60 секунд срабатывает loop: Claude читает свежие сообщения, смотрит карточку клиента, решает что ответить. У него на руках:
- Базовая персона (
prompts/lana_base.md) — стиль, запреты, тон. Общий для всех клиентов. - Персональный пресейл-промт (
prompts/lana_<имя>_demo.md) — что знаем про клиента, что делаем, что нельзя обсуждать. - Карточка клиента (
clients/<имя>.md) — живое досье, обновляется после каждого нового факта.
Claude формирует ответ — короткие сообщения, как живой человек. Не одно длинное на 200 слов, а 1-3 коротких подряд. Это критично для ощущения живого собеседника.
3. Отправка с typing-задержкой (tg_send.py)
Скрипт берёт ответ Claude и отправляет в чат через outbox JSON — не сразу. Outbox обрабатывается отдельным процессом, который имитирует естественное поведение:
- 3-7 секунд «печатает» (showing typing)
- Затем сообщение
- Если несколько подряд — пауза 5-10 секунд между ними
Без этой задержки моментальные ответы выдают AI с потрохами. С задержкой — клиент верит, что человек думает.
Что AI решает сам, что эскалирует
Это не «делегирование всего». Это разделение труда:
AI делает сам (~80% сообщений):
- Уточняет детали запроса
- Фиксирует новые факты в карточке клиента
- Обозначает следующий шаг
- Отправляет материалы из заранее подготовленного набора
- Вежливо отказывается от тем, которые вне компетенции
Эскалирует мне:
- Цены и коммерческие условия
- Сроки
- Любая критика в адрес моей работы
- Запрос на формат, которого нет в наборе
- Сомнение «я не уверена, что ответить»
Эскалация работает просто: AI пишет в моё личное окно Claude Code «вот сообщение клиента, я думаю ответить вот так — отправляем?». Я говорю «да» / «нет, вместо этого X» — и AI отправляет.
Стоп-фраза: если в чате клиента появляется слово «Николай» или «лично» — AI не отвечает, ждёт меня.
Карточка клиента — главный артефакт
clients/<имя>.md — это не просто заметки. Это источник правды о клиенте, который AI пересоздаёт после каждого диалога.
Структура:
# Имя Фамилия — короткий ярлык
## Контакт
- TG: @username, chat_id: -1001234567890
- Регион, часовой пояс
## Кто
- 2-3 строки: профессия, ниша, текущий бизнес
- Боли и цели
## Что делаем
- Текущий проект и статус
- Что обсудили на прошлой встрече
- Что висит на стороне клиента
- Что висит на моей стороне
## Что обещано
- Точные обещания с датами
## История общения
- Хронология ключевых сообщений (не все — только узловые)
## Запреты в общении
- Список конкретных тем, которых не касаемся
- Слов и фраз, которые не использовать
Когда AI читает новое сообщение, он:
- Смотрит карточку → понимает контекст
- Отвечает
- Обновляет карточку, если узнал новый факт
Это даёт долгую память без RAG — потому что весь контекст одного клиента помещается в один файл, а в начало каждого loop'а файл просто подгружается заново.
Грабли, на которые я наступал
1. Изоляция чатов
Когда клиентов больше одного, каждый должен иметь свой инстанс: своя сессия Telethon, свой .env, свой state, свои inbox/outbox. Иначе бывает катастрофа: AI отвечает в чате клиента А ответом, который сгенерирован под клиента Б.
У меня сейчас архитектура instances/<client>/ — папка под каждого клиента, всё своё. До этого был общий код — однажды чаты пересеклись. Теперь это закрытая статья: при прямом Telethon никогда не использовать cfg.chat_id из общего конфига, всегда явная константа.
2. Тон ассистента дороже бренда
Первая версия Ланы говорила: «не торопимся», «ладно», «угадала», «потыкаемся». Технически — правильно по-русски. Но клиенты дорогих услуг это не покупают — звучит как продавец на рынке.
Сейчас в базовой персоне жёсткий список запрещённых фраз. Тон — ассистент дорогой студии. Собранно, без лишних слов, без «ну» и «ладно».
3. Эскалация через явный сигнал, не угадывание
Раньше было «AI решает сам когда эскалировать». Это плохо работало — она либо эскалировала всё подряд, либо отвечала там, где надо было спросить.
Сейчас правило: эскалируй на любые цифры, сроки и формат. Всё остальное — по сути сама. Это проверяемое правило, AI его держит.
4. Демон периодически виснет
Telethon-сессии иногда теряют коннект и не восстанавливаются. Решение пока workaround: внешний lana_ctl.sh с командами start/stop/status/restart. Если сессия зависла — kill + start, это занимает 5 секунд. Корневая причина не найдена, в техдолге.
5. Не давать AI право отправлять файлы и фото без согласования
В одну итерацию я разрешил AI самому решать, отправлять ли HTML-файл клиенту. Через час он отправил черновик, который ещё не был готов. С тех пор: любой файл и фото — только через моё «отправь». Это закреплено как глобальное правило в CLAUDE.md.
Когда это паттерн стоит брать
Live Session окупается, когда:
- У тебя 2+ активных клиента, которые пишут в Telegram постоянно
- Часть общения — рутина (уточнения, фиксация, обмен материалами)
- Ты теряешь контекст из-за переключений между ними
- Нанять ассистента дорого или не хочется выпускать управление
Live Session не нужен, когда:
- Клиентов 1-2 и они пишут раз в день — справишься сам
- Тематика разговоров не про работу, а про личные отношения с клиентом
- Тебе нравится сам процесс общения и он часть продукта
Стек коротко
- Python 3.13+
- Telethon (user-account API) для чтения/отправки
- whisper.cpp +
ggml-large-v3-turboдля транскрипции голоса - Claude Code +
/loop dynamicдля принятия решений - Markdown для карточек клиентов
- JSON inbox/outbox для буферизации сообщений
- bash-обёртка (
lana_ctl.sh) для управления демонами
Без баз данных, без очередей, без Docker. Файловая система + cron + три скрипта.
Это работает уже месяц с двумя параллельными клиентами. Стоимость API — около $40/мес на оба чата. Дешевле любого живого ассистента, и работает 24/7 без выгорания.