尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Zed eval-cli 完全指南:无头运行 Agent 基准评测——构建、参数、产物与环境变量全解

Zed eval-cli 完全指南:无头运行 Agent 基准评测——构建、参数、产物与环境变量全解 Zed eval-cli 完全指南无头运行 Agent 基准评测——构建、参数、产物与环境变量全解【免费下载链接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.项目地址: https://gitcode.com/GitHub_Trending/ze/zedeval-cli是 Zed 仓库中用于在无 GUI、容器化的评测/基准环境中无头运行 Zed Agent 的 Rust 二进制。本文基于 crates/eval_cli/README.md 并深入 src/main.rs 源码完整覆盖构建方式、全部命令行参数、输出产物结构、退出码语义以及用于控制模型、工具集与评测行为的ZED_EVAL_*环境变量帮助你把 Zed Agent 接入 Harbor/Pier 等沙箱评测框架或用它对自己的模型改动做可复现的 A/B 评测。1. eval-cli 是什么与生产 Zed 共用的 Agent 管线eval-cli的定位是评测 harness 里的 Zed Agent它面向 Harbor、Pier 这类容器化评测框架设计假设仓库已检出到工作目录、模型 API Key 已通过环境变量提供、结果写入指定输出目录默认/logs/agent/。关键在于它不是对 Agent 的简化复刻。从 Cargo.toml 的依赖可以看到eval_cli直接依赖生产编辑器使用的agent、acp_thread、project、language_models、prompt_store等 crate——也就是说它复用的是与 Zed 编辑器完全相同的NativeAgentAcpThread管线完整的 agentic loop工具调用、子 Agent 派生、重试只是去掉了 GUI。源码 main.rs 中的run_agent函数印证了这条调用链解析--model为provider/model形式的SelectedModel并在LanguageModelRegistry中等待模型发现完成通过SettingsStore注入评测专用设置默认允许所有工具、指定模型与 thinking 配置Project::local(...)创建本地项目project.create_worktree(workdir, ...)挂载工作目录并等待文件扫描完成构造ThreadStore与NativeAgent::new(...)经NativeAgentConnection创建 ACP 会话并发送指令用select_biased!三路竞争Agent 完成、SIGTERM 中断、--timeout超时。无头环境的初始化集中在 headless.rsgpui_platform::headless()启动无 GUI 的 GPUI 应用init函数依次初始化SettingsStore、HTTP 客户端、AppDatabase、RealFs、LanguageRegistry、Node 运行时、扩展宿主、language_models::init与agent_ui::init。一个值得注意的细节由于评测进程没有控制终端PTY 分配会失败于ENOTTY代码显式设置acp_thread::HeadlessTerminal(true)headless.rs#L120-L123让 Agent 以非交互、无 PTY 的方式执行终端命令。2. 构建 eval-cli2.1 本机构建同 OS 本地测试cargo build --release -p eval_cli产物是target/release/eval-cli只能在构建它的操作系统上运行。2.2 Linux x86_64 静态构建Harbor/Pier 沙箱用Harbor 和 Pier 的容器统一运行 Linux x86_64。从仓库根目录执行 Docker 构建脚本crates/eval_cli/script/build-linux产出target/eval-clix86_64 Linux ELF 二进制也支持自定义输出路径crates/eval_cli/script/build-linux --output ~/bin/eval-cli-linux脚本 script/build-linux 的实质是docker build --platform linux/amd64 -f crates/eval_cli/Dockerfile后docker cp出/eval-cli。而 Dockerfile 里用的是cargo-zigbuild 交叉编译到x86_64-unknown-linux-musl再strip精简——生成的是完全静态链接的二进制可运行在任何 Linux 发行版glibc 或 musl/Alpine。构建阶段安装 cmake、build-essential 等仅用于编译 libgit2-sys、zstd-sys、libsqlite3-sys 等 C 库最终阶段为FROM scratch只拷入二进制。3. 命令行参数全解README 给出的最小示例eval-cli \ --workdir /testbed \ --model anthropic/claude-sonnet-4-6 \ --instruction Fix the bug described in... \ --timeout 600 \ --output-dir /logs/agent结合 main.rs 中clap定义的Args结构体完整参数如下参数默认值说明--workdir PATH.仓库工作目录启动时会做canonicalize--instruction TEXT无指令/提示词文本省略时从 stdin 读取内容为空则报错--instruction-suffix-file PATH无读取该文件内容以两个换行追加到指令末尾用于统一附加评测说明--model PROVIDER/MODELanthropic/claude-sonnet-4-6-latest语言模型provider/model格式--timeout SECS无不超时Agent 运行的墙上时钟上限超时按退出码 2 处理--output-dir PATH.产物目录result.json、thread.md、thread.json会自动create_dir_all--no-staff未启用关闭 staff mode默认开启对应cx.set_staff(true)--reasoning-effort LEVELhighthinking 模型思考模型的推理努力等级low/medium/high--thinking BOOL按模型自动检测显式开/关 extended thinking--printenv隐藏参数将当前环境变量以 JSON 打到 stdout供 Zed 的 shell 环境捕获机制内部使用模型相关的几个行为值得展开staff mode 默认开启cx.set_staff(!args.no_staff)main.rs#L204。staff 模式通常对应解锁更多模型/工具能力评测时如需与生产普通用户对齐可用--no-staff。thinking/effort 的注入方式run_agent会把enable_thinking默认取模型自身的supports_thinking()与effort开启 thinking 时默认high通过agent.default_model用户设置注入main.rs#L627-L645。Anthropic 模型别名解析--model允许写别名而非精确 ID。anthropic_model_alias_base会依次剥离-latest、-thinking、-1m-context后缀并支持基础名 8 位日期的具名版本匹配main.rs#L505-L534。例如选claude-sonnet-4-6-latest可匹配目录中的claude-sonnet-4-6或claude-sonnet-4-6-20260518非 Anthropic 提供方则要求 ID 精确相等。这些规则有对应的单元测试main.rs#L559-L593直接验证。模型发现轮询wait_for_model以 100ms 间隔轮询注册表最长等待 30 秒MODEL_DISCOVERY_TIMEOUTAnthropic 提供方在未认证或尚无模型列表时会持续等待避免误报模型不存在。4. 输出产物与退出码eval-cli把三个文件写入--output-dir并额外把完整会话实时打印到 stderr助手消息正文、每个工具调用的完成/失败状态、子 Agent 派生、重试状态等见 log_acp_thread_event4.1 result.json由EvalResult结构体main.rs#L116-L143序列化字段含义字段类型含义statusstringcompleted/timeout/interrupted/errorerrorstring?失败原因仅 error 时duration_secsfloat总耗时秒timeout_secsu64?传入的超时预算modelstring请求的模型名input_tokens/output_tokensu64?累计 token 用量cache_creation_input_tokens/cache_read_input_tokensu64?Anthropic 提示缓存写入/读取量为 0 时省略step_countu64?Agent助手轮数即 agentic loop 的模型往返次数tool_call_countu64?全部步骤的工具调用总数tool_callsmap按工具名分组的调用次数BTreeMap按键排序这些统计来自线程的持久化快照thread.to_db(cx)遍历所有 agent 消息逐条ToolUse内容计数并取cumulative_token_usagemain.rs#L887-L932。若线程级统计缺失会回退到 ACP 会话的token_usage()。4.2 thread.md 与 thread.jsonthread.mdthread.to_markdown()生成的完整会话 Markdown便于人工审查thread.jsonthread.to_db(cx)序列化出的原始线程状态消息、工具调用、token 用量供程序化后处理。4.3 退出码码含义触发路径源码常量0Agent 正常完成EXIT_OK且 ACP 停止原因不是MaxTokens1错误模型/鉴权/运行时失败EXIT_ERROREvalResult.status为error2超时EXIT_TIMEOUT--timeout先到3被 SIGTERM/SIGINT 中断EXIT_INTERRUPTED保存部分输出注意两个易错点其一若 Agent 因模型输出达到最大 token 上限StopReason::MaxTokens停止会被判为error而非completedmain.rs#L855-L870其二收到 SIGTERM 时会先调用acp_thread.cancel(cx)并落盘部分产物再以退出码 3 结束即中断但留痕。5. 评测专用环境变量控制工具集、实验开关与模型目录README 只提到 API Key 环境变量如ANTHROPIC_API_KEY、OPENAI_API_KEY但源码中还有四个对评测实验极其重要的ZED_EVAL_*/ZED_*变量5.1 ZED_EVAL_DISABLE_TOOLS用 profile 精准裁剪工具集模型只能看到活动 Agent profile 启用的工具因此eval-cli通过定义一个专门的evalprofile 并设为default_profile来禁用工具main.rs#L661-L715。ZED_EVAL_DISABLE_TOOLS接受逗号分隔的工具名如fetch,search_web典型场景是断网基准里禁用联网工具ZED_EVAL_DISABLE_TOOLSfetch,search_web \ eval-cli --workdir /testbed --model anthropic/claude-sonnet-4-6 \ --instruction ... --timeout 600 --output-dir /logs/agent源码注释说明由于新 profile 键不会与默认 profile 深合并代码显式维护了一份与内置writeprofile 同步的WRITE_TOOLS全量清单copy_path、edit_file、grep、terminal、spawn_agent、skill等 23 个再从中剔除被禁用的项。注释同时要求该清单与 assets/settings/default.json 中writeprofile 保持同步。5.2 ZED_EVAL_ENABLE_FLAGS开启实验性 feature flag逗号分隔的 feature flag 名经cx.update_flags打开main.rs#L206-L219用于在未 GA 的工具如lsp-tool/rename-tool上评测 Agent 表现生产环境不设置。5.3 ZED_OPENAI_COMPATIBLE_PROVIDERS / ZED_ANTHROPIC_AVAILABLE_MODELS不硬编码地扩展模型目录ZED_OPENAI_COMPATIBLE_PROVIDERS携带一段 JSON 对象在模型发现前合并进language_models.openai_compatible用户设置provider id - { api_url, available_models }形态让zed-eval可以把 Agent 路由到任意 OpenAI 兼容端点如 BasetenZED_ANTHROPIC_AVAILABLE_MODELS携带 JSON 数组合并进language_models.anthropic.available_models用于运行 API 上存在但/v1/models列表未返回的模型如早期访问模型。两者都在 main.rs#L339-L389 实现并会在后续set_user_settings时重新折叠回设置中——因为该调用会整体替换用户设置缓冲区。5.4 其余运行期设置run_agent注入的设置还包含agent.tool_permissions.default allow评测环境自动允许工具执行、autosave: off、format_on_save: off避免 Agent 行为被自动格式化干扰。这些是评测正确性的一部分而非可选项。6. 用 zed-eval 编排基准评测README 明确建议常规基准评测应使用 Python 的zed-evalCLI而不是直接调eval-cli。crates/eval_cli/zed_eval/目录包说明见 zed_eval/README.md负责构建该二进制、在 Modal/Harbor/Pier 上发起远端运行并取回结果。从仓库根目录开始的最短路径crates/eval_cli/script/install-zed-eval # 封装 uv tool install --editable跟踪本地改动 zed-eval doctor --create-volume zed-eval run rf --from local --n-tasks 2不想全局安装时用一次式入口crates/eval_cli/script/zed-eval args封装uv run --project crates/eval_cli/zed_eval zed-eval。eval-cli在其中的角色被 zed_eval/agent.py 与 zed_eval/harness_command.py 定义Harbor 侧是zed_eval.agent:ZedAgentPier 侧是zed_eval.pier_agent:ZedPierAgentAgent 二进制路径通过binary_path额外环境传入--ae binary_pathtarget/eval-cli找不到时会回退到target/release/eval-cli并给出明确报错超时会注入为沙箱内的EVAL_CLI_TIMEOUT环境变量harness_command将其展开为 eval-cli 的--timeout测试 test_benchmarks.py 断言了EVAL_CLI_TIMEOUT123的命令生成API Key 由提供方映射agent_common.py 中anthropic - ANTHROPIC_API_KEY、openai - OPENAI_API_KEY_get_api_env还会附加ZED_OPENAI_COMPATIBLE_PROVIDERS/ZED_ANTHROPIC_AVAILABLE_MODELS若配置了环境准备阶段会尽力安装 LSPtailwind、eslint 等、uv/ruff 与 gopls且全部为失败不致命的告警式安装。手动跑一个本地 Harbor 实验的完整形态来自 zed_eval READMEpip install -e crates/eval_cli/zed_eval/ crates/eval_cli/script/build-linux harbor run -d swebench_verifiedlatest \ --agent-import-path zed_eval.agent:ZedAgent \ --ae binary_pathtarget/eval-cli \ --ae EVAL_CLI_TIMEOUT600 \ -m anthropic/claude-sonnet-4-67. 小结eval-cli的设计取舍可以概括为三点与生产零分叉——直接复用NativeAgent/AcpThread/Project/SettingsStore评测结果即编辑器行为源码层面main.rs、headless.rs没有任何评测专用的 Agent 逻辑分支可审计的输出契约——result.json的 status/时长/token/步数/按工具名计数加上thread.md/thread.json全量会话与四个明确退出码构成 harness 解析所需的全部信号通过设置而非代码做实验——禁工具走 profileZED_EVAL_DISABLE_TOOLS、开实验走 flagZED_EVAL_ENABLE_FLAGS、扩模型目录走环境变量注入的用户设置全部不落盘、不硬编码保证同一二进制可以在不同基准间复用。如果你只需要单条指令跑一次任务直接按第 3 节的参数表调用二进制即可如果要对比模型或做批量评测则从zed-eval入手把eval-cli当作被编排的执行单元来理解。【免费下载链接】zedCode at the speed of thought – Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter.项目地址: https://gitcode.com/GitHub_Trending/ze/zed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表