第 15 章:Job 配置文件与轨迹加载
第 15 章:Job 配置文件与轨迹加载
当评测规模从"一条命令"增长到"多 agent、多数据集、可复现实验"时,CLI flags 就不够用了。本章讲解 JobConfig——以 YAML 或 JSON 表达的全部 Job 配置,覆盖 job、retry、agents、user_agent、environment、verifier、datasets、tasks、metrics 九大字段组;随后介绍如何把历史轨迹加载进新的 agent 会话,以及用
--stream实时观测运行中的 Job。
15.1 为什么用配置文件
harbor run -c "<config.yaml>" 直接加载配置文件。相对 flags 的三大优势:
- 一个文件支持多个 agents、多个 datasets、多个 tasks;
- 可提交版本控制,实验可复现;
- 与 CLI flags 可组合,flags 覆盖配置中的同名值。
最小示例:
# config.yaml
job_name: my-first-job
tasks:
- path: ""
agents:
- name: codex
model_name: openai/gpt-6-astra
environment:
type: docker 15.2 创建与校验配置
harbor job init "" # 生成配置,接受与 harbor run 相同的 flags
harbor job init "" --full # 生成包含所有字段的完整配置
harbor run --config "config.yaml" --print-config # 查看解析后的配置
harbor job schema # 打印配置的 JSON Schema
harbor run --dry-run --config "config.yaml" # 校验配置、agent kwargs、凭据与任务来源,不真正运行 --dry-run 加上 --launch 则使用 Harbor Hub 的 schema 与校验规则。
15.3 顶层字段总览
所有顶层字段均可选,Harbor 按默认值行事:
| 字段 | 默认值 | 说明 |
|---|---|---|
job_name / jobs_dir |
时间戳 / "jobs" |
Job 名称(省略时用 YYYY-MM-DD__HH-MM-SS)/ 结果目录 |
n_attempts |
1 |
每个"任务 × agent"组合的尝试次数 |
n_concurrent_trials |
4 |
最大并发 Trial 数,至少为 1 |
debug / quiet |
false |
调试日志 / 抑制单 Trial 进度显示 |
retry |
{} |
重试与指数退避配置 |
environment |
{} |
所有 Trial 共享的环境 provider 配置 |
verifier |
{} |
所有 Trial 共享的 verifier 配置 |
agents |
[{"name":"oracle"}] |
被评测的 agent 列表 |
user_agent |
null |
可选的模拟用户 agent 与桥接配置 |
datasets / tasks |
[] |
展开为任务的数据集来源 / 单个任务来源 |
metrics |
[] |
追加到各数据集 metrics 之上的 Job 级指标 |
| 其他 | [] |
artifacts(Trial 后收集的环境路径)、extra_instruction_paths/extra_instructions(追加指令)、source_jobs(regrade 来源) |
另有 5 个阶段级超时乘数:timeout_multiplier(全局,默认 1.0)及 agent_、verifier_、agent_setup_、environment_build_ 前缀的专属乘数(默认 null);布尔项 install_only 为 true 时只跑 agent setup 并禁用验证。
15.4 完整示例
job_name: weekly-regression
jobs_dir: jobs
n_attempts: 3
n_concurrent_trials: 16
retry:
max_retries: 3
min_wait_sec: 1.0
max_wait_sec: 60.0
agents:
- name: claude-code
model_name: anthropic/claude-sonnet-5
n_concurrent: 4
kwargs:
reasoning_effort: high
- name: codex
model_name: openai/gpt-6-astra
environment:
type: docker
override_cpus: 4
datasets:
- name: terminal-bench/core
ref: v1.015.5 关键字段分组详解
agents
| 字段 | 说明 |
|---|---|
name / import_path |
预集成 agent 名,或自定义 agent 的 module.path:ClassName |
model_name |
传给 agent 的模型标识 |
n_concurrent / concurrency_group |
单 agent 并发上限(不得超过 n_concurrent_trials)/ 共享并发池,同组必须同值 |
load_trajectory / resume_trajectory |
第一步前加载轨迹 / 多步任务步骤间恢复原生会话 |
override_timeout_sec / max_timeout_sec |
替换 / 封顶 agent 超时 |
skills |
本地技能目录、Git URL 或 org/name[@ref] 技能来源 |
kwargs / env |
传给 agent 构造器的参数 / 仅 agent 阶段可见的环境变量 |
mcp_servers |
提供给 agent 的 MCP 服务器列表 |
每个 mcp_servers[] 条目包含 name(必填)、transport(stdio/sse/streamable-http,默认 sse)、url(sse/http 类必填)、command 与 args(stdio 必填)。
retry
| 字段 | 默认值 | 说明 |
|---|---|---|
max_retries |
0 |
最大重试次数 |
include_exceptions / exclude_exceptions |
见下 | 可重试 / 永不重试的异常类名;排除优先于包含 |
wait_multiplier / min_wait_sec / max_wait_sec |
1.0 / 1.0 / 60.0 |
指数退避乘数与间隔上下界 |
默认不可重试的异常包括 AgentTimeoutError、VerifierTimeoutError、RewardFileNotFoundError、RewardFileEmptyError、VerifierOutputParseError、ApiUsageLimitError、AgentSafetyRefusalError、AgentAuthenticationError、ModelNotFoundError。
environment 与 verifier
environment.type 默认 docker,可选 podman、daytona、e2b、modal 等数十种 provider。常用字段:force_build(强制重建)、delete(Trial 结束后删除环境,默认 true)、override_cpus/override_memory_mb/override_storage_mb/override_gpus(运行时覆盖资源)、env(沙箱内基线环境变量)、mounts(Docker Compose 长语法挂载,仅作用于 agent 环境)、kwargs(provider 专属参数)。资源与网络策略详见第 10、11 章。
verifier 字段组:override_timeout_sec、max_timeout_sec、include_logs/exclude_logs(reward 文件始终会下载)、env、import_path/kwargs(自定义 verifier)、disable(跳过验证;启用 install_only 时自动置 true)。
datasets 与 tasks
两者都支持本地路径、Hub 名称、registry 与 Git 来源,且约束相同:每个来源只能选一种形态。
| 字段 | 适用 | 说明 |
|---|---|---|
path |
两者 | 本地目录;配 repo 时为仓库内隐式数据集路径 |
name |
两者 | Hub 上的 org/name,或自定义 registry 的裸名 |
ref / version |
两者 / registry | Hub 的 tag/digest;registry 的版本(二者不可同设) |
registry_url / registry_path |
datasets | 自定义 registry.json 的 URL / 路径 |
repo |
datasets | Git 仓库简写或 URL,可带 @ref |
task_names / exclude_task_names / n_tasks |
datasets | glob 包含 / 排除任务名 / 过滤后的任务数上限 |
git_url / git_commit_id |
tasks | Git 任务仓库与固定 commit |
source |
tasks | 可选的来源标签,用于分组任务与指标 |
user_agent:模拟用户
user_agent 支持全部 agents[] 字段,另有:
user_persona_path:定义模拟用户人设的文件路径;user_prompt_template_path:模拟用户使用的 Jinja2 提示词模板;bridge(配置user_agent时必填):连接模拟用户与主 agent 的桥接器,当前仅支持kind = "acp",可选prompt_path与kwargs。
metrics
Job 级 metrics[] 中的 type 字段支持 "sum"、"min"、"max"、"mean"、"uv-script",默认 "mean"。
15.6 轨迹加载
Harbor 可以把一次历史运行轨迹装进新的 agent 会话。有两种加载视角、两种轨迹格式:
| 视角 | 配置方式 | 格式 | 支持 agent |
|---|---|---|---|
| Task 级 | 指令目录下的 trajectory.json |
仅 ATIF | claude-code、codex |
| Run 级(Job 或 Trial) | --load-trajectory 或 agents[].load_trajectory |
ATIF 与 native | claude-code、codex |
Task 级:把名为 trajectory.json 的 ATIF 文件放在 instruction.md 同目录(多步任务放在第一步目录),agent 支持 ATIF 加载时 Harbor 自动装入。
Run 级:通过 CLI 或配置指定,且覆盖 Task 级加载。.json 后缀选择 ATIF 加载器,其他后缀选择 agent 的 native 加载器。以 native 轨迹为例:
harbor run \
-p examples/tasks/hello-load-native-trajectory \
-a claude-code -m opus -e daytona \
--load-trajectory examples/tasks/hello-load-native-trajectory/environment/d7d4e19e-608d-44ef-b166-cd050ef274ba.jsonl把 --load-trajectory 的路径换成某个 trajectory.json 即为 Run 级 ATIF 加载;写进配置文件则等价于 {"agents": [{"name": "codex", "load_trajectory": "path/to/trajectory.json"}]}。
native 与 ATIF 的差别:native 轨迹是 agent 专属的 .jsonl 会话文件(无损耗,但要求同一 agent;claude-code 存于 agent/sessions/projects/-app/<session-id>.jsonl,codex 存于 agent/sessions/<YYYY>/<MM>/<DD>/rollout-*.jsonl,移动文件时须保留文件名);ATIF 轨迹存于 agent/trajectory.json,是可移植格式——Harbor 会把它转换为目标 agent 的原生格式,因此 A agent 的轨迹可以"喂"给 B agent 当起点,转换保留受支持的消息、工具调用与结果,但可能省略 agent 专属细节。
三点注意:load_trajectory 不能与模拟 user_agent 组合;agent 通过 capabilities.load_native_trajectory 与 capabilities.load_atif_trajectory 声明能力,不支持的格式、缺失文件、非法 ATIF 会在启动前失败;加载只恢复会话内容,不恢复沙箱文件。多步任务中加载发生在第一步之前,配合 --resume-trajectory 时会话序列为 (load, resume, resume, ...),否则为 (load, fresh, fresh, ...)。
15.7 --stream:实时观测运行中的 Job
加 --stream 可以在 Job 运行时观察 agent 行为、查看沙箱文件;另开终端启动查看器:
harbor run -t terminal-bench/build-cython-ext \
-a claude-code -m anthropic/claude-sonnet-5 -e docker --stream
harbor view jobs # 在另一个终端运行- Trajectory 标签页:随着新步骤到达,实时跟随 agent 的动作、命令与结果;
- Stream 标签页:实时浏览沙箱文件与生成的产物,沙箱就绪后自动连接。
当前支持 Claude Code 与 Codex,沙箱支持 Daytona、Modal、Smol Machines、Tensorlake 或本地 Docker。浏览器与查看器需在同一台机器运行;Daytona 场景下凭据要对两者都可用。再加 --no-delete 可在运行结束后保留沙箱——调试时非常有用,但别忘了事后删除。
本章小结
- 配置文件支持多 agent、多数据集与版本控制;
harbor run -c加载,flags 可覆盖配置值。 harbor job init生成配置、harbor job schema打印 JSON Schema、--dry-run与--print-config用于不运行的校验。- 顶层字段分九组:job、retry、agents、user_agent、environment、verifier、datasets、tasks、metrics,全部可选且有默认值。
n_concurrent_trials是全局并发上限,agents[].n_concurrent不得超过它;重试通过异常类名精细控制。- 轨迹加载有 Task 级(ATIF-only)与 Run 级(ATIF + native,覆盖 Task 级)两种视角;native 无损耗但绑定 agent,ATIF 可跨 agent 移植。
- 加载只恢复会话内容而不恢复沙箱文件,且不能与
user_agent组合。 --stream配合harbor view提供 Trajectory 与 Stream 两个实时观测面板,--no-delete便于事后调试。