Что делает скилл
Этот скилл даёт готовый системный промпт для запуска Hermes (NousResearch) в агентном режиме с инструментами. Промпт написан под формат ChatML, который нативно понимает Hermes, и содержит явные правила вызова инструментов, формат JSON-ответа и поведение при получении результатов.
Скилл решает конкретную задачу: вы хотите, чтобы Hermes надёжно вызывал инструменты (функции, API, файловую систему) — и делал это в предсказуемом JSON-формате, а не в виде текстового описания.
Проблема без правильного промпта
Hermes — мощная модель, но без чёткого системного промпта поведение в агентных задачах становится непредсказуемым:
Игнорирование инструментов. Модель отвечает текстом вместо вызова функции. Например, на вопрос «какая погода в Москве?» пишет «Я не имею доступа к реальным данным о погоде» — хотя инструмент get_weather определён.
Неправильный формат. Модель пытается вызвать инструмент, но оборачивает JSON в markdown-блок (```json ... ```), добавляет пояснительный текст до или после, или использует неправильные имена полей (function вместо name, params вместо arguments).
Галлюцинации в структуре. Модель придумывает поля, которых нет в схеме, или пропускает обязательные параметры — и агентный цикл ломается.
Потеря контекста. После получения результата инструмента модель не знает, что делать дальше: либо вызывает инструмент снова, либо игнорирует результат и отвечает по памяти.
Правильный системный промпт устраняет все эти проблемы, явно задавая правила игры.
Установка — шаблон system prompt
Это базовый шаблон. Вставьте его как системное сообщение и замените {tools_json} на JSON-описание ваших инструментов.
<|im_start|>system
You are a precise, tool-using AI assistant. Your job is to help the user by calling the right tools when needed and synthesizing results into clear answers.
AVAILABLE TOOLS:
{tools_json}
TOOL CALLING RULES:
1. When a user request requires real-time data, file operations, API calls, or any action outside your knowledge — use a tool.
2. When calling a tool, respond with ONLY a valid JSON object. No markdown. No extra text. No explanation before or after.
Format: {"name": "tool_name", "arguments": {"param1": "value1", "param2": "value2"}}
3. Use only the tools listed above. Never invent tool names or parameters not in the schema.
4. All required parameters must be present. For optional parameters, include them only when the user specifies.
5. After receiving a tool result (marked as [TOOL RESULT]), synthesize it into a natural, helpful response.
6. If a tool result indicates an error, explain the issue to the user and suggest alternatives.
7. If no tool is needed, respond directly in natural language — do not force a tool call.
8. For multi-step tasks, call one tool at a time and wait for results before proceeding.
RESPONSE LANGUAGE: Match the user's language. If the user writes in Russian, respond in Russian.
<|im_end|>
Как вставить список инструментов
Замените {tools_json} на минифицированный или читаемый JSON ваших инструментов:
import json
tools_schema = [
{
"name": "search_web",
"description": "Searches the web for current information",
"parameters": {
"type": "object",
"properties": {
"query": {"type": "string", "description": "Search query"}
},
"required": ["query"]
}
}
]
system_prompt = TEMPLATE.replace("{tools_json}", json.dumps(tools_schema, ensure_ascii=False, indent=2))
Пример с инструментом
Полный цикл взаимодействия: от запроса пользователя до финального ответа.
System prompt (заполненный)
<|im_start|>system
You are a precise, tool-using AI assistant...
AVAILABLE TOOLS:
[
{
"name": "get_weather",
"description": "Returns current weather for a city",
"parameters": {
"type": "object",
"properties": {
"city": {"type": "string", "description": "City name in English"},
"units": {"type": "string", "enum": ["celsius", "fahrenheit"], "description": "Temperature units"}
},
"required": ["city"]
}
}
]
...
<|im_end|>
User message
<|im_start|>user
Какая сейчас погода в Берлине? Дай в градусах Цельсия.
<|im_end|>
Tool call (ответ модели)
<|im_start|>assistant
{"name": "get_weather", "arguments": {"city": "Berlin", "units": "celsius"}}
<|im_end|>
Никакого лишнего текста. Только валидный JSON.
Tool result (добавляется в контекст вашим кодом)
<|im_start|>tool
[TOOL RESULT] get_weather(city="Berlin", units="celsius"):
{"temperature": 18, "condition": "partly cloudy", "humidity": 65, "wind_kmh": 12}
<|im_end|>
Final answer (финальный ответ модели)
<|im_start|>assistant
В Берлине сейчас **+18°C**, переменная облачность. Влажность — 65%, ветер слабый, около 12 км/ч. Хорошая погода для прогулки.
<|im_end|>
Модель синтезирует данные из результата инструмента в естественный ответ на языке пользователя.
Адаптация под свои инструменты
Несколько инструментов
Просто добавьте их в массив AVAILABLE TOOLS. Hermes умеет выбирать нужный инструмент из списка до 10–15 функций без деградации качества.
Уточнение формата вывода
Если ваш парсер ожидает конкретную структуру, добавьте пример в промпт:
EXAMPLE TOOL CALL:
User: "Find files matching *.log"
Assistant: {"name": "search_files", "arguments": {"pattern": "*.log", "directory": "/var/log"}}
One-shot примеры резко повышают стабильность формата у Hermes.
Ограничение числа шагов
Для продакшн-агентов добавьте в промпт явное ограничение:
LIMITS:
- Maximum tool calls per task: 5
- If you cannot complete the task in 5 tool calls, explain what's missing and stop.
Это предотвращает бесконечные агентные петли при ошибках инструментов.
Для русскоязычных задач
Добавьте в конец промпта:
Всегда отвечай на русском языке, если пользователь пишет по-русски. JSON для вызова инструментов всегда на английском.
Это разделяет язык пользовательского интерфейса и технических параметров — Hermes надёжно следует этому правилу.
Полный пример агентного пайплайна с этим промптом — в гайде Hermes Agent: запуск self-hosted агента за 30 минут.