@indemn/cli 1.6.0 → 1.7.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/.claude-plugin/marketplace.json +3 -3
- package/.claude-plugin/plugin.json +9 -4
- package/.github/workflows/ci.yml +10 -0
- package/.github/workflows/publish.yml +2 -2
- package/.mcp.json +1 -4
- package/CONTRIBUTING.md +3 -1
- package/README.md +69 -176
- package/dist/cli/agents.d.ts.map +1 -1
- package/dist/cli/agents.js +226 -18
- package/dist/cli/agents.js.map +1 -1
- package/dist/cli/analytics.d.ts +3 -0
- package/dist/cli/analytics.d.ts.map +1 -0
- package/dist/cli/analytics.js +133 -0
- package/dist/cli/analytics.js.map +1 -0
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +62 -17
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/billing.d.ts +3 -0
- package/dist/cli/billing.d.ts.map +1 -0
- package/dist/cli/billing.js +23 -0
- package/dist/cli/billing.js.map +1 -0
- package/dist/cli/campaigns.d.ts +3 -0
- package/dist/cli/campaigns.d.ts.map +1 -0
- package/dist/cli/campaigns.js +34 -0
- package/dist/cli/campaigns.js.map +1 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +69 -102
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +71 -27
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/conversations.d.ts +3 -0
- package/dist/cli/conversations.d.ts.map +1 -0
- package/dist/cli/conversations.js +129 -0
- package/dist/cli/conversations.js.map +1 -0
- package/dist/cli/distribution.d.ts +3 -0
- package/dist/cli/distribution.d.ts.map +1 -0
- package/dist/cli/distribution.js +122 -0
- package/dist/cli/distribution.js.map +1 -0
- package/dist/cli/eval.d.ts.map +1 -1
- package/dist/cli/eval.js +315 -71
- package/dist/cli/eval.js.map +1 -1
- package/dist/cli/functions.d.ts.map +1 -1
- package/dist/cli/functions.js +109 -38
- package/dist/cli/functions.js.map +1 -1
- package/dist/cli/index.js +63 -54
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init.d.ts +27 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +152 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/kb.d.ts.map +1 -1
- package/dist/cli/kb.js +141 -15
- package/dist/cli/kb.js.map +1 -1
- package/dist/cli/link.d.ts +21 -0
- package/dist/cli/link.d.ts.map +1 -0
- package/dist/cli/link.js +112 -0
- package/dist/cli/link.js.map +1 -0
- package/dist/cli/org.d.ts.map +1 -1
- package/dist/cli/org.js +79 -67
- package/dist/cli/org.js.map +1 -1
- package/dist/cli/platform.d.ts +3 -0
- package/dist/cli/platform.d.ts.map +1 -0
- package/dist/cli/platform.js +133 -0
- package/dist/cli/platform.js.map +1 -0
- package/dist/cli/tickets.d.ts +3 -0
- package/dist/cli/tickets.d.ts.map +1 -0
- package/dist/cli/tickets.js +125 -0
- package/dist/cli/tickets.js.map +1 -0
- package/dist/cli/utils/output.d.ts +15 -9
- package/dist/cli/utils/output.d.ts.map +1 -1
- package/dist/cli/utils/output.js +53 -46
- package/dist/cli/utils/output.js.map +1 -1
- package/dist/cli/voice.d.ts +3 -0
- package/dist/cli/voice.d.ts.map +1 -0
- package/dist/cli/voice.js +206 -0
- package/dist/cli/voice.js.map +1 -0
- package/dist/core/diff.d.ts +16 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +57 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/core/org-resolver.d.ts +37 -0
- package/dist/core/org-resolver.d.ts.map +1 -0
- package/dist/core/org-resolver.js +73 -0
- package/dist/core/org-resolver.js.map +1 -0
- package/dist/core/runtime.d.ts +36 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +62 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/scope.d.ts +33 -0
- package/dist/core/scope.d.ts.map +1 -0
- package/dist/core/scope.js +37 -0
- package/dist/core/scope.js.map +1 -0
- package/dist/mcp/registry.d.ts +67 -0
- package/dist/mcp/registry.d.ts.map +1 -0
- package/dist/mcp/registry.js +195 -0
- package/dist/mcp/registry.js.map +1 -0
- package/dist/mcp/server.d.ts +9 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +87 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tool-meta.d.ts +21 -0
- package/dist/mcp/tool-meta.d.ts.map +1 -0
- package/dist/mcp/tool-meta.js +203 -0
- package/dist/mcp/tool-meta.js.map +1 -0
- package/dist/mcp/tools.d.ts +2 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +1462 -215
- package/dist/mcp/tools.js.map +1 -1
- package/dist/sdk/agent-bundle.d.ts +99 -0
- package/dist/sdk/agent-bundle.d.ts.map +1 -0
- package/dist/sdk/agent-bundle.js +211 -0
- package/dist/sdk/agent-bundle.js.map +1 -0
- package/dist/sdk/agents.d.ts +54 -1
- package/dist/sdk/agents.d.ts.map +1 -1
- package/dist/sdk/agents.js +59 -5
- package/dist/sdk/agents.js.map +1 -1
- package/dist/sdk/analytics.d.ts +158 -0
- package/dist/sdk/analytics.d.ts.map +1 -0
- package/dist/sdk/analytics.js +185 -0
- package/dist/sdk/analytics.js.map +1 -0
- package/dist/sdk/auth.d.ts +34 -12
- package/dist/sdk/auth.d.ts.map +1 -1
- package/dist/sdk/auth.js +62 -79
- package/dist/sdk/auth.js.map +1 -1
- package/dist/sdk/billing.d.ts +25 -0
- package/dist/sdk/billing.d.ts.map +1 -0
- package/dist/sdk/billing.js +61 -0
- package/dist/sdk/billing.js.map +1 -0
- package/dist/sdk/campaigns.d.ts +35 -0
- package/dist/sdk/campaigns.d.ts.map +1 -0
- package/dist/sdk/campaigns.js +59 -0
- package/dist/sdk/campaigns.js.map +1 -0
- package/dist/sdk/chat.d.ts +25 -2
- package/dist/sdk/chat.d.ts.map +1 -1
- package/dist/sdk/chat.js +37 -10
- package/dist/sdk/chat.js.map +1 -1
- package/dist/sdk/client.d.ts +93 -5
- package/dist/sdk/client.d.ts.map +1 -1
- package/dist/sdk/client.js +362 -100
- package/dist/sdk/client.js.map +1 -1
- package/dist/sdk/config-change.d.ts +74 -0
- package/dist/sdk/config-change.d.ts.map +1 -0
- package/dist/sdk/config-change.js +117 -0
- package/dist/sdk/config-change.js.map +1 -0
- package/dist/sdk/config.d.ts.map +1 -1
- package/dist/sdk/config.js +2 -1
- package/dist/sdk/config.js.map +1 -1
- package/dist/sdk/conversations.d.ts +101 -0
- package/dist/sdk/conversations.d.ts.map +1 -0
- package/dist/sdk/conversations.js +155 -0
- package/dist/sdk/conversations.js.map +1 -0
- package/dist/sdk/credentials.d.ts +25 -0
- package/dist/sdk/credentials.d.ts.map +1 -0
- package/dist/sdk/credentials.js +44 -0
- package/dist/sdk/credentials.js.map +1 -0
- package/dist/sdk/distribution.d.ts +94 -0
- package/dist/sdk/distribution.d.ts.map +1 -0
- package/dist/sdk/distribution.js +100 -0
- package/dist/sdk/distribution.js.map +1 -0
- package/dist/sdk/eval.d.ts +81 -0
- package/dist/sdk/eval.d.ts.map +1 -1
- package/dist/sdk/eval.js +117 -0
- package/dist/sdk/eval.js.map +1 -1
- package/dist/sdk/functions.d.ts +14 -1
- package/dist/sdk/functions.d.ts.map +1 -1
- package/dist/sdk/functions.js +48 -5
- package/dist/sdk/functions.js.map +1 -1
- package/dist/sdk/index.d.ts +2 -0
- package/dist/sdk/index.d.ts.map +1 -1
- package/dist/sdk/index.js +2 -0
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/jarvis-chat.d.ts +28 -0
- package/dist/sdk/jarvis-chat.d.ts.map +1 -0
- package/dist/sdk/jarvis-chat.js +117 -0
- package/dist/sdk/jarvis-chat.js.map +1 -0
- package/dist/sdk/kb.d.ts +69 -1
- package/dist/sdk/kb.d.ts.map +1 -1
- package/dist/sdk/kb.js +111 -24
- package/dist/sdk/kb.js.map +1 -1
- package/dist/sdk/orgs.d.ts +13 -0
- package/dist/sdk/orgs.d.ts.map +1 -0
- package/dist/sdk/orgs.js +59 -0
- package/dist/sdk/orgs.js.map +1 -0
- package/dist/sdk/platform.d.ts +62 -0
- package/dist/sdk/platform.d.ts.map +1 -0
- package/dist/sdk/platform.js +95 -0
- package/dist/sdk/platform.js.map +1 -0
- package/dist/sdk/session.d.ts +25 -0
- package/dist/sdk/session.d.ts.map +1 -0
- package/dist/sdk/session.js +69 -0
- package/dist/sdk/session.js.map +1 -0
- package/dist/sdk/skills.d.ts +46 -0
- package/dist/sdk/skills.d.ts.map +1 -0
- package/dist/sdk/skills.js +203 -0
- package/dist/sdk/skills.js.map +1 -0
- package/dist/sdk/test-chat.d.ts +52 -0
- package/dist/sdk/test-chat.d.ts.map +1 -0
- package/dist/sdk/test-chat.js +134 -0
- package/dist/sdk/test-chat.js.map +1 -0
- package/dist/sdk/tickets.d.ts +98 -0
- package/dist/sdk/tickets.d.ts.map +1 -0
- package/dist/sdk/tickets.js +91 -0
- package/dist/sdk/tickets.js.map +1 -0
- package/dist/sdk/types.d.ts +91 -6
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/voice.d.ts +147 -0
- package/dist/sdk/voice.d.ts.map +1 -0
- package/dist/sdk/voice.js +236 -0
- package/dist/sdk/voice.js.map +1 -0
- package/package.json +21 -4
- package/scripts/check-skills.mjs +25 -0
- package/skills/agent-builder/SKILL.md +89 -252
- package/skills/evaluations/SKILL.md +23 -234
- package/skills/evaluations/references/analysis.md +95 -0
- package/skills/evaluations/references/cli-reference.md +28 -0
- package/skills/evaluations/references/json-formats.md +100 -0
- package/src/cli/agents.ts +202 -22
- package/src/cli/analytics.ts +138 -0
- package/src/cli/auth.ts +56 -18
- package/src/cli/billing.ts +25 -0
- package/src/cli/campaigns.ts +33 -0
- package/src/cli/chat.ts +66 -115
- package/src/cli/config.ts +65 -31
- package/src/cli/conversations.ts +133 -0
- package/src/cli/distribution.ts +116 -0
- package/src/cli/eval.ts +254 -70
- package/src/cli/functions.ts +105 -39
- package/src/cli/index.ts +58 -55
- package/src/cli/init.ts +154 -0
- package/src/cli/kb.ts +120 -17
- package/src/cli/link.ts +117 -0
- package/src/cli/org.ts +81 -75
- package/src/cli/platform.ts +128 -0
- package/src/cli/tickets.ts +130 -0
- package/src/cli/utils/output.ts +51 -42
- package/src/cli/voice.ts +204 -0
- package/src/core/diff.ts +52 -0
- package/src/core/org-resolver.ts +113 -0
- package/src/core/runtime.ts +73 -0
- package/src/core/scope.ts +64 -0
- package/src/mcp/registry.ts +236 -0
- package/src/mcp/server.ts +84 -2
- package/src/mcp/tool-meta.ts +241 -0
- package/src/mcp/tools.ts +1529 -265
- package/src/sdk/agent-bundle.ts +245 -0
- package/src/sdk/agents.ts +74 -5
- package/src/sdk/analytics.ts +220 -0
- package/src/sdk/auth.ts +89 -109
- package/src/sdk/billing.ts +59 -0
- package/src/sdk/campaigns.ts +60 -0
- package/src/sdk/chat.ts +44 -10
- package/src/sdk/client.ts +373 -102
- package/src/sdk/config-change.ts +148 -0
- package/src/sdk/config.ts +2 -1
- package/src/sdk/conversations.ts +199 -0
- package/src/sdk/credentials.ts +53 -0
- package/src/sdk/distribution.ts +132 -0
- package/src/sdk/eval.ts +140 -0
- package/src/sdk/functions.ts +52 -6
- package/src/sdk/index.ts +2 -0
- package/src/sdk/jarvis-chat.ts +112 -0
- package/src/sdk/kb.ts +116 -29
- package/src/sdk/orgs.ts +62 -0
- package/src/sdk/platform.ts +115 -0
- package/src/sdk/session.ts +90 -0
- package/src/sdk/skills.ts +188 -0
- package/src/sdk/test-chat.ts +151 -0
- package/src/sdk/tickets.ts +120 -0
- package/src/sdk/types.ts +88 -6
- package/src/sdk/voice.ts +262 -0
- package/test/cli/entry.test.ts +34 -0
- package/test/cli/init.test.ts +66 -0
- package/test/cli/link.test.ts +57 -0
- package/test/core/org-resolver.test.ts +92 -0
- package/test/core/runtime.test.ts +30 -0
- package/test/core/scope.test.ts +93 -0
- package/test/harness.test.ts +24 -0
- package/test/helpers/config-home.ts +22 -0
- package/test/helpers/fake-middleware.ts +56 -0
- package/test/helpers/fetch-recorder.ts +75 -0
- package/test/helpers/jwt.ts +9 -0
- package/test/helpers/mcp-pair.ts +38 -0
- package/test/mcp/__snapshots__/tools-snapshot.test.ts.snap +145 -0
- package/test/mcp/askers.test.ts +60 -0
- package/test/mcp/elicit-timeout.test.ts +29 -0
- package/test/mcp/registry.test.ts +169 -0
- package/test/mcp/shaping.test.ts +41 -0
- package/test/mcp/tools-snapshot.test.ts +42 -0
- package/test/sdk/agents.test.ts +232 -0
- package/test/sdk/analytics.test.ts +89 -0
- package/test/sdk/auth.test.ts +70 -0
- package/test/sdk/billing.test.ts +47 -0
- package/test/sdk/campaigns.test.ts +43 -0
- package/test/sdk/client.test.ts +80 -0
- package/test/sdk/config-change.test.ts +142 -0
- package/test/sdk/conversations.test.ts +80 -0
- package/test/sdk/credentials.test.ts +33 -0
- package/test/sdk/distribution.test.ts +55 -0
- package/test/sdk/eval.test.ts +155 -0
- package/test/sdk/kb-upload.test.ts +50 -0
- package/test/sdk/kb.test.ts +95 -0
- package/test/sdk/orgs.test.ts +48 -0
- package/test/sdk/platform.test.ts +89 -0
- package/test/sdk/renewal.test.ts +115 -0
- package/test/sdk/session.test.ts +60 -0
- package/test/sdk/skills.test.ts +235 -0
- package/test/sdk/test-chat.test.ts +112 -0
- package/test/sdk/tickets.test.ts +42 -0
- package/test/sdk/voice.test.ts +147 -0
- package/vitest.config.ts +11 -0
|
@@ -9,6 +9,8 @@ Complete evaluation workflow for Indemn AI agents. Covers rubric creation, test
|
|
|
9
9
|
|
|
10
10
|
**Prerequisite:** `indemn whoami` must succeed. The `indemn` CLI must be installed and authenticated.
|
|
11
11
|
|
|
12
|
+
**Talking to people:** call rubrics, test sets and runs by their names; show ids only when asked. Give the verdict and the main reason in plain words first, details on request.
|
|
13
|
+
|
|
12
14
|
---
|
|
13
15
|
|
|
14
16
|
## Mode Detection
|
|
@@ -121,35 +123,7 @@ NEVER exceed 6 rules. A tight rubric with precise universal rules is better than
|
|
|
121
123
|
|
|
122
124
|
### Rubric JSON Format
|
|
123
125
|
|
|
124
|
-
|
|
125
|
-
{
|
|
126
|
-
"rules": [
|
|
127
|
-
{
|
|
128
|
-
"id": "SNAKE_CASE_ID",
|
|
129
|
-
"name": "Human-readable name",
|
|
130
|
-
"severity": "high | medium | low",
|
|
131
|
-
"category": "persona | instruction_compliance | safety | response_quality",
|
|
132
|
-
"description": "What this rule checks and why it matters",
|
|
133
|
-
"component_scope": "prompt | general | function | knowledge_base",
|
|
134
|
-
"component_ids": null,
|
|
135
|
-
"component_names": null,
|
|
136
|
-
"evaluation_criteria": {
|
|
137
|
-
"pass_conditions": ["Observable condition that indicates compliance"],
|
|
138
|
-
"fail_conditions": ["Observable condition that indicates violation"]
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
]
|
|
142
|
-
}
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
**component_scope values:**
|
|
146
|
-
|
|
147
|
-
| Scope | Meaning | Example |
|
|
148
|
-
|-------|---------|---------|
|
|
149
|
-
| `prompt` | Derived from a system prompt directive | "NEVER provide medical advice" |
|
|
150
|
-
| `general` | Standard quality/safety baseline | No hallucination, response coherence |
|
|
151
|
-
| `function` | Informed by the agent's tool capabilities | "Does not claim capabilities it doesn't have" |
|
|
152
|
-
| `knowledge_base` | Informed by the agent's KBs | "Grounds information rather than fabricating" |
|
|
126
|
+
See `references/json-formats.md` (rubric and test set bodies).
|
|
153
127
|
|
|
154
128
|
### Severity Assignment
|
|
155
129
|
|
|
@@ -204,70 +178,9 @@ Aim for roughly **15 items total**. A focused test set with 12-18 precise items
|
|
|
204
178
|
indemn testset create --name "<Agent Name> Test Set" --agent-id <agent-id> --file /tmp/testset.json
|
|
205
179
|
```
|
|
206
180
|
|
|
207
|
-
### Test Set JSON
|
|
208
|
-
|
|
209
|
-
```json
|
|
210
|
-
{
|
|
211
|
-
"type": "scenario",
|
|
212
|
-
"name": "Descriptive name - what this tests",
|
|
213
|
-
"inputs": {
|
|
214
|
-
"persona": "You are a [type] who [traits, emotional state, behavior pattern, goal].",
|
|
215
|
-
"initial_message": "Natural first message matching the persona",
|
|
216
|
-
"max_turns": 8
|
|
217
|
-
},
|
|
218
|
-
"expected": {
|
|
219
|
-
"success_criteria": ["Criterion about the conversation outcome"],
|
|
220
|
-
"expected_outcome": "What the conversation should achieve"
|
|
221
|
-
},
|
|
222
|
-
"tags": ["scenario", "category"],
|
|
223
|
-
"priority": "high"
|
|
224
|
-
}
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### Test Set JSON: Voice Simulation
|
|
228
|
-
|
|
229
|
-
Identical to scenario except `"type": "voice_simulation"`. The harness routes these through LiveKit with TTS/STT.
|
|
230
|
-
|
|
231
|
-
```json
|
|
232
|
-
{
|
|
233
|
-
"type": "voice_simulation",
|
|
234
|
-
"name": "Descriptive name - what this tests",
|
|
235
|
-
"inputs": {
|
|
236
|
-
"persona": "You are a caller who [traits]. You are on a phone call -- keep responses brief and natural.",
|
|
237
|
-
"initial_message": "Natural first utterance",
|
|
238
|
-
"max_turns": 6
|
|
239
|
-
},
|
|
240
|
-
"expected": {
|
|
241
|
-
"success_criteria": ["Criterion about the conversation outcome"],
|
|
242
|
-
"expected_outcome": "What the call should achieve"
|
|
243
|
-
},
|
|
244
|
-
"tags": ["voice_simulation", "category"],
|
|
245
|
-
"priority": "high"
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
Voice-specific: personas should behave like phone callers (shorter utterances, less formality). max_turns generally shorter (4-6 simple, 6-8 complex). Do NOT create single_turn items for voice agents.
|
|
250
|
-
|
|
251
|
-
### Test Set JSON: Single Turn
|
|
252
|
-
|
|
253
|
-
**Single-turn tests start a BRAND NEW conversation with NO prior context.** Design messages that are standalone.
|
|
254
|
-
|
|
255
|
-
```json
|
|
256
|
-
{
|
|
257
|
-
"type": "single_turn",
|
|
258
|
-
"name": "Descriptive name - what this tests",
|
|
259
|
-
"inputs": {
|
|
260
|
-
"message": "The standalone message to send"
|
|
261
|
-
},
|
|
262
|
-
"expected": {
|
|
263
|
-
"success_criteria": ["Specific observable criterion"]
|
|
264
|
-
},
|
|
265
|
-
"tags": ["category"],
|
|
266
|
-
"priority": "high"
|
|
267
|
-
}
|
|
268
|
-
```
|
|
181
|
+
### Test Set JSON
|
|
269
182
|
|
|
270
|
-
|
|
183
|
+
Scenario, voice simulation and single-turn item bodies are in `references/json-formats.md`.
|
|
271
184
|
|
|
272
185
|
### Success Criteria Rules
|
|
273
186
|
|
|
@@ -294,139 +207,37 @@ Scenarios start as fresh conversations with no pre-existing session state. Do NO
|
|
|
294
207
|
|
|
295
208
|
## Running Evaluations
|
|
296
209
|
|
|
297
|
-
|
|
210
|
+
Runs cost model calls and cannot be cancelled, so `indemn eval run` asks first; scripts and agents pass `--yes` only after the user agreed. The agent must be in the org you act on, and the test set must belong to that agent (`--allow-other-agent` overrides).
|
|
298
211
|
|
|
299
212
|
```bash
|
|
300
|
-
indemn eval run <agent-id> --test-set <id> --rubric <id> --wait
|
|
213
|
+
indemn eval run <agent-id> --test-set <id> --rubric <id> --wait --yes
|
|
301
214
|
```
|
|
302
215
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
**Two models are involved in evaluations:**
|
|
306
|
-
- **Agent model** — set via `indemn config set <id> --model`. This is the LLM the agent uses to generate responses during the eval.
|
|
307
|
-
- **Judge model** — set via `--eval-model` below. This is the LLM that scores the agent's responses against rubric rules and success criteria.
|
|
308
|
-
|
|
309
|
-
**Key flags:**
|
|
310
|
-
|
|
311
|
-
| Flag | Purpose | Notes |
|
|
312
|
-
|------|---------|-------|
|
|
313
|
-
| `--wait` | Poll until complete, show summary | Recommended for all runs |
|
|
314
|
-
| `--concurrency <n>` | Parallel items | Use `1` for voice_simulation |
|
|
315
|
-
| `--eval-model <model>` | Judge LLM (e.g., "gpt-4o") | Scores responses; does NOT change the agent's model |
|
|
316
|
-
| `--keep` | Preserve intermediate artifacts | Useful for debugging |
|
|
317
|
-
| `--limit <n>` | Run only first N items | Good for quick smoke tests |
|
|
318
|
-
| `--component-scope <scope>` | Filter by component scope | prompt, function, knowledge_base, general |
|
|
319
|
-
| `--component-ids <ids>` | Filter by component IDs | Comma-separated |
|
|
320
|
-
| `--conversation-ids <ids>` | Filter by conversation IDs | Comma-separated |
|
|
321
|
-
| `--mode <mode>` | Evaluation mode | Use "transcript" for transcript-based evaluation |
|
|
216
|
+
**Two models are involved:** the agent model (`indemn config set <id> --model provider/model`) answers; the judge model (`--eval-model`) scores.
|
|
322
217
|
|
|
323
|
-
|
|
218
|
+
| Flag | Purpose |
|
|
219
|
+
|------|---------|
|
|
220
|
+
| `--wait` | Poll until complete and show pass rate, errors and p95 latency (`--timeout` seconds, default 1800) |
|
|
221
|
+
| `--concurrency <n>` | Parallel items; use `1` for voice_simulation |
|
|
222
|
+
| `--eval-model <model>` | Judge LLM; does not change the agent |
|
|
223
|
+
| `--limit <n>` | Only the first N items (smoke test) |
|
|
224
|
+
| `--component-scope`, `--component-ids` | Only rules and items for those components |
|
|
225
|
+
| `--mode transcript` with `--conversation-ids` or `--date-from/--date-to` | Grade real conversations instead of the test set (a date range turns transcript mode on) |
|
|
226
|
+
| `--min-pass-rate <0..1>`, `--max-p95-ms <ms>`, `--fail-on-error`, `--error-policy block\|warn` | CI gate: exit 1 when the run misses the bar (same rules as the evaluations repo's gate script) |
|
|
227
|
+
| `--json` | Final run (and gate verdict) as JSON |
|
|
324
228
|
|
|
325
229
|
```bash
|
|
326
230
|
indemn eval status <run-id> [--json]
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
```bash
|
|
332
|
-
indemn eval list [--agent-id <id>] [--json] [--limit <n>] [--page <n>]
|
|
231
|
+
indemn eval list --agent-id <agent-id> [--json] [--limit <n>]
|
|
232
|
+
indemn eval trends --agent <agent-id> [--test-set <id>] # pass rate over time, drift warning
|
|
233
|
+
indemn eval compare <run-a> <run-b>
|
|
333
234
|
```
|
|
334
235
|
|
|
335
236
|
---
|
|
336
237
|
|
|
337
238
|
## Analyzing Results
|
|
338
239
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
- **UUID format** (contains hyphens, 36 chars) -- it is a `run_id`. Use directly.
|
|
342
|
-
- **ObjectId format** (24 hex chars) -- it is an `agent_id`. Fetch the latest completed run:
|
|
343
|
-
```bash
|
|
344
|
-
indemn eval list --agent-id <agent-id> --json --limit 5
|
|
345
|
-
```
|
|
346
|
-
|
|
347
|
-
### Step 2: Pull All Data
|
|
348
|
-
|
|
349
|
-
```bash
|
|
350
|
-
indemn eval status <run-id> --json
|
|
351
|
-
indemn eval results <run-id> --json
|
|
352
|
-
indemn rubric get <rubric-id> --json
|
|
353
|
-
indemn testset get <test-set-id> --json
|
|
354
|
-
indemn eval bot-context <agent-id> --json
|
|
355
|
-
```
|
|
356
|
-
|
|
357
|
-
For exact response shapes, see `references/data-shapes.md`.
|
|
358
|
-
|
|
359
|
-
### Step 3: Present Run Overview
|
|
360
|
-
|
|
361
|
-
```
|
|
362
|
-
Run: {run_id}
|
|
363
|
-
Agent: {bot_name} ({agent_id})
|
|
364
|
-
LLM: {bot_llm_provider}/{bot_llm_model}
|
|
365
|
-
Status: {passed}/{total} items passed ({pass_rate}%)
|
|
366
|
-
|
|
367
|
-
Criteria: {criteria_passed}/{criteria_total} checks passed
|
|
368
|
-
Rubric: {rubric_rules_passed}/{rubric_rules_total} rules passed
|
|
369
|
-
|
|
370
|
-
Component Scores:
|
|
371
|
-
prompt: {score}% ({passed}/{total})
|
|
372
|
-
knowledge_base: {score}% ({passed}/{total})
|
|
373
|
-
function: {score}% ({passed}/{total})
|
|
374
|
-
general: {score}% ({passed}/{total})
|
|
375
|
-
```
|
|
376
|
-
|
|
377
|
-
### Step 4: Analyze Each Failed Item
|
|
378
|
-
|
|
379
|
-
For every result where `passed == false`:
|
|
380
|
-
|
|
381
|
-
1. **Get the test item** -- match `test_case_id` to the test set's `items[].item_id` for name, type, inputs, success_criteria
|
|
382
|
-
2. **Check criteria scores** -- from `criteria_scores[]`, list which passed/failed with reasoning
|
|
383
|
-
3. **Check rubric scores** -- from `rubric_scores[]`, list which passed/failed with reasoning
|
|
384
|
-
4. **Check for divergence** -- flag when `criteria_passed != rubric_passed`. Divergence is a strong signal of an evaluation problem.
|
|
385
|
-
5. **Read the conversation** -- look at `output` field for the full response or transcript
|
|
386
|
-
6. **Cross-reference system prompt** -- check if the agent's behavior aligns with prompt instructions
|
|
387
|
-
7. **Classify** into one of four categories:
|
|
388
|
-
|
|
389
|
-
| Category | Signal | Action |
|
|
390
|
-
|----------|--------|--------|
|
|
391
|
-
| **Real Agent Problem** | Both layers agree agent misbehaved, or output contradicts prompt | Investigate agent code/prompt |
|
|
392
|
-
| **Evaluation Problem** | Criteria ambiguous/too strict, evaluator reasoning shows misunderstanding | Update test set criteria |
|
|
393
|
-
| **Test Design Problem** | Test assumptions wrong (e.g., assumed KB lacked info it has) | Redesign test item |
|
|
394
|
-
| **KB/Retrieval Problem** | Agent behavior correct but retrieval returned wrong content | Fix KB content or retrieval config |
|
|
395
|
-
|
|
396
|
-
### Divergence Analysis
|
|
397
|
-
|
|
398
|
-
When `criteria_passed != rubric_passed` for an item, this is a first-class finding:
|
|
399
|
-
|
|
400
|
-
- **Criteria FAIL + Rubric PASS** -- criteria are likely too strict or testing the wrong thing
|
|
401
|
-
- **Criteria PASS + Rubric FAIL** -- rubric may have rules that don't apply to this scenario, or agent violated a behavioral rule despite answering correctly
|
|
402
|
-
|
|
403
|
-
Always highlight divergences prominently.
|
|
404
|
-
|
|
405
|
-
### Step 5: Aggregate and Recommend
|
|
406
|
-
|
|
407
|
-
Group failures by category. Prioritize fixes:
|
|
408
|
-
|
|
409
|
-
- **P1 -- Evaluation fixes** (false failures mask real issues): specific criteria rewrites or rubric rule adjustments
|
|
410
|
-
- **P2 -- Agent investigation** (real bugs): which code paths or prompt sections to examine
|
|
411
|
-
- **P3 -- KB/Retrieval fixes**: which KBs need content updates or retrieval tuning
|
|
412
|
-
|
|
413
|
-
For each recommendation, quote the current criterion/rule, explain what is wrong, and propose the exact replacement text.
|
|
414
|
-
|
|
415
|
-
### Step 6: Apply Fixes
|
|
416
|
-
|
|
417
|
-
Updates create new versions (non-destructive, previous versions preserved):
|
|
418
|
-
|
|
419
|
-
```bash
|
|
420
|
-
indemn testset update <test-set-id> --file updated-testset.json
|
|
421
|
-
indemn rubric update <rubric-id> --file updated-rubric.json
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
Check version history: `indemn testset versions <id>` / `indemn rubric versions <id>`
|
|
425
|
-
|
|
426
|
-
After applying fixes, re-run:
|
|
427
|
-
```bash
|
|
428
|
-
indemn eval run <agent-id> --test-set <id> --rubric <id> --wait
|
|
429
|
-
```
|
|
240
|
+
Follow `references/analysis.md`: resolve the run, pull results (`get_eval_results` is concise by default; `failed_only` narrows it), present the overview, analyse each failed item, then recommend and apply fixes.
|
|
430
241
|
|
|
431
242
|
---
|
|
432
243
|
|
|
@@ -488,26 +299,4 @@ Produces a branded Indemn PDF with cover page, dual scores (criteria + rubric),
|
|
|
488
299
|
|
|
489
300
|
## CLI Reference
|
|
490
301
|
|
|
491
|
-
|
|
492
|
-
|---------|---------|
|
|
493
|
-
| `indemn eval bot-context <id> [--json]` | Get agent prompt, tools, KBs, LLM config |
|
|
494
|
-
| `indemn eval run <id> --test-set <id> [--rubric <id>] [--wait]` | Trigger an evaluation run |
|
|
495
|
-
| `indemn eval list [--agent-id <id>] [--json] [--limit] [--page]` | List evaluation runs |
|
|
496
|
-
| `indemn eval status <run-id> [--json]` | Get run status and summary |
|
|
497
|
-
| `indemn eval results <run-id> [--json]` | Get per-item detailed results |
|
|
498
|
-
| `indemn eval export <run-id> [--output <path>]` | Export results as markdown |
|
|
499
|
-
| `indemn eval report <run-id> [--output <path>]` | Export results as branded PDF |
|
|
500
|
-
| `indemn rubric create [--file <path>] [--name "<name>"] [--agent-id <id>]` | Create rubric (--file or --name required) |
|
|
501
|
-
| `indemn rubric get <id> [--json] [--revision <n>]` | Get rubric details |
|
|
502
|
-
| `indemn rubric list [--agent-id <id>] [--json] [--limit] [--page]` | List rubrics |
|
|
503
|
-
| `indemn rubric update <id> [--file <path>] [--name "<name>"]` | Update rubric (creates new version) |
|
|
504
|
-
| `indemn rubric delete <id>` | Delete rubric (requires confirmation) |
|
|
505
|
-
| `indemn rubric versions <id> [--json]` | List rubric version history |
|
|
506
|
-
| `indemn testset create [--file <path>] [--name "<name>"] [--agent-id <id>]` | Create test set (--file or --name required) |
|
|
507
|
-
| `indemn testset get <id> [--json] [--revision <n>]` | Get test set details |
|
|
508
|
-
| `indemn testset list [--agent-id <id>] [--json] [--limit] [--page]` | List test sets (always use --agent-id) |
|
|
509
|
-
| `indemn testset update <id> [--file <path>] [--name "<name>"]` | Update test set (creates new version) |
|
|
510
|
-
| `indemn testset delete <id>` | Delete test set (requires confirmation) |
|
|
511
|
-
| `indemn testset versions <id> [--json]` | List test set version history |
|
|
512
|
-
| `indemn config get <id> --field prompt` | Get just the system prompt |
|
|
513
|
-
| `indemn functions list <id>` | List agent's functions |
|
|
302
|
+
Every evaluation command is listed in `references/cli-reference.md`.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
## Analyzing Results
|
|
2
|
+
|
|
3
|
+
### Step 1: Resolve the Run
|
|
4
|
+
|
|
5
|
+
- **UUID format** (contains hyphens, 36 chars) -- it is a `run_id`. Use directly.
|
|
6
|
+
- **ObjectId format** (24 hex chars) -- it is an `agent_id`. Fetch the latest completed run:
|
|
7
|
+
```bash
|
|
8
|
+
indemn eval list --agent-id <agent-id> --json --limit 5
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
### Step 2: Pull All Data
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
indemn eval status <run-id> --json
|
|
15
|
+
indemn eval results <run-id> --json
|
|
16
|
+
indemn rubric get <rubric-id> --json
|
|
17
|
+
indemn testset get <test-set-id> --json
|
|
18
|
+
indemn eval bot-context <agent-id> --json
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
For exact response shapes, see `references/data-shapes.md`.
|
|
22
|
+
|
|
23
|
+
### Step 3: Present Run Overview
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
Run: {run_id}
|
|
27
|
+
Agent: {bot_name} ({agent_id})
|
|
28
|
+
LLM: {bot_llm_provider}/{bot_llm_model}
|
|
29
|
+
Status: {passed}/{total} items passed ({pass_rate}%)
|
|
30
|
+
|
|
31
|
+
Criteria: {criteria_passed}/{criteria_total} checks passed
|
|
32
|
+
Rubric: {rubric_rules_passed}/{rubric_rules_total} rules passed
|
|
33
|
+
|
|
34
|
+
Component Scores:
|
|
35
|
+
prompt: {score}% ({passed}/{total})
|
|
36
|
+
knowledge_base: {score}% ({passed}/{total})
|
|
37
|
+
function: {score}% ({passed}/{total})
|
|
38
|
+
general: {score}% ({passed}/{total})
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Step 4: Analyze Each Failed Item
|
|
42
|
+
|
|
43
|
+
For every result where `passed == false`:
|
|
44
|
+
|
|
45
|
+
1. **Get the test item** -- match `test_case_id` to the test set's `items[].item_id` for name, type, inputs, success_criteria
|
|
46
|
+
2. **Check criteria scores** -- from `criteria_scores[]`, list which passed/failed with reasoning
|
|
47
|
+
3. **Check rubric scores** -- from `rubric_scores[]`, list which passed/failed with reasoning
|
|
48
|
+
4. **Check for divergence** -- flag when `criteria_passed != rubric_passed`. Divergence is a strong signal of an evaluation problem.
|
|
49
|
+
5. **Read the conversation** -- look at `output` field for the full response or transcript
|
|
50
|
+
6. **Cross-reference system prompt** -- check if the agent's behavior aligns with prompt instructions
|
|
51
|
+
7. **Classify** into one of four categories:
|
|
52
|
+
|
|
53
|
+
| Category | Signal | Action |
|
|
54
|
+
|----------|--------|--------|
|
|
55
|
+
| **Real Agent Problem** | Both layers agree agent misbehaved, or output contradicts prompt | Investigate agent code/prompt |
|
|
56
|
+
| **Evaluation Problem** | Criteria ambiguous/too strict, evaluator reasoning shows misunderstanding | Update test set criteria |
|
|
57
|
+
| **Test Design Problem** | Test assumptions wrong (e.g., assumed KB lacked info it has) | Redesign test item |
|
|
58
|
+
| **KB/Retrieval Problem** | Agent behavior correct but retrieval returned wrong content | Fix KB content or retrieval config |
|
|
59
|
+
|
|
60
|
+
### Divergence Analysis
|
|
61
|
+
|
|
62
|
+
When `criteria_passed != rubric_passed` for an item, this is a first-class finding:
|
|
63
|
+
|
|
64
|
+
- **Criteria FAIL + Rubric PASS** -- criteria are likely too strict or testing the wrong thing
|
|
65
|
+
- **Criteria PASS + Rubric FAIL** -- rubric may have rules that don't apply to this scenario, or agent violated a behavioral rule despite answering correctly
|
|
66
|
+
|
|
67
|
+
Always highlight divergences prominently.
|
|
68
|
+
|
|
69
|
+
### Step 5: Aggregate and Recommend
|
|
70
|
+
|
|
71
|
+
Group failures by category. Prioritize fixes:
|
|
72
|
+
|
|
73
|
+
- **P1 -- Evaluation fixes** (false failures mask real issues): specific criteria rewrites or rubric rule adjustments
|
|
74
|
+
- **P2 -- Agent investigation** (real bugs): which code paths or prompt sections to examine
|
|
75
|
+
- **P3 -- KB/Retrieval fixes**: which KBs need content updates or retrieval tuning
|
|
76
|
+
|
|
77
|
+
For each recommendation, quote the current criterion/rule, explain what is wrong, and propose the exact replacement text.
|
|
78
|
+
|
|
79
|
+
### Step 6: Apply Fixes
|
|
80
|
+
|
|
81
|
+
Updates create new versions (non-destructive, previous versions preserved):
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
indemn testset update <test-set-id> --file updated-testset.json
|
|
85
|
+
indemn rubric update <rubric-id> --file updated-rubric.json
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Check version history: `indemn testset versions <id>` / `indemn rubric versions <id>`
|
|
89
|
+
|
|
90
|
+
After applying fixes, re-run:
|
|
91
|
+
```bash
|
|
92
|
+
indemn eval run <agent-id> --test-set <id> --rubric <id> --wait
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Evaluations CLI reference
|
|
2
|
+
|
|
3
|
+
All commands act on the org chosen by `--org`, the linked folder, or your only org. Agents of other orgs are refused.
|
|
4
|
+
|
|
5
|
+
| Command | What it does |
|
|
6
|
+
|---|---|
|
|
7
|
+
| `indemn eval run <agent-id> --test-set <id> [--rubric <id>] [--wait] [--yes]` | Start a run (asks first: paid, cannot be cancelled). CI gate flags: `--min-pass-rate`, `--max-p95-ms`, `--fail-on-error`, `--error-policy` |
|
|
8
|
+
| `indemn eval status <run-id> [--json]` | Status and counts |
|
|
9
|
+
| `indemn eval results <run-id> [--json]` | Per-item results |
|
|
10
|
+
| `indemn eval list --agent-id <id> [--json] [--limit n]` | Runs of one agent |
|
|
11
|
+
| `indemn eval trends --agent <id> [--test-set <id>]` | Pass rate and p95 over runs; drift when the pass rate fell by 0.1 or more |
|
|
12
|
+
| `indemn eval compare <run-a> <run-b>` | Pass rate and p95 differences |
|
|
13
|
+
| `indemn eval bot-context <agent-id>` | What the evaluator sees: prompt, skills, knowledge bases, model |
|
|
14
|
+
| `indemn eval export <run-id> [--output file.md]` | Markdown export |
|
|
15
|
+
| `indemn eval report <run-id> [--output file.pdf] [--server [--force]]` | PDF report, made locally or by the evaluations service |
|
|
16
|
+
| `indemn eval report-link <report-id>` | Fresh download link for a server report |
|
|
17
|
+
| `indemn eval metrics` | Voice quality metric names for `expected.voice.required_metrics` |
|
|
18
|
+
| `indemn eval transcript --agent <id> --baseline a.json --replay b.json` | Grade a replayed conversation against a baseline |
|
|
19
|
+
| `indemn eval prod-calls list --agent <id> [--search text]` | Ingested production voice calls |
|
|
20
|
+
| `indemn eval prod-calls promote <session-id>` | Add a call to the agent's "Regressions (review)" test set |
|
|
21
|
+
| `indemn eval datasets list --agent <id>` / `datasets cases <dataset-id>` | Low-level datasets the trigger creates |
|
|
22
|
+
| `indemn eval evaluators types` / `evaluators list --agent <id>` / `evaluators delete <config-id>` | Judge types and stored evaluator configs |
|
|
23
|
+
| `indemn rubric list\|get\|create\|update\|delete\|versions` | Rubrics (each update is a new version) |
|
|
24
|
+
| `indemn testset list\|get\|create\|update\|delete\|versions` | Test sets (each update is a new version) |
|
|
25
|
+
| `indemn conversations export <id> --agent <agent-id> --as-testset -o set.json` | Turn a real conversation into a scenario test item, then `indemn testset create --file set.json` |
|
|
26
|
+
| `indemn jarvis jobs create --bots <ids> --wait` | Ask Jarvis to generate baseline rubrics and test sets |
|
|
27
|
+
|
|
28
|
+
MCP equivalents: `run_evaluation` (asks first), `get_eval_status`, `get_eval_results` (`response_format`, `failed_only`), `eval_gate_verdict`, `eval_trends`, `compare_eval_runs`, `eval_report_link`, `eval_quality_metrics`, `list_prod_calls`, `promote_prod_call`, `evaluate_transcript`, `list_evaluator_configs`, the rubric and test-set tools, and `jarvis_create_job`.
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Rubric and test set JSON formats
|
|
2
|
+
|
|
3
|
+
Used by `indemn rubric create --file` and `indemn testset create --file`. Field-level shapes are in `data-shapes.md`.
|
|
4
|
+
|
|
5
|
+
#### Rubric JSON Format
|
|
6
|
+
|
|
7
|
+
```json
|
|
8
|
+
{
|
|
9
|
+
"rules": [
|
|
10
|
+
{
|
|
11
|
+
"id": "SNAKE_CASE_ID",
|
|
12
|
+
"name": "Human-readable name",
|
|
13
|
+
"severity": "high | medium | low",
|
|
14
|
+
"category": "persona | instruction_compliance | safety | response_quality",
|
|
15
|
+
"description": "What this rule checks and why it matters",
|
|
16
|
+
"component_scope": "prompt | general | function | knowledge_base",
|
|
17
|
+
"component_ids": null,
|
|
18
|
+
"component_names": null,
|
|
19
|
+
"evaluation_criteria": {
|
|
20
|
+
"pass_conditions": ["Observable condition that indicates compliance"],
|
|
21
|
+
"fail_conditions": ["Observable condition that indicates violation"]
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
**component_scope values:**
|
|
29
|
+
|
|
30
|
+
| Scope | Meaning | Example |
|
|
31
|
+
|-------|---------|---------|
|
|
32
|
+
| `prompt` | Derived from a system prompt directive | "NEVER provide medical advice" |
|
|
33
|
+
| `general` | Standard quality/safety baseline | No hallucination, response coherence |
|
|
34
|
+
| `function` | Informed by the agent's tool capabilities | "Does not claim capabilities it doesn't have" |
|
|
35
|
+
| `knowledge_base` | Informed by the agent's KBs | "Grounds information rather than fabricating" |
|
|
36
|
+
|
|
37
|
+
#### Test Set JSON: Scenario
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
{
|
|
41
|
+
"type": "scenario",
|
|
42
|
+
"name": "Descriptive name - what this tests",
|
|
43
|
+
"inputs": {
|
|
44
|
+
"persona": "You are a [type] who [traits, emotional state, behavior pattern, goal].",
|
|
45
|
+
"initial_message": "Natural first message matching the persona",
|
|
46
|
+
"max_turns": 8
|
|
47
|
+
},
|
|
48
|
+
"expected": {
|
|
49
|
+
"success_criteria": ["Criterion about the conversation outcome"],
|
|
50
|
+
"expected_outcome": "What the conversation should achieve"
|
|
51
|
+
},
|
|
52
|
+
"tags": ["scenario", "category"],
|
|
53
|
+
"priority": "high"
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
#### Test Set JSON: Voice Simulation
|
|
58
|
+
|
|
59
|
+
Identical to scenario except `"type": "voice_simulation"`. The harness routes these through LiveKit with TTS/STT.
|
|
60
|
+
|
|
61
|
+
```json
|
|
62
|
+
{
|
|
63
|
+
"type": "voice_simulation",
|
|
64
|
+
"name": "Descriptive name - what this tests",
|
|
65
|
+
"inputs": {
|
|
66
|
+
"persona": "You are a caller who [traits]. You are on a phone call -- keep responses brief and natural.",
|
|
67
|
+
"initial_message": "Natural first utterance",
|
|
68
|
+
"max_turns": 6
|
|
69
|
+
},
|
|
70
|
+
"expected": {
|
|
71
|
+
"success_criteria": ["Criterion about the conversation outcome"],
|
|
72
|
+
"expected_outcome": "What the call should achieve"
|
|
73
|
+
},
|
|
74
|
+
"tags": ["voice_simulation", "category"],
|
|
75
|
+
"priority": "high"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Voice-specific: personas should behave like phone callers (shorter utterances, less formality). max_turns generally shorter (4-6 simple, 6-8 complex). Do NOT create single_turn items for voice agents.
|
|
80
|
+
|
|
81
|
+
#### Test Set JSON: Single Turn
|
|
82
|
+
|
|
83
|
+
**Single-turn tests start a BRAND NEW conversation with NO prior context.** Design messages that are standalone.
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"type": "single_turn",
|
|
88
|
+
"name": "Descriptive name - what this tests",
|
|
89
|
+
"inputs": {
|
|
90
|
+
"message": "The standalone message to send"
|
|
91
|
+
},
|
|
92
|
+
"expected": {
|
|
93
|
+
"success_criteria": ["Specific observable criterion"]
|
|
94
|
+
},
|
|
95
|
+
"tags": ["category"],
|
|
96
|
+
"priority": "high"
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
**CRITICAL:** The `inputs` object for single-turn items contains ONLY `message`. No `max_turns`, `persona`, or `initial_message`.
|