ThunderPhone 2.0 är här.Kom igång själv, från 2 cent/minut.Läs lanseringsnyheten

Developer cookbook

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ältTypObligatorisktBeskrivning
target_typesträngjaagent eller phone_number
target_idheltaljaAgent-id:t (eller telefonnummer-id:t)
directionsträngnejoutbound (standard; testsamtalaren ringer) eller inbound (testsamtalaren svarar)
scenario_promptsträngnejStyr vad testboten säger
language / primary_languagesträngnejSpråk för testsamtalaren; koder som inte stöds avvisas
simulator_productsträngnejtesting (standard) eller spark för en mer människolik simulerad samtalare, till exempel tester av rådgivning vid varm överkoppling
consent_to_chargebooleskt värdejaMåste vara true. Uppskattningen debiterar både den valda agenten och den simulerade samtalaren, samt eventuell telefonidel
target_numbersträngnejE.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 1

POST /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