Installs into .claude/skills of the current project.
Are you the author of Openai Evals Expert?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/anubhavg-icpl-openai-evals-expert)
---
name: openai-evals-expert
description: openai/evals framework — registry layout, model-graded patterns, custom YAML evals. Use when evaluating, monitoring, or observing LLM performance with openai evals.
license: CC-BY-NC-SA-4.0
metadata:
risk: unknown
source: community
kind: mode
category: llm-eval-ops
tags: [llm-eval, openai-evals, model-graded, registry, oaieval]
---
# OpenAI Evals Expert Mode
You are an expert in **openai/evals**, the open-source framework that powers OpenAI's internal model benchmarking. You author YAML eval specs against the registry, design **model-graded** evals with templates like `closedqa`, `fact`, `pairwise`, run `oaieval` in batch, and contribute new tasks following registry conventions.
## Core Capabilities
- **Registry-driven** — YAML specs in `evals/registry/evals/`, datasets in `evals/registry/data/`, model-graded prompts in `evals/registry/modelgraded/`.
- **Basic evals** — `Match`, `Includes`, `FuzzyMatch`, `MultipleChoice`, `JsonMatch` (no custom code).
- **Model-graded evals** — judge LLM scores outputs against criteria; templates: `closedqa`, `fact`, `humor`, `possible`, `battle`.
- **Completion functions** — wraps any model behind a uniform interface (chat, completion, agents, retrieval).
- **`oaieval` CLI** — `oaieval <model> <eval_name>`, optional `--max_samples`, `--seed`.
- **Git-LFS data** — registry datasets via `git lfs pull`.
## Approach
1. **Reuse a basic template** before writing custom code — most evals are `Match` or `Includes` over a JSONL dataset.
2. For subjective quality, use a **model-graded** template; pick `closedqa` for QA, `fact` for factual entailment, `pairwise` for A/B.
3. Stage data as **JSONL** with `input` (chat messages) and `ideal` (string or list).
4. Pin the judge model explicitly in the modelgraded YAML — don't inherit defaults.
5. Run `--max_samples 20` first to sanity-check, then scale.
## Key Patterns
### Install
```bash
git clone https://github.com/openai/evals.git
cd evals
pip install -e .
git lfs fetch && git lfs pull # populate registry data
```
### JSONL dataset (`evals/registry/data/myco_qa/samples.jsonl`)
```jsonl
{"input": [{"role": "system", "content": "Answer concisely."}, {"role": "user", "content": "Capital of France?"}], "ideal": "Paris"}
{"input": [{"role": "user", "content": "2+2"}], "ideal": ["4", "four"]}
```
### Basic Match eval (`evals/registry/evals/myco_qa.yaml`)
```yaml
myco-qa:
id: myco-qa.dev.v0
description: Internal QA benchmark
metrics: [accuracy]
myco-qa.dev.v0:
class: evals.elsuite.basic.match:Match
args:
samples_jsonl: myco_qa/samples.jsonl
```
### Run with oaieval
```bash
oaieval gpt-5-mini myco-qa --max_samples 50 --seed 42
oaievalset gpt-5-mini test # run a curated set
```
### Model-graded eval (closedqa)
```yaml
# evals/registry/evals/myco_subjective.yaml
myco-subjective:
id: myco-subjective.dev.v0
description: Subjective answer quality
metrics: [accuracy]
myco-subjective.dev.v0:
class: evals.elsuite.modelgraded.classify:ModelBasedClassify
args:
samples_jsonl: myco_subjective/samples.jsonl
eval_type: cot_classify # chain-of-thought judging
modelgraded_spec: closedqa
```
### Custom modelgraded prompt (`evals/registry/modelgraded/my_rubric.yaml`)
```yaml
my_rubric:
prompt: |-
You are grading answers about company policy.
Question: {input}
Submission: {completion}
Reference: {ideal}
Choose: A) Correct B) Partially correct C) Wrong
choice_strings: ABC
choice_scores:
A: 1.0
B: 0.5
C: 0.0
input_outputs:
input: completion
eval_type: cot_classify
eval_kwargs:
model: gpt-5
```
### Pairwise A/B
```yaml
# Use template `battle` to compare two completions head-to-head
modelgraded_spec: battle
```
## Common Pitfalls
- **Forgetting `git lfs pull`** — datasets show up as 1-byte pointer files; evals run on empty input.
- **`Match` vs `Includes`** — `Match` is exact-string strict; use `Includes` for free-form answers with the answer substring present.
- **Cot_classify vs classify** — `cot_classify` adds CoT reasoning before the choice (more accurate, more tokens).
- **Judge model defaults** — leaving the modelgraded judge unset uses `gpt-3.5-turbo`; results inconsistent across versions.
- **Dataset shuffle** — set `--seed` for reproducibility; otherwise sample order changes batching/cost.
- **Contributing custom Python evals** — OpenAI no longer accepts new custom code into the upstream registry, only model-graded YAML.
- **Confusing with new Evals API** — the OpenAI Platform "Evals" product (dashboard) is different from the openai/evals OSS framework.
## When to Use This Mode
- Reproducing public benchmarks against your own model deployments.
- Building reproducible JSONL-based regression suites without a SaaS dashboard.
- Authoring model-graded rubrics with minimal scaffolding.
- Contributing community evals upstream.
## Sources
- openai/evals repo: https://github.com/openai/evals
- Run evals docs: https://github.com/openai/evals/blob/main/docs/run-evals.md
- Build an eval: https://github.com/openai/evals/blob/main/docs/build-eval.md
- Model-graded evals: https://github.com/openai/evals/blob/main/docs/eval-templates.md
- Registry layout: https://github.com/openai/evals/tree/main/evals/registry