Un test joue un appel en texte : un appelant simulé joue scenario, l'agent répond à partir de son brouillon (instructions, premier message et connaissances), et un juge évalue la conversation selon success_criteria. Écrivez des tests pour les appels qui comptent, lancez-les après chaque modification et publiez quand ils passent.
curl https://evasay.com/api/v1/voice/agents/AGENT_ID/tests \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Move a booking",
"scenario": "A regular customer wants to move Friday 3 pm to Saturday morning.",
"success_criteria": "Offers Saturday times and confirms the new time and the customer'"'"'s name.",
"max_turns": 8
}'
POST /agents/{id}/test-runs lance tous les tests de l'agent, ou ceux de test_ids, et renvoie une exécution par test (status: "running"). Interrogez GET /test-runs/{id} jusqu'à ce que status soit passed, failed ou error ; l'exécution contient alors le transcript et la reason du juge (en anglais, ou en chinois avec reason_language: "zh"). Chaque exécution coûte des Credits, affichés avec les tests dans le tableau de bord ; les exécutions s'arrêtent à la première que le solde ne peut pas payer, et not_started liste les autres. Une exécution qui échoue à se dérouler est remboursée. Les tests vérifient ce que dit l'agent, pas sa voix ni son rythme, et n'appellent pas ses fonctions : prévisualisez-les avec POST /tools/{id}/test. Un agent a jusqu'à 30 tests ; PATCH et DELETE /agents/{id}/tests/{test_id} en modifient ou en suppriment un.
Outre les appels complets (type: "simulation", par défaut), un test peut vérifier une seule réponse. type: "next_reply" prend chat_history, la conversation qui précède et se termine par l'appelant ([{role, text}], role valant caller ou agent), et success_criteria pour la réponse suivante de l'agent. type: "tool_call" prend chat_history et expected_tool {name, arguments, match} : l'agent doit appeler name (une de ses fonctions, ou end_call, transfer_call, handoff_to_agent) avec arguments, comparés exactement (texte rogné, sans tenir compte de la casse) ou, avec match: "judge", selon le sens ; les autres arguments qu'il passe sont ignorés. Le transcript d'une exécution indique dans tool_calls les fonctions appelées par l'agent.
POST /agents/{id}/tests/generate propose des tests à partir du brouillon de l'agent : ses instructions, ses connaissances et ses fonctions. Il prend count (1 à 10, 5 par défaut), types, focus (ce qu'il faut couvrir) et language (en ou zh, pour les noms et critères), coûte des Credits comme une exécution et renvoie des brouillons à relire puis à envoyer à POST /agents/{id}/tests ; avec save: true, il les enregistre.