Тест разыгрывает один звонок в виде текста: имитированный звонящий играет scenario, агент отвечает по своему черновику (инструкции, первое сообщение и знания), а проверяющий оценивает разговор по success_criteria. Пишите тесты для важных звонков, запускайте их после каждого изменения и публикуйте, когда они проходят.
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 запускает все тесты агента или те, что в test_ids, и отвечает одним прогоном на тест (status: "running"). Опрашивайте GET /test-runs/{id}, пока status не станет passed, failed или error; тогда в прогоне есть transcript и reason проверяющего (на английском или на китайском с reason_language: "zh"). Каждый прогон стоит Credits — сумма показана рядом с тестами в панели; прогоны останавливаются на первом, который не оплачивает баланс, а not_started перечисляет остальные. Прогон, который не удалось провести, возвращается. Тесты проверяют, что говорит агент, а не голос или темп, и не вызывают его функции: их проверьте заранее через POST /tools/{id}/test. У агента до 30 тестов; PATCH и DELETE /agents/{id}/tests/{test_id} меняют или удаляют тест.
Кроме целых звонков (type: "simulation", по умолчанию), тест может проверять один ответ. type: "next_reply" принимает chat_history — предшествующий разговор, который заканчивается словами звонящего ([{role, text}], где role — caller или agent), и success_criteria для следующего ответа агента. type: "tool_call" принимает chat_history и expected_tool {name, arguments, match}: агент должен вызвать name (одну из своих функций или end_call, transfer_call, handoff_to_agent) с arguments, которые сравниваются точно (без пробелов по краям и без учёта регистра) или, с match: "judge", по смыслу; остальные переданные аргументы не проверяются. transcript прогона показывает в tool_calls функции, которые вызвал агент.
POST /agents/{id}/tests/generate предлагает тесты по черновику агента: его инструкциям, знаниям и функциям. Принимает count (1–10, по умолчанию 5), types, focus (что охватить) и language (en или zh, для названий и критериев), стоит Credits как один прогон и возвращает черновики, которые нужно просмотреть и отправить в POST /agents/{id}/tests; с save: true они сохраняются.