---
title: "Δοκιμάστε έναν πράκτορα από άκρο σε άκρο (API)"
description: "Εκτελέστε μεμονωμένες προσομοιώσεις, παράλληλες παρτίδες σεναρίων και σουίτες πυλών κυκλοφορίας μέσω του API του ThunderPhone, ώστε οι παλινδρομήσεις του πράκτορα να εντοπίζονται πριν τις ακούσουν οι πελάτες."
---

<Note>
  Προτιμάτε τον πίνακα ελέγχου; Η ίδια δυνατότητα βρίσκεται στις **Προσομοιώσεις**
  (`/dashboard/simulations`), συμπεριλαμβανομένης της δημιουργίας σεναρίων με AI — δείτε
  [Προσομοίωση μιας κλήσης](/el/guides/simulate-a-call). Αυτή η σελίδα καλύπτει την
  προγραμματιστική διαδρομή.
</Note>

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

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

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

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

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

Η απόκριση είναι ένα [αντικείμενο εκτέλεσης προσομοίωσης](/api-reference/test-calls#test-call-run-object)
με `status="queued"`. Ελέγχετε περιοδικά έως ότου το `status` γίνει `completed` ή
`failed`· μόλις οριστεί το `call_id`, φορτώστε την απομαγνητοφώνηση μέσω
[`GET /v1/calls/{call_id}/transcript`](/api-reference/calls#get-transcript).

## Δέσμες: παράλληλα σενάρια

Εκτελέστε N σενάρια ταυτόχρονα — χρήσιμο για σουίτες παλινδρόμησης που
καλύπτουν κάθε γνωστή οριακή περίπτωση παράλληλα:

```bash
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` με αναγνωριστικά θυγατρικών εκτελέσεων. Ανακτήστε την
κατάσταση της δέσμης:

```bash
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 οργανισμού](/api-reference/developer-api-keys) στο CI.
Αυτό το σενάριο ενεργοποιεί τη σουίτα, πραγματοποιεί έλεγχο μέχρι να ολοκληρωθούν
η αξιολόγηση και η σύγκριση και τερματίζει με κωδικό διαφορετικό του μηδενός,
εκτός αν η ετυμηγορία είναι `pass`:

```bash
#!/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 στη σουίτα για να προσθέσετε ή να αντικαταστήσετε το χρονοδιάγραμμά της.
Δείτε τις [Σουίτες (πύλες κυκλοφορίας)](/api-reference/test-scenarios#suites-release-gates)
για το πλήρες αντικείμενο σουίτας και τα τελικά σημεία.

```bash
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` από κάθε αρχείο καταγραφής κλήσης που προκύπτει.

---

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

<CardGroup cols={2}>
  <Card title="Αναφορά δοκιμαστικών κλήσεων" icon="flask" href="/api-reference/test-calls">
    Κάθε παράμετρος ερωτήματος, κωδικός κατάστασης και μορφή δέσμης.
  </Card>
  <Card title="Βαθμολόγηση AI" icon="chart-line" href="/api-reference/calls#ai-call-grading">
    Βαθμολογήστε αυτόματα κάθε δοκιμαστική εκτέλεση για να παρακολουθείτε την ποιότητα με την πάροδο του χρόνου.
  </Card>
  <Card title="Αναφορές προβλημάτων" icon="triangle-exclamation" href="/api-reference/issue-reports">
    Επισημάνετε συγκεκριμένες δοκιμές για ανθρώπινη αξιολόγηση.
  </Card>
  <Card title="Webhook test-call.completed" icon="bolt" href="/el/webhooks/events">
    Μεταδώστε αποτελέσματα στο CI / Slack / PagerDuty σας.
  </Card>
</CardGroup>
