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 . Это обеспечивает три рабочих процесса:

  1. Обучение RL. Обучение языковых моделей многооборотным агентным задачам с помощью GRPO.
  2. Бенчмарки – оценка моделей с помощью стандартизированных агентских тестов.
  3. Генерация данных – создание данных обучения 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:

  1. Отправьте сообщения + схемы инструментов в API через server.chat_completion().
  2. Если ответ содержит tool_calls, отправьте каждый через handle_function_call().
  3. Добавьте результаты инструмента в беседу, вернитесь к шагу 1.
  4. Если 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.

Этап 2: VLLM ManagedServer (полная версия RL)

Использует ManagedServer для точных идентификаторов токенов + журнальных проб через /generate. Клиентский анализатор вызовов инструментов реконструирует структурированный tool_calls из необработанных выходных данных.

Создание окружения

Условия обучения

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:

  1. Создать под environments/benchmarks/your-benchmark/
  2. Установить конфигурацию только для ознакомления: eval_handling=STOP_TRAIN, steps_per_eval=1, total_steps=1
  3. Методы обучения-заглушки: collect_trajectories() возвращает (None, []), score() возвращает None
  4. Реализовать rollout_and_score_eval(eval_item) — цикл агента по каждому элементу + оценка
  5. Реализовать evaluate() — координирует все прогоны, вычисляет совокупные показатели.
  6. Добавьте потоковый JSONL для обеспечения устойчивости результатов к сбоям.
  7. Добавить очистку: обработка KeyboardInterrupt, cleanup_all_environments(), _tool_executor.shutdown()
  8. Выполнить с помощью 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

Предварительные условия

Для всех сред

For Modal-sandboxed benchmarks (TB2, TBLite)

For YC-Bench

For RL training

См. Обучение 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