---
title: "Ištestuokite agentą nuo pradžios iki pabaigos (API)"
description: "Vykdykite vienkartines simuliacijas, lygiagrečius scenarijų paketus ir leidimo patikros rinkinius per ThunderPhone API, kad agento regresijos būtų aptiktos prieš klientams jas išgirstant."
---

<Note>
  Teikiate pirmenybę valdymo skydui? Ta pati funkcija pasiekiama skiltyje **Simuliacijos**
  (`/dashboard/simulations`), įskaitant DI scenarijų generavimą — žr.
  [Simuliuoti skambutį](/lt/guides/simulate-a-call). Šiame puslapyje aprašomas
  programinis būdas.
</Note>

Tobulinant DI agentą, tobulinama jo užklausa, įrankiai
ir kraštinių atvejų tvarkymas. **Simuliacijų API** vykdo tikrus
skambučius agentui naudodama jūsų pateiktą scenarijaus užklausą. Nurodžius
agentą sukuriamas roboto su robotu vykdymas; nurodžius telefono numerį sukuriamas
SIP grįžtamojo ryšio vykdymas. Kiekvieno vykdymo metu sukuriamas tikras skambučių žurnalas su
transkriptu, vertinimu ir sąskaitų informacija, todėl tiksliai matote, kaip agentas
veikia ir kiek tai kainuoja.

Naudokite šią funkciją:

- Greitiesiems testams prieš diegimą po kiekvieno užklausos redagavimo
- Regresijos rinkiniams, prijungtiems prie CI (prijunkite `test-call.completed` žiniatinklio kablį
  → nesėkmingai užbaikite komponavimą, jei balas sumažėja)
- Lygiagretumo ribų apkrovos testavimui

## Vienkartinis paleidimas: vienas vykdymas

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

Laukai:

| Laukas | Tipas | Privalomas | Aprašas |
|-------|------|----------|-------------|
| `target_type` | eilutė | taip | `agent` arba `phone_number` |
| `target_id` | sveikasis skaičius | taip | Agento ID (arba telefono numerio ID) |
| `direction` | eilutė | ne | `outbound` (numatyta reikšmė; testinis skambintojas inicijuoja skambutį) arba `inbound` (testinis skambintojas atsiliepia) |
| `scenario_prompt` | eilutė | ne | Nustato, ką sako testavimo robotas |
| `language` / `primary_language` | eilutė | ne | Testinio skambintojo kalba; nepalaikomi kodai atmetami |
| `simulator_product` | eilutė | ne | `testing` (numatyta reikšmė) arba `spark`, skirtas labiau žmogiškam imituotam skambintojui, pvz., šiltojo perdavimo konsultacijos testams |
| `consent_to_charge` | loginė reikšmė | **taip** | Turi būti `true`. Sąmata apmokestina ir pasirinktą agentą, ir imituotą skambintoją, taip pat bet kurią telefonijos liniją |
| `target_number` | eilutė | ne | E.164 nuotolinės pusės pakeitimas; kitu atveju naudojamas platformos testavimo numeris |

`mode` yra tik skaitomas ir nustatomas pagal `target_type`: `agent` sukuria
`mode="bot"`, o `phone_number` sukuria `mode="sip"`.

Atsakymas yra [simuliacijos vykdymo objektas](/api-reference/test-calls#test-call-run-object),
kurio `status="queued"`. Tikrinkite, kol `status` taps `completed` arba
`failed`; kai nustatomas `call_id`, įkelkite transkriptą naudodami
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).

## Paketai: lygiagretūs scenarijai

Vienu metu vykdykite N scenarijų — tai naudinga regresijos rinkiniams, kurie
lygiagrečiai apima visus žinomus kraštinius atvejus:

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

Atsakyme pateikiamas antrinių vykdymų ID sąrašas `run_ids`. Gaukite paketo
būseną:

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

`run_count` ribojamas iki 20; `stagger_seconds` paskirsto paleidimus
laike, kad agentas nebūtų pernelyg apkrautas (0–60 s).

## Integruokite į CI

Sukurkite leidimo vartų rinkinį puslapyje **Simuliacijos**
(`/dashboard/simulations`) — pasirinkite agentą, pridėkite scenarijus rankiniu būdu arba
spustelėkite **Generuoti scenarijus naudojant DI**, kad juos parengtumėte pagal agento
raginimą (pasirinktinai papildomai patikrinant kraštutinius atvejus), ir sugrupuokite juos į rinkinį.
Rinkinys fiksuoja savo scenarijus ir agentą, taip pat minimalų sėkmės rodiklį ir
pasirinktinę nulio kritinių nesėkmių taisyklę. Sėkmingi vykdymai tampa priimta
atskaitos būsena; vėlesni perėjimai iš sėkmės į nesėkmę grąžinami kaip regresijos.

CI sistemoje naudokite [organizacijos API raktą](/api-reference/developer-api-keys).
Šis scenarijus paleidžia rinkinį, tikrina būseną, kol baigiamas vertinimas ir palyginimas,
ir baigia vykdymą su nenuliniu kodu, nebent sprendimas yra `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` grąžina `202` su
vykdymo ID. `GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id}` grąžina
`status`, `verdict`, `pass_rate`, `critical_failure_count` ir
atskaitos būsenos `regressions` sąrašą. Abu galiniai taškai susieja URL organizaciją
su API rakto organizacija.

## Paleiskite rinkinį pagal tvarkaraštį

Atidarykite agento skirtuką **Simuliuoti**, pasirinkite **Leidimo vartų rinkiniai** ir sukurkite
arba redaguokite rinkinį. Įjunkite **Vykdyti pagal tvarkaraštį**, pasirinkite **Dažnumas** ir
**Laiko juosta**, tada nustatykite **Minutė po valandos**, **Vietos laikas** arba **Diena**,
kaip parodyta. Pasirinkite **Išsaugoti rinkinį**. Išjungus **Vykdyti pagal tvarkaraštį**,
pašalinamas valdymo skydelio tvarkaraštis.

### Per API

Naudodami PATCH atnaujinkite rinkinį, kad pridėtumėte arba pakeistumėte jo tvarkaraštį. Žr.
[Rinkiniai (leidimo vartai)](/api-reference/test-scenarios#suites-release-gates), kur pateiktas visas
rinkinio objektas ir galiniai taškai.

```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` gali būti `hourly`, `daily` arba `weekly`. Naudokite IANA laiko juostą.
Valandiniai tvarkaraščiai naudoja `minute`; dieniniai tvarkaraščiai naudoja `hour` ir
`minute`; savaitiniai tvarkaraščiai taip pat naudoja `weekday`, kur pirmadienis yra `0`,
o sekmadienis yra `6`. Rinkinio atsakyme pateikiami `next_run_at` ir `last_run_at`.

Laikai keičiasi pagal pasirinktos laiko juostos vasaros laiko pakeitimus. Suplanuoti vykdymai
rodomi rinkinio vykdymų istorijoje ir naudoja jo dabartinį agentą, scenarijus,
kriterijus ir priimtą atskaitos būseną. Kiekvienas sugeneruotas bandomasis skambutis siunčia
`test-call.completed`; rinkinio lygio užbaigimo žiniatinklio kabliuko nėra. Suplanuoti
skambučiai apmokestinami tokiu pačiu simuliacijos tarifu kaip rankiniai rinkinio vykdymai ir
rinkinio vykdyme įrašo `trigger: "schedule"`.

Norėdami pristabdyti tvarkaraštį nekeisdami jo laiko nustatymų, naudodami PATCH atnaujinkite visą
esamą tvarkaraščio objektą su `"enabled": false`. `frequency` yra privalomas; praleisti
laiko juostos ir laiko laukai nustatomi į numatytąsias reikšmes, todėl įtraukite esamas
reikšmes. Siųskite `"schedule": null`, kad pašalintumėte tvarkaraštį.

## Modeliai

### Regresijos korpusas kiekvienai užklausai

Tvarkykite JSON failą su `{name, scenario_prompt, expected_outcome}`
kortelėmis. Po kiekvieno užklausos pakeitimo paleiskite visą rinkinį kaip paketą; palyginkite
transkriptus ir įvertinimus su ankstesnio paleidimo rezultatais.

### Dūmų testas kiekvienam leidimui

Vienas paketas iš penkių sėkmingų scenarijų, kurį vykdote po kiekvieno
diegimo. Jautrus delsai, todėl palikite `stagger_seconds: 0`.

### Delsos lyginamoji analizė

Paleiskite identiškus scenarijus skirtinguose produkto planuose (`spark`,
`bolt`, `storm-base`). Palyginkite `call.graded` balus ir
`duration_seconds` iš kiekvieno gauto skambučio žurnalo.

---

## Tolesni veiksmai

<CardGroup cols={2}>
  <Card title="Bandomųjų skambučių nuoroda" icon="flask" href="/api-reference/test-calls">
    Visi užklausos parametrai, būsenos kodai ir paketų struktūros.
  </Card>
  <Card title="AI vertinimas" icon="chart-line" href="/api-reference/calls#ai-call-grading">
    Automatiškai įvertinkite kiekvieną testavimo paleidimą, kad laikui bėgant stebėtumėte kokybę.
  </Card>
  <Card title="Problemų ataskaitos" icon="triangle-exclamation" href="/api-reference/issue-reports">
    Pažymėkite konkrečius testus, kad juos peržiūrėtų žmogus.
  </Card>
  <Card title="test-call.completed žiniatinklio kabliukas" icon="bolt" href="/lt/webhooks/events">
    Perduokite rezultatus į savo CI / Slack / PagerDuty.
  </Card>
</CardGroup>
