Crea un agente a partir de una plantilla y, si quieres, define sus campos en la misma solicitud. Sin template empieza en blanco; GET /api/v1/voice/catalog lista las plantillas junto con los idiomas y las voces que acepta un agente. Las plantillas están en inglés y chino, así que para otro idioma envíe system_prompt y first_message en ese idioma. O se guarda toda la solicitud o no se crea ningún agente, así que una solicitud rechazada puede reenviarse una vez corregida. dashboard_url en la respuesta es la página del agente en el panel, donde puede hablar con el borrador desde el navegador. Todos los agentes funcionan con EvaSay ASR, EvaSay LLM y EvaSay TTS, que EvaSay elige para cada llamada según su idioma y la carga, y que están incluidos en el precio de la llamada; no hay cuentas de otros proveedores que configurar.
curl https://evasay.com/api/v1/voice/agents \
-X POST \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{
"name": "Front desk",
"language": "en",
"first_message": "Hi, thanks for calling Sunrise Salon. How can I help?",
"system_prompt": "You are the front desk of Sunrise Salon..."
}'
Actualiza cualquiera de estos campos con PATCH /api/v1/voice/agents/{id}:
| Campo | Notas |
|---|---|
name, first_message, system_prompt | Texto |
status | published publica el borrador como una versión nueva; draft deja de recibir llamadas |
language | Uno de 27 idiomas, p. ej. en, zh, es, de, o multi para seguir a quien llama |
temperature | 0-100 |
max_duration_sec, silence_timeout_sec | Límites de la llamada |
interruptible, end_call_enabled | Booleanos |
confirm_details | Booleano; repite números y nombres en voz alta y pide que se confirmen |
ai_disclosure | Booleano, por defecto true; antes de su primer mensaje, el agente dice en el idioma de la llamada que quien llama habla con una IA (se omite si el primer mensaje ya lo dice) |
voicemail_detection | Booleano; las llamadas salientes escuchan primero y terminan al llegar a un buzón |
voicemail_message | Se deja en un buzón, puede usar {{variables}}; ninguno para colgar |
transfer_number | Número al que transferir, en formato internacional |
transfer_destinations | Hasta 9 números más, [{name, number, when}]; el agente elige uno según when |
transfer_briefing | Booleano; la persona que contesta primero oye el resumen de la llamada que hace el agente |
pronunciations | Hasta 100 [{word, say, case_sensitive}]; la voz dice say en lugar de word |
idle_messages | Hasta 3 recordatorios que se dicen por turno a quien llama y guarda silencio antes de terminar la llamada |
noise_reduction | Booleano; el ruido de fondo de quien llama se filtra antes de que lo oigan |
recording_enabled | Booleano; las llamadas se graban en dos canales (quien llama a la izquierda, el agente a la derecha) |
recording_consent | announce, ask (se conserva solo si quien llama acepta) o none |
recording_notice | El aviso o la pregunta que se dice primero; vacío para usar el integrado en el idioma de la llamada |
handoffs | Hasta 5 [{agent_id, when}]: otros agentes a los que este puede pasar una llamada |
knowledge_base_id | Una de tus bases de conocimiento |
vocabulary_id | Uno de tus vocabularios; los términos que contiene se reconocen mejor cuando los dice quien llama |
voice_id | Un id de voz integrada de EvaSay, o una de tus voces clonadas (clone:…) |
Las voces integradas dependen del idioma: el chino tiene ming-designed-female-clear y ming-designed-female-warm (femeninas), ming-designed-male-clear y ming-designed-male-friendly (masculinas); los demás idiomas tienen F1–F5 (femeninas) y M1–M5 (masculinas). Una voz integrada que no habla el idioma del agente se sustituye por la del mismo género que sí lo habla. El nombre de campo anterior tts_voice_id se sigue aceptando. Cualquier otro valor de voice_id, o una voz clonada que aún no esté lista, se rechaza.
analysis_config define qué se analiza de cada llamada al terminar: summary (por defecto true), summaryLanguage, successCriteria (lo que logra una llamada exitosa), fields (hasta 20 {name, type, description} que extraer, con type igual a string, number o boolean) y scorecard (hasta 10 {name, description, weight}, peso de 1 a 5). Los resultados están en el analysis de la llamada y en el webhook call.analyzed.
Cambiar los campos de un agente cambia su borrador. Las llamadas siguen usando la versión publicada hasta que publiques el borrador con POST /api/v1/voice/agents/{id}/publish (opcionalmente con una note), o con status: "published" en el mismo PATCH. Cada publicación conserva una versión numerada; published_version en el agente indica cuál usan las llamadas. Una llamada se queda en la versión que estaba activa cuando empezó, así que publicar durante una llamada no la cambia. Las llamadas de prueba desde el panel usan el borrador.
GET /agents/{id}/versions lista las versiones, y POST /agents/{id}/versions/{version}/restore vuelve atrás: las llamadas nuevas usan esa versión y el borrador pasa a ser ella. El nombre del agente, el despliegue, el aspecto del widget y las notificaciones no tienen versiones y cambian de inmediato, igual que los documentos de su base de conocimiento.