ThunderPhone 2.0、提供開始。セルフサービスで、1分あたり2¢から。発表内容を見る

Developer cookbook

エージェントをエンドツーエンドでテスト(API)

ThunderPhone API を通じて、ワンショットシミュレーション、並列シナリオバッチ、リリースゲートスイートを実行し、顧客が耳にする前にエージェントのリグレッションを検出します。

AIエージェントを改善するには、プロンプト、ツール、エッジケースの処理方法を 繰り返し調整します。シミュレーションAPI は、指定したシナリオプロンプトを使用して エージェントに対する実際の通話を実行します。エージェントを対象にするとボット間の実行となり、 電話番号を対象にするとSIPループバック実行となります。各実行では、文字起こし、評価、 課金を含む実際の通話ログが生成されるため、エージェントの挙動とコストを正確に確認できます。

用途:

  • プロンプトを編集するたびのデプロイ前スモークテスト
  • CIに組み込むリグレッションスイート(test-call.completed webhook をフックし、 スコアが低下した場合にビルドを失敗させる)
  • 同時実行制限のストレステスト

単発実行: 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_typestringはいagent または phone_number
target_idintegerはいエージェントID(または電話番号ID)
directionstringいいえoutbound(デフォルト。テスト発信者が発信)または inbound(テスト発信者が応答)
scenario_promptstringいいえテストボットの発話内容を指定
language / primary_languagestringいいえテスト発信者の言語。サポートされていないコードは拒否されます
simulator_productstringいいえtesting(デフォルト)、またはウォーム転送の相談テストなど、より人間らしいシミュレーション発信者向けの spark
consent_to_chargebooleanはいtrue である必要があります。見積もりには、選択したエージェントとシミュレーション発信者の両方に加え、すべての電話レッグの料金が含まれます
target_numberstringいいえリモート側のE.164上書き値。指定しない場合はプラットフォームのテスト番号を使用します

mode は読み取り専用であり、target_type から導出されます。agent では mode="bot" が生成され、phone_number では mode="sip" が生成されます。

レスポンスは、status="queued"シミュレーション実行オブジェクト です。statuscompleted または 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 1

POST /v1/orgs/{org_id}/suites/{suite_id}/run は実行 ID とともに 202 を返します。GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id}statusverdictpass_ratecritical_failure_count、およびベースラインの regressions リストを返します。どちらのエンドポイントも、URL 内の組織を API キーの組織に紐付けます。

パターン

プロンプトごとのリグレッションコーパス

{name, scenario_prompt, expected_outcome} タプルを含む JSON ファイルを管理します。プロンプトを変更するたびに、完全なセットをバッチとして実行し、前回の実行結果と文字起こしおよび評価を比較します。

リリースごとのスモークテスト

デプロイのたびに実行する、ハッピーパスのシナリオ 5 件からなる単一バッチです。レイテンシーの影響を受けやすいため、stagger_seconds: 0 を維持します。

レイテンシーベンチマーク

異なる製品ティア(sparkboltstorm-base)に対して同一のシナリオを実行します。各通話ログから call.graded スコアと duration_seconds を比較します。


次のステップ