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:
- Đà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
- Đ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
- 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.
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.
- Bạn muốn chạy điểm chuẩn? Chuyển đến Điểm chuẩn có sẵn
- Bạn muốn đào tạo với RL? Xem Công cụ đào tạo RL để biết giao diện do tác nhân điều khiển hoặc Môi trường chạy để thực hiện thủ công
- Bạn muốn tạo môi trường mới? Xem Tạo môi trường
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ọiget_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ân —
collect_trajectory()chạyHermesAgentLoopvà 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áp | Mụ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:
- Gửi tin nhắn + lược đồ công cụ tới API thông qua
server.chat_completion() - Nếu phản hồi chứa
tool_calls, hãy gửi từng thông quahandle_function_call() - Nối kết quả của công cụ vào cuộc trò chuyện, quay lại bước 1
- 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ục | Phương pháp |
|---|---|
| Thiết bị đầu cuối | terminal(lệnh, hết thời gian) |
| Tệp | read_file(path), write_file(path, content), search(query, path) |
| Chuyển khoản | upload_file(), upload_dir(), download_file(), download_dir() |
| Web | web_search(truy vấn), web_extract(urls) |
| Trình duyệt | browser_navigate(url), browser_snapshot() |
| Chung | call_tool(name, args) — lối thoát cho bất kỳ công cụ tác nhân Hermes nào |
| Dọn dẹp | dọ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át | Hộ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át | Hộ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 quan | r=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ểm | Tổng hợp: 0,5 × tỷ lệ sống sót + 0,5 × quỹ bình thường |
| Hộp cát | Thiết bị đầu cuối cục bộ (không cần Modal) |
| Công cụ | chỉ thiết bị đầu cuối |
| Chạy | 9 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_parsertrong 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:
- Tạo trong
môi trường/điểm chuẩn/điểm chuẩn của bạn/ - Đặt cấu hình chỉ eval:
eval_handling=STOP_TRAIN,steps_per_eval=1,total_steps=1 - Phương pháp đào tạo sơ khai:
collect_trajectories()trả về(None, []),score()trả vềNone - 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 - 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 - Thêm JSONL phát trực tuyến để duy trì kết quả an toàn khi xảy ra sự cố
- Thêm tính năng dọn dẹp: Xử lý
KeyboardInterrupt,cleanup_all_environments(),_tool_executor.shutdown() - 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ực | Loại | Mặc định | Mô tả |
|---|---|---|---|
enable_toolsets | Danh sách[str] | Không có (tất cả) | Những bộ công cụ Hermes nào được kích hoạt |
disabled_toolsets | Danh sách[str] | Không có | Bộ công cụ để lọc |
phân phối | str | Không có | Tên phân phối bộ công cụ xác suất |
max_agent_turns | int | 30 | Cuộc gọi LLM tối đa mỗi lần triển khai |
tác nhân_nhiệt độ | phao | 1.0 | Nhiệt độ lấy mẫu |
system_prompt | str | Không có | Tin nhắn hệ thống dành cho đại lý |
terminal_backend | str | "địa phương" | local, docker, modal, daytona, ssh, singularity |
terminal_timeout | int | 120 | Giây cho mỗi lệnh đầu cuối |
terminal_lifetime | int | 3600 | Tuổi thọ hộp cát tối đa |
tên_tập dữ liệu | str | Không có | Mã định danh tập dữ liệu HuggingFace |
tool_pool_size | int | 128 | Kích thước nhóm luồng để thực thi công cụ |
tool_call_parser | str | "hermes" | Trình phân tích cú pháp cho đầu ra thô của Giai đoạn 2 |
ngoại_thể | Dict | Khô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ý | Enum | STOP_TRAIN | STOP_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_IDvàMODAL_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 TinkerWANDB_API_KEY— để theo dõi số liệu Trọng số & Xu hướng- Module con
tinker-atropos(tạitinker-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