К содержимому
ErgonLab
← Блог
Гайд · Автоматизация
· 10 мин

Live Session: как AI ведёт чат с клиентом за тебя

Паттерн, в котором AI отвечает в реальном Telegram-чате как живой ассистент — собирает запрос, фиксирует факты, отдаёт критичное на согласование. Архитектура и грабли.

Зачем это вообще

У меня одновременно идёт работа над несколькими проектами, и в каждом — клиент в 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 читает новое сообщение, он:

  1. Смотрит карточку → понимает контекст
  2. Отвечает
  3. Обновляет карточку, если узнал новый факт

Это даёт долгую память без 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 без выгорания.

Соседние посты

Читать дальше

← Предыдущий
MCP-серверы в работе: 7 штук, которые подключаю каждому проекту
Следующий →
Claude — первое место в App Store. ChatGPT уступил
Все материалы
Принимаю заказы

Понравилось?
Обсудим задачу?

Напишите коротко — ответим в течение дня.

Написать в Telegram
@ergonlab_bot