ThunderPhone 2.0 je stigao.Postavite sve sami, već od 2 ¢/min.Pročitajte objavu

Developer cookbook

Testirajte agenta od početka do kraja (API)

Pokrenite jednokratne simulacije, paralelne skupove scenarija i pakete testova za odobrenje izdanja putem ThunderPhone API-ja kako bi se regresije agenta otkrile prije nego što ih korisnici čuju.

Iteriranje AI agenta znači iteriranje njegova prompta, njegovih alata i načina na koji obrađuje rubne slučajeve. API za simulacije pokreće stvarne pozive prema agentu koristeći prompt scenarija koji navedete. Ciljanje agenta stvara pokretanje bot-na-bot; ciljanje telefonskog broja stvara SIP povratno pokretanje. Svako pokretanje stvara stvarni zapis poziva s transkriptom, ocjenjivanjem i naplatom, tako da točno vidite kako se agent ponaša i koliko košta.

Upotrijebite ga za:

  • Kratke testove prije implementacije nakon svake izmjene prompta
  • Regresijske pakete povezane s CI-jem (povežite webhook test-call.completed → ne uspijeva izgradnja ako rezultat padne)
  • Testiranje ograničenja istodobnosti pod opterećenjem

Jednokratno: jedno pokretanje

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
  }'

Polja:

PoljeVrstaObaveznoOpis
target_typestringdaagent ili phone_number
target_idintegerdaID agenta (ili ID telefonskog broja)
directionstringneoutbound (zadano; testni pozivatelj upućuje poziv) ili inbound (testni pozivatelj odgovara)
scenario_promptstringneOdređuje što testni bot govori
language / primary_languagestringneJezik testnog pozivatelja; nepodržani kodovi se odbijaju
simulator_productstringnetesting (zadano) ili spark za simuliranog pozivatelja sličnijeg čovjeku, primjerice za testove konzultacija pri toplom preusmjeravanju
consent_to_chargebooleandaMora biti true. Procjena naplaćuje odabranog agenta i simuliranog pozivatelja te svaki telekomunikacijski segment
target_numberstringneNadjačavanje E.164 formata za udaljenu stranu; u suprotnom se koristi testni broj platforme

mode je samo za čitanje i izvodi se iz target_type: agent proizvodi mode="bot", dok phone_number proizvodi mode="sip".

Odgovor je objekt pokretanja simulacije sa status="queued". Anketirajte dok status ne postane completed ili failed; nakon što je postavljen call_id, učitajte transkript putem GET /v1/calls/{call_id}/transcript.

Skupno: paralelni scenariji

Pokrenite N scenarija istodobno — korisno za regresijske pakete koji paralelno pokrivaju svaki poznati rubni slučaj:

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
  }'

Odgovor sadrži popis run_ids s ID-jevima podređenih pokretanja. Dohvatite status skupnog pokretanja:

curl https://api.thunderphone.com/v1/simulations/batches/{batch_id} \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"

run_count je ograničen na 20; stagger_seconds raspoređuje pokretanja kako biste izbjegli prekomjerno opterećivanje agenta (0–60 s).

Uključite u CI

Na stranici Simulacije (/dashboard/simulations) izradite skup provjere izdanja — odaberite agenta, ručno dodajte scenarije ili kliknite Generirajte scenarije pomoću AI-ja kako biste ih izradili iz uputa agenta (uz opcionalnu provjeru rubnih slučajeva) i grupirajte ih u skup. Skup fiksira svoje scenarije i agenta, kao i minimalnu stopu prolaznosti i opcijsko pravilo bez kritičnih neuspjeha. Uspješna pokretanja postaju prihvaćena osnovna vrijednost; kasniji prijelazi iz prolaza u neuspjeh vraćaju se kao regresije.

U CI-ju upotrijebite API ključ organizacije. Ova skripta pokreće skup, provjerava status dok ocjenjivanje i usporedba ne budu dovršeni te završava s kodom različitim od nule ako presuda nije 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 vraća 202 s identifikatorom pokretanja. GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id} vraća status, verdict, pass_rate, critical_failure_count i popis osnovnih regressions. Obje krajnje točke povezuju organizaciju iz URL-a s organizacijom API ključa.

Pokrenite skup prema rasporedu

Otvorite karticu Simulirajte agenta, odaberite Skupovi provjere izdanja i izradite ili uredite skup. Uključite Pokreni prema rasporedu, odaberite Učestalost i Vremensku zonu, a zatim postavite Minutu nakon punog sata, Lokalno vrijeme ili Dan kako je prikazano. Odaberite Spremite skup. Isključivanjem opcije Pokreni prema rasporedu uklanjate raspored s nadzorne ploče.

Putem API-ja

PATCH zahtjevom ažurirajte skup kako biste dodali ili zamijenili njegov raspored. Pogledajte Skupovi (provjere izdanja) za potpuni objekt skupa i krajnje točke.

curl -X PATCH https://api.thunderphone.com/v1/suites/{suite_id} \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "schedule": {
      "enabled": true,
      "frequency": "daily",
      "timezone": "America/Chicago",
      "hour": 6,
      "minute": 30
    }
  }'

frequency može biti hourly, daily ili weekly. Upotrijebite vremensku zonu IANA-e. Rasporedi po satu koriste minute; dnevni rasporedi koriste hour i minute; tjedni rasporedi koriste i weekday, pri čemu je ponedjeljak 0, a nedjelja 6. Odgovor skupa uključuje next_run_at i last_run_at.

Vremena prate promjene ljetnog računanja vremena odabrane vremenske zone. Zakazana pokretanja pojavljuju se u povijesti pokretanja skupa i koriste njegov trenutačni agent, scenarije, kriterije i prihvaćenu osnovnu vrijednost. Svaki generirani testni poziv emitira test-call.completed; ne postoji webhook za dovršetak na razini skupa. Zakazani pozivi naplaćuju se po istoj stopi simulacije kao ručna pokretanja skupa i bilježe trigger: "schedule" pri pokretanju skupa.

Da biste pauzirali raspored bez promjene njegova vremena, PATCH zahtjevom pošaljite potpuni postojeći objekt rasporeda s "enabled": false. frequency je obavezan; izostavljena vremenska zona i vremenska polja vraćaju se na zadane vrijednosti, stoga uključite postojeće vrijednosti. Pošaljite "schedule": null kako biste uklonili raspored.

Obrasci

Regresijski korpus po upitu

Održavajte JSON datoteku s n-torkama {name, scenario_prompt, expected_outcome}. Pri svakoj izmjeni upita pokrenite cijeli skup kao grupu; usporedite transkripte i ocjene s prethodnim pokretanjem.

Brzi test po izdanju

Jedna grupa od pet scenarija s očekivanim uspješnim ishodom koju pokrećete nakon svakog postavljanja. Osjetljivo na latenciju, stoga zadržite stagger_seconds: 0.

Mjerenje latencije

Pokrenite identične scenarije na različitim razinama proizvoda (spark, bolt, storm-base). Usporedite rezultate call.graded i duration_seconds iz svakog dobivenog zapisnika poziva.


Sljedeći koraci