ThunderPhone 2.0 er lanceret.Selvbetjening fra 2 cent pr. minut.Læs mere om lanceringen

Developer cookbook

Test en agent fra ende til anden (API)

Kør enkeltstående simuleringer, parallelle scenariebatches og release-gate-suiter gennem 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 særlige tilfælde på. Simulerings-API'et kører rigtige opkald mod en agent ved hjælp af en scenarieprompt, 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 rigtig 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:

  • Smoke-tests før implementering efter hver promptredigering
  • Regressionstest integreret i CI (tilknyt webhookpen test-call.completed → lad bygningen fejle, hvis scoren falder)
  • Belastningstest 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:

FeltTypePåkrævetBeskrivelse
target_typestrengjaagent eller phone_number
target_idheltaljaAgent-id'et (eller telefonnummer-id'et)
directionstrengnejoutbound (standard; testopkalderen ringer op) eller inbound (testopkalderen besvarer opkaldet)
scenario_promptstrengnejStyrer, hvad testbotten siger
language / primary_languagestrengnejSprog for testopkalderen; ikke-understøttede koder afvises
simulator_productstrengnejtesting (standard) eller spark for en mere menneskelignende simuleret opkalder, f.eks. konsultationstests ved varm viderestilling
consent_to_chargebooleskjaSkal være true. Estimatet fakturerer både den valgte agent og den simulerede opkalder til en fast takst pr. minut plus eventuelle telefoni-led
target_numberstrengnejE.164-tilsidesættelse for den eksterne side; ellers bruges platformens testnummer

mode er skrivebeskyttet og afledes 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, kan du indlæse transskriptionen via GET /v1/calls/{call_id}/transcript.

Batchkørsler: parallelle scenarier

Kør N scenarier samtidig — nyttigt til regressionssuiter, der rammer alle kendte særlige tilfæ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).

Kobl det til CI

Opret en release gate-pakke 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 pakke. En pakke 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 basislinje; senere overgange fra bestået→ikke bestået returneres som regressioner.

Brug en organisations-API-nøgle i CI. Dette script udløser pakken, forespørger løbende, indtil vurdering og sammenligning er fuldført, og afslutter med en ikke-nul-status, 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 1

POST /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 basislinjens liste over regressions. Begge endpoints knytter organisationen i URL'en til API-nøglens organisation.

Kør en pakke efter en tidsplan

Åbn agentens fane Simuler, vælg Release gate-pakker, og opret eller redigér en pakke. Slå Kør efter en tidsplan til, vælg Frekvens og Tidszone, og angiv derefter Minut efter timen, Lokal tid eller Dag som vist. Vælg Gem pakke. Hvis du fjerner markeringen af Kør efter en tidsplan, fjernes tidsplanen i dashboardet.

Via API

PATCH pakken for at tilføje eller erstatte dens tidsplan. Se Pakker (release gates) for det fulde pakkeobjekt og endpoints.

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 kan være hourly, daily eller weekly. Brug en IANA-tidszone. Timebaserede tidsplaner bruger minute; daglige tidsplaner bruger hour og minute; ugentlige tidsplaner bruger også weekday, hvor mandag er 0, og søndag er 6. Pakkesvaret indeholder next_run_at og last_run_at.

Tidspunkter følger den valgte tidszones ændringer for sommertid. Planlagte kørsler vises i pakkens kørselshistorik og bruger dens aktuelle agent, scenarier, kriterier og accepterede basislinje. Hvert genereret testopkald udsender test-call.completed; der findes ingen webhook for fuldførelse på pakkeniveau. Planlagte opkald faktureres til samme simuleringspris som manuelle pakkekørsler og registrerer trigger: "schedule" på pakkekørslen.

Hvis du vil sætte en tidsplan på pause uden at ændre dens tidspunkt, skal du PATCH det komplette eksisterende tidsplanobjekt med "enabled": false. frequency er påkrævet; udeladte tidszone- og tidsfelter nulstilles til deres standardværdier, så inkludér de eksisterende værdier. Send "schedule": null for at fjerne tidsplanen.

Mønstre

Regressionkorpus pr. prompt

Vedligehold en JSON-fil med tuplerne {name, scenario_prompt, expected_outcome}. Ved hver promptændring skal du køre hele sættet som en batch; sammenlign transskriptionerne og vurderingerne med den forrige kørsel.

Smoke-test pr. udgivelse

En enkelt batch med fem happy-path-scenarier, som du kører efter hver udrulning. Latensfølsom, så behold stagger_seconds: 0.

Latensbenchmarking

Kør identiske scenarier mod forskellige produktniveauer (spark, bolt, storm-base). Sammenlign call.graded-scorerne og duration_seconds fra hver resulterende opkaldslog.


Næste trin