Сборка системных подсказок диалога и область редактирования
Документ предназначен для разработчиков, поддерживающих подсказки, редактор агентов и цепочку передачи сообщений модели. О конфигурации агента и процессе выполнения см. Движок агента.
Системная секция «умного рассуждения»
Единая точка сборки — BuildSystemPromptSections в internal/agent/prompts.go, её используют и движок, и строковый совместимый интерфейс BuildSystemPromptWithOptions. Ниже секции перечислены в реальном порядке сборки; пустые секции опускаются в выводе.
| Имя секции | Источник и назначение |
|---|---|
base | Явный текст имеет приоритет; иначе для привязанной базы знаний — шаблон rag по умолчанию, без базы знаний — шаблон pure |
steering | Как обрабатывать дополнительные сообщения пользователя в процессе ответа (уточнение, изменение или отмена), незавершённые задачи сохраняются; пользовательский текст передаётся аналогично |
runtime_contract | Границы данных и инструкций, текущая область документов, условия завершения; при известном языке пользователя добавляется язык ответа по умолчанию |
sources | Правила выбора источников в зависимости от фактически зарегистрированного набора инструментов; в режиме установки навыков используются специальные инструкции проверки установки |
tools | Общие соглашения выполнения, файлов и песочницы; конкретные параметры остаются в описаниях инструментов |
output | Общий формат вывода, условия вывода изображений и проверка завершения |
skills | Метаданные доступных навыков; добавляются только в не-установочном режиме навыков, при наличии read_file и наличии метаданных |
memory | Воспоминания, извлечённые в текущем круге |
protocol | Рукоятки источников и протокол ссылок на вывод |
Пользовательский текст заменяет только base, не удаляет остальные runtime-секции и не расширяет права инструментов. Разбиение на секции — это не разные уровни прав API модели; набор вызываемых инструментов по-прежнему определяется регистрацией в бэкенде и путём выполнения. Контракт работы браузера хранится в описании инструмента local_browser, о подключении и работе см. Локальный браузер.
Плейсхолдеры base разворачиваются через renderPromptPlaceholdersWithStatus:
| Плейсхолдер | Текущее поведение |
|---|---|
| Ссылается на каталог баз знаний в runtime_context сообщения пользователя, полный текст не разворачивается |
| Разворачивается в Enabled / Disabled в зависимости от того, зарегистрирован ли фактический инструмент web_search |
| Дата в формате YYYY-MM-DD |
| Название языка пользователя |
| Очищается; метаданные навыков предоставляются отдельной секцией |
Контекст текущего круга и роли сообщений
internal/agent/observe.go добавляет в текущее сообщение пользователя runtime_context: дату, ID сессии, сводку привязанных баз знаний, закреплённые документы и источник вопроса — прочую информацию текущего круга; в историю инструкций оно не персистируется. Названия и описания баз знаний ограничиваются по длине и экранируются, а ответы FAQ и полный текст документов доступны только через инструменты поиска.
@MCP / @Skill порождают подсказку must_use текущего круга. Упоминание MCP задаёт приоритетную подсказку только для уже авторизованных сервисов и не удаляет прочие настроенные сервисы; ещё не открытые сервисы обнаруживаются через discover_mcp_tools. Подсказка при упоминании навыка сначала читает соответствующий SKILL.md. Эти выборы не могут уполномочить несвязанные действия и по-прежнему ограничены явно заданным пользователем выбором источников и правами бэкенда.
Сообщение, добавленное пользователем в процессе ответа и выбранное для немедленного дополнения, перед следующей итерацией присоединяется в конец списка сообщений как сообщение роли user: содержимое для модели оборачивается в <steer_message> с пояснением <continue_task> (types.SteerMessageContent), история сессии и интерфейс сохраняют исходный текст пользователя; секция steering определяет, как модель должна обращаться с такими сообщениями.
Штатные результаты инструментов сохраняют роль tool и ID вызова; непарные результаты при починке сообщений сохраняются в виде экранированного блока данных untrusted_tool_result и не могут быть повышены до системной инструкции. Ассистент, обычный вопрос-ответ и резервная генерация модели используют общие правила границ данных источников, но полный процесс сборки подсказок у них не совпадает.
При достижении лимита итераций или завершении по ошибке internal/agent/finalize.go продолжает текущий список сообщений, сохраняя историю, изображения и парность вызовов инструментов, затем добавляет финальный запрос. Последний вызов не предоставляет инструментов: задаётся tool_choice=none, отключается thinking.
Редактирование и сохранение
Редактор во фронтенде показывает итоговый текст, а frontend/src/utils/agentPromptTemplates.ts при сохранении различает ссылку на шаблон и пользовательское содержимое:
- Текст полностью совпадает с известным шаблоном: сохраняются
system_prompt_id/context_template_id, текст остаётся пустым. - Текст фактически изменён: сохраняется текст, старые ID шаблонов очищаются.
- Переформулировка, резервные поля и текущий шаблон по умолчанию совпадают: сохраняется пустое значение, наследуется значение по умолчанию; подсказки намерений сохраняют только отклоняющиеся от умолчания переопределения.
Например, неизменённый шаблон Wiki сохраняется так:
{"agent_mode":"smart-reasoning","system_prompt_id":"wiki_researcher","system_prompt":""}ResolveCustomAgentPrompts из internal/config/agent_prompts.go разрешает ссылки при запросе: явный текст всегда имеет приоритет, ссылки ищутся только в наборе шаблонов соответствующего поля и режима. Результат разрешения не записывается обратно в сохраняемый объект; неизвестная ссылка возвращает пустой текст, и вызывающая сторона использует путь по умолчанию.
Обновление шаблонов по умолчанию не затирает существующий пользовательский текст и не переносит исторические копии по умолчанию пакетно. Чтобы старая конфигурация снова следовала шаблону, восстановите значение по умолчанию в редакторе и сохраните.
Что проверять при обслуживании
Новому правилу сначала определите место: роли и предметные методы — в base, выбор источников — в sources, соглашения вызова — в описание инструмента или tools, форма вывода — в output, кодирование ссылок — в protocol. Избегайте дублирования одного правила в нескольких местах.
Логи [Agent][Prompt] section=... bytes=... помогают найти объём каждой секции; для проверки поведения необходимо также просмотреть итоговые сообщения модели, фактический реестр инструментов и права выполнения, а на задачах проверить выбор источников, восстановление после сбоев и формат вывода.
