Crear un agente
Flujo de llamadas
diagram del agente, que puedes dibujar en el Call Builder del panel o escribir con la API.Nodos
| Tipo | Qué hace | Su data |
|---|---|---|
startCall | Abre la llamada. Contiene el prompt principal, la primera frase y los ajustes de las llamadas salientes. | brief, welcomeMessage, outbound |
knowHow | Un bloque de conocimiento o de comportamiento, con un título. Su prompt es HTML, y es ahí donde se vinculan las herramientas. | title, prompt |
forwardCall | Transfiere a quien llama a un número de teléfono, en frío o en caliente: un número fijo, o el que tu servicio busca durante la llamada. | title, prompt, forwardingMessage, destinationType, forwardingPhoneNumber o lookupUrl, transferMode, opciones |
forwardAgent | Pasa la conversación a otro agente. | agentId, message, description |
endCall | Cuelga después de una frase de cierre. | endCallMessage |
Cada nodo tiene un id, un type, una position en el lienzo (x, y) y su data. Los ids de los nodos se conservan al duplicar un agente, así que un script puede cambiar el mismo nodo en todas las copias.
Conexiones y condiciones
Las conexiones (edges) unen dos nodos (source, target). Una conexión puede llevar una condición, que decide el camino que sigue la llamada:
| Condición | El camino se sigue cuando |
|---|---|
isExistingContact / notExistingContact | Quien llama es, o no es, un contacto del CRM |
isNewCaller / notNewCaller | Es, o no es, la primera llamada de esa persona |
inboundOnly / outboundOnly | La llamada es entrante o saliente |
Un flujo de llamada mínimo
{
"nodes": [
{
"id": "start", "type": "startCall", "position": { "x": 0, "y": 0 },
"data": {
"brief": "<p>You are Alice, the receptionist of Club Lyon Part-Dieu. Answer briefly and warmly.</p>",
"welcomeMessage": "Hello, this is Alice, the AI assistant of Club Lyon Part-Dieu. How can I help?"
}
},
{
"id": "hours", "type": "knowHow", "position": { "x": 0, "y": 160 },
"data": { "title": "Opening hours", "prompt": "<p>The club is open every day from 6am to 11pm.</p>" }
},
{
"id": "end", "type": "endCall", "position": { "x": 0, "y": 320 },
"data": { "endCallMessage": "Thank you for calling. Have a good day!" }
}
],
"edges": [
{ "id": "e1", "source": "start", "target": "hours" },
{ "id": "e2", "source": "hours", "target": "end" }
]
}El prompt que lee el modelo es el brief seguido de los nodos en el orden del diagrama. Los prompts son HTML: conserva las etiquetas cuando vuelvas a escribir uno.
Ajustes de las llamadas salientes
El objeto outbound de startCall se aplica a las llamadas que realiza una campaña.
| Campo | Valores |
|---|---|
welcomeMessage | La primera frase de una llamada saliente |
firstMessageMode | assistant-speaks-first, assistant-waits-for-user, assistant-speaks-first-with-model-generated-message |
pauseBeforeSpeakingSeconds | De 0 a 5 |
voiceMailEnabled, voiceMailMessage | Dejar un mensaje cuando contesta un buzón de voz |
voiceMailExpectedDuration | De 5 a 60 segundos |
voiceMailProvider | google, openai: la detección del buzón de voz |
Transferencias
Un nodo forwardCall se ejecuta cuando se da la situación que describe su prompt: el agente dice el forwardingMessage y transfiere la llamada al destino del nodo.
destinationType | El número | Sus campos |
|---|---|---|
fixed (por defecto) | Siempre la misma línea, escrita en el nodo | forwardingPhoneNumber, en formato internacional (+33612345678) |
lookup | Lo elige tu servicio durante la llamada, para esa persona: ver más abajo | lookupUrl, lookupMessage, lookupParameters |
Los ajustes de la transferencia son los mismos para los dos:
| Campo | Valores |
|---|---|
transferMode | cold conecta a quien llama de inmediato. warm llama primero a la persona y la pone al tanto, y después conecta a quien llama. |
greetingMessage | Obligatorio en las transferencias en caliente: la primera frase que oye la persona al descolgar |
whisperMessage, threeWayIntroduction | En las transferencias en caliente: qué contarle a la persona sobre quien llama y cómo presentárselo. Son instrucciones para el agente, no frases que lea en voz alta. |
holdMusicUrl | La URL de la música que oye quien llama mientras espera |
transferTimeout | De 30 a 300 segundos (60 por defecto) |
fallbackMessage | Lo que dice el agente cuando la transferencia no se completa |
Buscar el número durante la llamada
Cuando el número correcto depende de quien llama (el subcontratista de su zona, la agencia de su código postal, el técnico de guardia esta semana), pon destinationType en lookup: tu servicio elige el número mientras la persona espera. El número nunca pasa por el modelo, así que el modelo no puede entenderlo mal ni inventárselo, y cientos de números quedan fuera del prompt.
{
"id": "technician", "type": "forwardCall", "position": { "x": 320, "y": 160 },
"data": {
"title": "Transfer to technician",
"prompt": "<p>Once the caller has given their address, transfer them.</p>",
"forwardingMessage": "I'm putting you through to the technician of your area.",
"destinationType": "lookup",
"lookupUrl": "https://example.com/api/transfer-number?token=YOUR_SECRET",
"lookupMessage": "One moment, I'm finding the technician of your area.",
"lookupParameters": {
"type": "object",
"properties": {
"address": { "type": "string", "description": "The caller's full address" }
},
"required": ["address"]
},
"transferMode": "cold",
"fallbackMessage": "The technician cannot be reached. I'll take a message."
}
}- El nodo se convierte en una herramienta del agente, con el nombre de su
titleen camelCase (Transfer to technician se convierte entransferToTechnician). Supromptle dice al agente cuándo usarla, ylookupParameters, un JSON Schema con el formato de losparametersde una herramienta personalizada, enumera lo que el agente recopila antes. Sin él, el agente no envía ningún argumento. - El agente dice el
lookupMessage(por defecto Un momento., en el idioma del agente), y CallShift envía alookupUrlla misma petición que a una herramienta personalizada: el nombre de la herramienta enname, los argumentos enargs, la llamada hasta ese momento encally, cuando quien llama es un contacto conocido, elcontact. - Tu servicio responde con el número, o con el motivo por el que no lo hay.
- Con un número, el agente dice el
forwardingMessagey transfiere la llamada, en frío o en caliente, con los ajustes del nodo.
La respuesta de tu servicio
Si hay coincidencia, la respuesta da el número:
{
"number": "+33612345678",
"message": "I'm putting you through to Dupont Plumbing, the technician of your area.",
"context": "Subcontractor for Lyon 3rd, contract 4521"
}Si no la hay, da el motivo, con cualquier código de estado HTTP:
{
"error": "Address outside our service area",
"context": "We cover Lyon and its suburbs only"
}| Campo | Qué hace |
|---|---|
number | Si hay coincidencia: el número al que transferir, en formato internacional y del mismo país que la línea por la que pasa la llamada. |
message | Si hay coincidencia, opcional: se dice palabra por palabra en lugar del forwardingMessage del nodo. |
error | Si no hay coincidencia: por qué no hay número. El agente recibe este motivo junto con el aviso de que la transferencia no es posible, y sigue con la llamada. |
context | Opcional: en una transferencia en caliente, se añade al whisperMessage para poner al tanto a la persona. Si no hay transferencia, se le da al agente. |
Responde en menos de 5 segundos. Tampoco hay transferencia si se supera ese plazo, si el cuerpo no incluye number ni error, si el código de estado es de error y falta error, si el número no es válido o es de otro país, o si la llamada se hace desde un navegador, que no está en ninguna línea: se le dice al agente que no es posible, y el motivo aparece en los registros de herramientas del panel. Los números extranjeros se rechazan para que un servicio que falle o que esté comprometido no pueda desviar tus llamadas a otro país.
La petición no lleva firma: pon un token secreto en la URL y compruébalo.
El nombre de herramienta de un nodo con búsqueda de número no puede estar ya en uso: un flujo de llamada en el que también sea el nombre de otro nodo de ese tipo, de una de las herramientas de la cuenta o de una herramienta integrada (sendSms, transferCall) se rechaza con un 422. Dale otro title al nodo; cambiar el título cambia el nombre de la herramienta.
La búsqueda del número funciona en los agentes que usan el motor de voz actual. Los demás agentes omiten el nodo, así que no transfieren: comprueba la transferencia con una llamada de prueba.
Transferir, pasar la conversación a otro agente y colgar son nodos del flujo de llamada. Todo lo demás que el agente hace con tus sistemas es una herramienta.
