ADK Evals Skill
What are 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.
When to Use This Skill
Use this skill when the developer asks about:
- Writing evals — file format, assertions, turn types, setup
- Running evals — CLI commands, filtering, output interpretation
- Testing specific primitives — how to test actions, tools, workflows, conversations, state
- The testing loop — write → run → inspect traces → iterate
- CI integration — exit codes,
--format jsonflag, tagging strategies - Eval configuration — idleTimeout, judgePassThreshold, judgeModel
Or when you are developing an ADK bot and need to write the equivalent of unit/end-to-end tests.
Trigger questions:
- "How do I write an eval?"
- "How do I test my workflow?"
- "How do I assert that a tool was called with specific params?"
- "My eval is failing, how do I debug it?"
- "How do I test that the bot stays silent?"
- "How do I run evals in CI?"
- "How do I seed state before an eval?"
- "How do I trigger a workflow in an eval?"
Available Documentation
How to Answer
- Writing an eval → Read
eval-format.mdfor structure and assertions - Running evals → Read
testing-workflow.mdfor CLI commands and output - Testing a specific primitive → Read
test-patterns.mdfor the relevant section - Debugging a failure → Combine
testing-workflow.md(inspect traces) +eval-format.md(check assertion syntax)
Quick Reference
Eval file structure
Turn types
Assertion categories
CLI commands
Critical Patterns
✅ 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)
Example Questions
Writing evals:
- "Write an eval that tests my createTicket tool is called with the right priority"
- "How do I assert that the bot stays silent after an internal event?"
- "How do I test a multi-turn conversation where context is retained?"
Running evals:
- "How do I run only regression evals?"
- "How do I see which assertions failed and why?"
- "How do I integrate evals into GitHub Actions?"
Debugging:
- "My eval says the tool wasn't called but I think it was — how do I check?"
- "How do I inspect what the bot actually did during an eval?"
Per-primitive:
- "How do I test a workflow that uses step.sleep()?"
- "How do I test that state changed from the seeded value?"
Response Format
Match depth to the question.
Simple questions ("what assertions are available?", "how do I run evals?")
Answer directly — show the relevant table or CLI command. Don't generate a full eval file for an informational question.
Writing an eval
- Show the complete
new Eval({})call with realistic field values - Include imports (
import { Eval } from '@botpress/evals') - Briefly explain non-obvious assertions — skip if the assertion is self-explanatory
- Suggest the CLI command to run it:
adk evals <name>
Debugging a failing eval
- Ask for or show the failing assertion (
expected/actualdiff) - Suggest opening traces in the Dev Console to see what the bot did
- Identify whether the issue is in the eval assertion or the bot's behavior


