Το ThunderPhone 2.0 είναι εδώ.Ξεκινήστε μόνοι σας, από 2¢/λεπτό.Διαβάστε την ανακοίνωση

Developer cookbook

Δοκιμάστε έναν πράκτορα από άκρο σε άκρο (API)

Εκτελέστε μεμονωμένες προσομοιώσεις, παράλληλες παρτίδες σεναρίων και σουίτες πυλών κυκλοφορίας μέσω του API του ThunderPhone, ώστε οι παλινδρομήσεις του πράκτορα να εντοπίζονται πριν τις ακούσουν οι πελάτες.

Η επανάληψη σε έναν AI πράκτορα σημαίνει επανάληψη στο prompt του, στα εργαλεία του και στον τρόπο με τον οποίο χειρίζεται οριακές περιπτώσεις. Το API προσομοιώσεων εκτελεί πραγματικές κλήσεις προς έναν πράκτορα χρησιμοποιώντας ένα prompt σεναρίου που παρέχετε. Η στόχευση ενός πράκτορα δημιουργεί εκτέλεση μεταξύ δύο πρακτόρων· η στόχευση ενός τηλεφωνικού αριθμού δημιουργεί εκτέλεση βρόχου επιστροφής SIP. Κάθε εκτέλεση παράγει πραγματικό αρχείο καταγραφής κλήσης με απομαγνητοφώνηση, αξιολόγηση και χρέωση, ώστε να βλέπετε ακριβώς πώς συμπεριφέρεται ο πράκτορας και πόσο κοστίζει.

Χρησιμοποιήστε το για:

  • Δοκιμές ταχείας επαλήθευσης πριν από την ανάπτυξη μετά από κάθε επεξεργασία prompt
  • Σουίτες παλινδρόμησης συνδεδεμένες με CI (συνδέστε το webhook test-call.completed → αποτύχετε το build αν η βαθμολογία μειωθεί)
  • Δοκιμή αντοχής των ορίων ταυτόχρονης εκτέλεσης

Μία εκτέλεση: μεμονωμένη κλήση

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ναιΤο αναγνωριστικό του πράκτορα (ή το αναγνωριστικό τηλεφωνικού αριθμού)
directionstringόχιoutbound (προεπιλογή· ο δοκιμαστικός καλών πραγματοποιεί την κλήση) ή inbound (ο δοκιμαστικός καλών απαντά)
scenario_promptstringόχιΚαθορίζει τι λέει το δοκιμαστικό bot
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". Ελέγχετε περιοδικά έως ότου το 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
  }'

Η απόκριση περιέχει μια λίστα 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 για να τα συντάξετε από την προτροπή του πράκτορα (με προαιρετικό έλεγχο οριακών περιπτώσεων) και ομαδοποιήστε τα σε μια σουίτα. Μια σουίτα δεσμεύει τα σενάρια και τον πράκτορά της, καθώς και ένα ελάχιστο ποσοστό επιτυχίας και έναν προαιρετικό κανόνα μηδενικών κρίσιμων αποτυχιών. Οι επιτυχημένες εκτελέσεις γίνονται η αποδεκτή γραμμή βάσης· μετέπειτα μεταβάσεις από επιτυχία σε αποτυχία επιστρέφονται ως παλινδρομήσεις.

Χρησιμοποιήστε ένα κλειδί API οργανισμού στο CI. Αυτό το σενάριο ενεργοποιεί τη σουίτα, πραγματοποιεί έλεγχο μέχρι να ολοκληρωθούν η αξιολόγηση και η σύγκριση και τερματίζει με κωδικό διαφορετικό του μηδενός, εκτός αν η ετυμηγορία είναι 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 επιστρέφει 202 με το αναγνωριστικό εκτέλεσης. Το GET /v1/orgs/{org_id}/suites/{suite_id}/runs/{run_id} επιστρέφει τα status, verdict, pass_rate, critical_failure_count και τη λίστα παλινδρομήσεων της γραμμής βάσης regressions. Και τα δύο τελικά σημεία δεσμεύουν τον οργανισμό του URL στον οργανισμό του κλειδιού API.

Εκτελέστε μια σουίτα με χρονοδιάγραμμα

Ανοίξτε την καρτέλα Προσομοίωση του πράκτορα, επιλέξτε Σουίτες πύλης κυκλοφορίας και δημιουργήστε ή επεξεργαστείτε μια σουίτα. Ενεργοποιήστε το Εκτέλεση με χρονοδιάγραμμα, επιλέξτε Συχνότητα και Ζώνη ώρας και, στη συνέχεια, ορίστε τα Λεπτό μετά την ώρα, Τοπική ώρα ή Ημέρα όπως εμφανίζονται. Επιλέξτε Αποθήκευση σουίτας. Η απενεργοποίηση του Εκτέλεση με χρονοδιάγραμμα καταργεί το χρονοδιάγραμμα του πίνακα ελέγχου.

Μέσω API

Κάντε PATCH στη σουίτα για να προσθέσετε ή να αντικαταστήσετε το χρονοδιάγραμμά της. Δείτε τις Σουίτες (πύλες κυκλοφορίας) για το πλήρες αντικείμενο σουίτας και τα τελικά σημεία.

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 ή weekly. Χρησιμοποιήστε μια ζώνη ώρας IANA. Τα ωριαία χρονοδιαγράμματα χρησιμοποιούν minute, τα ημερήσια χρονοδιαγράμματα χρησιμοποιούν hour και minute, ενώ τα εβδομαδιαία χρονοδιαγράμματα χρησιμοποιούν επίσης weekday, όπου η Δευτέρα είναι 0 και η Κυριακή είναι 6. Η απόκριση της σουίτας περιλαμβάνει τα next_run_at και last_run_at.

Οι ώρες ακολουθούν τις αλλαγές θερινής ώρας της επιλεγμένης ζώνης ώρας. Οι προγραμματισμένες εκτελέσεις εμφανίζονται στο ιστορικό εκτελέσεων της σουίτας και χρησιμοποιούν τον τρέχοντα πράκτορα, τα σενάρια, τα κριτήρια και την αποδεκτή γραμμή βάσης της. Κάθε παραγόμενη δοκιμαστική κλήση εκπέμπει test-call.completed· δεν υπάρχει webhook ολοκλήρωσης σε επίπεδο σουίτας. Οι προγραμματισμένες κλήσεις χρεώνονται με την ίδια τιμή προσομοίωσης με τις μη αυτόματες εκτελέσεις σουίτας και καταγράφουν trigger: "schedule" στην εκτέλεση της σουίτας.

Για να θέσετε σε παύση ένα χρονοδιάγραμμα χωρίς να αλλάξετε τον χρονισμό του, κάντε PATCH στο πλήρες υπάρχον αντικείμενο χρονοδιαγράμματος με "enabled": false. Το frequency είναι υποχρεωτικό· τα πεδία ζώνης ώρας και ώρας που παραλείπονται επαναφέρονται στις προεπιλεγμένες τιμές τους, επομένως συμπεριλάβετε τις υπάρχουσες τιμές. Στείλτε "schedule": null για να καταργήσετε το χρονοδιάγραμμα.

Μοτίβα

Σώμα παλινδρόμησης ανά προτροπή

Διατηρήστε ένα αρχείο JSON με πλειάδες {name, scenario_prompt, expected_outcome}. Σε κάθε αλλαγή προτροπής, εκτελέστε ολόκληρο το σύνολο ως δέσμη· συγκρίνετε τις απομαγνητοφωνήσεις και τις βαθμολογίες με την προηγούμενη εκτέλεση.

Έλεγχος καπνού ανά έκδοση

Μία δέσμη πέντε σεναρίων ομαλής ροής που εκτελείτε μετά από κάθε ανάπτυξη. Είναι ευαίσθητη στην καθυστέρηση, επομένως διατηρήστε το stagger_seconds: 0.

Συγκριτική αξιολόγηση καθυστέρησης

Εκτελέστε πανομοιότυπα σενάρια σε διαφορετικά επίπεδα προϊόντος (spark, bolt, storm-base). Συγκρίνετε τις βαθμολογίες call.graded και το duration_seconds από κάθε αρχείο καταγραφής κλήσης που προκύπτει.


Επόμενα βήματα