Read a conversation test run
GET /v1/agents/{agent_id}/versions/{version}/tests/{run_id}
| Property | Value |
|---|---|
| Operation | get_agent_version_test_run |
| Group | Agent versions |
| Scope | prompts:read |
| Route class | read |
| Idempotency | No Idempotency-Key |
| Audit | Not audited: A metadata read; a report holds ids, codes and counts only. |
| Released in | 1.55.0 |
| Phase 0 host | Served (the hosted api pins 1.65.0) |
Answers the report of a conversation test run (1.55.0): per test and repetition, each expectation met or not with the count that decided it, the Call by id, its ended reason and Turn count. Ids, codes and counts only, so the read is not audited. From 1.64.0, stated: each Call the report names, of inline tests or of a suite, is a test Call read through get_call and its Turns and text through get_call_transcript, an audited content read, as for any test Call; get_prompt_eval_call reads the Calls of the runs of a suite, and an inline test, having no suite, has no other route.
Request
Set VOCAL_API to the base URL of your API and VOCAL_API_KEY to an API key with the prompts:read scope (Authentication and keys). Replace each placeholder, such as agt_... or <name>, with your own value.
curl "$VOCAL_API/v1/agents/agt_.../versions/1/tests/per_..." \
-H "Authorization: Bearer $VOCAL_API_KEY"const response = await fetch(`${process.env.VOCAL_API}/v1/agents/agt_.../versions/1/tests/per_...`, {
headers: {
Authorization: `Bearer ${process.env.VOCAL_API_KEY}`,
},
});
console.log(response.status, await response.text());import os
import requests
response = requests.get(
f"{os.environ['VOCAL_API']}/v1/agents/agt_.../versions/1/tests/per_...",
headers={
"Authorization": f"Bearer {os.environ['VOCAL_API_KEY']}",
},
)
print(response.status_code, response.text)Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
agent_id | path | AgentId | yes | The id of an Agent: agt_ and the row's UUIDv7 in 26 Crockford base32 characters. Opaque and safe to log. |
version | path | integer | yes | A version number, from 1. |
run_id | path | PromptEvalRunId | yes | The id of an evaluation run or a conversation test run: per_ and the row's UUIDv7 in 26 Crockford base32 characters. Opaque and safe to log. |
Responses
| Status | Content type | Shape | Error codes |
|---|---|---|---|
200 | application/json | ConversationTestRun | |
400 | application/json | ErrorEnvelope | invalid_request |
401 | application/json | ErrorEnvelope | unauthenticated |
403 | application/json | ErrorEnvelope | forbidden |
404 | application/json | ErrorEnvelope | not_found |
429 | application/json | ErrorEnvelope | rate_limited |
500 | application/json | ErrorEnvelope | internal_error |
Fields of the 200 answer
The shape is ConversationTestRun.
| Field | Type | Required | Description |
|---|---|---|---|
agent_id | AgentId | yes | |
agent_version | integer | yes | |
cost_lines | array of PromptEvalCostLine | yes | |
created_at | Timestamp | yes | |
created_by | ActorRef | yes | |
error_code | string or null | yes | |
finished_at | Timestamp or null | yes | |
gate | PromptEvalGateOutcome or null | no | How the run fares against its suite's publish gate (1.63.0), once completed; null for inline tests, for a suite with no gate and before completion. Absent from an api before 1.63.0. |
id | PromptEvalRunId | yes | |
job_id | JobId | yes | The agent.conversation_test job that runs it. |
object | "conversation_test_run" | yes | |
repetitions | integer | yes | |
started_at | Timestamp or null | yes | |
status | PromptEvalRunStatus | yes | |
suite_id | PromptEvalSuiteId or null | yes | Null for inline tests. |
summary | ConversationTestSummary or null | yes | Null until completed. |
tests | array of ConversationTestReport | yes | One report per test, in the order of the suite or the request; empty until run. |