Testa en agent från början till slut (API)
Kör engångssimuleringar, parallella scenariobatcher och sviter för lanseringsgrindar via ThunderPhone API så att försämringar i agenten upptäcks innan kunderna hör dem.
Att iterera på en AI-agent innebär att iterera på dess prompt, dess verktyg och hur den hanterar gränsfall. Simulerings-API:t kör riktiga samtal mot en agent med en scenarioprompt som du anger. Om du riktar in dig på en agent skapas en bot-till-bot-körning. Om du riktar in dig på ett telefonnummer skapas en SIP-loopback-körning. Varje körning ger en riktig samtalslogg med transkription, bedömning och debitering, så att du ser exakt hur agenten beter sig och vad den kostar.
Använd det för:
- Röktester före driftsättning efter varje promptändring
- Regressionstester kopplade till CI (anslut webhooken
test-call.completed→ låt bygget misslyckas om poängen sjunker) - Belastningstestning av samtidighetsgränser
Engångskörning: en enskild körning
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
}'Fält:
| Fält | Typ | Obligatoriskt | Beskrivning |
|---|---|---|---|
target_type | sträng | ja | agent eller phone_number |
target_id | heltal | ja | Agent-id:t (eller telefonnummer-id:t) |
direction | sträng | nej | outbound (standard; testsamtalaren ringer) eller inbound (testsamtalaren svarar) |
scenario_prompt | sträng | nej | Styr vad testboten säger |
language / primary_language | sträng | nej | Språk för testsamtalaren; koder som inte stöds avvisas |
simulator_product | sträng | nej | testing (standard) eller spark för en mer människolik simulerad samtalare, till exempel tester av rådgivning vid varm överkoppling |
consent_to_charge | booleskt värde | ja | Måste vara true. Uppskattningen debiterar både den valda agenten och den simulerade samtalaren, samt eventuell telefonidel |
target_number | sträng | nej | E.164-åsidosättning för motparten; annars används plattformens testnummer |
mode är skrivskyddat och härleds från target_type: agent ger
mode="bot", medan phone_number ger mode="sip".
Svaret är ett simuleringskörningsobjekt
med status="queued". Polla tills status blir completed eller
failed; när call_id har angetts läser du in transkriptionen via
GET /v1/calls/{call_id}/transcript.
Batchar: parallella scenarier
Kör N scenarier samtidigt – användbart för regressionstester som träffar alla kända gränsfall parallellt:
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 innehåller en run_ids-lista med underkörnings-id:n. Hämta batchstatus:
curl https://api.thunderphone.com/v1/simulations/batches/{batch_id} \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"run_count är begränsat till 20; stagger_seconds sprider ut startandet
för att undvika att överbelasta agenten (0–60 s).
Koppla till CI
Skapa en svit för versionsgrindar på sidan Simuleringar
(/dashboard/simulations) — välj agenten, lägg till scenarier manuellt eller
klicka på Generera scenarier med AI för att utforma dem utifrån agentens
prompt (med en valfri genomgång av gränsfall) och gruppera dem i en svit.
En svit låser sina scenarier och sin agent, samt en lägsta godkännandegrad och
en valfri regel om noll kritiska fel. Godkända körningar blir den accepterade
baslinjen; senare övergångar från godkänt till underkänt returneras som regressioner.
Använd en API-nyckel för organisationen i CI.
Det här skriptet startar sviten, frågar tills betygsättning och jämförelse är
klara och avslutas med ett felvärde om domen inte är 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 returnerar 202 med
körnings-id:t. GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id} returnerar
status, verdict, pass_rate, critical_failure_count och baslinjens lista
över regressions. Båda slutpunkterna kopplar organisationen i URL:en till
API-nyckelns organisation.
Mönster
Regressionskorpus per prompt
Underhåll en JSON-fil med tuplerna {name, scenario_prompt, expected_outcome}.
Vid varje ändring av prompten kör du hela uppsättningen som en batch och jämför
transkriptionerna och betygen med den föregående körningen.
Röktest per version
En enda batch med fem scenarier för huvudflödet som du kör efter varje
driftsättning. Känsligt för latens, så behåll stagger_seconds: 0.
Latensbenchmarking
Kör identiska scenarier mot olika produktnivåer (spark,
bolt, storm-base). Jämför poängen för call.graded och
duration_seconds från varje resulterande samtalslogg.
Nästa steg
Varje frågeparameter, statuskod och batchformat.
Betygsätt varje testkörning automatiskt för att följa kvaliteten över tid.
Markera specifika tester för mänsklig granskning.
Strömma resultat till din CI / Slack / PagerDuty.