sidebar_position: 5 title: "Environments, Benchmarks & Data Generation" description: "Building RL training environments, running evaluation benchmarks, and generating SFT data with the Hermes-Agent Atropos integration" lang: ru
Среды, тесты и генерация данных
Агент Hermes включает в себя полнофункциональную среду, которая соединяет его возможности вызова инструментов со средой обучения RL Atropos . Это обеспечивает три рабочих процесса:
- Обучение RL. Обучение языковых моделей многооборотным агентным задачам с помощью GRPO.
- Бенчмарки – оценка моделей с помощью стандартизированных агентских тестов.
- Генерация данных – создание данных обучения SFT на основе развертывания агентов.
Все три имеют одно и то же ядро: класс среды, который определяет задачи, запускает цикл агента и оценивает выходные данные.
ℹ️ Info
Среды репозитория и инструменты обучения RL Описанная здесь среда Python находится в каталоге репозитория `environments/` и представляет собой API уровня реализации для интеграции Hermes/Atropos. Это отдельно от инструментов `rl_*`, ориентированных на пользователя, которые работают как поверхность оркестрации для удаленных рабочих процессов обучения RL.💡 Tip
Быстрые ссылки - **Хотите провести тесты?** Перейдите к [Доступные тесты](#available-benchmarks) - **Хотите обучаться с помощью RL?** См. [Инструменты обучения RL](/user-guide/features/rl-training) для интерфейса, управляемого агентом, или [Работающие среды](#running-environments) для выполнения вручную. - **Хотите создать новую среду?** См. раздел [Создание среды](#creating-environments).Архитектура
Система окружения построена на трехуровневой цепочке наследования:
classDiagram
class BaseEnv {
Server management
Worker scheduling
Wandb logging
CLI: serve / process / evaluate
}
class HermesAgentBaseEnv {
Terminal backend configuration
Tool resolution
Agent loop engine
ToolContext access
}
class TerminalTestEnv {
Stack testing
}
class HermesSweEnv {
SWE training
}
class TerminalBench2EvalEnv {
Benchmark evaluation
}
class TBLiteEvalEnv {
Fast benchmark
}
class YCBenchEvalEnv {
Long-horizon benchmark
}
BaseEnv <|-- HermesAgentBaseEnv
HermesAgentBaseEnv <|-- TerminalTestEnv
HermesAgentBaseEnv <|-- HermesSweEnv
HermesAgentBaseEnv <|-- TerminalBench2EvalEnv
TerminalBench2EvalEnv <|-- TBLiteEvalEnv
TerminalBench2EvalEnv <|-- YCBenchEvalEnv
BaseEnv (Атропос)
Фонд от atroposlib. Обеспечивает:
- Управление сервером — подключение к API-интерфейсам, совместимым с OpenAI (VLLM, SGLang, OpenRouter).
- Планирование работы — координация параллельного развертывания.
- Интеграция с Wandb — ведение журнала показателей и визуализация развертывания.
- Интерфейс CLI — три подкоманды: serve, process, evaluate
- Журнал оценки — evaluate_log() сохраняет результаты в формате JSON + JSONL.
HermesAgentBaseEnv
Уровень агента гермеса (environments/hermes_base_env.py). Добавляет:
- Конфигурация серверной части терминала — устанавливает TERMINAL_ENV для выполнения в изолированной программной среде (локальный, Docker, модальный, Daytona, SSH, Singularity).
- Разрешение инструмента — _resolve_tools_for_group() вызывает get_tool_definitions() гермес-агента, чтобы получить правильные схемы инструментов на основе включенных/отключенных наборов инструментов.
- Интеграция цикла агента — collect_trajectory() запускает HermesAgentLoop и оценивает результат.
- Двухэтапная работа — Этап 1 (сервер OpenAI) для eval/SFT, этап 2 (VLLM ManagedServer) для полного RL с logprobs.
- Асинхронные исправления безопасности — модальный бэкэнд обезьяны-патчей для работы внутри цикла событий Atropos.
Бетонные среды
Ваша среда наследует HermesAgentBaseEnv и реализует пять методов:
| Метод | Цель |
|---|---|
setup() |
Загрузить набор данных, инициализировать состояние |
get_next_item() |
Вернуть следующий элемент для развертывания |
format_prompt(item) |
Преобразование элемента в сообщение пользователя |
compute_reward(item, result, ctx) |
Оценка развертывания (0,0–1,0) |
evaluate() |
Логика периодической оценки |
Основные компоненты
Цикл агента
HermesAgentLoop (environments/agent_loop.py) — многооборотный агентный механизм многократного использования. Он выполняет тот же шаблон вызова инструментов, что и основной цикл Hermes-agent:
- Отправьте сообщения + схемы инструментов в API через
server.chat_completion(). - Если ответ содержит
tool_calls, отправьте каждый черезhandle_function_call(). - Добавьте результаты инструмента в беседу, вернитесь к шагу 1.
- Если
tool_callsнет, агент завершен.
Вызовы инструментов выполняются в пуле потоков (ThreadPoolExecutor(128)), чтобы асинхронные серверные части (Modal, Docker) не блокировались внутри цикла событий Atropos.
Возвращает AgentResult:
@dataclass
class AgentResult:
messages: List[Dict[str, Any]] # Full conversation history
turns_used: int # Number of LLM calls made
finished_naturally: bool # True if model stopped on its own
reasoning_per_turn: List[Optional[str]] # Extracted reasoning content
tool_errors: List[ToolError] # Errors encountered during tool dispatch
managed_state: Optional[Dict] # VLLM ManagedServer state (Phase 2)
Контекст инструмента
ToolContext (environments/tool_context.py) предоставляет функциям вознаграждения прямой доступ к той же песочнице, которая использовалась моделью во время ее развертывания. Область task_id означает, что все состояние (файлы, процессы, вкладки браузера) сохраняется.
async def compute_reward(self, item, result, ctx: ToolContext):
# Run tests in the model's terminal sandbox
test = ctx.terminal("pytest -v")
if test["exit_code"] == 0:
return 1.0
# Check if a file was created
content = ctx.read_file("/workspace/solution.py")
if content.get("content"):
return 0.5
# Download files for local verification
ctx.download_file("/remote/output.bin", "/local/output.bin")
return 0.0
Доступные методы:
| Категория | Методы |
|---|---|
| Терминал | terminal(command, timeout) |
| Файлы | read_file(path), write_file(path, content), search(query, path) |
| Трансферы | upload_file(), upload_dir(), download_file(), download_dir() |
| Интернет | web_search(query), web_extract(urls) |
| Браузер | browser_navigate(url), browser_snapshot() |
| Общий | call_tool(name, args) — аварийный люк для любого инструмента гермес-агента |
| Очистка | cleanup() — освободить все ресурсы |
Парсеры вызовов инструментов
Для Фазы 2 (VLLM ManagedServer) сервер возвращает необработанный текст без структурированных вызовов инструментов. Клиентские парсеры в environments/tool_call_parsers/ извлекают tool_calls из необработанного вывода:
from environments.tool_call_parsers import get_parser
parser = get_parser("hermes") # or "mistral", "llama3_json", "qwen", "deepseek_v3", etc.
content, tool_calls = parser.parse(raw_model_output)
Доступные парсеры: hermes, mistral, llama3_json, qwen, qwen3_coder, deepseek_v3, deepseek_v3_1, kimi_k2, longcat, glm45, glm47.
На этапе 1 (тип сервера OpenAI) парсеры не нужны — сервер самостоятельно обрабатывает вызовы инструментов.
Доступные тесты
ТерминалBench2
89 сложных задач терминала в изолированной среде Docker для каждой задачи.
| Что он тестирует | Способность однозадачного кодирования/сисадмина |
| Оценка | Двоичный код «пройден/не пройден» (проверка набора тестов) |
| Песочница | Модальные облачные песочницы (образы Docker для каждой задачи) |
| Инструменты | terminal + file |
| Задачи | 89 задач в нескольких категориях |
| Стоимость | ~$50–200 за полную оценку (параллельное выполнение) |
| Время | ~2–4 часа |
python environments/benchmarks/terminalbench_2/terminalbench2_env.py evaluate \
--config environments/benchmarks/terminalbench_2/default.yaml
# Run specific tasks
python environments/benchmarks/terminalbench_2/terminalbench2_env.py evaluate \
--config environments/benchmarks/terminalbench_2/default.yaml \
--env.task_filter fix-git,git-multibranch
Набор данных: NousResearch/terminal-bench-2 на HuggingFace.
TBLite (OpenThoughts Terminal Bench Lite)
100 задач с калибровкой сложности — более быстрый прокси для TerminalBench2.
| Что он тестирует | То же, что и TB2 (кодирование/сисадмин), калиброванные уровни сложности |
| Оценка | Двоичный код пройден/не пройден |
| Песочница | Модальные облачные песочницы |
| Инструменты | terminal + file |
| Задачи | 100 заданий: Легкое (40), Среднее (26), Сложное (26), Экстремальное (8) |
| Корреляция | r=0,911 при полном ТБ2 |
| Скорость | В 2,6–8 раз быстрее, чем TB2 |
python environments/benchmarks/tblite/tblite_env.py evaluate \
--config environments/benchmarks/tblite/default.yaml
TBLite — это тонкий подкласс TerminalBench2 — отличаются только набор данных и таймауты. Создано командой OpenThoughts Agent (Snorkel AI + Bespoke Labs). Набор данных: NousResearch/openoughts-tblite.
YC-Скамейка
Стратегический ориентир на долгосрочную перспективу — агент играет генерального директора стартапа, занимающегося искусственным интеллектом.
| Что он тестирует | Многоходовая стратегическая последовательность на протяжении сотен ходов |
| Оценка | Составной: 0.5 × survival + 0.5 × normalised_funds |
| Песочница | Локальный терминал (модальное окно не требуется) |
| Инструменты | только terminal |
| Бег | 9 по умолчанию (3 предустановки × 3 сида), последовательный |
| Стоимость | ~$50–200 за полную оценку |
| Время | ~3–6 часов |
# Install yc-bench (optional dependency)
pip install "hermes-agent[yc-bench]"
# Run evaluation
bash environments/benchmarks/yc_bench/run_eval.sh
# Or directly
python environments/benchmarks/yc_bench/yc_bench_env.py evaluate \
--config environments/benchmarks/yc_bench/default.yaml
# Quick single-preset test
python environments/benchmarks/yc_bench/yc_bench_env.py evaluate \
--config environments/benchmarks/yc_bench/default.yaml \
--env.presets '["fast_test"]' --env.seeds '[1]'
YC-Bench использует collinear-ai/yc-bench — детерминистическую симуляцию с 4 областями навыков (исследования, выводы, среда данных, обучение), системой престижа, управлением сотрудниками и финансовым давлением. В отличие от двоичной оценки каждой задачи в TB2, YC-Bench измеряет, может ли агент поддерживать последовательную стратегию при принятии сотен сложных решений.
Условия обучения
ТерминалТестЭнв
Минимальная автономная среда со встроенными задачами (без внешнего набора данных). Используется для сквозной проверки всего стека. Каждая задача просит модель создать файл по известному пути; верификатор проверяет содержимое.
# Process mode (saves rollouts to JSONL, no training server needed)
python environments/terminal_test_env/terminal_test_env.py process \
--env.data_path_to_save_groups terminal_test_output.jsonl
# Serve mode (connects to Atropos API for RL training)
python environments/terminal_test_env/terminal_test_env.py serve
HermesSweEnv
Тренировочная среда в стиле SWE. Модель получает задание на кодирование, использует для его решения терминал + файл + веб-инструменты, а функция вознаграждения запускает тесты в той же модальной песочнице.
python environments/hermes_swe_env/hermes_swe_env.py serve \
--openai.model_name YourModel \
--env.dataset_name bigcode/humanevalpack \
--env.terminal_backend modal
Запуск среды
Каждая среда представляет собой автономный скрипт Python с тремя подкомандами CLI:
evaluate — Запустить тест
Для сред только для ознакомления (тестов). Запускает все элементы, вычисляет метрики, регистрирует в wandb.
python environments/benchmarks/tblite/tblite_env.py evaluate \
--config environments/benchmarks/tblite/default.yaml \
--openai.model_name anthropic/claude-sonnet-4.6
Никакого обучающего сервера или run-api не требуется. Окружающая среда решает все.
process — Генерация данных SFT
Выполняет развертывание и сохраняет рассчитанные траектории в JSONL. Полезно для генерации обучающих данных без полного цикла RL.
python environments/terminal_test_env/terminal_test_env.py process \
--env.data_path_to_save_groups output.jsonl \
--openai.model_name anthropic/claude-sonnet-4.6
Формат вывода: каждая строка представляет собой оцененную траекторию с полной историей разговора, наградой и метаданными.
serve — Подключитесь к Atropos для обучения RL
Подключает среду к работающему API-серверу Atropos (run-api). Используется во время обучения RL в реальном времени.
# Terminal 1: Start the Atropos API
run-api
# Terminal 2: Start the environment
python environments/hermes_swe_env/hermes_swe_env.py serve \
--openai.model_name YourModel
Среда получает элементы от Atropos, запускает развертывание агентов, рассчитывает вознаграждение и отправляет рассчитанные траектории обратно для обучения.
Двухфазная работа
Этап 1: Сервер OpenAI (Eval/SFT)
Использует server.chat_completion() с параметром tools=. Сервер (VLLM, SGLang, OpenRouter, OpenAI) самостоятельно обрабатывает анализ вызовов инструментов. Возвращает объекты ChatCompletion со структурированным tool_calls.
- Использование для: оценка, генерация данных SFT, тесты, тестирование.
- Токены-заполнители создаются для конвейера Atropos (поскольку реальные идентификаторы токенов недоступны из API OpenAI).
Этап 2: VLLM ManagedServer (полная версия RL)
Использует ManagedServer для точных идентификаторов токенов + журнальных проб через /generate. Клиентский анализатор вызовов инструментов реконструирует структурированный tool_calls из необработанных выходных данных.
- Использовать для: полное обучение RL с GRPO/PPO.
- Настоящие токены, маски и журнальные пробы проходят через конвейер.
- Установите
tool_call_parserв конфигурации в соответствии с форматом вашей модели (например,"hermes","qwen","mistral")
Создание окружения
Условия обучения
from environments.hermes_base_env import HermesAgentBaseEnv, HermesAgentEnvConfig
from atroposlib.envs.server_handling.server_manager import APIServerConfig
class MyEnvConfig(HermesAgentEnvConfig):
my_custom_field: str = "default_value"
class MyEnv(HermesAgentBaseEnv):
name = "my-env"
env_config_cls = MyEnvConfig
@classmethod
def config_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",
)]
return env_config, server_configs
async def setup(self):
from datasets import load_dataset
self.dataset = list(load_dataset("my-dataset", split="train"))
self.iter = 0
async def get_next_item(self):
item = self.dataset[self.iter % len(self.dataset)]
self.iter += 1
return item
def format_prompt(self, item):
return item["instruction"]
async def compute_reward(self, item, result, ctx):
# ctx gives full tool access to the rollout's sandbox
test = ctx.terminal("pytest -v")
return 1.0 if test["exit_code"] == 0 else 0.0
async def evaluate(self, *args, **kwargs):
# Periodic evaluation during training
pass
if __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 для обеспечения устойчивости результатов к сбоям.
- Добавить очистку: обработка
KeyboardInterrupt,cleanup_all_environments(),_tool_executor.shutdown() - Выполнить с помощью
evaluateподкоманды
См. environments/benchmarks/yc_bench/yc_bench_env.py для чистой, хорошо документированной эталонной реализации.
Справочник по конфигурации
Поля HermesAgentEnvConfig
| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
enabled_toolsets |
List[str] |
None (все) |
Какие наборы инструментов Hermes включить |
disabled_toolsets |
List[str] |
None |
Наборы инструментов для фильтрации |
distribution |
str |
None |
Название дистрибутива набора вероятностных инструментов |
max_agent_turns |
int |
30 |
Максимальное количество звонков LLM на одно внедрение |
agent_temperature |
float |
1.0 |
Температура отбора проб |
system_prompt |
str |
None |
Системное сообщение для агента |
terminal_backend |
str |
"local" |
local, docker, modal, daytona, ssh, singularity |
terminal_timeout |
int |
120 |
Секунды на команду терминала |
terminal_lifetime |
int |
3600 |
Максимальное время жизни песочницы |
dataset_name |
str |
None |
Идентификатор набора данных HuggingFace |
tool_pool_size |
int |
128 |
Размер пула потоков для выполнения инструмента |
tool_call_parser |
str |
"hermes" |
Парсер для необработанных выходных данных фазы 2 |
extra_body |
Dict |
None |
Дополнительные параметры для OpenAI API (например, настройки провайдера OpenRouter) |
eval_handling |
Enum |
STOP_TRAIN |
STOP_TRAIN, LIMIT_TRAIN, NONE |
Конфигурация YAML
Среды можно настроить с помощью файлов YAML, передаваемых с помощью --config:
env:
enabled_toolsets: ["terminal", "file"]
max_agent_turns: 60
max_token_length: 32000
agent_temperature: 0.8
terminal_backend: "modal"
terminal_timeout: 300
dataset_name: "NousResearch/terminal-bench-2"
tokenizer_name: "NousResearch/Hermes-3-Llama-3.1-8B"
use_wandb: true
wandb_name: "my-benchmark"
openai:
base_url: "https://openrouter.ai/api/v1"
model_name: "anthropic/claude-sonnet-4.6"
server_type: "openai"
health_check: false
Значения YAML переопределяют значения по умолчанию config_init(). Аргументы CLI переопределяют значения YAML:
python my_env.py evaluate \
--config my_config.yaml \
--openai.model_name anthropic/claude-opus-4.6 # overrides YAML
Предварительные условия
Для всех сред
- Питон >= 3.11
atroposlib:pip install git+https://github.com/NousResearch/atropos.git- An LLM API key (OpenRouter, OpenAI, or self-hosted VLLM/SGLang)
For Modal-sandboxed benchmarks (TB2, TBLite)
- Modal account and CLI:
pip install "hermes-agent[modal]" MODAL_TOKEN_IDandMODAL_TOKEN_SECRETenvironment variables
For YC-Bench
pip install "hermes-agent[yc-bench]"(installs the yc-bench CLI + SQLAlchemy)- No Modal needed — runs with local terminal backend
For RL training
TINKER_API_KEY— API key for the Tinker training serviceWANDB_API_KEY— for Weights & Biases metrics tracking- The
tinker-atropossubmodule (attinker-atropos/в репозитории)
См. Обучение RL для ознакомления с рабочим процессом RL, управляемым агентом.
Структура каталогов
environments/
├── hermes_base_env.py # Abstract base class (HermesAgentBaseEnv)
├── agent_loop.py # Multi-turn agent engine (HermesAgentLoop)
├── tool_context.py # Per-rollout tool access for reward functions
├── patches.py # Async-safety patches for Modal backend
│
├── tool_call_parsers/ # Phase 2 client-side parsers
│ ├── hermes_parser.py # Hermes/ChatML <tool_call> format
│ ├── mistral_parser.py # Mistral [TOOL_CALLS] format
│ ├── llama_parser.py # Llama 3 JSON tool calling
│ ├── qwen_parser.py # Qwen format
│ ├── deepseek_v3_parser.py # DeepSeek V3 format
│ └── ... # + kimi_k2, longcat, glm45/47, etc.
│
├── terminal_test_env/ # Stack validation (inline tasks)
├── hermes_swe_env/ # SWE-bench training environment
│
└── benchmarks/ # Evaluation benchmarks
├── terminalbench_2/ # 89 terminal tasks, Modal sandboxes
├── tblite/ # 100 calibrated tasks (fast TB2 proxy)
└── yc_bench/ # Long-horizon strategic benchmark