에이전트를 엔드투엔드로 테스트하기(API)
ThunderPhone API를 통해 원샷 시뮬레이션, 병렬 시나리오 배치, 릴리스 게이트 스위트를 실행하여 고객이 듣기 전에 에이전트 회귀를 포착합니다.
에이전트를 반복 개선한다는 것은 프롬프트, 도구, 그리고 엣지 케이스를 처리하는 방식을 반복 개선한다는 의미입니다. 시뮬레이션 API는 제공한 시나리오 프롬프트를 사용하여 에이전트에 실제 통화를 실행합니다. 에이전트를 대상으로 지정하면 봇 간 실행이 생성되고, 전화번호를 대상으로 지정하면 SIP 루프백 실행이 생성됩니다. 모든 실행은 트랜스크립트, 평가 및 청구 정보가 포함된 실제 통화 로그를 생성하므로 에이전트가 정확히 어떻게 동작하는지와 비용을 확인할 수 있습니다.
다음 용도로 사용합니다.
- 프롬프트를 수정할 때마다 배포 전에 수행하는 스모크 테스트
- CI에 연결된 회귀 테스트 모음(
test-call.completed웹훅 연결 → 점수가 하락하면 빌드 실패 처리) - 동시 실행 한도 스트레스 테스트
단일 실행: 한 번의 실행
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 | 문자열 | 예 | agent 또는 phone_number |
target_id | 정수 | 예 | 에이전트 ID(또는 전화번호 ID) |
direction | 문자열 | 아니요 | outbound(기본값, 테스트 발신자가 전화를 겁니다) 또는 inbound(테스트 발신자가 전화를 받습니다) |
scenario_prompt | 문자열 | 아니요 | 테스트 봇이 말할 내용을 지정합니다 |
language / primary_language | 문자열 | 아니요 | 테스트 발신자의 언어이며, 지원되지 않는 코드는 거부됩니다 |
simulator_product | 문자열 | 아니요 | testing(기본값) 또는 온도 전환 상담 테스트와 같이 더 사람과 유사한 시뮬레이션 발신자를 위한 spark |
consent_to_charge | 불리언 | 예 | 반드시 true여야 합니다. 예상 비용에는 선택한 에이전트와 시뮬레이션 발신자, 그리고 모든 전화 통신 구간의 비용이 청구됩니다 |
target_number | 문자열 | 아니요 | 원격 측의 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로 시나리오 생성을 클릭하여 에이전트의 프롬프트에서 시나리오 초안을 생성합니다(선택적으로 엣지 케이스 검토 포함). 그런 다음 이를 스위트로 그룹화합니다.
스위트는 시나리오와 에이전트, 최소 통과율, 그리고 선택적인 심각한 실패 0건 규칙을 고정합니다. 통과한 실행은 승인된 기준선이 되며, 이후 통과→실패 전환은 회귀로 반환됩니다.
CI에서 조직 API 키를 사용합니다.
이 스크립트는 스위트를 트리거하고, 채점 및 비교가 완료될 때까지 폴링하며, 판정이 pass가 아니면 0이 아닌 종료 코드를 반환합니다.
#!/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를 비교합니다.