ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Agent测试框架Harbor指南:用TaoToken统一Key跑通评测流水线

Agent测试框架Harbor指南:用TaoToken统一Key跑通评测流水线 1. 为什么 Agent 评测总在 Key 管理上翻车做 Agent 评测的人大多经历过这个场景本地写好了十几个测试用例每个用例要跑 Claude Code、OpenHands、GPT 三种 Agent每种 Agent 又要换不同模型对比。结果光是环境变量就设了七八个ANTHROPIC_API_KEY、OPENAI_API_KEY、GEMINI_API_KEY混在一起跑批量任务时某个 Key 额度耗尽整批 Trial 全挂日志里还看不出是哪个环节断的。Harbor 这个 Agent 测试框架解决的正是评测流程标准化的问题——它把每个任务封装进独立 Docker 容器Agent 在沙箱里执行Verifier 用测试脚本自动打分输出reward.txt。但 Harbor 本身不提供 API Key它只负责调度和验证模型调用走的是你传入的环境变量。这就意味着评测流水线能不能稳定跑通一半取决于你的 Key 通道是否统一、可切换、可观测。我试过用三套 Key 分别跑不同 Agent结果是每次换模型都要改.env、重启终端、重新 export批量跑 20 个用例时中途断了一次排查半小时才发现是某个 Key 的并发限制。后来把模型调用统一收敛到 TaoToken 的 API 通道用一套 Key 覆盖 Claude、GPT、Gemini 系列模型Harbor 的--env-file只指向一个文件切换模型只改--model参数评测流程才算真正顺起来。这篇指南面向正在搭 Agent 评测流水线的开发者从 Harbor 的task.toml和settings.json骨架讲起把 TaoToken 统一 Key 接进去再串起用例注册、批量执行、结果校验的完整动作。跟着做完你能独立跑通一条可复现的 Harbor 评测流水线。2. TaoToken 在 Harbor 评测里的定位与前置准备Harbor 的模型调用链路是这样的harbor run启动 Trial → 容器内安装 Agent CLI比如 claude-code→ Agent CLI 读取环境变量里的 API Key → 向模型服务发请求。所以 Key 的注入点在环境变量不在task.toml里。这一点很关键很多人第一次配 Harbor 会去task.toml找 API Key 字段找不到就卡住了。TaoToken 在这里扮演的是统一模型通道的角色。它提供兼容 OpenAI 和 Anthropic 协议的 API 端点你拿一个 Key 就能调用多个模型系列。对 Harbor 评测来说好处有三个一是--env-file只需要维护一份不用为每个 Agent 准备不同 Key二是批量跑用例时额度集中管理不会出现某个 Key 突然耗尽导致整批失败三是模型切换只改--model参数评测脚本不用动。前置准备分两步。第一步是拿 Key访问 TaoToken 控制台 创建 API Key建议给评测专用建一个独立 Key方便单独看用量。第二步是确认 API 端点对话补全走https://taotoken.net/apiAnthropic 兼容协议走对应的/v1/messages路径。具体路径以 接入文档 为准文档里有各协议的完整端点列表。环境侧需要确认三样东西Docker 能正常docker buildHarbor 每个 Task 都要构建镜像、uv已安装Harbor 用 uv 管理、Python 3.10。这三样缺一个后面harbor run就会在环境启动阶段报错。3. 可复制的 Harbor 配置骨架与 TaoToken 接入3.1 安装 Harbor 与初始化任务先装 Harbor用 uv 一条命令搞定uv tool install harbor harbor --version然后初始化一个评测任务模板。这里用--include-canary-strings是为了让任务带上防污染标记跑基准测试时避免数据泄漏harbor tasks init my-agent-eval --include-canary-strings -p ./tasks生成的目录结构如下这是 Harbor 的标准骨架tasks/my-agent-eval/ ├── instruction.md # 给 Agent 的任务指令 ├── task.toml # 任务配置超时、资源、环境变量 ├── environment/ │ └── Dockerfile # 沙箱镜像定义 ├── tests/ │ └── test.sh # Verifier 测试脚本 └── solution/ └── solve.sh # Oracle 参考解答3.2 task.toml 配置骨架task.toml是 Harbor 的核心配置文件控制超时、资源、网络权限。下面是一份可直接复制的骨架我加了注释说明每个字段的作用version 1.0 [task] name my-org/agent-eval description Agent 评测任务验证代码修复能力 authors [{ name Your Name, email youexample.com }] [metadata] difficulty medium category programming tags [agent-eval, code-fix] [agent] timeout_sec 600.0 # Agent 执行超时复杂任务建议 600-1800 [verifier] timeout_sec 300.0 # 测试脚本超时 [environment] build_timeout_sec 600.0 # 镜像构建超时装依赖多的话调大 cpus 2 memory_mb 4096 storage_mb 10240 gpus 0 allow_internet true # Agent 需要联网调模型必须为 true注意allow_internet true这一项。Harbor 默认可能限制网络如果 Agent 在容器里调不通模型 API先检查这里。评测任务里 Agent 要访问 TaoToken 的 API 端点网络必须放行。3.3 settings.json 与统一 Key 注入Harbor 本身没有settings.json这个文件但 Agent CLI比如 claude-code在容器内会读自己的配置。为了让 TaoToken 的 Key 和端点注入到 Agent 进程推荐用.env文件 --env-file的方式。在项目根目录建一个.env# .env — Harbor 评测统一 Key 配置 ANTHROPIC_API_KEY你的TaoToken_Key ANTHROPIC_BASE_URLhttps://taotoken.net/api OPENAI_API_KEY你的TaoToken_Key OPENAI_BASE_URLhttps://taotoken.net/api/v1这里的关键是BASE_URL指向 TaoToken 的 API 端点Agent CLI 就会把请求发到统一通道而不是默认的官方端点。ANTHROPIC_API_KEY和OPENAI_API_KEY填同一个 TaoToken Key 即可因为 TaoToken 的 Key 是跨协议通用的。如果你用的是 claude-code 这类会读settings.json的 Agent可以在容器内挂载一份配置。Harbor 支持通过 Dockerfile 的COPY把配置文件放进镜像或者在task.toml里用环境变量覆盖。更简单的做法是直接在 Dockerfile 里写死端点FROM ubuntu:24.04 WORKDIR /app RUN apt-get update apt-get install -y \ curl \ rm -rf /var/lib/apt/lists/* # 注入 TaoToken 统一端点Agent CLI 启动时读取 ENV ANTHROPIC_BASE_URLhttps://taotoken.net/api ENV OPENAI_BASE_URLhttps://taotoken.net/api/v1这样容器内的 Agent 无论用哪个协议都会走 TaoToken 通道。Key 本身通过--env-file在运行时注入不写进镜像避免泄漏。3.4 用例注册instruction.md 与测试脚本instruction.md是给 Agent 看的任务描述要点是用绝对路径、明确输出格式、不暴露测试逻辑请在 /app 目录下创建一个名为 fix.py 的文件实现一个函数 add(a, b) 返回两数之和。文件必须位于 /app/fix.py函数签名必须为 def add(a, b):。tests/test.sh是 Verifier 脚本负责跑测试并写分数#!/bin/bash set -e apt-get update apt-get install -y curl curl -LsSf https://astral.sh/uv/install.sh | sh source $HOME/.local/bin/env uvx --with pytest8.4.1 pytest /tests/test_fix.py -v if [ $? -eq 0 ]; then echo 1 /logs/verifier/reward.txt else echo 0 /logs/verifier/reward.txt fitests/test_fix.py写具体断言import sys sys.path.insert(0, /app) from fix import add def test_add_positive(): assert add(2, 3) 5 def test_add_negative(): assert add(-1, 1) 0solution/solve.sh是 Oracle 参考解答用来验证任务本身可解#!/bin/bash cat /app/fix.py EOF def add(a, b): return a b EOF4. 验证请求跑通一次完整评测配置齐了先跑 Oracle 验证任务定义没问题harbor run --path ./tasks/my-agent-eval --agent oracle预期输出里reward 1.0。如果 Oracle 都跑不过说明任务定义有 bug先修任务再测真实 Agent。Oracle 通过后用真实 Agent 跑Key 从.env注入harbor run \ --path ./tasks/my-agent-eval \ --agent claude_code \ --model anthropic/claude-sonnet-4 \ --env-file .env这里--model的格式是provider/model-name。因为ANTHROPIC_BASE_URL指向了 TaoToken请求会走统一通道。跑完后 Harbor 会在输出目录生成结果包含每个 Trial 的reward.txt和日志。批量跑多个用例时把任务放在同一个父目录下用--n-concurrent控制并发harbor run \ --path ./tasks \ --agent claude_code \ --model anthropic/claude-sonnet-4 \ --env-file .env \ --n-concurrent 4跑完看汇总结果每个任务的 reward 会列出来。如果某个任务 reward 为 0去对应 Trial 的日志里看 Agent 执行记录和 Verifier 输出定位是 Agent 没做对还是测试脚本写错了。想快速验证模型通道是否通可以先用 模型对话 发一条测试消息确认 Key 和端点没问题再跑 Harbor。这样能把Key 配置问题和任务定义问题分开排查。5. 本篇常见错排查报错一ANTHROPIC_API_KEY not set或 Agent 启动后立即退出原因通常是--env-file没传或者.env里的变量名和 Agent CLI 期望的不一致。claude-code 读ANTHROPIC_API_KEYOpenHands 可能读OPENAI_API_KEY。检查.env变量名确认harbor run命令带了--env-file .env。报错二容器内请求超时或连接被拒先确认task.toml里allow_internet true。然后进容器手动测一下端点连通性harbor tasks start-env --path ./tasks/my-agent-eval -e docker -a -i # 进入容器后 curl -I https://taotoken.net/api如果容器内 curl 不通说明 Docker 网络配置有问题检查宿主机的 Docker DNS 设置。报错三reward.txt没生成或 Verifier 超时test.sh必须把分数写到/logs/verifier/reward.txt路径写错就不会有输出。另外verifier.timeout_sec设太小测试脚本没跑完就被 kill也会导致没有 reward。装依赖多的测试脚本建议给到 300s 以上。报错四Oracle 通过但真实 Agent 全挂这通常不是 Key 问题而是instruction.md描述不清Agent 理解偏了。检查指令是否用了绝对路径、输出格式是否明确、有没有暴露测试细节。Agent 只能看到instruction.md看不到task.toml、Dockerfile、tests/所以指令必须自包含。报错五批量跑时部分 Trial 失败日志显示额度或并发限制统一 Key 的好处在这里体现去 API Keys 管理页 看用量和并发情况必要时调低--n-concurrent或者给评测专用 Key 单独提额。比起到处换 Key集中管理排查快得多。6. 把评测流水线固化下来跑通一次之后建议把命令固化成脚本避免每次手敲参数出错。建一个run-eval.sh#!/bin/bash set -e TASK_PATH${1:-./tasks} MODEL${2:-anthropic/claude-sonnet-4} CONCURRENCY${3:-4} echo Running Harbor eval: task$TASK_PATH model$MODEL concurrency$CONCURRENCY harbor run \ --path $TASK_PATH \ --agent claude_code \ --model $MODEL \ --env-file .env \ --n-concurrent $CONCURRENCY这样切换模型只改第二个参数比如换成openai/gpt-4o或google/gemini-2.5-proKey 和端点都不用动。长期跑编码类 Agent 评测的话可以考虑用 Coding Plan 把额度固定下来批量评测时不用担心临时超额。最后提醒一个实操细节Harbor 的 Trial 日志默认在输出目录跑批量任务时建议把每次评测的输出目录按日期归档方便回溯对比不同模型在同一批用例上的表现。评测流水线的价值不在于跑一次而在于可复现、可对比、可回归。
返回列表