agentv 5.0.0-next.1 → 5.2.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +239 -53
- package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js → agentv-provider-AYXH7WLW-6YZKZ7PS.js} +2 -2
- package/dist/{artifact-writer-QD52FC56.js → artifact-writer-SN6UNL5G.js} +15 -8
- package/dist/{chunk-GZJMODLW.js → chunk-3S6A2RKR.js} +45880 -30542
- package/dist/chunk-3S6A2RKR.js.map +1 -0
- package/dist/{chunk-6Q56CEXV.js → chunk-3X357HS4.js} +7900 -8985
- package/dist/chunk-3X357HS4.js.map +1 -0
- package/dist/{chunk-6JVM4GJI.js → chunk-46K2OET3.js} +187 -80
- package/dist/chunk-46K2OET3.js.map +1 -0
- package/dist/{chunk-IJEZFZJR.js → chunk-7BGERE6L.js} +2 -2
- package/dist/chunk-7BGERE6L.js.map +1 -0
- package/dist/{chunk-UG4JHZYM.js → chunk-ALVZQUZP.js} +670 -1427
- package/dist/chunk-ALVZQUZP.js.map +1 -0
- package/dist/{chunk-RCIEHFQ2.js → chunk-PEUTJS7B.js} +3 -3
- package/dist/{chunk-5H446C7X.js → chunk-QMRVH5ZP.js} +2 -8
- package/dist/{chunk-IBI7A5RP.js → chunk-T4AD3H3Y.js} +3444 -2251
- package/dist/chunk-T4AD3H3Y.js.map +1 -0
- package/dist/cli.js +8 -9
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/assets/{index-D5_8DE_B.js → index-DNgf3qJ2.js} +1 -1
- package/dist/dashboard/assets/index-D_bokML8.css +1 -0
- package/dist/dashboard/assets/index-r_jSJmlw.js +121 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/{dist-KJ6PELQY.js → dist-DEPJOMCA.js} +74 -60
- package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js → docker-workspace-NNK4Z6FR-QRTIG6TM.js} +3 -3
- package/dist/{exec-MYPAJJP7-C5HD5WG5.js → exec-4HFFRQ3B-AXDMJNLJ.js} +3 -3
- package/dist/index.js +8 -9
- package/dist/{interactive-2WMVAASS.js → interactive-36ZNMQB2.js} +13 -29
- package/dist/interactive-36ZNMQB2.js.map +1 -0
- package/dist/skills/agentv-bench/SKILL.md +38 -34
- package/dist/skills/agentv-bench/agents/analyzer.md +6 -6
- package/dist/skills/agentv-bench/agents/comparator.md +4 -5
- package/dist/skills/agentv-bench/agents/grader.md +4 -4
- package/dist/skills/agentv-bench/references/autoresearch.md +3 -3
- package/dist/skills/agentv-bench/references/description-optimization.md +2 -2
- package/dist/skills/agentv-bench/references/environment-adaptation.md +10 -10
- package/dist/skills/agentv-bench/references/eval-yaml-spec.md +51 -30
- package/dist/skills/agentv-bench/references/migrating-from-skill-creator.md +4 -4
- package/dist/skills/agentv-bench/references/subagent-pipeline.md +13 -12
- package/dist/skills/agentv-eval-migrations/SKILL.md +33 -0
- package/dist/skills/agentv-eval-migrations/references/breaking-changes.md +1012 -0
- package/dist/skills/agentv-eval-review/SKILL.md +6 -3
- package/dist/skills/agentv-eval-review/scripts/lint_eval.py +1 -1
- package/dist/skills/agentv-eval-writer/SKILL.md +380 -246
- package/dist/skills/agentv-eval-writer/references/{config-schema.json → config.schema.json} +6 -5
- package/dist/skills/agentv-eval-writer/references/custom-evaluators.md +23 -18
- package/dist/skills/agentv-eval-writer/references/eval.schema.json +9852 -0
- package/dist/skills/agentv-eval-writer/references/python-helpers.md +8 -8
- package/dist/skills/agentv-eval-writer/references/rubric-evaluator.md +21 -22
- package/dist/skills/agentv-trace-analyst/SKILL.md +4 -4
- package/dist/templates/.agentv/targets.yaml +41 -40
- package/dist/{ts-eval-loader-RE43OAGX-AMRCUKBZ.js → ts-eval-loader-OMG2JBHP-OP5RR7A3.js} +5 -4
- package/package.json +19 -4
- package/dist/chunk-6JVM4GJI.js.map +0 -1
- package/dist/chunk-6Q56CEXV.js.map +0 -1
- package/dist/chunk-76FOHROU.js +0 -96
- package/dist/chunk-76FOHROU.js.map +0 -1
- package/dist/chunk-GZJMODLW.js.map +0 -1
- package/dist/chunk-HSHTTN6C.js +0 -565
- package/dist/chunk-HSHTTN6C.js.map +0 -1
- package/dist/chunk-IBI7A5RP.js.map +0 -1
- package/dist/chunk-IJEZFZJR.js.map +0 -1
- package/dist/chunk-LRULMAAA.js +0 -1711
- package/dist/chunk-LRULMAAA.js.map +0 -1
- package/dist/chunk-R3CXYNTN.js +0 -1238
- package/dist/chunk-R3CXYNTN.js.map +0 -1
- package/dist/chunk-UG4JHZYM.js.map +0 -1
- package/dist/chunk-VQ2ZO7XJ.js +0 -2098
- package/dist/chunk-VQ2ZO7XJ.js.map +0 -1
- package/dist/chunk-XALGXSKB.js +0 -21
- package/dist/chunk-XALGXSKB.js.map +0 -1
- package/dist/dashboard/assets/index-BVMrdN8a.js +0 -119
- package/dist/dashboard/assets/index-DZWXfWsv.css +0 -1
- package/dist/esm-NNMQYIKT.js +0 -32
- package/dist/esm-R77SNOF5.js +0 -65
- package/dist/esm-RVQPUGWH.js +0 -1207
- package/dist/esm-RVQPUGWH.js.map +0 -1
- package/dist/esm-TTEMJEVV.js +0 -933
- package/dist/esm-TTEMJEVV.js.map +0 -1
- package/dist/esm-ZADQ4XQH-QUFGGZL4.js +0 -924
- package/dist/esm-ZADQ4XQH-QUFGGZL4.js.map +0 -1
- package/dist/exec-MYPAJJP7-C5HD5WG5.js.map +0 -1
- package/dist/getMachineId-bsd-HSK5LZMG.js +0 -41
- package/dist/getMachineId-bsd-HSK5LZMG.js.map +0 -1
- package/dist/getMachineId-darwin-4DP6CCJV.js +0 -41
- package/dist/getMachineId-darwin-4DP6CCJV.js.map +0 -1
- package/dist/getMachineId-linux-44LJ5UJB.js +0 -33
- package/dist/getMachineId-linux-44LJ5UJB.js.map +0 -1
- package/dist/getMachineId-unsupported-NVK6IATM.js +0 -24
- package/dist/getMachineId-unsupported-NVK6IATM.js.map +0 -1
- package/dist/getMachineId-win-YZ36S7VA.js +0 -43
- package/dist/getMachineId-win-YZ36S7VA.js.map +0 -1
- package/dist/interactive-2WMVAASS.js.map +0 -1
- package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js +0 -9
- package/dist/otlp-json-file-exporter-RY63S3IG-PZBQPVYY.js.map +0 -1
- package/dist/skills/agentv-eval-writer/references/eval-schema.json +0 -17295
- package/dist/skills/agentv-eval-writer/references/experiment-schema.json +0 -278
- package/dist/src-76ISS3LH.js +0 -1733
- package/dist/src-76ISS3LH.js.map +0 -1
- package/dist/ts-eval-loader-RE43OAGX-AMRCUKBZ.js.map +0 -1
- /package/dist/{agentv-provider-AYXH7WLW-NJRC6UQX.js.map → agentv-provider-AYXH7WLW-6YZKZ7PS.js.map} +0 -0
- /package/dist/{artifact-writer-QD52FC56.js.map → artifact-writer-SN6UNL5G.js.map} +0 -0
- /package/dist/{chunk-RCIEHFQ2.js.map → chunk-PEUTJS7B.js.map} +0 -0
- /package/dist/{chunk-5H446C7X.js.map → chunk-QMRVH5ZP.js.map} +0 -0
- /package/dist/{dist-KJ6PELQY.js.map → dist-DEPJOMCA.js.map} +0 -0
- /package/dist/{docker-workspace-ZJ2ESVBI-6UDETQII.js.map → docker-workspace-NNK4Z6FR-QRTIG6TM.js.map} +0 -0
- /package/dist/{esm-NNMQYIKT.js.map → exec-4HFFRQ3B-AXDMJNLJ.js.map} +0 -0
- /package/dist/{esm-R77SNOF5.js.map → ts-eval-loader-OMG2JBHP-OP5RR7A3.js.map} +0 -0
|
@@ -0,0 +1,1012 @@
|
|
|
1
|
+
# AgentV Eval YAML Breaking Changes From v4.42.4
|
|
2
|
+
|
|
3
|
+
This reference is for migrating eval YAML authored against AgentV v4.42.4 to
|
|
4
|
+
the current schema. It is intentionally migration-specific: each section states
|
|
5
|
+
the v4.42.4-era shape, the current shape, migration steps, verification, and
|
|
6
|
+
compatibility notes.
|
|
7
|
+
|
|
8
|
+
Evidence audited for this guide:
|
|
9
|
+
|
|
10
|
+
- v4.42.4 docs under `apps/web/src/content/docs/docs/v4.42.4/`.
|
|
11
|
+
- Current docs under `apps/web/src/content/docs/docs/next/`.
|
|
12
|
+
- v4.42.4 source from the local `v4.42.4` git tag.
|
|
13
|
+
- Current parser, validator, and schema code in `packages/core/src/evaluation/`.
|
|
14
|
+
|
|
15
|
+
Use the current clone as the final source of truth. Do not claim a migration is
|
|
16
|
+
required only because the current docs prefer a newer convention; require it
|
|
17
|
+
only when the current schema, validator, or loader rejects the old shape or the
|
|
18
|
+
old shape no longer means the same thing.
|
|
19
|
+
|
|
20
|
+
## Quick Migration Checklist
|
|
21
|
+
|
|
22
|
+
For a v4.42.4-era eval:
|
|
23
|
+
|
|
24
|
+
1. Move top-level `execution.target` to top-level `target`.
|
|
25
|
+
2. Move top-level `execution.targets` to top-level `targets`, and rename target
|
|
26
|
+
object `name` to `label`.
|
|
27
|
+
3. Rename suite/test/turn `assertions` to `assert`.
|
|
28
|
+
4. If a test uses `tests[].execution.assertions` or
|
|
29
|
+
`tests[].execution.evaluators`, rename that nested list to
|
|
30
|
+
`tests[].execution.assert`; prefer top-level or per-test `assert` for normal
|
|
31
|
+
grader authoring.
|
|
32
|
+
5. Replace `type: rubrics` or `type: rubric` with `type: llm-rubric` and move
|
|
33
|
+
rubric arrays from `criteria`/`rubrics` to `value`.
|
|
34
|
+
6. Replace `type: code-grader` and `type: code-judge` with `type: script`.
|
|
35
|
+
7. Move repeat/trial policy from `execution.trials` to
|
|
36
|
+
`evaluate_options.repeat`.
|
|
37
|
+
8. Move suite budget from `execution.budget_usd` to
|
|
38
|
+
`evaluate_options.budget_usd`.
|
|
39
|
+
9. Move authored suite concurrency from `execution.workers` or
|
|
40
|
+
`execution.max_concurrency` to `evaluate_options.max_concurrency`, or leave
|
|
41
|
+
it to `--workers` / project config if it is operator policy.
|
|
42
|
+
10. Remove top-level `execution`; current eval YAML rejects it.
|
|
43
|
+
11. Move authored coding-agent testbed setup from public `workspace` fields to
|
|
44
|
+
`environment`.
|
|
45
|
+
12. Remove `workspace.mode` and `workspace.path` from committed eval YAML.
|
|
46
|
+
Use `--workspace-path` or `.agentv/config.local.yaml` for local static
|
|
47
|
+
directories.
|
|
48
|
+
13. Move lifecycle hooks to top-level `extensions`.
|
|
49
|
+
14. Put reset policy and portable testbed setup under `environment`; keep
|
|
50
|
+
provider environment overrides under top-level `env`.
|
|
51
|
+
15. Replace authored `preprocessors` and deprecated Promptfoo `postprocess`
|
|
52
|
+
with `transform` at `default_test.options`, `tests[].options`, or the
|
|
53
|
+
assertion that needs the shaped output.
|
|
54
|
+
16. Keep raw cases under `tests` / `tests: file://...`; run full eval suites
|
|
55
|
+
directly with CLI multi-file selection and tags.
|
|
56
|
+
17. Validate with `bun apps/cli/src/cli.ts validate <eval-file>`.
|
|
57
|
+
|
|
58
|
+
## Assertions Renamed To `assert`
|
|
59
|
+
|
|
60
|
+
### v4.42.4 Shape
|
|
61
|
+
|
|
62
|
+
v4.42.4 docs and schema used `assertions` for suite-level and per-test graders:
|
|
63
|
+
|
|
64
|
+
```yaml
|
|
65
|
+
assertions:
|
|
66
|
+
- name: correctness
|
|
67
|
+
type: llm-grader
|
|
68
|
+
prompt: ./graders/correctness.md
|
|
69
|
+
|
|
70
|
+
tests:
|
|
71
|
+
- id: addition
|
|
72
|
+
criteria: Correctly calculates 15 + 27 = 42
|
|
73
|
+
input: What is 15 + 27?
|
|
74
|
+
expected_output: "42"
|
|
75
|
+
assertions:
|
|
76
|
+
- type: contains
|
|
77
|
+
value: "42"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
v4.42.4 also accepted `execution.assertions`, `execution.evaluators`, and
|
|
81
|
+
case-level `evaluators` as legacy grader lists.
|
|
82
|
+
|
|
83
|
+
### Current Shape
|
|
84
|
+
|
|
85
|
+
Current eval YAML uses `assert`:
|
|
86
|
+
|
|
87
|
+
```yaml
|
|
88
|
+
assert:
|
|
89
|
+
- name: correctness
|
|
90
|
+
type: llm-rubric
|
|
91
|
+
prompt: ./graders/correctness.md
|
|
92
|
+
|
|
93
|
+
tests:
|
|
94
|
+
- id: addition
|
|
95
|
+
input: What is 15 + 27?
|
|
96
|
+
expected_output: "42"
|
|
97
|
+
assert:
|
|
98
|
+
- type: contains
|
|
99
|
+
value: "42"
|
|
100
|
+
- Correctly calculates the answer
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Current `EvalFileSchema` has top-level `assert` and test-level `assert`; it
|
|
104
|
+
does not define top-level or test-level `assertions`. Current parser code reads
|
|
105
|
+
case `assert` and `execution.assert`; assertion template files are expected to
|
|
106
|
+
contain top-level `assert`.
|
|
107
|
+
|
|
108
|
+
### Migration Steps
|
|
109
|
+
|
|
110
|
+
- Rename top-level `assertions:` to `assert:`.
|
|
111
|
+
- Rename every test-level `assertions:` to `assert:`.
|
|
112
|
+
- Rename conversation turn `assertions:` to `assert:`.
|
|
113
|
+
- Rename assertion template files from:
|
|
114
|
+
|
|
115
|
+
```yaml
|
|
116
|
+
assertions:
|
|
117
|
+
- type: is-json
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
to:
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
assert:
|
|
124
|
+
- type: is-json
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
- Replace `evaluators:` with `assert:`.
|
|
128
|
+
- If a test had `execution.skip_defaults: true`, keep it; that flag still
|
|
129
|
+
controls whether suite-level defaults are appended.
|
|
130
|
+
|
|
131
|
+
### Verification
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
135
|
+
rg -n "assertions:|evaluators:" path/to/evals path/to/.agentv/templates
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Compatibility Notes
|
|
139
|
+
|
|
140
|
+
Result artifacts and grader stdout still contain `assertions` arrays. Do not
|
|
141
|
+
rename result JSON or script-grader output fields to `assert`; this migration is
|
|
142
|
+
for authored eval YAML and assertion template YAML.
|
|
143
|
+
|
|
144
|
+
`criteria` remains a valid optional case field, but it is no longer the
|
|
145
|
+
preferred way to express the whole semantic contract. Put actual grading checks
|
|
146
|
+
in `assert`, usually as plain strings.
|
|
147
|
+
|
|
148
|
+
## `criteria` Is Optional, Reference Answers Live In Vars
|
|
149
|
+
|
|
150
|
+
### v4.42.4 Shape
|
|
151
|
+
|
|
152
|
+
v4.42.4 docs treated `criteria` as required. Older AgentV YAML also allowed
|
|
153
|
+
`expected_output` as a sibling field on test cases:
|
|
154
|
+
|
|
155
|
+
```yaml
|
|
156
|
+
tests:
|
|
157
|
+
- id: simple-eval
|
|
158
|
+
criteria: Assistant correctly explains the bug and proposes a fix
|
|
159
|
+
input: "Debug this function..."
|
|
160
|
+
expected_output: The answer explains the root cause and fix.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Current Shape
|
|
164
|
+
|
|
165
|
+
Current docs and schema make `criteria` optional. Authored graders live under
|
|
166
|
+
`assert`. Plain strings in `assert` become an `llm-rubric` check.
|
|
167
|
+
Promptfoo-aligned reference answers live in `vars.expected_output`, and only
|
|
168
|
+
affect grading when an explicit assertion consumes them.
|
|
169
|
+
|
|
170
|
+
```yaml
|
|
171
|
+
default_test:
|
|
172
|
+
assert:
|
|
173
|
+
- type: llm-rubric
|
|
174
|
+
value: "Matches the reference answer: {{ expected_output }}"
|
|
175
|
+
prompts:
|
|
176
|
+
- "{{ input }}"
|
|
177
|
+
tests:
|
|
178
|
+
- id: simple-eval
|
|
179
|
+
vars:
|
|
180
|
+
input: "Debug this function..."
|
|
181
|
+
expected_output: The answer explains the root cause and fix.
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Migration Steps
|
|
185
|
+
|
|
186
|
+
- If old `criteria` is the only grading contract, move or copy it into
|
|
187
|
+
`assert` as one or more plain strings.
|
|
188
|
+
- Keep `criteria` only when multiple graders need shared context that is not
|
|
189
|
+
itself the asserted checklist.
|
|
190
|
+
- Move `tests[].expected_output` or `default_test.expected_output` to
|
|
191
|
+
`vars.expected_output`.
|
|
192
|
+
- Add or keep an explicit assertion strategy. Use `llm-rubric` with
|
|
193
|
+
`{{ expected_output }}` for semantic reference-answer checks, or deterministic
|
|
194
|
+
assertion `value: "{{ expected_output }}"` when the grader type compares a
|
|
195
|
+
concrete value.
|
|
196
|
+
|
|
197
|
+
### Verification
|
|
198
|
+
|
|
199
|
+
```bash
|
|
200
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
201
|
+
rg -n "expected_output:" path/to/evals
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
For any remaining `criteria`, confirm it is shared grader context and not a
|
|
205
|
+
duplicate of `assert`.
|
|
206
|
+
|
|
207
|
+
### Compatibility Notes
|
|
208
|
+
|
|
209
|
+
Current runtime still carries `EvalTest.criteria` internally because prompt
|
|
210
|
+
templates and custom graders can consume it. The breaking authoring change is
|
|
211
|
+
that workers should not depend on missing `assert` plus `criteria` to define
|
|
212
|
+
the whole grading contract for new migrated YAML.
|
|
213
|
+
|
|
214
|
+
## Authored `input` Moved To `prompts` Plus Vars
|
|
215
|
+
|
|
216
|
+
### v4.42.4 Shape
|
|
217
|
+
|
|
218
|
+
Older AgentV eval YAML allowed top-level `input` and inline `tests[].input` as
|
|
219
|
+
the public task authoring surface:
|
|
220
|
+
|
|
221
|
+
```yaml
|
|
222
|
+
input: Read AGENTS.md before answering.
|
|
223
|
+
|
|
224
|
+
tests:
|
|
225
|
+
- id: addition
|
|
226
|
+
input: What is 15 + 27?
|
|
227
|
+
assert:
|
|
228
|
+
- type: contains
|
|
229
|
+
value: "42"
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Current Shape
|
|
233
|
+
|
|
234
|
+
Current normal eval YAML uses top-level `prompts` rendered with
|
|
235
|
+
`default_test.vars` and `tests[].vars`:
|
|
236
|
+
|
|
237
|
+
```yaml
|
|
238
|
+
prompts:
|
|
239
|
+
- - role: system
|
|
240
|
+
content: "{{ system_instruction }}"
|
|
241
|
+
- role: user
|
|
242
|
+
content: "{{ question }}"
|
|
243
|
+
|
|
244
|
+
default_test:
|
|
245
|
+
vars:
|
|
246
|
+
system_instruction: Read AGENTS.md before answering.
|
|
247
|
+
|
|
248
|
+
tests:
|
|
249
|
+
- id: addition
|
|
250
|
+
vars:
|
|
251
|
+
question: What is 15 + 27?
|
|
252
|
+
assert:
|
|
253
|
+
- type: contains
|
|
254
|
+
value: "42"
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### Migration Steps
|
|
258
|
+
|
|
259
|
+
- Replace simple top-level `input: <text>` with a prompt entry or
|
|
260
|
+
`default_test.vars.system_instruction` rendered from a chat prompt.
|
|
261
|
+
- Replace simple `tests[].input: <text>` with `tests[].vars.input: <text>` and
|
|
262
|
+
a top-level prompt such as `"{{ input }}"` or `"{{ vars.input }}"`.
|
|
263
|
+
- Replace message-array input with a top-level chat prompt entry. Move any
|
|
264
|
+
per-row values into `tests[].vars` and render them from the message content.
|
|
265
|
+
- Replace `input_files` plus string input with a chat prompt content array that
|
|
266
|
+
contains `{type: file, value: "{{ file_path }}"}` and a text block. Store file
|
|
267
|
+
paths in `default_test.vars` or `tests[].vars`.
|
|
268
|
+
- Keep `input` only in external raw-case files imported through
|
|
269
|
+
`tests: file://...` when preserving existing raw datasets.
|
|
270
|
+
Do not copy that compatibility shape back into normal eval YAML.
|
|
271
|
+
|
|
272
|
+
### Verification
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
276
|
+
rg -n "^[[:space:]]*input:|input_files:" path/to/evals
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Compatibility Notes
|
|
280
|
+
|
|
281
|
+
The runtime `EvalTest.input` representation remains internal after prompts are
|
|
282
|
+
rendered. External raw-case loaders may still ingest `input` rows for imported
|
|
283
|
+
datasets, but authored eval YAML now hard-errors on top-level `input` and inline
|
|
284
|
+
`tests[].input`.
|
|
285
|
+
|
|
286
|
+
## Top-Level `execution` Removed From Eval YAML
|
|
287
|
+
|
|
288
|
+
### v4.42.4 Shape
|
|
289
|
+
|
|
290
|
+
v4.42.4 docs used top-level `execution` for target selection, workers, error
|
|
291
|
+
tolerance, thresholds, budgets, trials, and suite-level graders:
|
|
292
|
+
|
|
293
|
+
```yaml
|
|
294
|
+
execution:
|
|
295
|
+
target: azure-base
|
|
296
|
+
workers: 4
|
|
297
|
+
fail_on_error: false
|
|
298
|
+
threshold: 0.8
|
|
299
|
+
budget_usd: 2.00
|
|
300
|
+
trials:
|
|
301
|
+
count: 3
|
|
302
|
+
strategy: pass_at_k
|
|
303
|
+
|
|
304
|
+
assertions:
|
|
305
|
+
- type: contains
|
|
306
|
+
value: READY
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Current Shape
|
|
310
|
+
|
|
311
|
+
Current eval YAML rejects top-level `execution`. Move run controls to their
|
|
312
|
+
dedicated fields:
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
target: azure-base
|
|
316
|
+
threshold: 0.8
|
|
317
|
+
evaluate_options:
|
|
318
|
+
max_concurrency: 4
|
|
319
|
+
budget_usd: 2.00
|
|
320
|
+
repeat:
|
|
321
|
+
count: 3
|
|
322
|
+
strategy: pass_any
|
|
323
|
+
|
|
324
|
+
assert:
|
|
325
|
+
- type: contains
|
|
326
|
+
value: READY
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Migration Steps
|
|
330
|
+
|
|
331
|
+
- `execution.target` -> top-level `target`.
|
|
332
|
+
- `execution.targets` -> top-level `targets`.
|
|
333
|
+
- `execution.threshold` -> top-level `threshold`.
|
|
334
|
+
- `execution.budget_usd` -> `evaluate_options.budget_usd`.
|
|
335
|
+
- `execution.workers` and `execution.max_concurrency` ->
|
|
336
|
+
`evaluate_options.max_concurrency` when authored suite concurrency is part of
|
|
337
|
+
the eval. If it is operator policy, use `--workers` or `.agentv/config.yaml`
|
|
338
|
+
/ `agentv.config.*` `execution.max_concurrency` instead.
|
|
339
|
+
- `execution.fail_on_error` has no current eval-YAML home. Treat it as
|
|
340
|
+
operational policy; do not commit it into migrated eval YAML.
|
|
341
|
+
- `execution.cache` has no current eval-YAML home. Use project/operator config
|
|
342
|
+
if cache policy is needed.
|
|
343
|
+
- Delete top-level `execution` after moving supported fields.
|
|
344
|
+
|
|
345
|
+
### Verification
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
349
|
+
rg -n "^execution:|fail_on_error:|cache:" path/to/evals
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### Compatibility Notes
|
|
353
|
+
|
|
354
|
+
Per-test `execution` still exists, but it is narrow: current schema allows
|
|
355
|
+
case-level `execution.assert`, `skip_defaults`, cache/fail fields, budget, and
|
|
356
|
+
threshold, while target selection belongs at top level or CLI. Do not keep
|
|
357
|
+
target selection under `tests[].execution.target` when migrating.
|
|
358
|
+
|
|
359
|
+
## Repeat Policy Replaces `trials`, `runs`, And `early_exit`
|
|
360
|
+
|
|
361
|
+
### v4.42.4 Shape
|
|
362
|
+
|
|
363
|
+
v4.42.4 used `execution.trials` with strategies such as `pass_at_k`:
|
|
364
|
+
|
|
365
|
+
```yaml
|
|
366
|
+
execution:
|
|
367
|
+
trials:
|
|
368
|
+
count: 3
|
|
369
|
+
strategy: pass_at_k
|
|
370
|
+
cost_limit_usd: 1.00
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
Some stale evals from later intermediate branches may instead have top-level
|
|
374
|
+
`runs`, `repeat`, or `early_exit`.
|
|
375
|
+
|
|
376
|
+
### Current Shape
|
|
377
|
+
|
|
378
|
+
Current authoring uses `evaluate_options.repeat`:
|
|
379
|
+
|
|
380
|
+
```yaml
|
|
381
|
+
evaluate_options:
|
|
382
|
+
repeat:
|
|
383
|
+
count: 3
|
|
384
|
+
strategy: pass_any
|
|
385
|
+
early_exit: true
|
|
386
|
+
cost_limit_usd: 1.00
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
The shorthand is also accepted:
|
|
390
|
+
|
|
391
|
+
```yaml
|
|
392
|
+
evaluate_options:
|
|
393
|
+
repeat: 3
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
### Migration Steps
|
|
397
|
+
|
|
398
|
+
- `execution.trials.count` -> `evaluate_options.repeat.count`.
|
|
399
|
+
- `execution.trials.strategy: pass_at_k` -> `pass_any`.
|
|
400
|
+
- `execution.trials.strategy: mean` -> `mean`.
|
|
401
|
+
- `execution.trials.strategy: confidence_interval` -> `confidence_interval`.
|
|
402
|
+
- `execution.trials.cost_limit_usd` -> `evaluate_options.repeat.cost_limit_usd`.
|
|
403
|
+
- Top-level `runs` -> `evaluate_options.repeat.count`.
|
|
404
|
+
- Top-level `repeat` -> `evaluate_options.repeat`.
|
|
405
|
+
- Top-level `early_exit` -> `evaluate_options.repeat.early_exit`.
|
|
406
|
+
|
|
407
|
+
### Verification
|
|
408
|
+
|
|
409
|
+
```bash
|
|
410
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
411
|
+
rg -n "trials:|pass_at_k|^runs:|^repeat:|^early_exit:" path/to/evals
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
### Compatibility Notes
|
|
415
|
+
|
|
416
|
+
Runtime types and some result artifacts still use the internal word `trials`.
|
|
417
|
+
Authored YAML should use `repeat`; produced executions are attempts.
|
|
418
|
+
|
|
419
|
+
## `experiment` Is A Label, Not A Runtime Container
|
|
420
|
+
|
|
421
|
+
### v4.42.4 Shape
|
|
422
|
+
|
|
423
|
+
v4.42.4 public eval docs did not use a top-level `experiment` object for eval
|
|
424
|
+
runtime policy; runtime policy lived mostly under top-level `execution`. Some
|
|
425
|
+
stale evals from later development snapshots may have an object like:
|
|
426
|
+
|
|
427
|
+
```yaml
|
|
428
|
+
experiment:
|
|
429
|
+
target: codex
|
|
430
|
+
model: gpt-5
|
|
431
|
+
runs: 3
|
|
432
|
+
timeout_seconds: 600
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### Current Shape
|
|
436
|
+
|
|
437
|
+
Current schema accepts top-level `experiment` only as a non-empty string run
|
|
438
|
+
grouping label. Current docs also support promptfoo-shaped `tags.experiment`.
|
|
439
|
+
|
|
440
|
+
```yaml
|
|
441
|
+
experiment: with-skills
|
|
442
|
+
target: codex
|
|
443
|
+
timeout_seconds: 600
|
|
444
|
+
evaluate_options:
|
|
445
|
+
repeat:
|
|
446
|
+
count: 3
|
|
447
|
+
strategy: pass_any
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
or:
|
|
451
|
+
|
|
452
|
+
```yaml
|
|
453
|
+
tags:
|
|
454
|
+
experiment: with-skills
|
|
455
|
+
target: codex
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Migration Steps
|
|
459
|
+
|
|
460
|
+
- If `experiment` is an object, move runtime fields out:
|
|
461
|
+
- target identity -> top-level `target` or `targets`
|
|
462
|
+
- repeat/runs -> `evaluate_options.repeat`
|
|
463
|
+
- budget -> `evaluate_options.budget_usd`
|
|
464
|
+
- timeout -> top-level `timeout_seconds`
|
|
465
|
+
- threshold -> top-level `threshold`
|
|
466
|
+
- Keep only a string label in `experiment`, or use `tags.experiment`.
|
|
467
|
+
|
|
468
|
+
### Verification
|
|
469
|
+
|
|
470
|
+
```bash
|
|
471
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
472
|
+
rg -n "^experiment:" path/to/evals
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
### Compatibility Notes
|
|
476
|
+
|
|
477
|
+
Do not describe a v4.42.4 eval as if `experiment:` was already the main runtime
|
|
478
|
+
object unless you verified that exact file or commit. For v4.42.4 migrations,
|
|
479
|
+
the common source shape is `execution:`.
|
|
480
|
+
|
|
481
|
+
## Workspace Lifetime: `isolation` To `scope`
|
|
482
|
+
|
|
483
|
+
### v4.42.4 Shape
|
|
484
|
+
|
|
485
|
+
v4.42.4 workspace docs used `isolation`:
|
|
486
|
+
|
|
487
|
+
```yaml
|
|
488
|
+
workspace:
|
|
489
|
+
repos:
|
|
490
|
+
- path: ./repo
|
|
491
|
+
repo: org/repo
|
|
492
|
+
commit: main
|
|
493
|
+
hooks:
|
|
494
|
+
after_each:
|
|
495
|
+
reset: fast
|
|
496
|
+
isolation: shared # shared | per_test
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
### Current Shape
|
|
500
|
+
|
|
501
|
+
Current workspace docs and schema use `scope`:
|
|
502
|
+
|
|
503
|
+
```yaml
|
|
504
|
+
workspace:
|
|
505
|
+
repos:
|
|
506
|
+
- path: ./repo
|
|
507
|
+
repo: org/repo
|
|
508
|
+
commit: main
|
|
509
|
+
hooks:
|
|
510
|
+
after_each:
|
|
511
|
+
reset: fast
|
|
512
|
+
scope: suite # suite | attempt
|
|
513
|
+
```
|
|
514
|
+
|
|
515
|
+
### Migration Steps
|
|
516
|
+
|
|
517
|
+
- `workspace.isolation: shared` -> `workspace.scope: suite`.
|
|
518
|
+
- `workspace.isolation: per_test` -> `workspace.scope: attempt`.
|
|
519
|
+
- If `isolation` is omitted, preserve behavior by omitting `scope` or setting
|
|
520
|
+
`scope: suite`.
|
|
521
|
+
|
|
522
|
+
### Verification
|
|
523
|
+
|
|
524
|
+
```bash
|
|
525
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
526
|
+
rg -n "isolation:" path/to/evals
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
### Compatibility Notes
|
|
530
|
+
|
|
531
|
+
`scope: attempt` means a clean workspace for each resolved execution attempt:
|
|
532
|
+
prompt/target/test/repeat expansion. Docker configuration does not replace
|
|
533
|
+
workspace lifetime; use `workspace.scope` even when `workspace.docker` exists.
|
|
534
|
+
|
|
535
|
+
## Local Workspace Modes Removed From Eval YAML
|
|
536
|
+
|
|
537
|
+
### v4.42.4 Shape
|
|
538
|
+
|
|
539
|
+
v4.42.4 workspace docs allowed `mode` and `path`:
|
|
540
|
+
|
|
541
|
+
```yaml
|
|
542
|
+
workspace:
|
|
543
|
+
mode: static # pooled | temp | static
|
|
544
|
+
path: /tmp/my-ws
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### Current Shape
|
|
548
|
+
|
|
549
|
+
Current committed eval YAML must keep portable workspace setup under
|
|
550
|
+
`workspace` and put machine-local existing directories outside the eval:
|
|
551
|
+
|
|
552
|
+
```yaml
|
|
553
|
+
workspace:
|
|
554
|
+
repos:
|
|
555
|
+
- path: ./repo
|
|
556
|
+
repo: org/repo
|
|
557
|
+
commit: main
|
|
558
|
+
scope: suite
|
|
559
|
+
```
|
|
560
|
+
|
|
561
|
+
One-off local binding:
|
|
562
|
+
|
|
563
|
+
```bash
|
|
564
|
+
bun apps/cli/src/cli.ts eval path/to/eval.eval.yaml --workspace-path /tmp/my-ws
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
Persistent local binding:
|
|
568
|
+
|
|
569
|
+
```yaml
|
|
570
|
+
# .agentv/config.local.yaml
|
|
571
|
+
execution:
|
|
572
|
+
workspace_path: /tmp/my-ws
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
### Migration Steps
|
|
576
|
+
|
|
577
|
+
- Remove `workspace.mode`.
|
|
578
|
+
- Remove `workspace.path`, `workspace.static_path`, `workspace.static`, and
|
|
579
|
+
`workspace.pool` if present.
|
|
580
|
+
- Convert portable setup to `workspace.template`, `workspace.repos`,
|
|
581
|
+
`workspace.hooks.after_each.reset`, `workspace.env`, and `workspace.scope`.
|
|
582
|
+
- Put existing local paths in `--workspace-path` or `.agentv/config.local.yaml`.
|
|
583
|
+
|
|
584
|
+
### Verification
|
|
585
|
+
|
|
586
|
+
```bash
|
|
587
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
588
|
+
rg -n "workspace:|mode:|path:|static_path:|pool:" path/to/evals
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Inspect matches manually because `repos[].path` is still valid.
|
|
592
|
+
|
|
593
|
+
### Compatibility Notes
|
|
594
|
+
|
|
595
|
+
Current project config intentionally strips `execution.workspace_path` from
|
|
596
|
+
committed `.agentv/config.yaml`; it is only supported in `config.local.yaml`.
|
|
597
|
+
|
|
598
|
+
## Workspace Hooks And Lifecycle Extensions
|
|
599
|
+
|
|
600
|
+
### v4.42.4 Shape
|
|
601
|
+
|
|
602
|
+
v4.42.4 workspace hooks allowed `command` and `script` fields, and docs used
|
|
603
|
+
workspace hooks for executable setup:
|
|
604
|
+
|
|
605
|
+
```yaml
|
|
606
|
+
workspace:
|
|
607
|
+
hooks:
|
|
608
|
+
before_all:
|
|
609
|
+
script: ["bun", "run", "setup.ts"]
|
|
610
|
+
after_each:
|
|
611
|
+
command: ["bun", "run", "reset.ts"]
|
|
612
|
+
reset: fast
|
|
613
|
+
```
|
|
614
|
+
|
|
615
|
+
### Current Shape
|
|
616
|
+
|
|
617
|
+
Current hook configs reject `script`; use `command`. Current docs prefer
|
|
618
|
+
top-level `extensions` for executable setup and keep
|
|
619
|
+
`workspace.hooks.after_each.reset` for reset policy:
|
|
620
|
+
|
|
621
|
+
```yaml
|
|
622
|
+
extensions:
|
|
623
|
+
- file://scripts/setup.mjs:beforeAll
|
|
624
|
+
|
|
625
|
+
workspace:
|
|
626
|
+
hooks:
|
|
627
|
+
after_each:
|
|
628
|
+
reset: fast
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
Legacy command hooks still parse for existing suites when they use `command`:
|
|
632
|
+
|
|
633
|
+
```yaml
|
|
634
|
+
workspace:
|
|
635
|
+
hooks:
|
|
636
|
+
before_all:
|
|
637
|
+
command: ["bun", "run", "setup.ts"]
|
|
638
|
+
```
|
|
639
|
+
|
|
640
|
+
### Migration Steps
|
|
641
|
+
|
|
642
|
+
- Rename any hook `script:` field to `command:`.
|
|
643
|
+
- Prefer moving setup/fixture/build/install commands to top-level
|
|
644
|
+
`extensions`.
|
|
645
|
+
- Keep `workspace.hooks.after_each.reset` for `none`, `fast`, or `strict`.
|
|
646
|
+
- Extension file references must use `file://path/to/hook.ts:beforeAll` style
|
|
647
|
+
and a Promptfoo-compatible hook name: `beforeAll`, `beforeEach`,
|
|
648
|
+
`afterEach`, or `afterAll`.
|
|
649
|
+
|
|
650
|
+
### Verification
|
|
651
|
+
|
|
652
|
+
```bash
|
|
653
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
654
|
+
rg -n "script:|extensions:" path/to/evals
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
### Compatibility Notes
|
|
658
|
+
|
|
659
|
+
`workspace.hooks` and `target.hooks` use snake_case lifecycle keys such as
|
|
660
|
+
`before_all`; top-level `extensions` use Promptfoo-compatible camel-case hook
|
|
661
|
+
suffixes in `file://...:beforeAll`.
|
|
662
|
+
|
|
663
|
+
## Repository Entries Are Provenance Only
|
|
664
|
+
|
|
665
|
+
### v4.42.4 Shape
|
|
666
|
+
|
|
667
|
+
v4.42.4 documented `workspace.repos[].repo`, `commit`, `base_commit`,
|
|
668
|
+
`ancestor`, and `sparse` as repo provenance. Treat `base_commit` as a legacy
|
|
669
|
+
authoring alias during migration; normalize it to `commit` instead of carrying
|
|
670
|
+
it forward. The v4.42.4 parser rejected some acquisition fields such as
|
|
671
|
+
`source`, `checkout`, and `clone`.
|
|
672
|
+
|
|
673
|
+
### Current Shape
|
|
674
|
+
|
|
675
|
+
Current parser continues to keep acquisition out of eval YAML and additionally
|
|
676
|
+
rejects `type`, `resolve`, and `resolver`:
|
|
677
|
+
|
|
678
|
+
```yaml
|
|
679
|
+
workspace:
|
|
680
|
+
repos:
|
|
681
|
+
- path: ./repo
|
|
682
|
+
repo: org/repo
|
|
683
|
+
commit: abc123def
|
|
684
|
+
ancestor: 1
|
|
685
|
+
sparse:
|
|
686
|
+
- packages/core
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### Migration Steps
|
|
690
|
+
|
|
691
|
+
- `workspace.repos[].source` -> `workspace.repos[].repo`.
|
|
692
|
+
- `workspace.repos[].checkout.ref` or similar -> `commit`.
|
|
693
|
+
- `workspace.repos[].base_commit` -> `commit`.
|
|
694
|
+
- `workspace.repos[].clone.sparse` -> top-level `sparse`.
|
|
695
|
+
- Remove `type`, `resolve`, and `resolver` from repo entries.
|
|
696
|
+
- Configure acquisition policy in repo resolver/project config, not in eval
|
|
697
|
+
YAML.
|
|
698
|
+
|
|
699
|
+
### Verification
|
|
700
|
+
|
|
701
|
+
```bash
|
|
702
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
703
|
+
rg -n "source:|checkout:|clone:|base_commit:|type:|resolve:|resolver:" path/to/evals
|
|
704
|
+
```
|
|
705
|
+
|
|
706
|
+
Inspect `type:` matches manually because grader entries still use `type`.
|
|
707
|
+
|
|
708
|
+
### Compatibility Notes
|
|
709
|
+
|
|
710
|
+
`repos[].path` remains valid and means the target directory inside the
|
|
711
|
+
materialized workspace. It is not the removed local `workspace.path`.
|
|
712
|
+
Current eval YAML accepts a single checkout pin field, `commit`, so workers
|
|
713
|
+
should not preserve a second spelling in examples or generated evals.
|
|
714
|
+
|
|
715
|
+
## Target And Runtime Separation
|
|
716
|
+
|
|
717
|
+
### v4.42.4 Shape
|
|
718
|
+
|
|
719
|
+
v4.42.4 docs selected targets under `execution` and used `name` in target
|
|
720
|
+
objects:
|
|
721
|
+
|
|
722
|
+
```yaml
|
|
723
|
+
execution:
|
|
724
|
+
target: azure-base
|
|
725
|
+
targets:
|
|
726
|
+
- baseline
|
|
727
|
+
- name: with-skills
|
|
728
|
+
use_target: default
|
|
729
|
+
hooks:
|
|
730
|
+
before_each:
|
|
731
|
+
command: ["setup-plugins.sh", "skills"]
|
|
732
|
+
```
|
|
733
|
+
|
|
734
|
+
v4.42.4 `.agentv/targets.yaml` examples also used `name` and provider settings
|
|
735
|
+
as top-level target fields:
|
|
736
|
+
|
|
737
|
+
```yaml
|
|
738
|
+
targets:
|
|
739
|
+
- name: azure-base
|
|
740
|
+
provider: azure
|
|
741
|
+
endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
|
|
742
|
+
api_key: ${{ AZURE_OPENAI_API_KEY }}
|
|
743
|
+
model: ${{ AZURE_DEPLOYMENT_NAME }}
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
### Current Shape
|
|
747
|
+
|
|
748
|
+
Current eval YAML uses top-level `target` or `targets`. Target references use
|
|
749
|
+
`label`; `id` is reserved for provider/backend identity when needed:
|
|
750
|
+
|
|
751
|
+
```yaml
|
|
752
|
+
target: azure-base
|
|
753
|
+
|
|
754
|
+
targets:
|
|
755
|
+
- label: with-skills
|
|
756
|
+
use_target: default
|
|
757
|
+
hooks:
|
|
758
|
+
before_each:
|
|
759
|
+
command: ["setup-plugins.sh", "skills"]
|
|
760
|
+
```
|
|
761
|
+
|
|
762
|
+
Current `.agentv/targets.yaml` uses `label` and nests provider settings under
|
|
763
|
+
`config`:
|
|
764
|
+
|
|
765
|
+
```yaml
|
|
766
|
+
targets:
|
|
767
|
+
- label: azure-base
|
|
768
|
+
provider: azure
|
|
769
|
+
config:
|
|
770
|
+
endpoint: ${{ AZURE_OPENAI_ENDPOINT }}
|
|
771
|
+
api_key: ${{ AZURE_OPENAI_API_KEY }}
|
|
772
|
+
model: ${{ AZURE_DEPLOYMENT_NAME }}
|
|
773
|
+
```
|
|
774
|
+
|
|
775
|
+
### Migration Steps
|
|
776
|
+
|
|
777
|
+
- Eval YAML: `execution.target` -> top-level `target`.
|
|
778
|
+
- Eval YAML: `execution.targets` -> top-level `targets`.
|
|
779
|
+
- Eval target object `name` -> `label`.
|
|
780
|
+
- If an eval-local target object has provider configuration, include a
|
|
781
|
+
`label`; use `extends` to derive from a base target.
|
|
782
|
+
- Targets file: rename `name` to `label` and move provider-specific settings
|
|
783
|
+
into `config`.
|
|
784
|
+
- Keep AgentV target extensions such as `grader_target`, `use_target`,
|
|
785
|
+
`fallback_targets`, `workers`, and `batch_requests` as top-level fields on
|
|
786
|
+
target objects.
|
|
787
|
+
|
|
788
|
+
### Verification
|
|
789
|
+
|
|
790
|
+
```bash
|
|
791
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
792
|
+
bun apps/cli/src/cli.ts validate .agentv/targets.yaml
|
|
793
|
+
rg -n "execution:|name:|endpoint:|api_key:|model:" path/to/evals .agentv/targets.yaml
|
|
794
|
+
```
|
|
795
|
+
|
|
796
|
+
Inspect `name:` matches manually because grader names still exist.
|
|
797
|
+
|
|
798
|
+
### Compatibility Notes
|
|
799
|
+
|
|
800
|
+
Do not put target selection in test cases when migrating. Split
|
|
801
|
+
target-specific cases into separate eval suites, use tags/filters, or run the
|
|
802
|
+
same eval with different `--target` values.
|
|
803
|
+
|
|
804
|
+
## Grader Type And Rubric Shape Changes
|
|
805
|
+
|
|
806
|
+
### v4.42.4 Shape
|
|
807
|
+
|
|
808
|
+
v4.42.4 docs used:
|
|
809
|
+
|
|
810
|
+
```yaml
|
|
811
|
+
assertions:
|
|
812
|
+
- type: rubrics
|
|
813
|
+
criteria:
|
|
814
|
+
- id: accuracy
|
|
815
|
+
outcome: Correctly identifies the denied party
|
|
816
|
+
weight: 5
|
|
817
|
+
|
|
818
|
+
- type: code-grader
|
|
819
|
+
command: ["python", "check.py"]
|
|
820
|
+
```
|
|
821
|
+
|
|
822
|
+
v4.42.4 accepted snake_case grader types such as `is_json`.
|
|
823
|
+
|
|
824
|
+
### Current Shape
|
|
825
|
+
|
|
826
|
+
Current authored grader types are kebab-case. Semantic rubric grading uses
|
|
827
|
+
plain assertion strings or `llm-rubric`:
|
|
828
|
+
|
|
829
|
+
```yaml
|
|
830
|
+
assert:
|
|
831
|
+
- type: llm-rubric
|
|
832
|
+
value:
|
|
833
|
+
- id: accuracy
|
|
834
|
+
outcome: Correctly identifies the denied party
|
|
835
|
+
weight: 5
|
|
836
|
+
|
|
837
|
+
- type: script
|
|
838
|
+
command: ["python", "check.py"]
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
### Migration Steps
|
|
842
|
+
|
|
843
|
+
- `type: rubrics` or `type: rubric` -> `type: llm-rubric`.
|
|
844
|
+
- `criteria:` / `rubrics:` / `rubric_item:` under `llm-rubric` ->
|
|
845
|
+
`value:`.
|
|
846
|
+
- `type: g-eval` -> `type: llm-rubric`.
|
|
847
|
+
- `type: code-grader`, `code-judge`, `code_grader`, or `code_judge` ->
|
|
848
|
+
`type: script`.
|
|
849
|
+
- `type: llm_judge` or `llm_grader` -> `type: llm-grader`.
|
|
850
|
+
- Convert multi-word snake_case deterministic types to kebab-case:
|
|
851
|
+
`is_json` -> `is-json`, `contains_all` -> `contains-all`,
|
|
852
|
+
`starts_with` -> `starts-with`, and so on.
|
|
853
|
+
|
|
854
|
+
### Verification
|
|
855
|
+
|
|
856
|
+
```bash
|
|
857
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
858
|
+
rg -n "type: (rubrics|rubric|g-eval|code-grader|code-judge|code_grader|code_judge|llm_judge|llm_grader|.*_.*)" path/to/evals
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
### Compatibility Notes
|
|
862
|
+
|
|
863
|
+
Current `grader-parser.ts` contains replacement hints for several removed type
|
|
864
|
+
names, but current schema and generated references are stricter than v4.42.4.
|
|
865
|
+
Migrate authored YAML instead of relying on parser leniency.
|
|
866
|
+
|
|
867
|
+
Script grader output still returns JSON with an `assertions` array; do not
|
|
868
|
+
rename grader output to `assert`.
|
|
869
|
+
|
|
870
|
+
## Prompt File Paths And `file://`
|
|
871
|
+
|
|
872
|
+
### v4.42.4 Shape
|
|
873
|
+
|
|
874
|
+
v4.42.4 LLM grader docs allowed both:
|
|
875
|
+
|
|
876
|
+
```yaml
|
|
877
|
+
assertions:
|
|
878
|
+
- type: llm-grader
|
|
879
|
+
prompt: ./graders/correctness.md
|
|
880
|
+
- type: llm-grader
|
|
881
|
+
prompt: file://graders/correctness.md
|
|
882
|
+
```
|
|
883
|
+
|
|
884
|
+
### Current Shape
|
|
885
|
+
|
|
886
|
+
Current LLM grader docs keep the same prompt path behavior:
|
|
887
|
+
|
|
888
|
+
```yaml
|
|
889
|
+
assert:
|
|
890
|
+
- type: llm-rubric
|
|
891
|
+
prompt: ./graders/correctness.md
|
|
892
|
+
- type: llm-rubric
|
|
893
|
+
prompt: file://graders/correctness.md
|
|
894
|
+
```
|
|
895
|
+
|
|
896
|
+
Other current file-reference surfaces are stricter:
|
|
897
|
+
|
|
898
|
+
```yaml
|
|
899
|
+
extensions:
|
|
900
|
+
- file://scripts/setup.mjs:beforeAll
|
|
901
|
+
|
|
902
|
+
default_test: file://defaults.yaml
|
|
903
|
+
|
|
904
|
+
tests:
|
|
905
|
+
- file://cases.yaml
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
### Migration Steps
|
|
909
|
+
|
|
910
|
+
- Do not add `file://` to ordinary `prompt: ./path.md` only for migration; the
|
|
911
|
+
current prompt resolver still treats path-like strings as file references.
|
|
912
|
+
- Keep `file://` when you need explicit file-reference resolution.
|
|
913
|
+
- Add `file://` for top-level `extensions` entries.
|
|
914
|
+
- Use `file://` or `ref://` for `default_test` string references.
|
|
915
|
+
- In `tests` arrays, use `file://...` for file include entries. A top-level
|
|
916
|
+
`tests: ./cases.yaml` string remains accepted for raw case files.
|
|
917
|
+
|
|
918
|
+
### Verification
|
|
919
|
+
|
|
920
|
+
```bash
|
|
921
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
922
|
+
rg -n "prompt:|extensions:|default_test:|file://" path/to/evals
|
|
923
|
+
```
|
|
924
|
+
|
|
925
|
+
### Compatibility Notes
|
|
926
|
+
|
|
927
|
+
This is partly a non-breaking area: v4.42.4 and current docs both allow
|
|
928
|
+
relative prompt paths. The breaking part is the newer surfaces that require
|
|
929
|
+
`file://`, especially `extensions`.
|
|
930
|
+
|
|
931
|
+
## Imports, Raw Cases, And Suite Ownership
|
|
932
|
+
|
|
933
|
+
### v4.42.4 Shape
|
|
934
|
+
|
|
935
|
+
v4.42.4 eval files used `tests` for inline cases or external raw case files:
|
|
936
|
+
|
|
937
|
+
```yaml
|
|
938
|
+
name: my-eval
|
|
939
|
+
execution:
|
|
940
|
+
target: default
|
|
941
|
+
tests: ./cases.yaml
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
The external file contained raw case rows.
|
|
945
|
+
|
|
946
|
+
### Current Shape
|
|
947
|
+
|
|
948
|
+
Current eval YAML accepts inline `tests`, `tests: ./cases.yaml`, and field-local
|
|
949
|
+
file refs for raw case data. Run multiple full eval suites directly with CLI
|
|
950
|
+
selection and tags:
|
|
951
|
+
|
|
952
|
+
```yaml
|
|
953
|
+
prompts: file://../prompts/refund.yaml
|
|
954
|
+
default_test: file://../defaults/refund.yaml
|
|
955
|
+
tests:
|
|
956
|
+
- file://../cases/refund-smoke.cases.yaml
|
|
957
|
+
- id: local-edge-case
|
|
958
|
+
vars:
|
|
959
|
+
question: Can a final-sale item be refunded after damage in transit?
|
|
960
|
+
assert:
|
|
961
|
+
- Explains the final-sale exception
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
### Migration Steps
|
|
965
|
+
|
|
966
|
+
- Keep `tests: ./cases.yaml` when the file is a raw case array, JSONL, CSV,
|
|
967
|
+
directory, glob, or script-backed dataset.
|
|
968
|
+
- Use `tests: file://...` or string entries inside `tests` for raw rows that run
|
|
969
|
+
in the parent suite context.
|
|
970
|
+
- Run full eval suites directly with CLI multi-file selection and tags. Do not
|
|
971
|
+
add wrapper-suite import semantics.
|
|
972
|
+
- Use `prompts: file://...`, `default_test: file://...`, and
|
|
973
|
+
`environment: file://...` to share reusable config locally at the field that
|
|
974
|
+
consumes it.
|
|
975
|
+
- Use `run:` on individual tests only for scoped overrides: `threshold`,
|
|
976
|
+
`repeat`, `timeout_seconds`, and `budget_usd`.
|
|
977
|
+
|
|
978
|
+
### Verification
|
|
979
|
+
|
|
980
|
+
```bash
|
|
981
|
+
bun apps/cli/src/cli.ts validate path/to/eval.eval.yaml
|
|
982
|
+
rg -n "include:|tests:" path/to/evals
|
|
983
|
+
```
|
|
984
|
+
|
|
985
|
+
### Compatibility Notes
|
|
986
|
+
|
|
987
|
+
`eval_cases` remains a deprecated alias in the current schema, but migrated
|
|
988
|
+
YAML should use `tests`. The current convention is that runnable suites use
|
|
989
|
+
`*.eval.yaml`; reusable raw case files commonly use `*.cases.yaml` or JSONL.
|
|
990
|
+
|
|
991
|
+
## Result Artifact Path Changes Are Not Eval YAML Migrations
|
|
992
|
+
|
|
993
|
+
v4.42.4 docs described local run workspaces under
|
|
994
|
+
`.agentv/results/runs/<experiment>/<run-id>/`. Current docs describe v2 run
|
|
995
|
+
workspaces under `.agentv/results/<run_id>/`, with experiment metadata stored
|
|
996
|
+
in `summary.json` / rows rather than inferred from the path.
|
|
997
|
+
|
|
998
|
+
Within each run bundle, the per-run index is `.internal/index.jsonl` and
|
|
999
|
+
`summary.json` points to it with `index_path`. Per-sample execution folders are
|
|
1000
|
+
named `sample-N`; use row fields such as `sample_index` and `retry_index` for
|
|
1001
|
+
semantics. New writers emit `metrics.json` for duration, tokens, cost,
|
|
1002
|
+
execution, and trajectory data; they do not emit `timing.json`, `timing_path`,
|
|
1003
|
+
or nested `metrics.timing`.
|
|
1004
|
+
|
|
1005
|
+
Do not edit eval YAML just to chase result artifact path changes. Migrate only
|
|
1006
|
+
authored fields that the eval parser reads. Use:
|
|
1007
|
+
|
|
1008
|
+
```bash
|
|
1009
|
+
bun apps/cli/src/cli.ts results validate path/to/run-dir
|
|
1010
|
+
```
|
|
1011
|
+
|
|
1012
|
+
for existing run artifacts.
|