---
title: "Testējiet balss aģentu no sākuma līdz beigām (API)"
description: "Palaidiet vienreizējas simulācijas, paralēlas scenāriju paketes un laidienu vārtu testu komplektus, izmantojot ThunderPhone API, lai balss aģenta regresijas tiktu atklātas, pirms tās pamana klienti."
---

<Note>
  Vai dodat priekšroku informācijas panelim? Tā pati iespēja ir pieejama sadaļā **Simulations**
  (`/dashboard/simulations`), tostarp AI scenāriju ģenerēšana — skatiet
  [Simulēt zvanu](/lv/guides/simulate-a-call). Šajā lapā ir aprakstīta
  programmiskā pieeja.
</Note>

AI aģenta pilnveidošana nozīmē tā uzvednes, rīku un malu gadījumu
apstrādes iteratīvu uzlabošanu. **Simulāciju API** veic reālus
zvanus aģentam, izmantojot jūsu norādītu scenārija uzvedni. Mērķējot
uz aģentu, tiek izveidots bota–bota izpildījums; mērķējot uz tālruņa
numuru, tiek izveidots SIP atgriezeniskās cilpas izpildījums. Katrs
izpildījums izveido reālu zvanu žurnālu ar transkriptu, vērtējumu un
norēķiniem, lai jūs precīzi redzētu, kā aģents darbojas un cik tas
maksā.

Izmantojiet to šādiem mērķiem:

- Ātrajām pārbaudēm pirms izvietošanas pēc katra uzvednes labojuma
- Regresijas komplektiem, kas savienoti ar CI (piesaistiet `test-call.completed` tīmekļa āķi
  → neizlaidiet būvējumu, ja vērtējums samazinās)
- Vienlaicības ierobežojumu slodzes testēšanai

## Vienreizējs izpildījums: viena palaišana

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

Lauki:

| Lauks | Tips | Obligāts | Apraksts |
|-------|------|----------|----------|
| `target_type` | virkne | jā | `agent` vai `phone_number` |
| `target_id` | vesels skaitlis | jā | Balss aģenta ID (vai tālruņa numura ID) |
| `direction` | virkne | nē | `outbound` (noklusējums; testa zvanītājs zvana) vai `inbound` (testa zvanītājs atbild) |
| `scenario_prompt` | virkne | nē | Nosaka, ko saka testa bots |
| `language` / `primary_language` | virkne | nē | Testa zvanītāja valoda; neatbalstīti kodi tiek noraidīti |
| `simulator_product` | virkne | nē | `testing` (noklusējums) vai `spark`, lai simulētais zvanītājs būtu cilvēciskāks, piemēram, siltās pārsūtīšanas konsultācijas testos |
| `consent_to_charge` | Būla vērtība | **jā** | Jābūt `true`. Aprēķins iekasē maksu gan par atlasīto balss aģentu, gan simulēto zvanītāju pēc vienotas minūtes likmes, kā arī par jebkuru telefonijas savienojumu |
| `target_number` | virkne | nē | E.164 aizstāšana attālajai pusei; pretējā gadījumā tiek izmantots platformas testa numurs |

`mode` ir tikai lasāms un tiek atvasināts no `target_type`: `agent` izveido
`mode="bot"`, savukārt `phone_number` izveido `mode="sip"`.

Atbilde ir [simulācijas izpildījuma objekts](/api-reference/test-calls#test-call-run-object)
ar `status="queued"`. Veiciet aptauju, līdz `status` kļūst par `completed` vai
`failed`; kad ir iestatīts `call_id`, ielādējiet transkriptu, izmantojot
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).

## Paketes: paralēli scenāriji

Vienlaikus palaidiet N scenārijus — noderīgi regresijas komplektiem, kas
paralēli pārbauda katru zināmo malu gadījumu:

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

Atbildē ir pakārtoto izpildījumu ID saraksts `run_ids`. Iegūstiet paketes
statusu:

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

`run_count` maksimālā vērtība ir 20; `stagger_seconds` nosaka palaišanas
intervālus, lai nepārslogotu aģentu (0–60 s).

## Pievienojiet to CI

Izveidojiet laidiena vārtejas komplektu lapā **Simulācijas**
(`/dashboard/simulations`) — izvēlieties balss aģentu, manuāli pievienojiet scenārijus vai
noklikšķiniet uz **Ģenerēt scenārijus ar MI**, lai izveidotu tos no balss aģenta
uzvednes (ar izvēles robežgadījumu pārbaudi), un grupējiet tos komplektā.
Komplekts fiksē tā scenārijus un balss aģentu, kā arī minimālo izturēšanas rādītāju un
izvēles noteikumu par nulli kritisku kļūmju. Sekmīgi izpildījumi kļūst par pieņemto
bāzlīniju; vēlākas pārejas no izturēta uz neizturētu rezultātu tiek atgrieztas kā regresijas.

CI izmantojiet [organizācijas API atslēgu](/api-reference/developer-api-keys).
Šis skripts aktivizē komplektu, aptaujā līdz vērtēšana un salīdzināšana ir
pabeigta, un tiek pārtraukts ar rezultātu, kas nav nulle, ja vien spriedums nav `pass`:

```bash
#!/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` atgriež `202` ar
izpildījuma ID. `GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id}` atgriež
`status`, `verdict`, `pass_rate`, `critical_failure_count` un
bāzlīnijas `regressions` sarakstu. Abi galapunkti saista URL organizāciju
ar API atslēgas organizāciju.

## Palaidiet komplektu pēc grafika

Atveriet balss aģenta cilni **Simulēt**, atlasiet **Laidiena vārtejas komplekti** un izveidojiet vai
rediģējiet komplektu. Ieslēdziet **Palaist pēc grafika**, izvēlieties **Biežums** un
**Laika josla**, pēc tam iestatiet **Minūte pēc stundas**, **Vietējais laiks** vai **Diena**, kā
parādīts. Atlasiet **Saglabāt komplektu**. Noņemot atzīmi no **Palaist pēc grafika**, tiek noņemts
informācijas paneļa grafiks.

### Izmantojot API

Nosūtiet PATCH pieprasījumu komplektam, lai pievienotu vai aizstātu tā grafiku. Pilnu
komplekta objektu un galapunktus skatiet sadaļā [Komplekti (laidiena
vārtejas)](/api-reference/test-scenarios#suites-release-gates).

```bash
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` var būt `hourly`, `daily` vai `weekly`. Izmantojiet IANA laika joslu.
Stundu grafikos tiek izmantots `minute`; dienas grafikos tiek izmantoti `hour` un `minute`;
nedēļas grafikos tiek izmantots arī `weekday`, kur pirmdiena ir `0` un svētdiena ir `6`.
Komplekta atbilde ietver `next_run_at` un `last_run_at`.

Laiki seko atlasītās laika joslas vasaras laika izmaiņām. Ieplānotie izpildījumi
tiek parādīti komplekta izpildījumu vēsturē un izmanto tā pašreizējo balss aģentu, scenārijus,
kritērijus un pieņemto bāzlīniju. Katrs ģenerētais testa zvans izvada
`test-call.completed`; komplekta līmeņa pabeigšanas tīmekļa aizķeres nav. Par ieplānotajiem
zvaniem tiek piemērota tāda pati simulācijas maksa kā par manuāliem komplekta izpildījumiem, un
komplekta izpildījumā tiek reģistrēts `trigger: "schedule"`.

Lai apturētu grafiku, nemainot tā laiku, nosūtiet PATCH pieprasījumu ar pilnu esošo
grafika objektu un `"enabled": false`. `frequency` ir obligāts; izlaistie
laika joslas un laika lauki tiek atiestatīti uz noklusējuma vērtībām, tāpēc iekļaujiet esošās
vērtības. Nosūtiet `"schedule": null`, lai noņemtu grafiku.

## Modeļi

### Regresijas korpuss katrai uzvednei

Uzturiet JSON failu ar `{name, scenario_prompt, expected_outcome}`
trijniekiem. Pēc katras uzvednes izmaiņas palaidiet visu kopu partijā; salīdziniet
atšifrējumus un vērtējumus ar iepriekšējo palaišanu.

### Dūmu tests katrai versijai

Viena piecu veiksmīgu scenāriju partija, ko palaižat pēc katras
izvietošanas. Tā ir jutīga pret latentumu, tāpēc saglabājiet `stagger_seconds: 0`.

### Latentuma etalonmērīšana

Palaidiet identiskus scenārijus dažādos produktu līmeņos (`spark`,
`bolt`, `storm-base`). Salīdziniet `call.graded` vērtējumus un
`duration_seconds` no katra iegūtā zvanu žurnāla.

---

## Nākamās darbības

<CardGroup cols={2}>
  <Card title="Testa zvanu atsauce" icon="flask" href="/api-reference/test-calls">
    Katrs vaicājuma parametrs, statusa kods un partijas struktūra.
  </Card>
  <Card title="MI vērtēšana" icon="chart-line" href="/api-reference/calls#ai-call-grading">
    Automātiski novērtējiet katru testa palaišanu, lai laika gaitā sekotu kvalitātei.
  </Card>
  <Card title="Problēmu ziņojumi" icon="triangle-exclamation" href="/api-reference/issue-reports">
    Atzīmējiet konkrētus testus manuālai pārskatīšanai.
  </Card>
  <Card title="test-call.completed tīmekļa āķis" icon="bolt" href="/lv/webhooks/events">
    Straumējiet rezultātus uz savu CI / Slack / PagerDuty.
  </Card>
</CardGroup>
