Repository navigation
Personas
Персона — это LLM-пресет: системный промпт плюс параметры генерации. Персону можно привязать к чату, виджету, мобильному ассистенту или Telegram-боту, и она будет определять, как ассистент отвечает.
Привязка хранит только id пресета. Промпт и параметры перечитываются из базы на каждом сообщении — копий-снимков нет. Поэтому правка персоны в разделе LLM сразу применяется во всех привязанных чатах и каналах, без пересоздания сессий и перезапуска ботов.
| Где хранится привязка | Поле | «Нет персоны» |
|---|---|---|
| Чат-сессия | chat_sessions.llm_persona |
NULL |
| Виджет / мобильный инстанс / Telegram-бот | llm_persona |
пустая строка |
Сами пресеты живут в таблице llm_presets, резолвер — modules/llm/persona.py.
modules/chat/facade.py:_build_prompt:
- Явный оверрайд из запроса (
llm_override.system_prompt) - Собственный промпт чата или инстанса
- Промпт персоны
-
prompts/platform-agent.md(путь черезPLATFORM_AGENT_PROMPT_FILE) - Промпт LLM-сервиса
Персона стоит ниже собственного промпта — локальная настройка всегда побеждает; и выше platform-agent — поэтому привязка персоны реально меняет ответы.
Если персона привязана, из неё берутся temperature, max_tokens, top_p, repetition_penalty. Явные llm_params инстанса перекрывают значения персоны.
Параметры передаются на каждый вызов (generate_response_from_messages(..., params=...)), а не пишутся в сервис: LLM-сервис — синглтон, общий для всех параллельных чатов, и запись в него параметров одного чата испортила бы остальные. Поддержано в VLLMLLMService, CloudLLMService, OpenAICompatibleProvider и GeminiProvider (у Gemini параметры уезжают в generation_config; repetition_penalty отбрасывается — эквивалента в API нет).
Admin Panel → LLM → Персоны секретарей. Полный CRUD: id, имя, описание, системный промпт и все четыре параметра генерации. Здесь же создаются новые персоны — править код не нужно (старый хардкод SECRETARY_PERSONAS в vllm_llm_service.py остался только как источник дефолтов для первичного заполнения таблицы).
Кнопка «Сбросить» возвращает промпт пресета к значению из DEFAULT_LLM_PRESETS.
Настройки чата (шестерёнка) → вкладка «Промпт сессии» → блок «Персона»:
- выпадающий список персон или «— без персоны —»;
- строка-подсказка, откуда сейчас берётся промпт;
- редактор промпта персоны и её параметры;
-
«Сохранить в персону» — правка уезжает в пресет и применяется ко всем, кто на него подписан (нужны права
llm:edit); - «Только для этого чата» — текст копируется в промпт сессии, персона не меняется;
- «Вернуть промпт персоны» — снять локальное переопределение.
Admin Panel → Виджеты / Мобильное приложение / Telegram → вкладка AI. Выпадающий список персон (реальный список из базы, а не два зашитых имени). В карточке инстанса промпт показывается всегда, с пометкой источника: собственный промпт инстанса, промпт персоны или промпт платформы.
Таблица заполняется из DEFAULT_LLM_PRESETS при первом обращении:
| id | Имя | Стиль |
|---|---|---|
anna |
Анна | Дружелюбный, краткий |
marina |
Марина | Формальный, профессиональный |
Обе рассчитаны на телефонный сценарий: короткие ответы без Markdown, числа прописью, «ё». Для чата и виджетов чаще подходят Prompts или собственная персона.
| Метод | Эндпоинт | Права |
|---|---|---|
GET |
/admin/chat/personas |
chat:view — список для пикера в чате |
GET |
/admin/llm/presets |
llm:view — полный список пресетов |
POST / PUT / DELETE
|
/admin/llm/presets[/{id}] |
llm:edit — CRUD |
GET / POST
|
/admin/llm/prompt/{persona} |
llm:view / llm:edit — промпт персоны |
POST |
/admin/llm/prompt/{persona}/reset |
llm:edit — сброс к дефолту |
PUT |
/admin/chat/sessions/{id} |
chat:edit — поле llm_persona
|
Отдельный /admin/chat/personas нужен, чтобы пикер работал у пользователей без доступа к разделу LLM. Правка самой персоны при этом остаётся привилегированной операцией.
scripts/migrate_persona_binding.py добавляет chat_sessions.llm_persona и обнуляет llm_persona у существующих виджетов, мобильных инстансов и ботов.
Обнуление намеренное: поле много релизов дефолтилось в anna, но не читалось никем. Начни система уважать его задним числом — все живые виджеты без своего промпта внезапно заговорили бы телефонным промптом секретаря. После миграции персона включается явно. Поддерживает --dry-run.
- У WhatsApp-инстансов колонки
llm_personaпока нет. - ENV-переменная
SECRETARY_PERSONAвлияет только на глобальную персону LLM-сервиса (legacy-пути/chat, телефония), но не на чат-сессии.
← Wiki-RAG | Prompts | API-Reference →