Учебник 25: Выполнение кода
Учебник 25: Выполнение кода — простое для понимания руководство на основе официальной документации
Это часть официальной серии руководств Hermes Agent. Смотреть все руководства
Представьте, что вы печёте торт и вместо того, чтобы приносить ингредиенты по одному, вы записываете весь рецепт, отдаёте его помощнику, и он приносит только готовый торт. Именно это Code Execution делает для Hermes Agent — он позволяет агенту запустить полноценный Python-скрипт, который вызывает несколько инструментов внутри, а затем возвращает в разговор только конечный результат.
Что такое Code Execution?
Обычно, когда Hermes нужно выполнить поиск в интернете, прочитать файл или запустить команду, он делает это шаг за шагом — и каждый промежуточный результат попадает в его «память» (контекстное окно). Это медленно и расходует токены.
С помощью инструмента execute_code Hermes пишет Python-скрипт, который может вызывать инструменты программно — например, web_search, read_file или patch — всё за один раз. Скрипт выполняется в отдельном дочернем процессе, и только вывод print() возвращается агенту. Все промежуточные данные остаются скрытыми.
Как это работает: пошагово
Шаг 1: Агент пишет Python-скрипт
Он начинает с импорта инструментов из специального модуля:
from hermes_tools import web_search, web_extract
Шаг 2: Hermes создаёт вспомогательный модуль
Он автоматически генерирует заглушку hermes_tools.py, которая связывает ваш скрипт с основным агентом.
Шаг 3: Открывается канал связи
Hermes открывает Unix domain socket (быструю локальную «телефонную линию» между процессами) и запускает поток-слушатель.
Шаг 4: Скрипт выполняется в дочернем процессе
Каждый вызов инструмента внутри скрипта передаётся через этот сокет обратно в Hermes, который выполняет его и отправляет результат обратно.
Шаг 5: Возвращается только вывод print
Операторы print() в скрипте — это единственное, что видит LLM. Все промежуточные результаты инструментов никогда не попадают в контекстное окно — это экономит огромное количество токенов.
Когда Hermes использует это?
Агент автоматически выбирает execute_code, когда замечает:
- 3 или более вызовов инструментов с логикой между ними (например, фильтрация или сравнение)
- Пакетную обработку данных — например, поиск по многим файлам и извлечение фрагментов
- Циклы — повторение действия для множества элементов
Главный плюс? Эффективность токенов. Вместо того чтобы передавать каждый результат поиска обратно в разговор, в диалог попадает только итоговое резюме.
Практические примеры, которые можно попробовать
1. Конвейер обработки данных
from hermes_tools import search_files, read_file
import json
# Найти все конфигурационные файлы и извлечь настройки базы данных
matches = search_files("database", path=".", file_glob="*.yaml", limit=20)
configs = []
for match in matches.get("matches", []):
content = read_file(match["path"])
configs.append({"file": match["path"], "preview": content["content"][:200]})
print(json.dumps(configs, indent=2))
2. Многоэтапное веб-исследование
from hermes_tools import web_search, web_extract
import json
results = web_search("Rust async runtime comparison 2025", limit=5)
summaries = []
for r in results["data"]["web"]:
page = web_extract([r["url"]])
for p in page.get("results", []):
if p.get("content"):
summaries.append({
"title": r["title"],
"url": r["url"],
"excerpt": p["content"][:500]
})
print(json.dumps(summaries, indent=2))
3. Массовый рефакторинг файлов
from hermes_tools import search_files, read_file, patch
matches = search_files("old_api_call", path="src/", file_glob="*.py")
fixed = 0
for match in matches.get("matches", []):
result = patch(
path=match["path"],
old_string="old_api_call(",
new_string="new_api_call(",
replace_all=True
)
if "error" not in str(result):
fixed += 1
print(f"Fixed {fixed} files out of {len(matches.get('matches', []))} matches")
4. Конвейер сборки и тестирования
from hermes_tools import terminal
import json
result = terminal("cd /project && python -m pytest --tb=short -q 2>&1", timeout=120)
output = result.get("output", "")
passed = output.count(" passed")
failed = output.count(" failed")
print(json.dumps({"passed": passed, "failed": failed}, indent=2))
Ключевые моменты, которые стоит запомнить
- Доступные инструменты внутри скриптов:
web_search,web_extract,read_file,write_file,search_files,patchиterminal(только в фоновом режиме). - Возвращается только вывод
print()— всё остальное остаётся скрытым. - Отлично подходит для циклов, фильтрации и многоэтапных задач — это как дать Hermes мини-среду программирования.
Итог
Code Execution превращает Hermes из пошагового ассистента в пакетный процессор. Он пишет скрипт, запускает его и возвращает вам только конечный ответ — экономя время, токены и умственные усилия. Если вы когда-нибудь заметите, что Hermes выполняет множество повторяющихся вызовов инструментов, скорее всего, он использует эту функцию под капотом.
Далее: Урок 26 — Пакетная обработка: запуск сотен промптов параллельно.
📖 Официальная документация
Эта статья основана на официальной документации Hermes Agent :Официальные документы › user-guide/features/code-execution