> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thunderphone.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Bir ajanı uçtan uca test edin (API)

> Müşteriler fark etmeden önce gerilemelerin yakalanması için test-calls API'siyle yapay zeka ajanınızda önceden hazırlanmış senaryoları ç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.
  [Çağrıyı simüle etme](/tr/guides/simulate-a-call). Bu sayfa
  programatik yöntemi kapsar.
</Note>

Bir yapay zeka ajanını yinelemek, istemini, araçlarını
ve uç durumları ele alma biçimini yinelemek anlamına gelir. **test-calls API**,
sağladığınız senaryo istemini kullanarak bir ajana karşı gerçek
(bot-bot veya SIP geri döngü) çağrılar çalıştırır — her çalıştırma;
transkript, değerlendirme ve faturalandırma içeren gerçek bir çağrı günlüğü oluşturur; böylece ajanın
nasıl davrandığını ve maliyetini tam olarak görebilirsiniz.

Şunlar için kullanın:

* Her istem düzenlemesinden sonra yayına alma öncesi temel testler
* 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 theme={null}
curl -X POST https://api.thunderphone.com/v1/test-calls \
  -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`       | string  | evet     | `agent` veya `phone_number`                                       |
| `target_id`         | integer | evet     | Ajan kimliği (veya telefon numarası kimliği)                      |
| `direction`         | string  | evet     | `outbound` (bot arama yapar) veya `inbound` (bot yanıtlar)        |
| `scenario_prompt`   | string  | hayır    | Test botunun ne söyleyeceğini belirler                            |
| `mode`              | string  | hayır    | `bot` (bot-bot, varsayılan) veya `sip` (SIP geri döngü)           |
| `consent_to_charge` | boolean | **evet** | `true` olmalıdır. Test çağrıları normal ücretin 2 katına mal olur |
| `target_number`     | string  | hayır    | Botun arayan kimliği için geçersiz kılma (E.164)                  |

Yanıt, `status="queued"` durumunda bir [Test çağrısı çalıştırma nesnesidir](/api-reference/test-calls#test-call-run-object).
`status`, `completed` veya `failed` olana kadar sorgulayın; `call_id`
ayarlandıktan sonra transkripti
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript) aracılığıyla yükleyin.

## Toplu işlemler: paralel senaryolar

N senaryoyu eşzamanlı çalıştırın — bilinen tüm uç durumları paralel olarak
ele alan regresyon paketleri için kullanışlıdır:

```bash theme={null}
curl -X POST https://api.thunderphone.com/v1/test-call-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 kimliklerini içeren bir `run_ids` listesi döndürür. Toplu işlem
durumunu getirin:

```bash theme={null}
curl https://api.thunderphone.com/v1/test-call-batches/{batch_id} \
  -H "Authorization: Bearer sk_live_YOUR_API_KEY"
```

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

## CI'ye bağlayın

**Simülasyonlar** sayfasında (`/dashboard/simulations`) bir sürüm geçiş kontrol paketi oluşturun — ajanı seçin, senaryoları elle ekleyin veya ajanın isteminden taslak oluşturmaları için **Yapay zekayla senaryolar oluştur** seçeneğine tıklayın (isteğe bağlı uç durum taramasıyla) ve bunları bir pakette gruplayın.
Bir paket; senaryolarını ve ajanını, ayrıca minimum başarılı geçiş oranını ve isteğe bağlı sıfır kritik hata kuralını sabitler. Başarılı çalıştırmalar kabul edilen temel 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, derecelendirme ve karşılaştırma tamamlanana kadar yoklar ve karar `pass` olmadığı sürece sıfır olmayan kodla çıkar:

```bash theme={null}
#!/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
`regressions` listesini döndürür. Her iki uç nokta da URL'deki kuruluşu API anahtarının kuruluşuna bağlar.

## 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 notları önceki çalıştırmayla karşılaştırın.

### Sürüm başına duman testi

Her yayına almadan sonra çalıştırdığınız, başarılı akış içeren beş senaryodan oluşan tek bir toplu işlem. Gecikmeye duyarlıdır; bu nedenle `stagger_seconds: 0` değerini koruyun.

### Gecikme karşılaştırması

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

***

## Sonraki adımlar

<CardGroup cols={2}>
  <Card title="Test çağrıları başvurusu" icon="flask" href="/api-reference/test-calls">
    Her sorgu parametresi, durum kodu ve toplu işlem biçimi.
  </Card>

  <Card title="Yapay zeka derecelendirmesi" icon="chart-line" href="/api-reference/calls#ai-call-grading">
    Kaliteyi zaman içinde takip etmek için her test çalıştırmasını otomatik 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 webhook'u" icon="bolt" href="/tr/webhooks/events">
    Sonuçları CI / Slack / PagerDuty sisteminize aktarın.
  </Card>
</CardGroup>
