sidebar_position: 5 title: "Prompt Assembly" description: "How Hermes builds the system prompt, preserves cache stability, and injects ephemeral layers" lang: ru
Быстрая сборка
Гермес намеренно разделяет:
- состояние кэшированного системного запроса
- эфемерные дополнения во время вызова API
Это один из наиболее важных дизайнерских решений в проекте, поскольку он влияет на:
- использование токена
- быстрая эффективность кэширования
- непрерывность сеанса
- корректность памяти
Первичные файлы:
run_agent.pyagent/prompt_builder.pytools/memory_tool.py
Слои кэшированных системных подсказок
Кэшированное системное приглашение собирается примерно в следующем порядке:
- идентификатор агента —
SOUL.mdизHERMES_HOME, если доступен, в противном случае возвращается кDEFAULT_AGENT_IDENTITYвprompt_builder.py. - Руководство по поведению с учетом инструментов
- Статический блок Honcho (когда активен)
- дополнительное системное сообщение
- замороженный снимок ПАМЯТИ
- замороженный снимок профиля ПОЛЬЗОВАТЕЛЯ
- индекс навыков
- файлы контекста (
AGENTS.md,.cursorrules,.cursor/rules/*.mdc) — SOUL.md не включен сюда, если он уже был загружен в качестве идентификатора на шаге 1. - временная метка/необязательный идентификатор сеанса
- подсказка по платформе
Если установлен skip_context_files (например, делегирование субагента), SOUL.md не загружается и вместо него используется жестко запрограммированный DEFAULT_AGENT_IDENTITY.
Конкретный пример: собранная системная подсказка
Вот упрощенное представление того, как выглядит окончательное системное приглашение, когда присутствуют все слои (в комментариях указан источник каждого раздела):
# Layer 1: Agent Identity (from ~/.hermes/SOUL.md)
You are Hermes, an AI assistant created by Nous Research.
You are an expert software engineer and researcher.
You value correctness, clarity, and efficiency.
...
# Layer 2: Tool-aware behavior guidance
You have persistent memory across sessions. Save durable facts using
the memory tool: user preferences, environment details, tool quirks,
and stable conventions. Memory is injected into every turn, so keep
it compact and focused on facts that will still matter later.
...
When the user references something from a past conversation or you
suspect relevant cross-session context exists, use session_search
to recall it before asking them to repeat themselves.
# Tool-use enforcement (for GPT/Codex models only)
You MUST use your tools to take action — do not describe what you
would do or plan to do without actually doing it.
...
# Layer 3: Honcho static block (when active)
[Honcho personality/context data]
# Layer 4: Optional system message (from config or API)
[User-configured system message override]
# Layer 5: Frozen MEMORY snapshot
## Persistent Memory
- User prefers Python 3.12, uses pyproject.toml
- Default editor is nvim
- Working on project "atlas" in ~/code/atlas
- Timezone: US/Pacific
# Layer 6: Frozen USER profile snapshot
## User Profile
- Name: Alice
- GitHub: alice-dev
# Layer 7: Skills index
## Skills (mandatory)
Before replying, scan the skills below. If one clearly matches
your task, load it with skill_view(name) and follow its instructions.
...
<available_skills>
software-development:
- code-review: Structured code review workflow
- test-driven-development: TDD methodology
research:
- arxiv: Search and summarize arXiv papers
</available_skills>
# Layer 8: Context files (from project directory)
# Project Context
The following project context files have been loaded and should be followed:
## AGENTS.md
This is the atlas project. Use pytest for testing. The main
entry point is src/atlas/main.py. Always run `make lint` before
committing.
# Layer 9: Timestamp + session
Current time: 2026-03-30T14:30:00-07:00
Session: abc123
# Layer 10: Platform hint
You are a CLI AI Agent. Try not to use markdown but simple text
renderable inside a terminal.
Как SOUL.md отображается в командной строке
SOUL.md находится по адресу ~/.hermes/SOUL.md и служит идентификатором агента — самый первый раздел системного приглашения. Логика загрузки в prompt_builder.py работает следующим образом:
# From agent/prompt_builder.py (simplified)
def load_soul_md() -> Optional[str]:
soul_path = get_hermes_home() / "SOUL.md"
if not soul_path.exists():
return None
content = soul_path.read_text(encoding="utf-8").strip()
content = _scan_context_content(content, "SOUL.md") # Security scan
content = _truncate_content(content, "SOUL.md") # Cap at 20k chars
return content
Когда load_soul_md() возвращает содержимое, оно заменяет жестко запрограммированное DEFAULT_AGENT_IDENTITY. Затем вызывается функция build_context_files_prompt() с skip_soul=True, чтобы предотвратить появление SOUL.md дважды (один раз как идентификатор, один раз как файл контекста).
Если SOUL.md не существует, система возвращается к:
You are Hermes Agent, an intelligent AI assistant created by Nous Research.
You are helpful, knowledgeable, and direct. You assist users with a wide
range of tasks including answering questions, writing and editing code,
analyzing information, creative work, and executing actions via your tools.
You communicate clearly, admit uncertainty when appropriate, and prioritize
being genuinely useful over being verbose unless otherwise directed below.
Be targeted and efficient in your exploration and investigations.
Как внедряются файлы контекста
build_context_files_prompt() использует систему приоритетов — загружается только один тип контекста проекта (выигрывает первое совпадение):
# From agent/prompt_builder.py (simplified)
def build_context_files_prompt(cwd=None, skip_soul=False):
cwd_path = Path(cwd).resolve()
# Priority: first match wins — only ONE project context loaded
project_context = (
_load_hermes_md(cwd_path) # 1. .hermes.md / HERMES.md (walks to git root)
or _load_agents_md(cwd_path) # 2. AGENTS.md (cwd only)
or _load_claude_md(cwd_path) # 3. CLAUDE.md (cwd only)
or _load_cursorrules(cwd_path) # 4. .cursorrules / .cursor/rules/*.mdc
)
sections = []
if project_context:
sections.append(project_context)
# SOUL.md from HERMES_HOME (independent of project context)
if not skip_soul:
soul_content = load_soul_md()
if soul_content:
sections.append(soul_content)
if not sections:
return ""
return (
"# Project Context\n\n"
"The following project context files have been loaded "
"and should be followed:\n\n"
+ "\n".join(sections)
)
Подробности обнаружения файла контекста
| Приоритет | Файлы | Область поиска | Заметки |
|---|---|---|---|
| 1 | .hermes.md, HERMES.md |
CWD до git root | Конфигурация проекта Hermes |
| 2 | AGENTS.md |
только CWD | Файл инструкций общего агента |
| 3 | CLAUDE.md |
только CWD | Совместимость с кодом Клода |
| 4 | .cursorrules, .cursor/rules/*.mdc |
только CWD | Совместимость курсоров |
Все контекстные файлы:
- Проверка безопасности — проверяется наличие шаблонов быстрого внедрения (невидимый юникод, «игнорировать предыдущие инструкции», попытки кражи учетных данных).
- Усечено — ограничено 20 000 символами с соотношением начала и конца 70/20 и маркером усечения.
- Фронтовая часть YAML удалена — фронтальная часть .hermes.md удалена (зарезервирована для будущих переопределений конфигурации)
Слои только для времени вызова API
Они намеренно не сохраняются как часть кэшированного системного приглашения:
ephemeral_system_prompt- предварительное заполнение сообщений
- наложения контекста сеанса на основе шлюза
- отзыв Honcho на более позднем ходу, добавленный в сообщение пользователя на текущем ходу
Такое разделение сохраняет стабильный префикс стабильным для кэширования.
Снимки памяти
Данные локальной памяти и профиля пользователя вводятся в виде замороженных снимков при запуске сеанса. В середине сеанса запись обновляет состояние диска, но не изменяет уже созданное системное приглашение до тех пор, пока не произойдет новый сеанс или принудительное перестроение.
Файлы контекста
agent/prompt_builder.py сканирует и очищает файлы контекста проекта, используя систему приоритетов — загружается только один тип (выигрывает первое совпадение):
.hermes.md/HERMES.md(переходит к корневому каталогу git)AGENTS.md(CWD при запуске; подкаталоги открываются постепенно во время сеанса черезagent/subdirectory_hints.py)CLAUDE.md(только CWD).cursorrules/.cursor/rules/*.mdc(только CWD)
SOUL.md загружается отдельно через load_soul_md() для идентификационного слота. При успешной загрузке build_context_files_prompt(skip_soul=True) предотвращает его двойное появление.
Длинные файлы усекаются перед внедрением.
Индекс навыков
Система навыков добавляет компактный индекс навыков в подсказку, когда доступны инструменты для навыков.
Почему сборка команд разделена таким образом
Архитектура намеренно оптимизирована для:
- сохранять кэширование подсказок на стороне провайдера
- избегайте мутаций истории без необходимости
- сохранять семантику памяти понятной
- позволить шлюзу/ACP/CLI добавлять контекст, не отравляя постоянное состояние приглашения