Chuyển tới nội dung chính

Môi trường, Điểm chuẩn & Tạo dữ liệu

Hermes Agent bao gồm một khung môi trường đầy đủ kết nối khả năng gọi công cụ của nó với khung đào tạo RL Atropos. Điều này cho phép ba quy trình công việc:

  1. Đào tạo RL — Đào tạo các mô hình ngôn ngữ về các tác vụ tác nhân nhiều lượt với GRPO
  2. Điểm chuẩn — Đánh giá các mô hình dựa trên điểm chuẩn tác nhân được tiêu chuẩn hóa
  3. Tạo dữ liệu — Tạo dữ liệu đào tạo SFT từ quá trình triển khai đại lý

Cả ba đều có chung một lõi: một lớp môi trường xác định các nhiệm vụ, chạy vòng lặp tác nhân và chấm điểm đầu ra.

Repo environments vs RL training tools

Khung môi trường Python được ghi lại ở đây nằm trong thư mục environments/ của repo và là API cấp triển khai để tích hợp Hermes/Atropos. Điều này tách biệt với các công cụ rl_* giao diện người dùng, hoạt động như một bề mặt điều phối cho quy trình đào tạo RL từ xa.

Quick Links

Ngành kiến ​​​​trúc

Hệ thống môi trường được xây dựng trên chuỗi kế thừa ba lớp:

BaseEnv (Atropos)

Nền tảng từ atroposlib. Cung cấp:

  • Quản lý máy chủ — kết nối với các API tương thích với OpenAI (VLLM, SGLang, OpenRouter)
  • Lập kế hoạch cho nhân viên — phối hợp triển khai song song
  • Tích hợp Wandb — hiển thị nhật ký số liệu và triển khai
  • Giao diện CLI — ba lệnh phụ: serve, process, evaluate
  • Ghi nhật ký đánh giáevaluate_log() lưu kết quả vào JSON + JSONL

HermesAgentBaseEnv

Lớp tác nhân hermes (environments/hermes_base_env.py). Thêm:

  • Cấu hình phụ trợ thiết bị đầu cuối — đặt TERMINAL_ENV để thực thi trong hộp cát (cục bộ, Docker, Modal, Daytona, SSH, Singularity)
  • Độ phân giải công cụ_resolve_tools_for_group() gọi get_tool_def địnhs() của hermes-agent để có được lược đồ công cụ phù hợp dựa trên bộ công cụ đã bật/tắt
  • Tích hợp vòng lặp tác nhâncollect_trajectory() chạy HermesAgentLoop và ghi kết quả
  • Hoạt động hai giai đoạn — Giai đoạn 1 (máy chủ OpenAI) cho eval/SFT, Giai đoạn 2 (VLLM ManagedServer) cho RL đầy đủ với logprobs
  • Bản vá an toàn không đồng bộ — bản vá khỉ Phần phụ trợ phương thức hoạt động bên trong vòng lặp sự kiện của Atropos

Môi trường cụ thể

Môi trường của bạn kế thừa từ HermesAgentBaseEnv và triển khai năm phương thức:

Phương phápMục đích
thiết lập()Tải tập dữ liệu, trạng thái khởi tạo
get_next_item()Trả lại mục tiếp theo để triển khai
format_prompt(item)Chuyển đổi một mục thành tin nhắn của người dùng
compute_reward(item, result, ctx)Cho điểm khi triển khai (0,0–1,0)
đánh giá()Logic đánh giá định kỳ

Thành phần cốt lõi

Vòng lặp đại lý

HermesAgentLoop (environments/agent_loop.py) là công cụ tác nhân nhiều lượt có thể tái sử dụng. Nó chạy cùng một kiểu gọi công cụ như vòng lặp chính của Hermes-agent:

  1. Gửi tin nhắn + lược đồ công cụ tới API thông qua server.chat_completion()
  2. Nếu phản hồi chứa tool_calls, hãy gửi từng thông qua handle_function_call()
  3. Nối kết quả của công cụ vào cuộc trò chuyện, quay lại bước 1
  4. Nếu không có tool_calls, tác nhân đã hoàn tất

Các lệnh gọi công cụ được thực thi trong nhóm luồng (ThreadPoolExecutor(128)) để các chương trình phụ trợ không đồng bộ (Modal, Docker) không bị bế tắc bên trong vòng lặp sự kiện của Atropos.

Trả về một 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)

Bối cảnh công cụ

ToolContext (environments/tool_context.py) cung cấp cho các hàm phần thưởng quyền truy cập trực tiếp vào cùng một hộp cát mà mô hình đã sử dụng trong quá trình triển khai. Phạm vi task_id có nghĩa là tất cả trạng thái (tệp, quy trình, tab trình duyệt) đều được giữ nguyên.

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

Các phương pháp có sẵn:

Danh mụcPhương pháp
Thiết bị đầu cuốiterminal(lệnh, hết thời gian)
Tệpread_file(path), write_file(path, content), search(query, path)
Chuyển khoảnupload_file(), upload_dir(), download_file(), download_dir()
Webweb_search(truy vấn), web_extract(urls)
Trình duyệtbrowser_navigate(url), browser_snapshot()
Chungcall_tool(name, args) — lối thoát cho bất kỳ công cụ tác nhân Hermes nào
Dọn dẹpdọn dẹp() — giải phóng tất cả tài nguyên

Trình phân tích cuộc gọi công cụ

Đối với Giai đoạn 2 (Máy chủ được quản lý VLLM), máy chủ trả về văn bản thô mà không có lệnh gọi công cụ có cấu trúc. Trình phân tích cú pháp phía máy khách trong environments/tool_call_parsers/ trích xuất tool_calls từ đầu ra thô:

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)

Các trình phân tích cú pháp có sẵn: hermes, mistral, llama3_json, qwen, qwen3_code, deepseek_v3, deepseek_v3_1, kimi_k2, longcat, glm45, glm47.

Trong Giai đoạn 1 (loại máy chủ OpenAI), không cần đến trình phân tích cú pháp - máy chủ xử lý việc phân tích cú pháp cuộc gọi công cụ một cách tự nhiên.

Điểm chuẩn có sẵn

TerminalBench2

89 nhiệm vụ đầu cuối đầy thử thách với môi trường hộp cát Docker theo từng nhiệm vụ.

Nó kiểm tra những gìKhả năng mã hóa/quản trị hệ thống đơn nhiệm
Tính điểmĐạt/không đạt nhị phân (xác minh bộ kiểm tra)
Hộp cátHộp cát đám mây phương thức (hình ảnh Docker cho mỗi tác vụ)
Công cụthiết bị đầu cuối + tập tin
Nhiệm vụ89 nhiệm vụ trên nhiều danh mục
Chi phí~$50–200 cho đánh giá đầy đủ (thực thi song song)
Thời gian~2–4 giờ
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

Tập dữ liệu: NousResearch/terminal-bench-2 trên HuggingFace.

TBLite (OpenThoughts Terminal Bench Lite)

100 tác vụ được hiệu chỉnh theo độ khó — proxy nhanh hơn cho TerminalBench2.

Nó kiểm tra những gìTương tự như TB2 (viết mã/sysadmin), mức độ khó được hiệu chỉnh
Tính điểmĐạt/không đạt nhị phân
Hộp cátHộp cát đám mây phương thức
Công cụthiết bị đầu cuối + tập tin
Nhiệm vụ100 nhiệm vụ: Dễ (40), Trung bình (26), Khó (26), Cực (8)
Tương quanr=0,911 với đầy đủ TB2
Tốc độNhanh hơn 2,6–8× so với TB2
python environments/benchmarks/tblite/tblite_env.py evaluate \
--config environments/benchmarks/tblite/default.yaml

TBLite là một lớp con mỏng của TerminalBench2 — chỉ có tập dữ liệu và thời gian chờ là khác nhau. Được tạo bởi nhóm Đại lý OpenThoughts (Snorkel AI + Bespoke Labs). Tập dữ liệu: NousResearch/openthoughts-tblite.

###YC-Băng ghế dự bị

Tiêu chuẩn chiến lược dài hạn — người đại diện đóng vai CEO của một công ty khởi nghiệp AI.

Nó kiểm tra những gìSự gắn kết chiến lược nhiều lượt qua hàng trăm lượt
Tính điểmTổng hợp: 0,5 × tỷ lệ sống sót + 0,5 × quỹ bình thường
Hộp cátThiết bị đầu cuối cục bộ (không cần Modal)
Công cụchỉ thiết bị đầu cuối
Chạy9 mặc định (3 cài đặt trước × 3 hạt), tuần tự
Chi phí~$50–200 cho đánh giá đầy đủ
Thời gian~3–6 giờ
# 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 sử dụng colliner-ai/yc-bench — một mô phỏng xác định với 4 lĩnh vực kỹ năng (nghiên cứu, suy luận, môi trường dữ liệu, đào tạo), hệ thống uy tín, quản lý nhân viên và áp lực tài chính. Không giống như tính năng chấm điểm nhị phân cho mỗi nhiệm vụ của TB2, YC-Bench đo lường xem liệu một tác nhân có thể duy trì chiến lược mạch lạc trong hàng trăm quyết định gộp hay không.

Môi trường đào tạo

TerminalTestEnv

Một môi trường khép kín tối thiểu với các tác vụ nội tuyến (không có tập dữ liệu bên ngoài). Được sử dụng để xác thực toàn bộ ngăn xếp từ đầu đến cuối. Mỗi tác vụ yêu cầu mô hình tạo một tệp tại một đường dẫn đã biết; người xác minh kiểm tra nội dung.

# 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

Môi trường đào tạo theo phong cách băng ghế dự bị SWE. Mô hình nhận một nhiệm vụ mã hóa, sử dụng thiết bị đầu cuối + tệp + công cụ web để giải quyết nó và chức năng phần thưởng chạy thử nghiệm trong cùng một hộp cát Modal.

python environments/hermes_swe_env/hermes_swe_env.py serve \
--openai.model_name YourModel \
--env.dataset_name bigcode/humanevalpack \
--env.terminal_backend modal

Môi trường chạy

Mỗi môi trường là một tập lệnh Python độc lập với ba lệnh con CLI:

đánh giá — Chạy điểm chuẩn

Dành cho môi trường chỉ đánh giá (điểm chuẩn). Chạy tất cả các mục, tính toán số liệu, ghi nhật ký vào Wanb.

python environments/benchmarks/tblite/tblite_env.py evaluate \
--config environments/benchmarks/tblite/default.yaml \
--openai.model_name anthropic/claude-sonnet-4.6

Không cần máy chủ đào tạo hoặc run-api. Môi trường xử lý mọi thứ.

process — Tạo dữ liệu SFT

Chạy các đợt triển khai và lưu quỹ đạo đã ghi điểm vào JSONL. Hữu ích khi tạo dữ liệu huấn luyện mà không có vòng lặp RL đầy đủ.

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

Định dạng đầu ra: mỗi dòng là một quỹ đạo được ghi điểm với đầy đủ lịch sử cuộc trò chuyện, phần thưởng và siêu dữ liệu.

phục vụ — Kết nối với Atropos để đào tạo RL

Kết nối môi trường với máy chủ API Atropos đang chạy (run-api). Được sử dụng trong quá trình đào tạo RL trực tiếp.

# 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

Môi trường nhận vật phẩm từ Atropos, triển khai đại lý, tính toán phần thưởng và gửi lại quỹ đạo đã ghi điểm để đào tạo.

Vận hành hai pha

Giai đoạn 1: OpenAI Server (Eval/SFT)

Sử dụng server.chat_completion() với tham số tools=. Máy chủ (VLLM, SGLang, OpenRouter, OpenAI) xử lý nguyên bản việc phân tích cú pháp lệnh gọi công cụ. Trả về đối tượng ChatCompletion có cấu trúc tool_calls.

  • Sử dụng cho: đánh giá, tạo dữ liệu SFT, điểm chuẩn, thử nghiệm
  • Mã thông báo giữ chỗ được tạo cho quy trình Atropos (vì ID mã thông báo thực không có sẵn từ API OpenAI)

Giai đoạn 2: Máy chủ quản lý VLLM (Full RL)

Sử dụng ManagedServer để có ID mã thông báo chính xác + logprobs thông qua /generate. Trình phân tích cú pháp lệnh gọi công cụ phía máy khách sẽ xây dựng lại tool_calls có cấu trúc từ đầu ra thô.

  • Sử dụng cho: đào tạo RL đầy đủ với GRPO/PPO
  • Mã thông báo thực, mặt nạ và logprobs chảy qua đường ống
  • Đặt tool_call_parser trong config để khớp với định dạng mô hình của bạn (ví dụ: "hermes", "qwen", "mistral")

Tạo môi trường

Môi trường đào tạo

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()

Điểm chuẩn chỉ dành cho đánh giá

Để biết điểm chuẩn, hãy làm theo mẫu được TerminalBench2, TBLite và YC-Bench sử dụng:

  1. Tạo trong môi trường/điểm chuẩn/điểm chuẩn của bạn/
  2. Đặt cấu hình chỉ eval: eval_handling=STOP_TRAIN, steps_per_eval=1, total_steps=1
  3. Phương pháp đào tạo sơ khai: collect_trajectories() trả về (None, []), score() trả về None
  4. Triển khai rollout_and_score_eval(eval_item) — vòng lặp tác nhân cho mỗi mục + tính điểm
  5. Triển khai evaluate() — sắp xếp tất cả các lần chạy, tính toán số liệu tổng hợp
  6. Thêm JSONL phát trực tuyến để duy trì kết quả an toàn khi xảy ra sự cố
  7. Thêm tính năng dọn dẹp: Xử lý KeyboardInterrupt, cleanup_all_environments(), _tool_executor.shutdown()
  8. Chạy với lệnh phụ evaluate

Xem environments/benchmarks/yc_bench/yc_bench_env.py để biết cách triển khai tham chiếu rõ ràng, được ghi chép đầy đủ.

Tham khảo cấu hình

Trường HermesAgentEnvConfig

Lĩnh vựcLoạiMặc địnhMô tả
enable_toolsetsDanh sách[str]Không có (tất cả)Những bộ công cụ Hermes nào được kích hoạt
disabled_toolsetsDanh sách[str]Không cóBộ công cụ để lọc
phân phốistrKhông cóTên phân phối bộ công cụ xác suất
max_agent_turnsint30Cuộc gọi LLM tối đa mỗi lần triển khai
tác nhân_nhiệt độphao1.0Nhiệt độ lấy mẫu
system_promptstrKhông cóTin nhắn hệ thống dành cho đại lý
terminal_backendstr"địa phương"local, docker, modal, daytona, ssh, singularity
terminal_timeoutint120Giây cho mỗi lệnh đầu cuối
terminal_lifetimeint3600Tuổi thọ hộp cát tối đa
tên_tập dữ liệustrKhông cóMã định danh tập dữ liệu HuggingFace
tool_pool_sizeint128Kích thước nhóm luồng để thực thi công cụ
tool_call_parserstr"hermes"Trình phân tích cú pháp cho đầu ra thô của Giai đoạn 2
ngoại_thểDictKhông cóCác thông số bổ sung cho API OpenAI (ví dụ: prefs của nhà cung cấp OpenRouter)
đánh giá_xử lýEnumSTOP_TRAINSTOP_TRAIN, LIMIT_TRAIN, NONE

Cấu hình YAML

Môi trường có thể được định cấu hình thông qua các tệp YAML được truyền bằng --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

Giá trị YAML ghi đè mặc định config_init(). Đối số CLI ghi đè giá trị YAML:

python my_env.py evaluate \
--config my_config.yaml \
--openai.model_name anthropic/claude-opus-4.6 # overrides YAML

Điều kiện tiên quyết

Dành cho mọi môi trường

  • Python >= 3.11
  • atroposlib: pip cài đặt git+https://github.com/NousResearch/atropos.git
  • Khóa API LLM (OpenRouter, OpenAI hoặc VLLM/SGLang tự lưu trữ)

Dành cho điểm chuẩn theo phương thức hộp cát (TB2, TBLite)

  • Tài khoản Modal và CLI: pip install "hermes-agent[modal]"
  • Biến môi trường MODAL_TOKEN_IDMODAL_TOKEN_SECRET

Dành cho ghế YC

  • pip install "hermes-agent[yc-bench]" (cài đặt yc-bench CLI + SQLAlchemy)
  • Không cần Modal - chạy với phụ trợ thiết bị đầu cuối cục bộ

Để đào tạo RL

  • TINKER_API_KEY — Khóa API cho dịch vụ đào tạo Tinker
  • WANDB_API_KEY — để theo dõi số liệu Trọng số & Xu hướng
  • Module con tinker-atropos (tại tinker-atropos/ trong repo)

Xem Đào tạo RL để biết quy trình làm việc RL do tác nhân điều khiển.

Cấu trúc thư mục

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