---
title: "Bir ajanı uçtan uca test edin (API)"
description: "Ajan gerilemelerini müşteriler duymadan önce yakalamak için ThunderPhone API üzerinden tek seferlik simülasyonlar, paralel senaryo toplu işlemleri ve sürüm geçişi test paketleri çalıştırın."
---

<Note>
  Kontrol panelini mi tercih ediyorsunuz? Aynı özellik, yapay zeka senaryosu oluşturma dahil olmak üzere **Simülasyonlar**
  (`/dashboard/simulations`) bölümünde de bulunur — bkz.
  [Bir aramayı simüle edin](/tr/guides/simulate-a-call). Bu sayfa,
  programatik yöntemi ele alır.
</Note>

Bir yapay zeka ajanını yinelemek, istemini, araçlarını
ve uç durumları ele alma biçimini yinelemek anlamına gelir. **simülasyonlar API'si**, sağladığınız bir senaryo istemiyle
bir ajana karşı gerçek aramalar gerçekleştirir. Bir ajanı hedeflemek botlar arası bir çalıştırma oluşturur; bir telefon numarasını hedeflemek ise
bir SIP geri döngü çalıştırması oluşturur. Her çalıştırma, döküm,
puanlama ve ücretlendirme içeren gerçek bir arama günlüğü üretir; böylece ajanın
tam olarak nasıl davrandığını ve maliyetini görürsünüz.

Şunlar için kullanın:

- Her istem düzenlemesinden sonra yayına alma öncesi hızlı doğrulama testleri
- CI'a bağlanan regresyon paketleri (`test-call.completed` webhook'unu bağlayın
  → puan düşerse derlemeyi başarısız yapın)
- Eşzamanlılık sınırlarını stres testine tabi tutma

## Tek seferlik: tek çalıştırma

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

Alanlar:

| Alan | Tür | Zorunlu | Açıklama |
|-------|------|----------|-------------|
| `target_type` | dize | evet | `agent` veya `phone_number` |
| `target_id` | tam sayı | evet | Ajan kimliği (veya telefon numarası kimliği) |
| `direction` | dize | hayır | `outbound` (varsayılan; test arayanı aramayı başlatır) veya `inbound` (test arayanı aramayı yanıtlar) |
| `scenario_prompt` | dize | hayır | Test botunun ne söyleyeceğini belirler |
| `language` / `primary_language` | dize | hayır | Test arayanının dili; desteklenmeyen kodlar reddedilir |
| `simulator_product` | dize | hayır | `testing` (varsayılan) veya sıcak aktarma danışma testleri gibi daha insan benzeri simüle edilmiş bir arayan için `spark` |
| `consent_to_charge` | boolean | **evet** | `true` olmalıdır. Tahmin, seçilen ajanı ve simüle edilmiş arayanı sabit dakika başı ücret üzerinden, ayrıca varsa telefon bağlantısı ücretiyle birlikte faturalandırır |
| `target_number` | dize | hayır | Uzak taraf için E.164 geçersiz kılma değeri; aksi takdirde platform test numarası kullanılır |

`mode` salt okunurdur ve `target_type` değerinden türetilir: `agent`,
`mode="bot"` üretirken `phone_number`, `mode="sip"` üretir.

Yanıt, `status="queued"` durumunda bir [simülasyon çalıştırma nesnesidir](/api-reference/test-calls#test-call-run-object).
`status`, `completed` veya
`failed` olana kadar yoklayın; `call_id` ayarlandıktan sonra dökümü
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript) üzerinden yükleyin.

## Toplu çalıştırmalar: paralel senaryolar

N senaryoyu eşzamanlı çalıştırın — bilinen her uç duruma
paralel olarak ulaşan regresyon paketleri için kullanışlıdır:

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

Yanıt, alt çalıştırma kimliklerinden oluşan bir `run_ids` listesi içerir. Toplu çalıştırma
durumunu alın:

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

`run_count` en fazla 20 olabilir; `stagger_seconds`, ajanı aşırı yüklememek için
başlatmaları aralıklı yapar (0–60 sn).

## Bunu CI'a bağlayın

**Simülasyonlar** sayfasında (`/dashboard/simulations`) bir yayın geçidi paketi
oluşturun — yapay zeka ajanını seçin, senaryoları elle ekleyin veya ajanın
isteminden taslak oluşturmaları için **Yapay Zeka ile senaryo oluştur** seçeneğine
tıklayın (isteğe bağlı bir uç durum kontrolüyle) ve bunları bir pakette
gruplandırın. Bir paket, senaryolarını ve yapay zeka ajanını; ayrıca minimum
başarı oranını ve isteğe bağlı sıfır kritik hata kuralını sabitler. Başarılı
çalıştırmalar kabul edilen temel çizgi olur; daha sonraki başarılı→başarısız
geçişler regresyon olarak döndürülür.

CI'da bir [kuruluş API anahtarı](/api-reference/developer-api-keys) kullanın.
Bu betik paketi tetikler, notlandırma ve karşılaştırma tamamlanana kadar sorgular
ve karar `pass` olmadıkça sıfır olmayan bir kodla çıkar:

```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`, çalıştırma kimliğiyle birlikte
`202` döndürür. `GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id}`,
`status`, `verdict`, `pass_rate`, `critical_failure_count` ve temel çizgi
`regressions` listesini döndürür. Her iki uç nokta da URL'deki kuruluşu API
anahtarının kuruluşuna bağlar.

## Bir paketi zamanlamaya göre çalıştırın

Ajanın **Simüle Et** sekmesini açın, **Yayın geçidi paketleri** seçeneğini
belirleyin ve bir paket oluşturun veya düzenleyin. **Zamanlamaya göre çalıştır**
seçeneğini açın, **Sıklık** ve **Saat dilimi** seçin; ardından gösterildiği
şekilde **Saatten sonraki dakika**, **Yerel saat** veya **Gün** ayarlayın.
**Paketi kaydet** seçeneğini belirleyin. **Zamanlamaya göre çalıştır**
seçeneğinin işaretini kaldırmak, pano zamanlamasını kaldırır.

### API ile

Zamanlamasını eklemek veya değiştirmek için pakete PATCH isteği gönderin.
Paket nesnesinin ve uç noktaların tamamı için [Paketler (yayın
geçitleri)](/api-reference/test-scenarios#suites-release-gates) bölümüne bakın.

```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`, `hourly`, `daily` veya `weekly` olabilir. IANA saat dilimi
kullanın. Saatlik zamanlamalarda `minute`; günlük zamanlamalarda `hour` ve
`minute`; haftalık zamanlamalarda ise ayrıca pazartesinin `0`, pazarın `6`
olduğu `weekday` kullanılır. Paket yanıtı `next_run_at` ve `last_run_at`
alanlarını içerir.

Saatler, seçilen saat diliminin yaz saati uygulaması değişikliklerine göre
belirlenir. Zamanlanmış çalıştırmalar paketin çalıştırma geçmişinde görünür ve
paketin mevcut yapay zeka ajanını, senaryolarını, ölçütlerini ve kabul edilen
temel çizgisini kullanır. Oluşturulan her test çağrısı `test-call.completed`
olayını yayımlar; paket düzeyinde tamamlanma webhook'u yoktur. Zamanlanmış
çağrılar, manuel paket çalıştırmalarıyla aynı simülasyon ücreti üzerinden
faturalandırılır ve paket çalıştırmasında `trigger: "schedule"` kaydedilir.

Zamanlamayı zamanlamasını değiştirmeden duraklatmak için, mevcut zamanlama
nesnesinin tamamına `"enabled": false` ile PATCH isteği gönderin. `frequency`
zorunludur; belirtilmeyen saat dilimi ve saat alanları varsayılan değerlerine
sıfırlanır, bu nedenle mevcut değerleri ekleyin. Zamanlamayı kaldırmak için
`"schedule": null` gönderin.

## Kalıplar

### İstem başına regresyon veri kümesi

`{name, scenario_prompt, expected_outcome}` demetlerinden oluşan bir JSON dosyası tutun.
Her istem değişikliğinde, tüm kümeyi toplu olarak çalıştırın; transkriptleri ve
değerlendirme puanlarını önceki çalıştırmayla karşılaştırın.

### Sürüm başına hızlı test

Her yayına alma işleminden sonra çalıştırdığınız, başarılı akıştaki beş senaryodan oluşan
tek bir toplu işlem. Gecikmeye duyarlı olduğundan `stagger_seconds: 0` değerini koruyun.

### Gecikme kıyaslaması

Aynı senaryoları farklı ürün katmanlarında (`spark`,
`bolt`, `storm-base`) çalıştırın. `call.graded` puanlarını ve
oluşan her çağrı günlüğündeki `duration_seconds` değerini karşılaştırın.

---

## Sonraki adımlar

<CardGroup cols={2}>
  <Card title="Test çağrıları referansı" icon="flask" href="/api-reference/test-calls">
    Her sorgu parametresi, durum kodu ve toplu işlem biçimi.
  </Card>
  <Card title="Yapay zeka ile değerlendirme" icon="chart-line" href="/api-reference/calls#ai-call-grading">
    Zaman içinde kaliteyi takip etmek için her test çalıştırmasını otomatik olarak puanlayın.
  </Card>
  <Card title="Sorun raporları" icon="triangle-exclamation" href="/api-reference/issue-reports">
    Belirli testleri insan incelemesi için işaretleyin.
  </Card>
  <Card title="test-call.completed web kancası" icon="bolt" href="/tr/webhooks/events">
    Sonuçları CI / Slack / PagerDuty sisteminize aktarın.
  </Card>
</CardGroup>
