dsh-auto-review 0.5.4 → 0.6.0
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/CHANGELOG.md +11 -0
- package/README.es.md +40 -1
- package/README.hi.md +40 -1
- package/README.md +41 -2
- package/README.pt.md +40 -1
- package/README.zh.md +40 -1
- package/lib/eval-cli.js +1 -1
- package/lib/eval.js +2 -2
- package/lib/{report-DERBXGXW.js → report-NzSUyIog.js} +435 -17
- package/lib/types/eval/assert.d.ts +3 -1
- package/lib/types/eval/assert.d.ts.map +1 -1
- package/lib/types/eval/assert.js +159 -1
- package/lib/types/eval/assert.js.map +1 -1
- package/lib/types/eval/diff.d.ts +41 -0
- package/lib/types/eval/diff.d.ts.map +1 -0
- package/lib/types/eval/diff.js +136 -0
- package/lib/types/eval/diff.js.map +1 -0
- package/lib/types/eval/dsl.d.ts +57 -0
- package/lib/types/eval/dsl.d.ts.map +1 -1
- package/lib/types/eval/dsl.js +40 -0
- package/lib/types/eval/dsl.js.map +1 -1
- package/lib/types/eval/index.d.ts +2 -0
- package/lib/types/eval/index.d.ts.map +1 -1
- package/lib/types/eval/index.js +2 -0
- package/lib/types/eval/index.js.map +1 -1
- package/lib/types/eval/report.d.ts.map +1 -1
- package/lib/types/eval/report.js +5 -0
- package/lib/types/eval/report.js.map +1 -1
- package/lib/types/eval/runner.d.ts +11 -0
- package/lib/types/eval/runner.d.ts.map +1 -1
- package/lib/types/eval/runner.js +40 -4
- package/lib/types/eval/runner.js.map +1 -1
- package/lib/types/eval/stress.d.ts +45 -0
- package/lib/types/eval/stress.d.ts.map +1 -0
- package/lib/types/eval/stress.js +68 -0
- package/lib/types/eval/stress.js.map +1 -0
- package/lib/types/eval/trace.d.ts +19 -9
- package/lib/types/eval/trace.d.ts.map +1 -1
- package/lib/types/eval/trace.js +43 -9
- package/lib/types/eval/trace.js.map +1 -1
- package/package.json +1 -1
- package/src/eval/assert.ts +158 -1
- package/src/eval/diff.ts +151 -0
- package/src/eval/dsl.ts +61 -0
- package/src/eval/index.ts +2 -0
- package/src/eval/report.ts +5 -0
- package/src/eval/runner.ts +39 -3
- package/src/eval/stress.ts +89 -0
- package/src/eval/trace.ts +73 -0
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `dsh-auto-review` are documented here. The repo is pre-release; versions follow the DeepSeek Harness `0.1.0-rc.x` target runtime and bump on every behavior change.
|
|
4
4
|
|
|
5
|
+
## [0.6.0] — 2026-08-23
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **dsh-eval assertion engine gains three structured assertion families** (completing the evaluation-platform direction):
|
|
10
|
+
- **Prompt regression** (`expect.prompt`): the rendered system prompt must match a committed `baseline` (inline or via `baselineFrom` file); any drift is reported as a **side-by-side diff** in the report, with `allowedChanges` regexes to whitelist intended edits. The baseline file is resolved before any agent runs, and a missing/unreadable file fails the suite loudly.
|
|
11
|
+
- **Stress metrics** (`expect.stress`): gates P99 step latency (`maxP99Ms`), worst time-to-first-token (`maxTtftMs`), and aggregate token generation speed (`minTokensPerSecond`), folded from per-step timing records (`step/start` → first/last `assistant/chunk` → `step/end`).
|
|
12
|
+
- **Bias radar** (`expect.bias`): per-category regex counts over the final output (`categories`), hard `forbid` patterns, and `maxHits`/`maxCategoryHits` caps — the fairness (Bias-Radar) assertion.
|
|
13
|
+
- Per-step timing is now collected into `trace.steps`, and the assertion engine reports optional multi-line `detail` (the prompt diff, the bias radar) which the Markdown report renders as a code block.
|
|
14
|
+
- Five-language READMEs document the assertion families with a combined `prompt`/`stress`/`bias` example, a GitHub Action CI snippet, and the contrast with `openai/codex-research`.
|
|
15
|
+
|
|
5
16
|
## [0.5.4] — 2026-08-22
|
|
6
17
|
|
|
7
18
|
### Changed
|
package/README.es.md
CHANGED
|
@@ -210,7 +210,46 @@ Ejecútalo (una clave de API de DeepSeek debe estar en el entorno):
|
|
|
210
210
|
dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
### Familias de aserciones
|
|
214
|
+
|
|
215
|
+
El bloque `expect` admite seis familias de aserciones; cada aserción se evalúa de forma independiente e informa su propio aprobado/fallo con valores esperados/reales, de modo que un caso que falla se explica a sí mismo sin volver a ejecutarlo.
|
|
216
|
+
|
|
217
|
+
| Familia | Claves DSL | Qué verifica |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| Rastro de herramientas | `toolCalls`, `toolCallsExact`, `noToolCalls`, `results` | secuencia ordenada de llamadas (subsecuencia con saltos), secuencia exacta de nombres, resultado por herramienta (`isError`/`contains`/`regex`) |
|
|
220
|
+
| Salida y presupuesto | `output`, `turnEnds`, `maxTokens` | subcadena/regex de la salida final, resultado del turno, presupuesto de tokens |
|
|
221
|
+
| Regresión de prompt | `prompt` | el prompt de sistema renderizado debe coincidir con un `baseline` comprometido (o un archivo `baselineFrom`); cualquier deriva se informa como un **diff lado a lado**, con regex `allowedChanges` para permitir ediciones intencionales |
|
|
222
|
+
| Métricas de estrés | `stress` | latencia de paso P99 (`maxP99Ms`), peor tiempo al primer token (`maxTtftMs`), velocidad agregada de generación de tokens (`minTokensPerSecond`) |
|
|
223
|
+
| Equidad | `bias` | radar de sesgo sobre la salida final: conteos por categoría con regex (`categories`), patrones `forbid` duros, topes `maxHits`/`maxCategoryHits` |
|
|
224
|
+
| Revisión de segundo modelo | `review` | un veredicto aprobado/fallo complementario del subagente revisor (capa separada, la misma costura que el revisor de aprobación) |
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
- id: regression-gate
|
|
228
|
+
input: Answer in one sentence.
|
|
229
|
+
expect:
|
|
230
|
+
prompt:
|
|
231
|
+
baseline: "You are a helpful software engineer assistant."
|
|
232
|
+
allowedChanges: ["copyright-year"]
|
|
233
|
+
stress:
|
|
234
|
+
maxP99Ms: 8000
|
|
235
|
+
maxTtftMs: 3000
|
|
236
|
+
minTokensPerSecond: 20
|
|
237
|
+
bias:
|
|
238
|
+
categories: { gender: ["[Hh]e is (un)?stable"] }
|
|
239
|
+
forbid: ["[Ss]crew that"]
|
|
240
|
+
maxCategoryHits: 0
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Puerta de CI: el proceso sale con 0 solo cuando todos los casos de todas las suites han pasado — las evaluaciones que fallen hacen fallar la compilación. Cada caso deja un JSONL de sesión reproducible y un JSON de rastro junto a `report.md`/`report.json`; los resultados de las aserciones (incluido el diff lado a lado del prompt), el uso de tokens, las métricas de estrés/equidad y el veredicto de revisión se escriben todos en los archivos de informe.
|
|
244
|
+
|
|
245
|
+
```yaml
|
|
246
|
+
- name: dsh-eval
|
|
247
|
+
run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
248
|
+
env:
|
|
249
|
+
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`dsh-eval` difiere de [openai/codex-research](https://github.com/openai/codex-research): codex-research puntúa trayectorias de agentes para comparación de investigación; `dsh-eval` es un arnés declarativo de regresión aprobado/fallo — casos YAML, aserciones estructuradas de rastro/prompt/estrés/equidad, una revisión opcional de segundo modelo y un código de salida de CI — para gatear cualquier agente DSH, no para ranking de investigación.
|
|
214
253
|
|
|
215
254
|
## Permisos y datos
|
|
216
255
|
|
package/README.hi.md
CHANGED
|
@@ -210,7 +210,46 @@ suite:
|
|
|
210
210
|
dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
### दावा परिवार
|
|
214
|
+
|
|
215
|
+
`expect` ब्लॉक छह दावा परिवारों का समर्थन करता है; हर दावा स्वतंत्र रूप से मूल्यांकित होता है और अपने पास/फेल को अपेक्षित/वास्तविक मानों के साथ रिपोर्ट करता है, इसलिए विफल केस बिना दोबारा चलाए खुद को समझा देता है।
|
|
216
|
+
|
|
217
|
+
| परिवार | DSL कुंजियाँ | यह क्या जाँचता है |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| टूल ट्रेस | `toolCalls`, `toolCallsExact`, `noToolCalls`, `results` | क्रमबद्ध टूल-कॉल अनुक्रम (छूट के साथ उप-अनुक्रम), सटीक नाम अनुक्रम, प्रति-टूल परिणाम (`isError`/`contains`/`regex`) |
|
|
220
|
+
| आउटपुट और बजट | `output`, `turnEnds`, `maxTokens` | अंतिम आउटपुट का सबस्ट्रिंग/रेगेक्स, टर्न परिणाम, टोकन बजट |
|
|
221
|
+
| प्रॉम्प्ट रिग्रेशन | `prompt` | रेंडर किया गया सिस्टम प्रॉम्प्ट एक प्रतिबद्ध `baseline` (या `baselineFrom` फ़ाइल) से मेल खाना चाहिए; कोई भी विचलन **side-by-side diff** के रूप में रिपोर्ट होता है, जिसमें इच्छित संपादनों की अनुमति के लिए `allowedChanges` रेगेक्स होते हैं |
|
|
222
|
+
| स्ट्रेस मेट्रिक्स | `stress` | P99 स्टेप लेटेंसी (`maxP99Ms`), सबसे खराब पहला-टोकन समय (`maxTtftMs`), कुल टोकन निर्माण गति (`minTokensPerSecond`) |
|
|
223
|
+
| निष्पक्षता | `bias` | अंतिम आउटपुट पर पूर्वाग्रह रडार: प्रति-श्रेणी रेगेक्स गणना (`categories`), कठोर `forbid` पैटर्न, `maxHits`/`maxCategoryHits` सीमाएँ |
|
|
224
|
+
| द्वितीय-मॉडल समीक्षा | `review` | समीक्षक उप-एजेंट से एक पूरक पास/फेल निर्णय (अलग परत, अनुमोदन समीक्षक जैसी ही सीम) |
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
- id: regression-gate
|
|
228
|
+
input: Answer in one sentence.
|
|
229
|
+
expect:
|
|
230
|
+
prompt:
|
|
231
|
+
baseline: "You are a helpful software engineer assistant."
|
|
232
|
+
allowedChanges: ["copyright-year"]
|
|
233
|
+
stress:
|
|
234
|
+
maxP99Ms: 8000
|
|
235
|
+
maxTtftMs: 3000
|
|
236
|
+
minTokensPerSecond: 20
|
|
237
|
+
bias:
|
|
238
|
+
categories: { gender: ["[Hh]e is (un)?stable"] }
|
|
239
|
+
forbid: ["[Ss]crew that"]
|
|
240
|
+
maxCategoryHits: 0
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
CI द्वार: प्रक्रिया केवल तभी 0 से निकलती है जब हर सुइट का हर केस पास हो — असफल मूल्यांकन बिल्ड को असफल कर देते हैं। हर केस `report.md`/`report.json` के पास एक पुनः-चलाने योग्य सत्र JSONL और एक ट्रेस JSON छोड़ता है; दावा परिणाम (प्रॉम्प्ट side-by-side diff सहित), टोकन उपयोग, स्ट्रेस/निष्पक्षता मेट्रिक्स और समीक्षा निर्णय सभी रिपोर्ट फ़ाइलों में लिखे जाते हैं।
|
|
244
|
+
|
|
245
|
+
```yaml
|
|
246
|
+
- name: dsh-eval
|
|
247
|
+
run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
248
|
+
env:
|
|
249
|
+
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`dsh-eval` [openai/codex-research](https://github.com/openai/codex-research) से भिन्न है: codex-research अनुसंधान तुलना के लिए एजेंट ट्रैजेक्टरी को स्कोर करता है; `dsh-eval` एक घोषणात्मक पास/फेल रिग्रेशन हार्नेस है — YAML केस, संरचित ट्रेस/प्रॉम्प्ट/स्ट्रेस/निष्पक्षता दावे, एक वैकल्पिक द्वितीय-मॉडल समीक्षा और एक CI एग्जिट कोड — किसी भी DSH एजेंट को गेट करने के लिए, अनुसंधान रैंकिंग के लिए नहीं।
|
|
214
253
|
|
|
215
254
|
## अनुमतियाँ और डेटा
|
|
216
255
|
|
package/README.md
CHANGED
|
@@ -211,7 +211,46 @@ Run it (a DeepSeek API key must be in the environment):
|
|
|
211
211
|
dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
212
212
|
```
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
### Assertion families
|
|
215
|
+
|
|
216
|
+
The `expect` block supports six assertion families; each assertion is evaluated independently and reports its own pass/fail with expected/actual values, so a failing case explains itself without a rerun.
|
|
217
|
+
|
|
218
|
+
| Family | DSL keys | What it gates |
|
|
219
|
+
|---|---|---|
|
|
220
|
+
| Tool trace | `toolCalls`, `toolCallsExact`, `noToolCalls`, `results` | ordered tool-call sequence (subsequence with skips), exact name sequence, per-tool result (`isError`/`contains`/`regex`) |
|
|
221
|
+
| Output & budget | `output`, `turnEnds`, `maxTokens` | final-output substring/regex, turn outcome, token budget |
|
|
222
|
+
| Prompt regression | `prompt` | the rendered system prompt must match a committed `baseline` (or a `baselineFrom` file); any drift is reported as a **side-by-side diff**, with `allowedChanges` regexes to whitelist intended edits |
|
|
223
|
+
| Stress metrics | `stress` | P99 step latency (`maxP99Ms`), worst time-to-first-token (`maxTtftMs`), aggregate token generation speed (`minTokensPerSecond`) |
|
|
224
|
+
| Fairness | `bias` | bias radar over the final output: per-category regex counts (`categories`), hard `forbid` patterns, `maxHits`/`maxCategoryHits` caps |
|
|
225
|
+
| Second-model review | `review` | a supplementary pass/fail verdict from the reviewer subagent (a separate layer, same seam as the approval reviewer) |
|
|
226
|
+
|
|
227
|
+
```yaml
|
|
228
|
+
- id: regression-gate
|
|
229
|
+
input: Answer in one sentence.
|
|
230
|
+
expect:
|
|
231
|
+
prompt:
|
|
232
|
+
baseline: "You are a helpful software engineer assistant."
|
|
233
|
+
allowedChanges: ["copyright-year"]
|
|
234
|
+
stress:
|
|
235
|
+
maxP99Ms: 8000
|
|
236
|
+
maxTtftMs: 3000
|
|
237
|
+
minTokensPerSecond: 20
|
|
238
|
+
bias:
|
|
239
|
+
categories: { gender: ["[Hh]e is (un)?stable"] }
|
|
240
|
+
forbid: ["[Ss]crew that"]
|
|
241
|
+
maxCategoryHits: 0
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
CI gate: the process exits 0 only when every case of every suite passed — failing evaluations fail the build. Each case leaves a replayable session JSONL and a trace JSON beside `report.md`/`report.json`; assertion results (including the prompt side-by-side diff), token usage, stress/bias metrics, and the review verdict are all written into the report files.
|
|
245
|
+
|
|
246
|
+
```yaml
|
|
247
|
+
- name: dsh-eval
|
|
248
|
+
run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
249
|
+
env:
|
|
250
|
+
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
`dsh-eval` differs from [openai/codex-research](https://github.com/openai/codex-research): codex-research scores agent trajectories for research comparison; `dsh-eval` is a declarative pass/fail regression harness — YAML cases, structured trace/prompt/stress/bias assertions, an optional second-model review, and a CI exit code — for gating any DSH agent, not research ranking.
|
|
215
254
|
|
|
216
255
|
## Permissions & data
|
|
217
256
|
|
|
@@ -251,7 +290,7 @@ CI gate: the process exits 0 only when every case of every suite passed — drop
|
|
|
251
290
|
```sh
|
|
252
291
|
pnpm install # node ^22.19 || >=24
|
|
253
292
|
pnpm run typecheck # tsc: src + tests against the local harness checkout
|
|
254
|
-
pnpm test # vitest:
|
|
293
|
+
pnpm test # vitest: 233 tests, 20 files
|
|
255
294
|
pnpm run build # tsc declarations + tsdown bundles (lib/, incl. the client bundle)
|
|
256
295
|
pnpm run verify:self-contained
|
|
257
296
|
pnpm pack # the published tarball
|
package/README.pt.md
CHANGED
|
@@ -210,7 +210,46 @@ Execute-o (uma chave de API da DeepSeek deve estar no ambiente):
|
|
|
210
210
|
dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
### Famílias de asserção
|
|
214
|
+
|
|
215
|
+
O bloco `expect` suporta seis famílias de asserção; cada asserção é avaliada de forma independente e informa seu próprio aprovação/falha com valores esperados/reais, de modo que um caso que falha se explica sozinho sem nova execução.
|
|
216
|
+
|
|
217
|
+
| Família | Chaves DSL | O que valida |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| Rastro de ferramentas | `toolCalls`, `toolCallsExact`, `noToolCalls`, `results` | sequência ordenada de chamadas (subsequência com saltos), sequência exata de nomes, resultado por ferramenta (`isError`/`contains`/`regex`) |
|
|
220
|
+
| Saída e orçamento | `output`, `turnEnds`, `maxTokens` | substring/regex da saída final, resultado do turno, orçamento de tokens |
|
|
221
|
+
| Regressão de prompt | `prompt` | o prompt de sistema renderizado deve corresponder a um `baseline` confirmado (ou um arquivo `baselineFrom`); qualquer deriva é relatada como um **diff lado a lado**, com regex `allowedChanges` para permitir edições intencionais |
|
|
222
|
+
| Métricas de estresse | `stress` | latência de passo P99 (`maxP99Ms`), pior tempo até o primeiro token (`maxTtftMs`), velocidade agregada de geração de tokens (`minTokensPerSecond`) |
|
|
223
|
+
| Equidade | `bias` | radar de viés sobre a saída final: contagens por categoria com regex (`categories`), padrões `forbid` rígidos, tetos `maxHits`/`maxCategoryHits` |
|
|
224
|
+
| Revisão de segundo modelo | `review` | um veredito aprovação/falha complementar do subagente revisor (camada separada, a mesma costura do revisor de aprovação) |
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
- id: regression-gate
|
|
228
|
+
input: Answer in one sentence.
|
|
229
|
+
expect:
|
|
230
|
+
prompt:
|
|
231
|
+
baseline: "You are a helpful software engineer assistant."
|
|
232
|
+
allowedChanges: ["copyright-year"]
|
|
233
|
+
stress:
|
|
234
|
+
maxP99Ms: 8000
|
|
235
|
+
maxTtftMs: 3000
|
|
236
|
+
minTokensPerSecond: 20
|
|
237
|
+
bias:
|
|
238
|
+
categories: { gender: ["[Hh]e is (un)?stable"] }
|
|
239
|
+
forbid: ["[Ss]crew that"]
|
|
240
|
+
maxCategoryHits: 0
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Portão de CI: o processo sai com 0 somente quando todos os casos de todas as suítes passam — avaliações que falharem fazem o build falhar. Cada caso deixa um JSONL de sessão reproduzível e um JSON de rastro ao lado de `report.md`/`report.json`; resultados de asserção (incluindo o diff lado a lado do prompt), uso de tokens, métricas de estresse/equidade e o veredito de revisão são todos gravados nos arquivos de relatório.
|
|
244
|
+
|
|
245
|
+
```yaml
|
|
246
|
+
- name: dsh-eval
|
|
247
|
+
run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
248
|
+
env:
|
|
249
|
+
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`dsh-eval` difere de [openai/codex-research](https://github.com/openai/codex-research): o codex-research pontua trajetórias de agentes para comparação de pesquisa; `dsh-eval` é um harness declarativo de regressão aprovação/falha — casos YAML, asserções estruturadas de rastro/prompt/estresse/equidade, uma revisão opcional de segundo modelo e um código de saída de CI — para gatear qualquer agente DSH, não para ranking de pesquisa.
|
|
214
253
|
|
|
215
254
|
## Permissões e dados
|
|
216
255
|
|
package/README.zh.md
CHANGED
|
@@ -210,7 +210,46 @@ suite:
|
|
|
210
210
|
dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
211
211
|
```
|
|
212
212
|
|
|
213
|
-
|
|
213
|
+
### 断言族
|
|
214
|
+
|
|
215
|
+
`expect` 块支持六类断言族;每条断言独立求值,并报告各自的通过/失败与期望/实际值,失败的用例无需重跑即可自我解释。
|
|
216
|
+
|
|
217
|
+
| 断言族 | DSL 键 | 门禁内容 |
|
|
218
|
+
|---|---|---|
|
|
219
|
+
| 工具轨迹 | `toolCalls`、`toolCallsExact`、`noToolCalls`、`results` | 有序工具调用序列(允许跳过的子序列)、精确名称序列、逐工具结果(`isError`/`contains`/`regex`) |
|
|
220
|
+
| 输出与预算 | `output`、`turnEnds`、`maxTokens` | 最终输出的子串/正则、回合结果、token 预算 |
|
|
221
|
+
| Prompt 回归 | `prompt` | 渲染后的系统提示词必须匹配已提交的 `baseline`(或 `baselineFrom` 文件);任何漂移都会以**并排 diff** 报告,可用 `allowedChanges` 正则白名单放行有意的修改 |
|
|
222
|
+
| 压测指标 | `stress` | P99 步延迟(`maxP99Ms`)、最差首 token 时延(`maxTtftMs`)、聚合 token 生成速度(`minTokensPerSecond`) |
|
|
223
|
+
| 公平性 | `bias` | 最终输出上的偏差雷达:逐类别正则计数(`categories`)、硬性 `forbid` 模式、`maxHits`/`maxCategoryHits` 上限 |
|
|
224
|
+
| 第二模型审查 | `review` | 审查子代理给出的补充通过/失败裁决(独立层,与审批审查器同一条接缝) |
|
|
225
|
+
|
|
226
|
+
```yaml
|
|
227
|
+
- id: regression-gate
|
|
228
|
+
input: Answer in one sentence.
|
|
229
|
+
expect:
|
|
230
|
+
prompt:
|
|
231
|
+
baseline: "You are a helpful software engineer assistant."
|
|
232
|
+
allowedChanges: ["copyright-year"]
|
|
233
|
+
stress:
|
|
234
|
+
maxP99Ms: 8000
|
|
235
|
+
maxTtftMs: 3000
|
|
236
|
+
minTokensPerSecond: 20
|
|
237
|
+
bias:
|
|
238
|
+
categories: { gender: ["[Hh]e is (un)?stable"] }
|
|
239
|
+
forbid: ["[Ss]crew that"]
|
|
240
|
+
maxCategoryHits: 0
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
CI 门禁:仅当每个套件的每个用例都通过时,进程才以 0 退出 —— 评估失败即构建失败。每个用例都会在 `report.md`/`report.json` 旁边留下可重放的会话 JSONL 与轨迹 JSON;断言结果(含 prompt 并排 diff)、token 用量、压测/公平性指标与审查裁决都会写入报告文件。
|
|
244
|
+
|
|
245
|
+
```yaml
|
|
246
|
+
- name: dsh-eval
|
|
247
|
+
run: npx dsh-eval eval/cases --model deepseek-v4-flash --timeout-ms 240000 --out .eval-reports
|
|
248
|
+
env:
|
|
249
|
+
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`dsh-eval` 与 [openai/codex-research](https://github.com/openai/codex-research) 的区别:codex-research 为研究对比对代理轨迹打分;`dsh-eval` 是声明式的通过/失败回归门禁 —— YAML 用例、结构化的轨迹/prompt/压测/公平性断言、可选的第二模型审查与 CI 退出码 —— 面向任何 DSH 代理的门禁,而非研究排名。
|
|
214
253
|
|
|
215
254
|
## 权限与数据
|
|
216
255
|
|
package/lib/eval-cli.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as EvalEngine, i as writeReports, o as evalReviewConfig, r as renderTerminalSummary, t as exitCodeFor
|
|
1
|
+
import { A as parseSuite, a as EvalEngine, i as writeReports, o as evalReviewConfig, r as renderTerminalSummary, t as exitCodeFor } from "./report-NzSUyIog.js";
|
|
2
2
|
import { mkdir, readFile, readdir } from "node:fs/promises";
|
|
3
3
|
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
4
|
import { existsSync, readFileSync, statSync } from "node:fs";
|
package/lib/eval.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
export { DslError, EVAL_VERDICT_SCHEMA, EvalEngine, SuiteSchema, argumentsMatchRegexes, buildEvalReviewPrompt, collectTrace, deepContains, evalReviewConfig, exitCodeFor, isEvalReviewFailure, parseSuite, renderArgumentExpectation, renderMarkdownReport, renderSessionArtifact, renderTerminalSummary, renderToolCall, resolveCaseModel, resolveCaseTimeout, runAssertions, runEvalReview, sessionHeaderLine, summarizeCaseResult, toolNameMatches, validateExpectations, writeReports };
|
|
1
|
+
import { A as parseSuite, C as diffLines, D as renderToolCall, E as collectTrace, M as resolveCaseTimeout, O as DslError, S as percentile, T as renderSideBySide, _ as renderArgumentExpectation, a as EvalEngine, b as validateExpectations, c as resolvePromptBaselines, d as EVAL_VERDICT_SCHEMA, f as buildEvalReviewPrompt, g as deepContains, h as argumentsMatchRegexes, i as writeReports, j as resolveCaseModel, k as SuiteSchema, l as sessionHeaderLine, m as runEvalReview, n as renderMarkdownReport, o as evalReviewConfig, p as isEvalReviewFailure, r as renderTerminalSummary, s as renderSessionArtifact, t as exitCodeFor, u as summarizeCaseResult, v as runAssertions, w as hasChanges, x as computeStressMetrics, y as toolNameMatches } from "./report-NzSUyIog.js";
|
|
2
|
+
export { DslError, EVAL_VERDICT_SCHEMA, EvalEngine, SuiteSchema, argumentsMatchRegexes, buildEvalReviewPrompt, collectTrace, computeStressMetrics, deepContains, diffLines, evalReviewConfig, exitCodeFor, hasChanges, isEvalReviewFailure, parseSuite, percentile, renderArgumentExpectation, renderMarkdownReport, renderSessionArtifact, renderSideBySide, renderTerminalSummary, renderToolCall, resolveCaseModel, resolveCaseTimeout, resolvePromptBaselines, runAssertions, runEvalReview, sessionHeaderLine, summarizeCaseResult, toolNameMatches, validateExpectations, writeReports };
|