Skip to content

Обзор

«Хранить чаты» — это на самом деле три разные задачи по работе с данными с разными паттернами доступа, объёмом и сроком хранения. Слить их в одну таблицу — ошибка: телеметрия раздула бы транзакционное хранилище, а поиск конкурировал бы с записями. Держи их раздельно, каждую за своим slice'ом, чтобы физический бэкенд оставался заменяемым.

ЗадачаЧто этоГдеSlice
Хранилищечат как источник записи (то, что показывает UI)Postgres (общий → выделенный инстанс на масштабе)agent/chat
Короткая памятьрабочее окно контекста на этот ход (окно + running summary)производное от Postgres; сводка персистится на чатеagent/chat + agent/orchestrator
Debug и трейсингпромпты · вызовы тулов · токены · полный трейсLangfuse (отдельно; на базе ClickHouse)инструментировано из api
Памятьзаметки, которые агент держит между разговорами, плюс поиск по разговорузаметки в Postgres; векторы в infra/vectoragent/memory

Принцип

  • Один источник правды (Хранилище) — надёжное, реляционное, с пагинацией для UI.
  • Телеметрия — не правда (Debug) — append-only, высокий объём, короткое хранение, своя система.
  • Память — производное (Память) — асинхронный индекс, построенный из чатов, а не сами чаты.

«Не в api» — если точнее: доменная логика чата остаётся в slice'е agent/chat (это просто gateway); данные могут жить в отдельной базе. Gateway превращает «сейчас в api, отдельно потом» в изменение конфига, а не в переписывание.

→ Дальше: Хранилище · Короткая память · Debug и трейсинг · Память · Реализация.