Test en agent fra ende til ende (API)
Kør enkeltstående simuleringer, parallelle scenariebatches og udgivelsesgate-suiter via ThunderPhone API
At iterere på en AI-agent betyder at iterere på dens prompt, dens værktøjer og den måde, den håndterer kanttilfælde på. Simulerings-API'et foretager rigtige opkald til en agent ved hjælp af en scenarioprompt, du angiver. Målretning mod en agent opretter en bot-til-bot-kørsel; målretning mod et telefonnummer opretter en SIP-loopback-kørsel. Hver kørsel producerer en reel opkaldslog med transskription, bedømmelse og fakturering, så du kan se præcis, hvordan agenten opfører sig, og hvad den koster.
Brug det til:
- Små test før udrulning efter hver promptændring
- Regressionssuiter koblet til CI (tilknyt webhookpen
test-call.completed→ lad buildet fejle, hvis scoren falder) - Stresstest af samtidighedsgrænser
Engangskørsel: enkelt kørsel
curl -X POST https://api.thunderphone.com/v1/simulations \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_type": "agent",
"target_id": 12,
"direction": "outbound",
"scenario_prompt": "You are a polite caller asking about refund policy for order 12345.",
"consent_to_charge": true
}'Felter:
| Felt | Type | Påkrævet | Beskrivelse |
|---|---|---|---|
target_type | string | ja | agent eller phone_number |
target_id | integer | ja | Agent-id'et (eller telefonnummer-id'et) |
direction | string | nej | outbound (standard; testopkalderen ringer op) eller inbound (testopkalderen besvarer opkaldet) |
scenario_prompt | string | nej | Styrer, hvad testbotten siger |
language / primary_language | string | nej | Sprog for testopkalderen; ikke-understøttede koder afvises |
simulator_product | string | nej | testing (standard) eller spark for en mere menneskelignende simuleret opkalder, f.eks. tests af konsultation ved varm overførsel |
consent_to_charge | boolean | ja | Skal være true. Beregningen fakturerer både den valgte agent og den simulerede opkalder samt eventuelle telefoni-led |
target_number | string | nej | E.164-tilsidesættelse for den eksterne side; ellers bruges platformens testnummer |
mode er skrivebeskyttet og afledt af target_type: agent producerer
mode="bot", mens phone_number producerer mode="sip".
Svaret er et simuleringskørselsobjekt
med status="queued". Poll, indtil status bliver completed eller
failed; når call_id er angivet, skal du indlæse transskriptionen via
GET /v1/calls/{call_id}/transcript.
Batchkørsler: parallelle scenarier
Kør N scenarier samtidigt — nyttigt til regressionssuiter, der rammer alle kendte kanttilfælde parallelt:
curl -X POST https://api.thunderphone.com/v1/simulations/batches \
-H "Authorization: Bearer sk_live_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"target_type": "agent",
"target_id": 12,
"direction": "outbound",
"run_count": 5,
"stagger_seconds": 2,
"scenario_prompts": [
"Ask about refund policy.",
"Ask for hours of operation.",
"Complain about a delayed shipment.",
"Ask to speak with a human.",
"Ask an unrelated trivia question."
],
"consent_to_charge": true
}'Svaret indeholder en run_ids-liste med id'er for underkørsler. Hent
batchstatus:
curl https://api.thunderphone.com/v1/simulations/batches/{batch_id} \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"run_count er begrænset til 20; stagger_seconds fordeler opstarten
for at undgå at overbelaste agenten (0–60 s).
Integrer det i CI
Opret en releasegate-testpakke på siden Simuleringer
(/dashboard/simulations) — vælg agenten, tilføj scenarier manuelt eller
klik på Generer scenarier med AI for at udarbejde dem ud fra agentens
prompt (med en valgfri gennemgang af kanttilfælde), og gruppér dem i en
testpakke. En testpakke fastlåser sine scenarier og sin agent samt en
minimumsbeståelsesrate og en valgfri regel om nul kritiske fejl. Beståede
kørsler bliver den accepterede baseline; senere overgange fra bestået til
ikke bestået returneres som regressioner.
Brug en organisations-API-nøgle i CI.
Dette script udløser testpakken, forespørger løbende, indtil bedømmelse og
sammenligning er fuldført, og afslutter med en fejlstatus, medmindre
afgørelsen er pass:
#!/usr/bin/env bash
set -euo pipefail
: "${THUNDERPHONE_API_KEY:?Set THUNDERPHONE_API_KEY}"
: "${THUNDERPHONE_ORG_ID:?Set THUNDERPHONE_ORG_ID}"
: "${THUNDERPHONE_SUITE_ID:?Set THUNDERPHONE_SUITE_ID}"
base="https://api.thunderphone.com/v1/orgs/${THUNDERPHONE_ORG_ID}/suites/${THUNDERPHONE_SUITE_ID}"
auth="Authorization: Bearer ${THUNDERPHONE_API_KEY}"
run_id="$(curl --fail --silent --show-error -X POST "${base}/run" \
-H "$auth" -H "Content-Type: application/json" -d '{}' | jq -r '.id')"
deadline=$((SECONDS + 1800))
while (( SECONDS < deadline )); do
result="$(curl --fail --silent --show-error \
"${base}/runs/${run_id}" -H "$auth")"
status="$(jq -r '.status' <<<"$result")"
if [[ "$status" == "completed" ]]; then
jq . <<<"$result"
[[ "$(jq -r '.verdict' <<<"$result")" == "pass" ]]
exit
fi
sleep 10
done
echo "ThunderPhone suite timed out" >&2
exit 1POST /v1/orgs/{org_id}/suites/{suite_id}/run returnerer 202 med
kørsels-id'et. GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id} returnerer
status, verdict, pass_rate, critical_failure_count og
baseline-listen regressions. Begge endpoints knytter organisationen i
URL'en til API-nøglens organisation.
Mønstre
Regressionskorpus pr. prompt
Vedligehold en JSON-fil med tupler af {name, scenario_prompt, expected_outcome}.
Ved hver promptændring skal du køre hele sættet som en batch; sammenlign
transskriptionerne og bedømmelserne med den forrige kørsel.
Smoketest pr. release
En enkelt batch med fem happy-path-scenarier, som du kører efter hver
udrulning. Den er følsom over for latenstid, så behold stagger_seconds: 0.
Benchmarking af latenstid
Kør identiske scenarier mod forskellige produktniveauer (spark,
bolt, storm-base). Sammenlign scorerne call.graded og
duration_seconds fra hver resulterende opkaldslog.
Næste trin
Alle forespørgselsparametre, statuskoder og batchformater.
Giv automatisk score til hver testkørsel for at følge kvaliteten over tid.
Markér specifikke tests til menneskelig gennemgang.
Stream resultater til din CI / Slack / PagerDuty.