npx skills add ...
npx skills add botpress/skills --skill adk-evals
Complete reference for writing, running, and iterating on evals (automated conversation tests) for ADK agents. Covers eval file format, all assertion types, CLI usage, and per-primitive testing patterns.
npx skills add botpress/skills --skill adk-evals
Evals are automated conversation tests for ADK agents. Each eval defines a scenario — a sequence of user messages or events — and asserts on what the bot should do: what it says, which tools it calls, how state changes, which workflows run, and more.
Evals run against a live dev bot (adk dev), so they test the full stack — not mocks.
Use this skill when the developer asks about:
--format json flag, tagging strategiesOr when you are developing an ADK bot and need to write the equivalent of unit/end-to-end tests.
Trigger questions:
| File | Contents |
|---|---|
references/eval-format.md | Complete file format — all fields, turn types, assertion categories, match operators, setup, outcome, options |
references/testing-workflow.md | Running evals, interpreting output, using traces, the write → test → iterate loop, CI integration |
references/test-patterns.md | Per-primitive patterns for actions, tools, workflows, conversations, and state |
eval-format.md for structure and assertionstesting-workflow.md for CLI commands and outputtest-patterns.md for the relevant sectiontesting-workflow.md (inspect traces) + eval-format.md (check assertion syntax)| Turn | When to use |
|---|---|
user: 'message' | Standard user message |
event: { payload } | Push a custom event (arrives as chat:custom) |
expectSilence: true | Assert bot does NOT respond |
| Category | What it checks |
|---|---|
response | Bot reply text (contains, not_contains, matches, llm_judge) |
tools | Tool calls (called, not_called, call_order, params) |
state | Bot/user/conversation state (equals, changed) |
workflow | Workflow execution (entered, completed) |
timing | Response time in ms (lte, gte) |
✅ Every turn needs user or event
❌ expectSilence alone is not a valid turn
✅ Assert tool params to verify correct extraction
❌ Only asserting the tool was called
✅ Use outcome for post-conversation state and workflow assertions
✅ Seed state to test conditional behavior without running setup turns
❌ Using conversation turns to set up state (slow and fragile)
Writing evals:
Running evals:
Debugging:
Per-primitive:
Match depth to the question.
Answer directly — show the relevant table or CLI command. Don't generate a full eval file for an informational question.
new Eval({}) call with realistic field valuesimport { Eval } from '@botpress/evals')adk evals <name>expected / actual diff)adk evals # run all evals
adk evals <name> # run one eval
adk evals --tag <tag> # filter by tag
adk evals --type regression # filter by type
adk evals --verbose # show all assertions
adk evals --format json # JSON output for CI
adk evals runs # list recent runs
adk evals runs --latest # most recent run
adk evals runs --latest -v # with full details// CORRECT
{ user: 'hello', expectSilence: true }
{ event: { payload: { kind: 'payment.failed' } }, expectSilence: true }// WRONG — missing user or event
{
expectSilence: true
}// CORRECT — verifies the LLM extracted the right values
{ called: 'createTicket', params: { priority: { equals: 'high' } } }// INCOMPLETE — doesn't verify params were correct
{
called: 'createTicket'
}// CORRECT — final state checked once after all turns
outcome: {
state: [{ path: 'conversation.resolved', equals: true }],
workflow: [{ name: 'ticketFlow', completed: true }],
}// CORRECT — start in a known state
setup: {
state: {
user: { plan: 'pro' },
conversation: { phase: 'support' },
},
}// WRONG — depends on the bot correctly processing setup turns
conversation: [
{ user: 'I am on the pro plan' }, // hoping bot sets user.plan
{ user: 'I need help with billing' }, // actual test turn
]