Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Телеграм

Телеграм — модуль, а не часть ядра. Он живёт отдельным процессом (eva/telegram-bridge) на eva-sdk: свой токен, своя база под телеграмное состояние (допуски, привязка чатов, настройки, дебаунс, триаж), свой перезапуск. Поведение поверхности — что́ считается обращением, как выглядит /settings, чем триажатся группы — описано у него; здесь только шов с ядром.

Ядро знает о нём ровно то же, что о любом модуле: подключён по modules.servers.telegram, его инструменты приезжают в реестр как telegram_* в группе telegram. Всё остальное ядро получает от него обычным ходом через HTTP/SSE API.

Что в ядре есть ради поверхностей

Ничего телеграм-специфичного, но кое-что появилось под поверхность с внешними сообщениями — телеграм её первый (и пока единственный) носитель:

  • Якорь тура (anchor в POST /v1/chats/{id}/messages) — внешнее сообщение, на которое отвечает тур. По нему инструменты поверхности знают цель (реакция, реплай, «гашу этот ответ»), а ядро понимает, что тур пришёл из чата с живыми людьми. Инструмент, которому якорь необходим, объявляет _meta["dev.eva/anchored"] и без якоря не показывается и не исполняется.
  • Инструмент-вердикт (_meta["dev.eva/ends_turn"]) — успешный вызов закрывает тур, управление модели не возвращается. Так объявлен telegram_skip: сказанное «молчу» окончательно, и модель не успевает ни передумать, ни уйти в цикл повторных skip.
  • Говорящий (sender) — личность из /v1/persons/resolve. Ею ядро решает, чей это тур: личность из master.aliases — тур Господина, прочие — гости с урезанной памятью и без master-инструментов. Доступ к личной памяти говорящим не открывается: он требует ещё и trusted, а доверенной мост объявляет одну личку Господина — в группе его личное придержано, даже когда спрашивает он сам.
  • Поверхность чата (surface в POST /v1/chats, параметр eva-sdk::create_chat) — поверхность помечает им свои чаты, и в общий список клиентов они не попадают: переписки с другими людьми считаются десятками и затопили бы его. Смотрятся явным фильтром GET /v1/chats?surface=<имя|any>.
  • Окно живой истории и компакция публичных чатов настраиваются отдельно от личных, секцией context.telegram: вход дорогой модели в группе режется жёстче. Окно истории ключуется якорем тура, профиль компакции — поверхностью самого чата.
  • Кэш промпта для таких туров отдельный (llm.prompt_cache_telegram): в группе реплики идут пачками от разных людей, и TTL там осмысленно другой.
  • Кнопочные вопросы (ask_questions) — общий инструмент ядра, не телеграмный: варианты уезжают клиенту в tool_call-событии, ответ приходит в POST /v1/chats/{id}/questions/answer. Кнопки рисует поверхность — телеграм своими inline-кнопками, tui и android своими. Сколько вопросы живут — tools.ask_ttl.
  • Уведомления инструментом (notify.tool + notify.tool_args, см. конфигурацию): когда Ева просит внимания, ядро зовёт названный оператором инструмент и кладёт текст полем text. Личка Господина в телеграме — это telegram_send_to_other_chat с её chat_id в аргументах; телеграмной семантики у ядра при этом нет.

Телеграм-таблицы в базе ядра

В схеме ядра лежат telegram_*-таблицы, которых оно не читает: это состояние моста той поры, когда мост жил в ядре. Данные переживают код — таблицы остались на месте, а модуль ведёт своё состояние у себя.