Producto
SDK

Servicios API

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

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.

Github

Puedes descargar nuestro repositorio de ejemplo para crear tus agentes.

Los servicios están en Producción Estable y han demostrado alta fiabilidad. El sistema maneja automáticamente la recolección de datos, validación y ejecución de APIs externas.

Flujo de Funcionamiento

  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

Estructura Completa

json
01{
02 "services": [
03 {
04 "intent": "schedule_appointment",
05 "reference": "Servicio para agendar citas médicas en la clínica",
06 "enabled": true,
07 "method": "POST",
08 "requiredFields": [
09 {
10 "name": "nombre",
11 "description": "Nombre completo del paciente",
12 "promptHint": "¿Podrías indicarme tu nombre completo, por favor?",
13 "type": "string"
14 },
15 {
16 "name": "email",
17 "description": "Correo electrónico para confirmaciones",
18 "promptHint": "¿Cuál es tu dirección de correo electrónico?",
19 "type": "email"
20 },
21 {
22 "name": "fecha",
23 "description": "Fecha y hora preferida para la cita",
24 "promptHint": "¿Qué día y hora te gustaría agendar? (Ejemplo: mañana a las 3pm)",
25 "type": "date"
26 },
27 {
28 "name": "telefono",
29 "description": "Número de teléfono de contacto",
30 "promptHint": "¿Cuál es tu número de teléfono?",
31 "type": "phone"
32 }
33 ],
34 "endpoint": "https://api.clinica.com/v1/appointments",
35 "tags": ["citas", "agendamiento", "medical"],
36 "headers": {
37 "Authorization": "Bearer {{apiKey}}",
38 "Content-Type": "application/json",
39 "X-Clinic-ID": "clinic_123"
40 },
41 "bodyTemplate": {
42 "patient_name": "{{nombre}}",
43 "patient_email": "{{email}}",
44 "appointment_date": "{{fecha|format('yyyy-MM-dd HH:mm')}}",
45 "phone": "{{telefono}}",
46 "source": "plazbot_ai"
47 },
48 "responseMapping": {
49 "appointmentId": "$.data.appointment_id",
50 "confirmedDate": "$.data.scheduled_date",
51 "doctorName": "$.data.doctor.name",
52 "status": "$.status",
53 "errorMessage": "$.error.message"
54 },
55 "responseMessage": "¡Perfecto! Tu cita ha sido agendada para el {{confirmedDate}} con {{doctorName}}. ID de cita: {{appointmentId}}",
56 "responseConditions": [
57 {
58 "condition": "$.status == 'success'",
59 "message": " ¡Cita confirmada! Te esperamos el {{confirmedDate}} con {{doctorName}}. Recibirás un recordatorio por email.",
60 "nextService": "verify_contact_info"
61 },
62 {
63 "condition": "$.status == 'conflict'",
64 "message": " Lo siento, ese horario no está disponible. ¿Te gustaría que te sugiera horarios libres?",
65 "nextService": "verify_contact_info"
66 },
67 {
68 "condition": "$.status == 'error'",
69 "message": " Hubo un problema al agendar: {{errorMessage}}. ¿Podrías intentar con otra fecha?",
70 "nextService": "verify_contact_info"
71 }
72 ],
73 "action": "notify_doctor"
74 }
75 ]
76}

Variables del Servicio

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.plazbot.com/file123

Ubicaciones de uso:

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

Ejemplo de Uso

json
01"services": [
02 {
03 "intent": "conversar_humano",
04 "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.",
05 "enabled": true,
06 "method": "POST",
07 "requiredFields": [
08 {
09 "name": "curp",
10 "description": "Valor del Curp",
11 "promptHint": "Cual es tu curp?",
12 "type": "string"
13 }
14 ],
15 "tags": [
16 "humano",
17 "agente",
18 "conversar",
19 "si",
20 "sí",
21 "por favor",
22 "claro",
23 "perfecto",
24 "dale"
25 ],
26 "endpoint": "https://hook.us1.make.com/8dvokk7w5rqvlnbq9ibekj9vurqhprsy",
27 "headers": {
28 "content-type": "application/json"
29 },
30 "bodyTemplate": {
31 "curp": "{{curp}}",
32 "lastmessage": "[lastmessage]",
33 "messageIA": "[lastmessageIA]",
34 "fecha": "[lastmessagetime]",
35 "sessionId": "[sessionId]"
36 },
37 "responseMessage": "Validaremos la informacion.",
38 "action": ""
39 }
40 ]

Campos del Servicio

CampoTipoRequeridoDescripción
intentstringIdentificador único del servicio (ej: schedule_appointment)
referencestringDescripción clara para que la IA entienda cuándo usar este servicio
enabledbooleanSi el servicio está activo (true) o deshabilitado (false)
methodstringSiMetodo HTTP: GET o POST
endpointstringURL completa de la API externa
requiredFieldsarrayLista de campos que el usuario debe proporcionar
headersobjectNoHeaders HTTP personalizados
bodyTemplateobjectNoEstructura del body para requests
bodySchemaobjectNoDefine los tipos de datos del body ("string", "date", "boolean", "numeric"). Se usa para convertir los valores al tipo correcto antes de enviar.
responseMappingobjectNoMapeo de la respuesta usando JSONPath
responseMessagestringNoMensaje de éxito predeterminado
responseConditionsarrayNoRespuestas condicionales basadas en el resultado
tagsarrayNoEtiquetas para clasificar el servicio
actionstringNoAcción a ejecutar después del servicio

Configuración de Required Fields

CampoTipoRequeridoDescripción
namestringNombre de la variable (sin espacios)
descriptionstringDescripción del campo para la IA
promptHintstringPregunta específica para obtener este dato
typestringTipo de dato esperado
propertiesarraySolo arrayObjectSub-propiedades del objeto ([{name, type}])
buttonsarrayNoHasta 3 botones de respuesta rapida para el usuario ([{text}], texto de 1 a 20 caracteres)

Tipos de Datos Soportados

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"
datetimeFecha con hora exacta"2024-03-15 14:30:00"
numberNúmero entero o decimal150 o 99.99
integerNúmero entero42
booleanVerdadero o falsotrue / false
arrayArray de strings["valor1", "valor2"]
arrayObjectArray de objetos con propiedades[{"campo": "valor"}]

Los campos de tipo date son procesados inteligentemente por la IA. El usuario puede escribir "mañana a las 3pm" y se convertirá automáticamente al formato correcto.

Tipo arrayObject - Arrays de Objetos

El tipo arrayObject permite definir campos que recopilan listas de objetos con propiedades configurables. Cada propiedad del objeto se define con name y type.

json
01{
02 "name": "numeros_a_portar",
03 "description": "Lista de números telefónicos a portar",
04 "promptHint": "¿Cuáles son los números a portar? Necesito tipo de plan, operador y número.",
05 "type": "arrayObject",
06 "properties": [
07 { "name": "tipo_de_plan", "type": "string" },
08 { "name": "operador", "type": "string" },
09 { "name": "numero", "type": "string" }
10 ]
11}

El LLM generará un JSON Schema con items: { type: "object", properties: {...} } para que el modelo de IA recopile los datos correctamente.

Tipos soportados en sub-propiedades: string, number, integer, boolean

El tipo array (sin Object) genera un array simple de strings: ["valor1", "valor2"]. Usa arrayObject cuando necesites objetos con múltiples propiedades.

Botones de Respuesta Rapida (buttons)

Un campo requerido puede mostrar hasta 3 botones para que el usuario responda con un toque en lugar de escribir. Cada boton tiene un text de 1 a 20 caracteres.

json
01{
02 "name": "tipo_consulta",
03 "description": "Tipo de consulta del paciente",
04 "promptHint": "¿Que tipo de consulta necesitas?",
05 "type": "string",
06 "buttons": [
07 { "text": "Limpieza" },
08 { "text": "Ortodoncia" },
09 { "text": "Urgencia" }
10 ]
11}

Headers Comunes

Autenticación Bearer Token

json
01{
02 "headers": {
03 "Authorization": "Bearer {{apiKey}}",
04 "Content-Type": "application/json"
05 }
06}

Autenticación API Key

json
01{
02 "headers": {
03 "X-API-Key": "{{apiKey}}",
04 "Content-Type": "application/json"
05 }
06}

Headers Personalizados

json
01{
02 "headers": {
03 "Authorization": "Bearer {{token}}",
04 "Content-Type": "application/json",
05 "X-Client-ID": "plazbot",
06 "X-Version": "2.0",
07 "Accept": "application/json"
08 }
09}

Body Template con Formateo

Formateo de Fechas

json
01{
02 "bodyTemplate": {
03 "appointment_date": "{{fecha|format('yyyy-MM-dd')}}",
04 "appointment_time": "{{fecha|format('HH:mm')}}",
05 "timestamp": "{{fecha|format('yyyy-MM-dd HH:mm:ss')}}"
06 }
07}

Variables Condicionales

json
01{
02 "bodyTemplate": {
03 "customer_name": "{{nombre}}",
04 "email": "{{email}}",
05 "phone": "{{telefono|default('Sin teléfono')}}",
06 "priority": "{{vip|default(false)}}"
07 }
08}

Response Mapping Avanzado

Mapeo Básico

json
01{
02 "responseMapping": {
03 "id": "$.data.id",
04 "status": "$.status",
05 "message": "$.data.message"
06 }
07}

Mapeo de Arrays

json
01{
02 "responseMapping": {
03 "availableSlots": "$.data.available_times[*]",
04 "firstSlot": "$.data.available_times[0]",
05 "doctorName": "$.data.doctors[0].name"
06 }
07}

Mapeo Condicional

json
01{
02 "responseMapping": {
03 "result": "$.success",
04 "appointmentId": "$.data.appointment_id",
05 "errorCode": "$.error.code",
06 "errorMessage": "$.error.message"
07 }
08}

Respuestas Condicionales

Configuración Avanzada

json
01{
02 "responseConditions": [
03 {
04 "condition": "$.success == true",
05 "message": " ¡Éxito! Tu solicitud fue procesada. ID: {{appointmentId}}"
06 },
07 {
08 "condition": "$.error.code == 'SLOT_UNAVAILABLE'",
09 "message": " Ese horario no está disponible. Horarios libres: {{availableSlots}}"
10 },
11 {
12 "condition": "$.error.code == 'INVALID_EMAIL'",
13 "message": " El email proporcionado no es válido. ¿Podrías verificarlo?"
14 },
15 {
16 "condition": "$.status == 'pending'",
17 "message": "⏳ Tu solicitud está en revisión. Te contactaremos en 24 horas."
18 }
19 ]
20}

Condiciones con Multiples Valores

json
01{
02 "responseConditions": [
03 {
04 "condition": "$.status in ['success', 'confirmed']",
05 "message": "Procesado exitosamente: {{message}}"
06 },
07 {
08 "condition": "$.status in ['error', 'failed'] && $.error.code == 'PAYMENT_FAILED'",
09 "message": "Error de pago: {{errorMessage}}. Quieres intentar con otra tarjeta?"
10 }
11 ]
12}

Encadenamiento de Servicios (nextService)

Cada condicion puede incluir un campo nextService que indica el intent de otro servicio a ejecutar automaticamente si esa condicion se cumple:

json
01{
02 "responseConditions": [
03 {
04 "condition": "$.status == 'confirmed'",
05 "message": "Tu cita ha sido confirmada para el {{scheduled_date}}.",
06 "nextService": "send_appointment_reminder"
07 },
08 {
09 "condition": "$.status == 'conflict'",
10 "message": "Ese horario no esta disponible.",
11 "nextService": "suggest_alternative_times"
12 }
13 ]
14}
CampoDescripcion
conditionExpresion condicional simple usando JSONPath y operadores (==, !=, <, >, <=, >=, in, nin). Formato legacy, retrocompatible
conditions(Opcional) Array de sub-condiciones [{ condition }] para combinar con AND/OR. Reemplaza a condition cuando necesitas condiciones compuestas
logicalOperator(Opcional) Operador logico para combinar las sub-condiciones: AND u OR. Default: AND
messageMensaje a mostrar al usuario si la condicion se cumple
nextService(Opcional) Intent del siguiente servicio a ejecutar automaticamente

Condiciones Compuestas (AND/OR)

En lugar de una condition simple, puedes definir varias sub-condiciones y combinarlas con logicalOperator:

json
01{
02 "responseConditions": [
03 {
04 "conditions": [
05 { "condition": "$.status == 'success'" },
06 { "condition": "$.data.stock > 0" }
07 ],
08 "logicalOperator": "AND",
09 "message": "Producto disponible. Stock: {{stock}} unidades."
10 },
11 {
12 "conditions": [
13 { "condition": "$.status == 'error'" },
14 { "condition": "$.data.stock == 0" }
15 ],
16 "logicalOperator": "OR",
17 "message": "Lo siento, el producto no esta disponible en este momento."
18 }
19 ]
20}

Body Schema

El bodySchema define los tipos de datos que se enviaran en el body del request. Esto permite que el sistema convierta automaticamente los valores del usuario al tipo correcto antes de hacer la llamada HTTP.

json
01{
02 "bodySchema": {
03 "patient_name": "string",
04 "email": "string",
05 "preferred_date": "date",
06 "is_vip": "boolean",
07 "amount": "numeric"
08 }
09}
TipoDescripcion
stringTexto tal cual
dateConvierte a formato de fecha
booleanConvierte a true/false
numericConvierte a numero

Ejemplos por Casos de Uso

Agendar Cita Médica

json
01{
02 "intent": "agendar_cita_medica",
03 "reference": "Servicio para agendar citas médicas con doctores especialistas",
04 "enabled": true,
05 "method": "POST",
06 "requiredFields": [
07 {
08 "name": "paciente",
09 "description": "Nombre completo del paciente",
10 "promptHint": "¿Cuál es el nombre completo del paciente?",
11 "type": "string"
12 },
13 {
14 "name": "especialidad",
15 "description": "Especialidad médica requerida",
16 "promptHint": "¿Qué especialidad médica necesitas? (cardiología, dermatología, etc.)",
17 "type": "string"
18 },
19 {
20 "name": "fecha_preferida",
21 "description": "Fecha y hora preferida",
22 "promptHint": "¿Cuándo te gustaría agendar la cita?",
23 "type": "date"
24 }
25 ],
26 "endpoint": "https://api.hospital.com/v2/appointments",
27 "headers": {
28 "Authorization": "Bearer {{hospitalApiKey}}",
29 "Content-Type": "application/json"
30 },
31 "bodyTemplate": {
32 "patient_name": "{{paciente}}",
33 "specialty": "{{especialidad}}",
34 "preferred_date": "{{fecha_preferida|format('yyyy-MM-dd HH:mm')}}",
35 "booking_source": "ai_assistant"
36 }
37}

Consulta de Productos

json
01{
02 "intent": "consultar_producto",
03 "reference": "Buscar información detallada de productos en el catálogo",
04 "enabled": true,
05 "method": "GET",
06 "requiredFields": [
07 {
08 "name": "producto",
09 "description": "Nombre o código del producto",
10 "promptHint": "¿Qué producto te interesa consultar?",
11 "type": "string"
12 }
13 ],
14 "endpoint": "https://api.tienda.com/products/search?q={{producto}}",
15 "headers": {
16 "X-API-Key": "{{storeApiKey}}"
17 },
18 "responseMapping": {
19 "productName": "$.data[0].name",
20 "price": "$.data[0].price",
21 "stock": "$.data[0].stock",
22 "description": "$.data[0].description"
23 },
24 "responseMessage": " **{{productName}}**\n Precio: ${{price}}\n Stock: {{stock}} unidades\n {{description}}"
25}

Procesar Pago

json
01{
02 "intent": "procesar_pago",
03 "reference": "Procesar pagos de órdenes usando gateway de pagos",
04 "enabled": true,
05 "method": "POST",
06 "requiredFields": [
07 {
08 "name": "monto",
09 "description": "Monto a cobrar",
10 "promptHint": "¿Cuál es el monto a cobrar?",
11 "type": "number"
12 },
13 {
14 "name": "email_cliente",
15 "description": "Email del cliente",
16 "promptHint": "¿Cuál es el email del cliente?",
17 "type": "email"
18 }
19 ],
20 "endpoint": "https://api.payments.com/v1/charges",
21 "headers": {
22 "Authorization": "Bearer {{paymentApiKey}}",
23 "Content-Type": "application/json"
24 },
25 "bodyTemplate": {
26 "amount": "{{monto}}",
27 "currency": "USD",
28 "customer_email": "{{email_cliente}}",
29 "description": "Pago procesado por IA Assistant"
30 },
31 "responseConditions": [
32 {
33 "condition": "$.status == 'succeeded'",
34 "message": " ¡Pago exitoso! ID de transacción: {{transactionId}}"
35 },
36 {
37 "condition": "$.status == 'failed'",
38 "message": " El pago falló: {{errorMessage}}"
39 }
40 ]
41}

Nunca hardcodees API keys en la configuración. Usa siempre variables como {{apiKey}} que se configuran de forma segura en el panel de Plazbot.

¿Quieres probar la API en vivo? Abre el Playground.