Skip to content

Services

Guía completa para conectar el Agente de IA con servicios externos usando APIs REST.

Configuración de los Servicios de Agentes IA

Section titled “Configuración de los Servicios de Agentes IA”

Los servicios permiten que tu agente de IA se conecte con APIs externas para ejecutar acciones complejas como consultar bases de datos, realizar reservas, procesar pagos, o cualquier integración que necesites. El agente recolectará automáticamente la información necesaria del usuario antes de llamar a la API.

  1. Detección de Intención: La IA identifica que el usuario quiere usar un servicio.
  2. Recolección de Datos: El agente pregunta por los campos requeridos que falten.
  3. Validación: Se validan los tipos de datos antes de enviar.
  4. Llamada a API: Se ejecuta la llamada HTTP con los datos recolectados.
  5. Procesamiento: Se mapea la respuesta según responseMapping.
  6. Respuesta Final: Se envía la respuesta personalizada al usuario.
{
"services": [
{
"intent": "schedule_appointment",
"reference": "Servicio para agendar citas médicas en la clínica",
"enabled": true,
"method": "POST",
"requiredFields": [
{
"name": "nombre",
"description": "Nombre completo del paciente",
"promptHint": "¿Podrías indicarme tu nombre completo, por favor?",
"type": "string"
},
{
"name": "email",
"description": "Correo electrónico para confirmaciones",
"promptHint": "¿Cuál es tu dirección de correo electrónico?",
"type": "email"
},
{
"name": "fecha",
"description": "Fecha y hora preferida para la cita",
"promptHint": "¿Qué día y hora te gustaría agendar? (Ejemplo: mañana a las 3pm)",
"type": "date"
},
{
"name": "telefono",
"description": "Número de teléfono de contacto",
"promptHint": "¿Cuál es tu número de teléfono?",
"type": "phone"
}
],
"endpoint": "https://api.clinica.com/v1/appointments",
"tags": ["citas", "agendamiento", "medical"],
"headers": {
"Authorization": "Bearer {{apiKey}}",
"Content-Type": "application/json",
"X-Clinic-ID": "clinic_123"
},
"bodyTemplate": {
"patient_name": "{{nombre}}",
"patient_email": "{{email}}",
"appointment_date": "{{fecha|format('yyyy-MM-dd HH:mm')}}",
"phone": "{{telefono}}",
"source": "wabotify_ai"
},
"responseMapping": {
"appointmentId": "$.data.appointment_id",
"confirmedDate": "$.data.scheduled_date",
"doctorName": "$.data.doctor.name",
"status": "$.status",
"errorMessage": "$.error.message"
},
"responseMessage": "¡Perfecto! Tu cita ha sido agendada para el {{confirmedDate}} con {{doctorName}}. ID de cita: {{appointmentId}}",
"responseConditions": [
{
"condition": "$.status == 'success'",
"message": "✅ ¡Cita confirmada! Te esperamos el {{confirmedDate}} con {{doctorName}}. Recibirás un recordatorio por email.",
"nextService": "verify_contact_info"
},
{
"condition": "$.status == 'conflict'",
"message": "❌ Lo siento, ese horario no está disponible. ¿Te gustaría que te sugiera horarios libres?",
"nextService": "verify_contact_info"
},
{
"condition": "$.status == 'error'",
"message": "⚠️ Hubo un problema al agendar: {{errorMessage}}. ¿Podrías intentar con otra fecha?",
"nextService": "verify_contact_info"
}
],
"action": "notify_doctor"
}
]
}

Las variables del sistema son valores predefinidos que el agente puede utilizar automáticamente en los servicios. Estas variables se actualizan dinámicamente durante la conversación y proporcionan información contextual importante.

Sintaxis: [nombreVariable]

Solo disponibles en: Sección Servicios

VariableDescripciónTipoEjemplo
[lastmessagetime]Fecha y hora del último mensaje del usuarioSistema2024-08-31 18:53:28
[sessionId]ID único de la sesión actualSistemasess_abc123def456
[agentId]ID único del agente actualSistemaagent_xyz789
[lastmessage]Último mensaje del usuarioSistema"Hola, necesito agendar una cita"
[lastmessageIA]Última respuesta del agenteSistema"¡Hola! Te ayudo a agendar tu cita"
[urlTempFile]URL temporal de archivos adjuntosDinámicohttps://temp.wabotify.com/file123
  • Endpoints: Para incluir variables del sistema en las URLs
  • Headers: Para autenticación o identificación
  • Body templates: Para enviar datos contextuales
  • Respuestas: Para personalizar mensajes

"services": [
{
"intent": "conversar_humano",
"reference": "Transferir conversación a agente humano cuando el cliente confirma que quiere hablar con una persona después de que el asistente virtual le ofrece soporte humano en la conversación. El cliente puede responder con confirmaciones como sí, ok, por favor, perfecto cuando se le pregunta si desea conversar con un agente humano.",
"enabled": true,
"method": "POST",
"requiredFields": [
{
"name": "curp",
"description": "Valor del Curp",
"promptHint": "Cual es tu curp?",
"type": "string"
}
],
"tags": [
"humano", "agente", "conversar", "si", "", "por favor", "claro", "perfecto", "dale"
],
"endpoint": "https://hook.us1.make.com/8dvokk7w5rqvlnbq9ibekj9vurqhprsy",
"headers": {
"content-type": "application/json"
},
"bodyTemplate": {
"curp": "{{curp}}",
"lastmessage": "[lastmessage]",
"messageIA": "[lastmessageIA]",
"fecha": "[lastmessagetime]",
"sessionId": "[sessionId]"
},
"responseMessage": "Validaremos la informacion.",
"action": ""
}
]

CampoTipoRequeridoDescripción
intentstring✅ SíIdentificador único del servicio (ej: schedule_appointment)
referencestring✅ SíDescripción clara para que la IA entienda cuándo usar este servicio
enabledboolean✅ SíSi el servicio está activo (true) o deshabilitado (false)
methodstring✅ SíMétodo HTTP: GET, POST, PUT, DELETE
endpointstring✅ SíURL completa de la API externa
requiredFieldsarray✅ SíLista de campos que el usuario debe proporcionar
headersobject❌ NoHeaders HTTP personalizados
bodyTemplateobject❌ NoEstructura del body para requests
responseMappingobject❌ NoMapeo de la respuesta usando JSONPath
responseMessagestring❌ NoMensaje de éxito predeterminado
responseConditionsarray❌ NoRespuestas condicionales basadas en el resultado
tagsarray❌ NoEtiquetas para clasificar el servicio
actionstring❌ NoAcción a ejecutar después del servicio
CampoTipoRequeridoDescripción
namestring✅ SíNombre de la variable (sin espacios)
descriptionstring✅ SíDescripción del campo para la IA
promptHintstring✅ SíPregunta específica para obtener este dato
typestring✅ SíTipo de dato esperado

TipoDescripciónEjemplo de Valor
stringTexto libre"Juan Pérez"
emailDirección de correo válida"usuario@email.com"
phoneNúmero de teléfono"+51987654321"
dateFecha y hora"2024-03-15 14:30"
numberNúmero entero o decimal150 o 99.99
booleanVerdadero o falsotrue / false
urlURL válida"https://ejemplo.com"

{
"headers": {
"Authorization": "Bearer {{apiKey}}",
"Content-Type": "application/json"
}
}
{
"headers": {
"X-API-Key": "{{apiKey}}",
"Content-Type": "application/json"
}
}
{
"headers": {
"Authorization": "Bearer {{token}}",
"Content-Type": "application/json",
"X-Client-ID": "wabotify",
"X-Version": "2.0",
"Accept": "application/json"
}
}

{
"bodyTemplate": {
"appointment_date": "{{fecha|format('yyyy-MM-dd')}}",
"appointment_time": "{{fecha|format('HH:mm')}}",
"timestamp": "{{fecha|format('yyyy-MM-dd HH:mm:ss')}}"
}
}
{
"bodyTemplate": {
"customer_name": "{{nombre}}",
"email": "{{email}}",
"phone": "{{telefono|default('Sin teléfono')}}",
"priority": "{{vip|default(false)}}"
}
}

{
"responseMapping": {
"id": "$.data.id",
"status": "$.status",
"message": "$.data.message"
}
}
{
"responseMapping": {
"availableSlots": "$.data.available_times[*]",
"firstSlot": "$.data.available_times[0]",
"doctorName": "$.data.doctors[0].name"
}
}
{
"responseMapping": {
"result": "$.success",
"appointmentId": "$.data.appointment_id",
"errorCode": "$.error.code",
"errorMessage": "$.error.message"
}
}

{
"responseConditions": [
{
"condition": "$.success == true",
"message": "✅ ¡Éxito! Tu solicitud fue procesada. ID: {{appointmentId}}"
},
{
"condition": "$.error.code == 'SLOT_UNAVAILABLE'",
"message": "❌ Ese horario no está disponible. Horarios libres: {{availableSlots}}"
},
{
"condition": "$.error.code == 'INVALID_EMAIL'",
"message": "⚠️ El email proporcionado no es válido. ¿Podrías verificarlo?"
},
{
"condition": "$.status == 'pending'",
"message": "⏳ Tu solicitud está en revisión. Te contactaremos en 24 horas."
}
]
}
{
"responseConditions": [
{
"condition": "$.status in ['success', 'confirmed']",
"message": "✅ Procesado exitosamente: {{message}}"
},
{
"condition": "$.status in ['error', 'failed'] && $.error.code == 'PAYMENT_FAILED'",
"message": "💳 Error de pago: {{errorMessage}}. ¿Quieres intentar con otra tarjeta?"
}
]
}

{
"intent": "agendar_cita_medica",
"reference": "Servicio para agendar citas médicas con doctores especialistas",
"enabled": true,
"method": "POST",
"requiredFields": [
{
"name": "paciente",
"description": "Nombre completo del paciente",
"promptHint": "¿Cuál es el nombre completo del paciente?",
"type": "string"
},
{
"name": "especialidad",
"description": "Especialidad médica requerida",
"promptHint": "¿Qué especialidad médica necesitas? (cardiología, dermatología, etc.)",
"type": "string"
},
{
"name": "fecha_preferida",
"description": "Fecha y hora preferida",
"promptHint": "¿Cuándo te gustaría agendar la cita?",
"type": "date"
}
],
"endpoint": "https://api.hospital.com/v2/appointments",
"headers": {
"Authorization": "Bearer {{hospitalApiKey}}",
"Content-Type": "application/json"
},
"bodyTemplate": {
"patient_name": "{{paciente}}",
"specialty": "{{especialidad}}",
"preferred_date": "{{fecha_preferida|format('yyyy-MM-dd HH:mm')}}",
"booking_source": "ai_assistant"
}
}
{
"intent": "consultar_producto",
"reference": "Buscar información detallada de productos en el catálogo",
"enabled": true,
"method": "GET",
"requiredFields": [
{
"name": "producto",
"description": "Nombre o código del producto",
"promptHint": "¿Qué producto te interesa consultar?",
"type": "string"
}
],
"endpoint": "https://api.tienda.com/products/search?q={{producto}}",
"headers": {
"X-API-Key": "{{storeApiKey}}"
},
"responseMapping": {
"productName": "$.data[0].name",
"price": "$.data[0].price",
"stock": "$.data[0].stock",
"description": "$.data[0].description"
},
"responseMessage": "📦 **{{productName}}**\n💰 Precio: ${{price}}\n📊 Stock: {{stock}} unidades\n📝 {{description}}"
}
{
"intent": "procesar_pago",
"reference": "Procesar pagos de órdenes usando gateway de pagos",
"enabled": true,
"method": "POST",
"requiredFields": [
{
"name": "monto",
"description": "Monto a cobrar",
"promptHint": "¿Cuál es el monto a cobrar?",
"type": "number"
},
{
"name": "email_cliente",
"description": "Email del cliente",
"promptHint": "¿Cuál es el email del cliente?",
"type": "email"
}
],
"endpoint": "https://api.payments.com/v1/charges",
"headers": {
"Authorization": "Bearer {{paymentApiKey}}",
"Content-Type": "application/json"
},
"bodyTemplate": {
"amount": "{{monto}}",
"currency": "USD",
"customer_email": "{{email_cliente}}",
"description": "Pago procesado por IA Assistant"
},
"responseConditions": [
{
"condition": "$.status == 'succeeded'",
"message": "✅ ¡Pago exitoso! ID de transacción: {{transactionId}}"
},
{
"condition": "$.status == 'failed'",
"message": "❌ El pago falló: {{errorMessage}}"
}
]
}