Loading...
Loading...
Compare original and translation side by side
adk devadk dev--format json--format json| File | Contents |
|---|---|
| Complete file format — all fields, turn types, assertion categories, match operators, setup, outcome, options |
| Running evals, interpreting output, using traces, the write → test → iterate loop, CI integration |
| Per-primitive patterns for actions, tools, workflows, conversations, tables, and state |
| 文件 | 内容 |
|---|---|
| 完整文件格式——所有字段、轮次类型、断言类别、匹配运算符、设置、结果、选项 |
| 运行evals、解读输出、使用追踪信息、编写→测试→迭代循环、CI集成 |
| 针对动作、工具、工作流、对话、表格和状态的基础组件测试模式 |
eval-format.mdtesting-workflow.mdtest-patterns.mdtesting-workflow.mdeval-format.mdeval-format.mdtesting-workflow.mdtest-patterns.mdtesting-workflow.mdeval-format.mdimport { Eval } from '@botpress/adk'
export default new Eval({
name: 'greeting',
type: 'regression',
tags: ['basic'],
setup: {
state: { bot: { welcomeSent: false } },
workflow: { trigger: 'onboarding', input: { userId: 'test-1' } },
},
conversation: [
{
user: 'Hi!',
assert: {
response: [
{ not_contains: 'error' },
{ llm_judge: 'Response is friendly and offers to help' },
],
tools: [{ not_called: 'createTicket' }],
state: [{ path: 'conversation.greeted', equals: true }],
},
},
],
outcome: {
state: [{ path: 'conversation.greeted', equals: true }],
},
options: {
idleTimeout: 20000,
judgePassThreshold: 4,
},
})import { Eval } from '@botpress/adk'
export default new Eval({
name: 'greeting',
type: 'regression',
tags: ['basic'],
setup: {
state: { bot: { welcomeSent: false } },
workflow: { trigger: 'onboarding', input: { userId: 'test-1' } },
},
conversation: [
{
user: 'Hi!',
assert: {
response: [
{ not_contains: 'error' },
{ llm_judge: 'Response is friendly and offers to help' },
],
tools: [{ not_called: 'createTicket' }],
state: [{ path: 'conversation.greeted', equals: true }],
},
},
],
outcome: {
state: [{ path: 'conversation.greeted', equals: true }],
},
options: {
idleTimeout: 20000,
judgePassThreshold: 4,
},
})| Turn | When to use |
|---|---|
| Standard user message |
| Non-message trigger (webhook, integration event) |
| Assert bot does NOT respond |
| 轮次 | 使用场景 |
|---|---|
| 标准用户消息 |
| 非消息触发(webhook、集成事件) |
| 断言机器人不回复 |
| Category | What it checks |
|---|---|
| Bot reply text (contains, matches, llm_judge, similar_to) |
| Tool calls (called, not_called, call_order, params) |
| Bot/user/conversation state (equals, changed) |
| Table rows (row_exists, row_count) |
| Workflow execution (entered, completed) |
| Response time in ms (lte, gte) |
| 类别 | 检查内容 |
|---|---|
| 机器人回复文本(contains、matches、llm_judge、similar_to) |
| 工具调用(called、not_called、call_order、params) |
| 机器人/用户/对话状态(equals、changed) |
| 表格行(row_exists、row_count) |
| 工作流执行(entered、completed) |
| 响应时间(毫秒,lte、gte) |
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 detailsadk evals # 运行所有evals
adk evals <name> # 运行单个eval
adk evals --tag <tag> # 按标签过滤
adk evals --type regression # 按类型过滤
adk evals --verbose # 显示所有断言
adk evals --format json # 输出JSON格式用于CI
adk evals runs # 列出最近运行记录
adk evals runs --latest # 最新运行记录
adk evals runs --latest -v # 显示完整详情userevent// CORRECT
{ user: 'hello', expectSilence: true }
{ event: { type: 'payment.failed' }, expectSilence: true }expectSilence// 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' }outcome// CORRECT — final state checked once after all turns
outcome: {
state: [{ path: 'conversation.resolved', equals: true }],
tables: [{ table: 'ticketsTable', row_exists: { status: { equals: 'open' } } }],
}// WRONG — table may not be written until after all turns
conversation: [
{
user: 'Create a ticket',
assert: { tables: [{ table: 'ticketsTable', row_exists: { status: { equals: 'open' } } }] },
},
]// 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
]userevent// 正确示例
{ user: 'hello', expectSilence: true }
{ event: { type: 'payment.failed' }, expectSilence: true }expectSilence// 错误示例 — 缺少user或event
{ expectSilence: true }// 正确示例 — 验证LLM提取了正确的值
{ called: 'createTicket', params: { priority: { equals: 'high' } } }// 不完整示例 — 未验证参数是否正确
{ called: 'createTicket' }outcome// 正确示例 — 所有轮次结束后检查最终状态
outcome: {
state: [{ path: 'conversation.resolved', equals: true }],
tables: [{ table: 'ticketsTable', row_exists: { status: { equals: 'open' } } }],
}// 错误示例 — 表格可能在所有轮次结束后才写入
conversation: [
{
user: 'Create a ticket',
assert: { tables: [{ table: 'ticketsTable', row_exists: { status: { equals: 'open' } } }] },
},
]// 正确示例 — 从已知状态开始
setup: {
state: {
user: { plan: 'pro' },
conversation: { phase: 'support' },
},
}// 错误示例 — 依赖机器人正确处理设置轮次
conversation: [
{ user: 'I am on the pro plan' }, // 期望机器人设置user.plan
{ user: 'I need help with billing' }, // 实际测试轮次
]new Eval({})import { Eval } from '@botpress/adk'expectSilenceassert.responseusereventadk evals <name>expectedactualnew Eval({})import { Eval } from '@botpress/adk'expectSilenceassert.responseusereventadk evals <name>expectedactual