エージェントをエンドツーエンドでテスト(API)
ThunderPhone API を通じて、ワンショットシミュレーション、並列シナリオバッチ、リリースゲートスイートを実行し、顧客が耳にする前にエージェントのリグレッションを検出します。
AIエージェントを改善するには、プロンプト、ツール、エッジケースの処理方法を 繰り返し調整します。シミュレーションAPI は、指定したシナリオプロンプトを使用して エージェントに対する実際の通話を実行します。エージェントを対象にするとボット間の実行となり、 電話番号を対象にするとSIPループバック実行となります。各実行では、文字起こし、評価、 課金を含む実際の通話ログが生成されるため、エージェントの挙動とコストを正確に確認できます。
用途:
- プロンプトを編集するたびのデプロイ前スモークテスト
- CIに組み込むリグレッションスイート(
test-call.completedwebhook をフックし、 スコアが低下した場合にビルドを失敗させる) - 同時実行制限のストレステスト
単発実行: 1回の実行
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
}'フィールド:
| フィールド | 型 | 必須 | 説明 |
|---|---|---|---|
target_type | string | はい | agent または phone_number |
target_id | integer | はい | エージェントID(または電話番号ID) |
direction | string | いいえ | outbound(デフォルト。テスト発信者が発信)または inbound(テスト発信者が応答) |
scenario_prompt | string | いいえ | テストボットの発話内容を指定 |
language / primary_language | string | いいえ | テスト発信者の言語。サポートされていないコードは拒否されます |
simulator_product | string | いいえ | testing(デフォルト)、またはウォーム転送の相談テストなど、より人間らしいシミュレーション発信者向けの spark |
consent_to_charge | boolean | はい | true である必要があります。見積もりには、選択したエージェントとシミュレーション発信者の両方に加え、すべての電話レッグの料金が含まれます |
target_number | string | いいえ | リモート側のE.164上書き値。指定しない場合はプラットフォームのテスト番号を使用します |
mode は読み取り専用であり、target_type から導出されます。agent では
mode="bot" が生成され、phone_number では mode="sip" が生成されます。
レスポンスは、status="queued" のシミュレーション実行オブジェクト
です。status が completed または failed になるまでポーリングします。call_id が設定されたら、
GET /v1/calls/{call_id}/transcriptで文字起こしを取得します。
バッチ: 並列シナリオ
N個のシナリオを同時に実行します。既知のすべてのエッジケースを並列でテストする リグレッションスイートに便利です。
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
}'レスポンスには、子実行IDの run_ids リストが含まれます。バッチステータスを取得します。
curl https://api.thunderphone.com/v1/simulations/batches/{batch_id} \
-H "Authorization: Bearer sk_live_YOUR_API_KEY"run_count の上限は20です。stagger_seconds は、エージェントへの過剰な負荷を避けるため、
起動間隔を設定します(0~60秒)。
CI に組み込む
シミュレーションページ
(/dashboard/simulations) でリリースゲートスイートを作成します。エージェントを選択し、シナリオを手動で追加するか、AIでシナリオを生成をクリックしてエージェントのプロンプトからシナリオを下書きします(任意でエッジケースの確認も可能です)。その後、それらをスイートにまとめます。
スイートには、そのシナリオとエージェントに加え、最低合格率と任意の重大な失敗をゼロにするルールが固定されます。合格した実行は承認済みベースラインとなり、後続の合格→失敗への遷移はリグレッションとして返されます。
CI では組織 API キーを使用します。
このスクリプトはスイートをトリガーし、採点と比較が完了するまでポーリングを行い、判定が 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 1POST /v1/orgs/{org_id}/suites/{suite_id}/run は実行 ID とともに 202 を返します。GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id} は
status、verdict、pass_rate、critical_failure_count、およびベースラインの
regressions リストを返します。どちらのエンドポイントも、URL 内の組織を API キーの組織に紐付けます。
パターン
プロンプトごとのリグレッションコーパス
{name, scenario_prompt, expected_outcome} タプルを含む JSON ファイルを管理します。プロンプトを変更するたびに、完全なセットをバッチとして実行し、前回の実行結果と文字起こしおよび評価を比較します。
リリースごとのスモークテスト
デプロイのたびに実行する、ハッピーパスのシナリオ 5 件からなる単一バッチです。レイテンシーの影響を受けやすいため、stagger_seconds: 0 を維持します。
レイテンシーベンチマーク
異なる製品ティア(spark、bolt、storm-base)に対して同一のシナリオを実行します。各通話ログから call.graded スコアと duration_seconds を比較します。