Hermes Agent включает полноценный фреймворк окружений, который соединяет его возможности вызова инструментов с Atropos — фреймворком для RL-обучения. Это обеспечивает три рабочих процесса:
RL-обучение — обучение языковых моделей на multi-turn агентных задачах с GRPO
Бенчмарки — оценка моделей на стандартизированных агентных бенчмарках
Генерация данных — создание SFT-данных для обучения из агентных прогонов
Все три используют одну и ту же основу: класс окружения (environment), который определяет задачи, запускает агентный цикл и оценивает результат.
info Репозиторий окружений vs инструменты RL-обучения
Документируемый здесь фреймворк окружений на Python находится в директории environments/ репозитория и представляет собой API уровня реализации для интеграции Hermes/Atropos. Это отделено от пользовательских инструментов rl_*, которые работают как оркестрационная обёртка для удалённых рабочих процессов RL-обучения.
Интеграция с Wandb — логирование метрик и визуализация прогонов
Интерфейс CLI — три подкоманды: serve, process, evaluate
Логирование оценок — evaluate_log() сохраняет результаты в JSON + JSONL
HermesAgentBaseEnv
Уровень hermes-agent (environments/hermes_base_env.py). Добавляет:
Конфигурация терминального бэкенда — устанавливает TERMINAL_ENV для изолированного выполнения (local, Docker, Modal, Daytona, SSH, Singularity)
Разрешение инструментов — _resolve_tools_for_group() вызывает get_tool_definitions() из hermes-agent для получения правильных схем инструментов на основе включённых/отключённых наборов инструментов
Интеграция агентного цикла — collect_trajectory() запускает HermesAgentLoop и оценивает результат
Двухфазная работа — Фаза 1 (OpenAI server) для eval/SFT, Фаза 2 (VLLM ManagedServer) для полноценного RL с logprobs
Патчи для async-безопасности — monkey-patches для Modal бэкенда для работы внутри event loop Atropos
Конкретные окружения
Ваше окружение наследуется от HermesAgentBaseEnv и реализует пять методов:
Метод
Назначение
setup()
Загрузка датасета, инициализация состояния
get_next_item()
Возвращает следующий элемент для прогона
format_prompt(item)
Преобразует элемент в сообщение пользователя
compute_reward(item, result, ctx)
Оценивает прогон (0.0–1.0)
evaluate()
Логика периодической оценки
Основные компоненты
Агентный цикл
HermesAgentLoop (environments/agent_loop.py) — это переиспользуемый multi-turn агентный движок. Он выполняет тот же шаблон вызова инструментов, что и основной цикл hermes-agent:
Отправляет сообщения + схемы инструментов в API через server.chat_completion()
Если ответ содержит tool_calls, выполняет каждый через handle_function_call()
Добавляет результаты вызова инструментов в разговор, возвращается к шагу 1
Если tool_calls нет, агент завершает работу
Вызовы инструментов выполняются в пуле потоков (ThreadPoolExecutor(128)), чтобы async-бэкенды (Modal, Docker) не блокировались внутри event loop Atropos.
Возвращает AgentResult:
@dataclassclassAgentResult:messages:List[Dict[str,Any]]# Полная история разговораturns_used:int# Количество сделанных вызовов LLMfinished_naturally:bool# True, если модель остановилась самаreasoning_per_turn:List[Optional[str]]# Извлечённое содержимое рассужденийtool_errors:List[ToolError]# Ошибки, возникшие при выполнении инструментовmanaged_state:Optional[Dict]# Состояние VLLM ManagedServer (Фаза 2)
Контекст инструментов
ToolContext (environments/tool_context.py) даёт функциям вознаграждения прямой доступ к той же изолированной среде, которую модель использовала во время своего прогона. Область видимости task_id гарантирует сохранение всего состояния (файлы, процессы, вкладки браузера).
asyncdefcompute_reward(self,item,result,ctx:ToolContext):# Запуск тестов в терминальной изолированной среде моделиtest=ctx.terminal("pytest -v")iftest["exit_code"]==0:return1.0# Проверка, был ли создан файлcontent=ctx.read_file("/workspace/solution.py")ifcontent.get("content"):return0.5# Скачивание файлов для локальной проверкиctx.download_file("/remote/output.bin","/local/output.bin")return0.0
call_tool(name, args) — запасной выход для любого инструмента hermes-agent
Очистка
cleanup() — освобождение всех ресурсов
Парсеры вызовов инструментов
Для Фазы 2 (VLLM ManagedServer) сервер возвращает сырой текст без структурированных вызовов инструментов. Клиентские парсеры в environments/tool_call_parsers/ извлекают tool_calls из сырого вывода:
fromenvironments.tool_call_parsersimportget_parserparser=get_parser("hermes")# или "mistral", "llama3_json", "qwen", "deepseek_v3", etc.content,tool_calls=parser.parse(raw_model_output)
TBLite — это тонкий подкласс TerminalBench2, отличающийся только датасетом и таймаутами. Создан командой OpenThoughts Agent (Snorkel AI + Bespoke Labs). Датасет: NousResearch/openthoughts-tblite.
YC-Bench
Долгосрочный стратегический бенчмарк — агент играет роль CEO AI-стартапа.
Что тестирует
Многошаговую стратегическую согласованность на сотнях шагов
9 по умолчанию (3 пресета × 3 сида), последовательно
Стоимость
~$50–200 за полный eval
Время
~3–6 часов
# Установка yc-bench (опциональная зависимость)
pipinstall"hermes-agent[yc-bench]"# Запуск оценки
bashenvironments/benchmarks/yc_bench/run_eval.sh
# Или напрямую
pythonenvironments/benchmarks/yc_bench/yc_bench_env.pyevaluate\\--configenvironments/benchmarks/yc_bench/default.yaml
# Быстрый тест с одним пресетом
pythonenvironments/benchmarks/yc_bench/yc_bench_env.pyevaluate\\--configenvironments/benchmarks/yc_bench/default.yaml\\--env.presets'["fast_test"]'--env.seeds'[1]'
YC-Bench использует collinear-ai/yc-bench — детерминированную симуляцию с 4 доменами навыков (research, inference, data_environment, training), системой престижа, управлением сотрудниками и финансовым давлением. В отличие от бинарной оценки TB2 для каждой задачи, YC-Bench измеряет, способен ли агент поддерживать согласованную стратегию на протяжении сотен взаимосвязанных решений.
Окружения для обучения
TerminalTestEnv
Минимальное самодостаточное окружение со встроенными задачами (без внешнего датасета). Используется для сквозной проверки всего стека. Каждая задача просит модель создать файл по известному пути; верификатор проверяет содержимое.
# Режим обработки (сохраняет прогоны в JSONL, сервер обучения не требуется)
pythonenvironments/terminal_test_env/terminal_test_env.pyprocess\\--env.data_path_to_save_groupsterminal_test_output.jsonl
# Режим сервера (подключается к Atropos API для RL-обучения)
pythonenvironments/terminal_test_env/terminal_test_env.pyserve
HermesSweEnv
Окружение для обучения в стиле SWE-bench. Модель получает задачу по программированию, использует инструменты terminal + file + web для её решения, а функция вознаграждения запускает тесты в той же Modal-изолированной среде.
Окружение получает элементы от Atropos, запускает агентные прогоны, вычисляет вознаграждения и отправляет оценённые траектории обратно для обучения.
Двухфазная работа
Фаза 1: OpenAI Server (Eval / SFT)
Использует server.chat_completion() с параметром tools=. Сервер (VLLM, SGLang, OpenRouter, OpenAI) обрабатывает парсинг вызовов инструментов нативно. Возвращает объекты ChatCompletion со структурированными tool_calls.
Используется для: оценки, генерации SFT-данных, бенчмарков, тестирования
Плейсхолдер-токены создаются для конвейера Atropos (поскольку настоящие ID токенов недоступны через OpenAI API)
Фаза 2: VLLM ManagedServer (Полноценное RL)
Использует ManagedServer для точных ID токенов + logprobs через /generate. Клиентский парсер вызовов инструментов восстанавливает структурированные tool_calls из сырого вывода.
Используется для: полноценного RL-обучения с GRPO/PPO
Настоящие токены, маски и logprobs проходят через конвейер
Установите tool_call_parser в конфигурации в соответствии с форматом вашей модели (например, "hermes", "qwen", "mistral")
Создание окружений
Окружение для обучения
fromenvironments.hermes_base_envimportHermesAgentBaseEnv,HermesAgentEnvConfigfromatroposlib.envs.server_handling.server_managerimportAPIServerConfigclassMyEnvConfig(HermesAgentEnvConfig):my_custom_field:str="default_value"classMyEnv(HermesAgentBaseEnv):name="my-env"env_config_cls=MyEnvConfig@classmethoddefconfig_init(cls):env_config=MyEnvConfig(enabled_toolsets=["terminal","file"],terminal_backend="modal",max_agent_turns=30,)server_configs=[APIServerConfig(base_url="https://openrouter.ai/api/v1",model_name="anthropic/claude-sonnet-4.6",server_type="openai",)]returnenv_config,server_configsasyncdefsetup(self):fromdatasetsimportload_datasetself.dataset=list(load_dataset("my-dataset",split="train"))self.iter=0asyncdefget_next_item(self):item=self.dataset[self.iter%len(self.dataset)]self.iter+=1returnitemdefformat_prompt(self,item):returnitem["instruction"]asyncdefcompute_reward(self,item,result,ctx):# ctx предоставляет полный доступ к инструментам в изолированной среде прогонаtest=ctx.terminal("pytest -v")return1.0iftest["exit_code"]==0else0.0asyncdefevaluate(self,*args,**kwargs):# Периодическая оценка во время обученияpassif__name__=="__main__":MyEnv.cli()
Бенчмарк только для оценки
Для бенчмарков следуйте шаблону, используемому TerminalBench2, TBLite и YC-Bench:
Создайте вenvironments/benchmarks/your-benchmark/
Установите конфиг только для оценки: eval_handling=STOP_TRAIN, steps_per_eval=1, total_steps=1
Заглушите методы обучения: collect_trajectories() возвращает (None, []), score() возвращает None
Реализуйтеrollout_and_score_eval(eval_item) — агентный цикл + оценка для каждого элемента
Реализуйтеevaluate() — оркестрирует все прогоны, вычисляет агрегированные метрики
Добавьте потоковый JSONL для устойчивого к сбоям сохранения результатов