LightEval 互操作测试夹具

状态:Active(2026-03-13)

本文描述用于验证 LightEvalConfigService、LiteLLM factory,以及 lighteval endpoint litellm CLI/Python 入口之间契约的确定性夹具集。

目标

  • 验证 CLI 与 Python 两条 LightEval 路径生成的 config.yaml
  • 覆盖成功、重试与失败语义
  • 避免在 CI 与本地 smoke 运行中访问外部 API
  • 保持契约夹具可复现

夹具布局

backend/tests/lighteval/
├── fixtures/
│   ├── providers/
│   │   └── fake-openai.json
│   ├── datasets/
│   │   └── mini-mmlu.eval752.zip
│   └── configs/
│       ├── expected-config.yaml
│       └── expected-cli-stdout.txt
├── test_cli_contract.py
├── test_python_contract.py
└── utils.py

provider fixture 指向本地 OpenAI-compatible test gateway。 契约测试在启动临时本地实例时,可能会动态改写其 base URL。

测试矩阵

IDScenarioAssertion
LEV-001CLI happy pathconfig 与 golden 一致,CLI 成功,且只有一次 provider 调用
LEV-002CLI retry pathfail-once 模型先失败一次,再成功
LEV-003Python API failurealways-fail 模型在耗尽重试预算后抛错
LEV-004Config drift guard生成的 YAML 仍与 golden output 一致
LEV-005Multilingual contractpolyglot fixture 在 CLI 与 Python 路径下都保持稳定

Test Gateway 行为

本地 test gateway 兼容 OpenAI API,并按 model name 控制行为:

  • 普通 model names:成功
  • 名称包含 fail-once:第一次调用失败,之后成功
  • 名称包含 always-fail:每次都失败

这样能在不引入额外生产分支的情况下,稳定覆盖重试语义。

夹具再生成

使用以下命令刷新夹具集:

cd backend
uv run python ../scripts/testing/build_lighteval_fixture.py

构建器会更新:

  • provider JSON
  • dataset package
  • golden LightEval config
  • golden CLI stdout

CI 用法

  • pytest -m lighteval --no-cov 会在 CI 和 nightly 流程中运行
  • Docker integration 与其独立,但采用相同的本地 gateway 思路
  • 失败时应上传日志与调用元数据,便于调试