Skip to content

Repository files navigation

CodeArena

基于 omp CLI 的 LLM 编码能力评测工具。CodeArena 负责题库、评测编排、隐藏测试、评分与报告;模型发现、鉴权、寻址和协议适配全部交给 omp。

它评的是模型在统一 omp harness 下完成编码任务的实际表现,而不是绕过 harness 直连供应商 API 的结果。

OMP 如何参与评测

CodeArena 不维护模型注册表,也不保存供应商密钥。候选模型和评审模型都使用 provider/model 引用,并在运行时对照 omp models --json --no-extensions 的结果校验。

每个候选模型与任务的评测流程:

  1. 用参考解自校验任务的全部隐藏测试和测试变体。
  2. 在空临时目录启动独立的 omp -p 进程生成代码。
  3. --mode json 事件流读取模型文本与 token 用量,并记录请求的 thinking 档位。
  4. 解析模型输出的代码,在本地运行 pytest 隐藏测试并计算主分。
  5. 可选地通过同一条 omp 调用链让评审模型给出代码质量分。
  6. 聚合各层得分,保存原始记录并生成 Markdown 排行榜。

为保持不同模型和不同轮次的输入一致,omp 调用固定使用最小 system prompt,并带上 --no-session --no-tools --no-skills --no-rules --no-extensions --no-lsp。每次调用都从空目录启动,不读取当前仓库的 AGENTS.md 等项目上下文。

因此,报告中的 token 用量包含 omp harness 的固定开销,不能直接等同于裸 API 计量。

评测能力

  • 统一模型入口:直接复用 omp 已配置的模型、凭据、路由和协议适配,不为每个供应商重复实现客户端。
  • 分层原创题库:L1 单函数实现、L2 多文件小项目、L3 仓库级修复;支持确定性的多种子测试变体,降低公开 benchmark 污染。
  • 可回归主分:按隐藏测试通过比例给部分分,再按 L1/L2/L3 权重聚合。
  • 独立失败状态:代码错误、测试收集失败、超时和基础设施失败分别记录;缺少可评分结果的候选不参与排名。
  • 可选质量评审:任一 omp 模型都可作为 judge,按 rubric 给出 1–5 分;质量分只展示,不计入主分。
  • 可审计产物:保留每组评测的模型输出、解析代码、pytest 日志、token、耗时和 JSONL 原始记录。
  • 实时进度:TTY 中显示 Rich 进度条和结果表;管道或 CI 中输出稳定的逐行文本。按 Ctrl-C 会终止仍在运行的 omp 子进程,并保留已完成结果。

快速开始

需要 Python >= 3.11、uv 和已安装配置好的 omp CLI。先确认 omp 能找到要评测的模型:

omp --version
omp models --no-extensions

安装项目并查看 CodeArena 可用的模型目录:

uv sync
uv run codearena --version
cp codearena.example.toml codearena.toml
uv run codearena list-models
# 在 TTY 中用空格多选候选模型,并写回 codearena.toml
uv run codearena select

不用 uv 时也可以安装到普通虚拟环境:

python3 -m venv .venv
.venv/bin/pip install -e .

使用 select 命令或手动编辑 codearena.toml 配置候选清单后,即可运行完整评测:

# 使用配置中的 candidates、layers 和 effort
uv run codearena run
# 临时覆盖候选模型
uv run codearena run --models your-provider/model-a your-provider/model-b
# 只跑指定层级,并覆盖统一思考强度
uv run codearena run --layers L1 L2 --effort high
# 从指定历史轮次重新生成排行榜;默认值就是 latest
uv run codearena report --run latest

评分口径

  • 任务主分:全部测试变体合并后的 passed / total。无效输出、候选代码错误和测试失败会进入主分;供应商请求等基础设施失败不伪装成零分。
  • 层级分:候选模型在同一层全部任务主分的平均值。
  • 总分:各层级分按配置权重聚合;只运行部分层级时,会按实际层级权重重新归一。
  • 质量分:评审模型按 rubric 给出的 1–5 分均值,只作参考。评审模型也在候选清单中时,报告会标记自评。
  • 排名资格:候选必须覆盖本轮计划的全部任务;存在基础设施失败导致的缺失结果时不参与排序。

评测产物

每轮评测写入 runs/<时间戳>/

run.json # 轮次元数据:候选、层级、judge、effort、并发上限、权重、题库 hash
results.jsonl # 每个“候选模型 × 任务”一条结构化原始记录
raw/ # 模型响应、解析后的代码快照和 pytest 日志
leaderboard.md # 按总分排序的 Markdown 排行榜

配置

复制 codearena.example.tomlcodearena.toml 后按需修改;本地配置不会被 Git 跟踪。模型引用必须存在于 omp 的无扩展模型目录中:

candidates = [
"provider/model-a",
"provider/model-b",
]
judge = "provider/judge-model"# 不需要质量分时删除此项,并设置 quality = falserunner = "local"# 当前已实现的 runner
[run]
effort = "max"# low / medium / high / maxtimeout_s = 300# 每次隐藏测试执行超时layers = ["L1", "L2", "L3"]
concurrency = 4candidate_concurrency = 2# 同时运行的候选模型数,不得大于 concurrencymax_attempts = 3# omp 调用的总尝试次数retry_backoff_s = 2.0# 指数退避基数秒数
[scoring]
quality = true
[scoring.weights]
L1 = 0.2L2 = 0.3L3 = 0.5

concurrency 限制同时运行的“候选模型 × 任务”完整流水线总数;candidate_concurrency 限制同时活跃的候选模型数,默认值为 1。调度器在活跃候选之间公平分配全局并发槽位。

出题

任务目录契约(tasks/<层级>/<题目id>/):

task.yml # id、layer、title、timeout_s(可选)、test_seeds(可选)
prompt.md # 题面:签名、要求、示例、输出约定
solution/ # 参考解,用于出题自校验
tests/test_*.py # 隐藏测试:多个小而独立的 test 函数(按比例给部分分)
scaffold/ # L2/L3 可选;起始文件会附在模型题面中并复制进工作目录

候选输出协议已经写入固定 prompt 模板:只输出标注为 python 的 Markdown 围栏代码块;多文件任务中,每个代码块首行使用 # file: <相对路径>

每次 run 开始前,CodeArena 都会用参考解自校验本轮全部隐藏测试,不合格的任务会中止整个评测轮次。test_seeds 必须是非空且不重复的整数列表;配置后,每个种子都会通过 CODEARENA_SEED 注入并独立执行,最终合并通过数、总数与日志。

安全须知

空临时目录和关闭 omp 上下文注入只保证评测输入一致,不是安全沙箱runner = "local" 会在本机子进程中直接执行候选代码,仅受工作目录与超时约束,不隔离文件系统或网络。只评测可信模型端点生成的代码。

开发

uv run pytest -q

相关文档:CONTEXT.md(领域词汇表)、AGENTS.md(提交约定)。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages