En este documento, se detallan los parámetros de configuración específicos que necesitas para la integración, así como la solución de problemas comunes.
Requisitos de la red de telefonía
Si tu red filtra el tráfico saliente, debes permitir el tráfico saliente para la señalización de SIP y la transmisión de contenido multimedia.
Para la señalización de SIP, debes permitir todo el rango de IP 74.125.88.128/25 (TCP)
en el puerto 5672. Para un conjunto de reglas de firewall más restrictivo, puedes restringir la señalización de SIP
a uno de los siguientes servidores de SIP de GTP regionalizados:
- Región de EE.UU.:
us.telephony.goog(74.125.88.132) - Región de la UE:
eu.telephony.goog(74.125.88.133) - Región de APAC:
ap.telephony.goog(74.125.88.134) - Región de Sudamérica:
sa.telephony.goog(74.125.88.135)
Para el contenido multimedia de RTP, debes configurar reglas de firewall que permitan el tráfico destinado al
rango de IP de CIDR 74.125.39.0/24. Los puertos necesarios para el contenido multimedia suelen ser solo 16384-32767 (TCP+UDP), pero este rango de puertos se puede expandir en el futuro.
Proveedores o modelos de SBC compatibles
En la siguiente tabla, se enumeran los proveedores o modelos de SBC y las versiones de firmware compatibles. Puedes encontrar instrucciones de integración detalladas para cada proveedor vinculado en la versión de firmware.
| Proveedores y modelos | Versiones de firmware (SIPREC, SIP) |
|---|---|
| AudioCodes VE SBC | v7.60A.100.022 (SIPREC, SIP) |
| Avaya Session Border Controller for Enterprise | v10.2.1.1-104-25336 (SIPREC, SIP) |
| Oracle E-SBC Acme Packet 4600 | SCZ9.3.0 GA (compilación 46) (SIPREC, SIP) |
| Ribbon Swe Core SBC | v12.01.07R000 (SIPREC, SIP) |
| Cisco Unified Border Element (CUBE) | v17.15.4 (SIPREC, SIP) |
Protocolos de señalización y de medios de SBC compatibles
| Protocolo | Valor |
|---|---|
| Protocolo de señalización | SIP por TLS (SRTP) |
| Medios | SRTP (protocolo seguro de transporte en tiempo real) |
| Encriptación de medios | SDES (descripciones de seguridad para SDP) |
| Conjunto de algoritmos de cifrado de contenido multimedia compatible | AES_CM_128_HMAC_SHA1_80, AEAD_AES_256_GCM |
| Códecs de contenido multimedia compatibles | G.711 µ-law (PCMU), G.711 A-law (PCMA), Opus |
Encabezados SIP
Cuando
configuraste un perfil de conversación y un número de teléfono,
creaste un perfil de conversación de CCAI con el
sipConfig.createConversationOnTheFly establecido en true. Debes generar de forma dinámica
el ID de conversación durante el INVITE de SIP con el valor del encabezado SIP
de Call-Info o UUI.
El valor del encabezado SIP apunta al extremo de Dialogflow definiendo el Google Cloud ID del proyecto y el ID de la conversación:
- El ID del proyecto de Google Cloud es el proyecto que usaste cuando configuraste un proyecto de Google Cloud .
- El SBC debe generar de forma dinámica el ID de conversación. El ID de conversación debe cumplir con la fórmula de expresión regular
[a-zA-Z][a-zA-Z0-9_-]*con una longitud de caracteres que varía de 3 a 64. Para generar de forma dinámica el ID de conversación, usa un patrón común en el que tomes el valor de Call-ID en el INVITE de SIP y le agregues un prefijo con letras para que cumpla con la expresión regular especificada anteriormente. Por ejemplo, si el valor de Call-ID es297363723_79131759_799783510, agregarle el prefijo"CID-"haría que cumpla con la expresión regular[a-zA-Z][a-zA-Z0-9_-]*.
Encabezado SIP de Call-Info
Agrega un encabezado SIP personalizado llamado Call-Info al SIP INVITE para establecer de forma única el
ID de conversación:
Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/$PROJECT_ID/conversations/$CONVERSATION_ID>;purpose=Goog-ContactCenter-Conversation
Ejemplo:
Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510>;purpose=Goog-ContactCenter-Conversation
Encabezado SIP de UUI
Si no se admite la configuración del encabezado SIP personalizado Call-Info, puedes configurar
el encabezado SIP UUI (User-to-User) en el SIP INVITE para pasar el ID de
conversación.
Usa los mismos datos solicitados en Call-Info con la URL codificada en formato hexadecimal y el
propósito establecido en Goog-ContactCenter-Conversation. El siguiente es un encabezado de ejemplo,
en el que la cadena hexadecimal, cuando se decodifica, es
http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510:
User-to-User: 687474703a2f2f6469616c6f67666c6f772e676f6f676c65617069732e636f6d2f763262657461312f70726f6a656374732f6763702d70726f6a6563742d69642d31323334352f636f6e766572736174696f6e732f4349442d3239373336333732335f37393133313735395f373939373833353130;encoding=hex;purpose=Goog-ContactCenter-Conversation
Para pasar datos adicionales al agente y establecerlos como un parámetro de sesión, puedes
pasar una lista de pares clave-valor codificados en formato hexadecimal separados por punto y coma, seguidos de
;encoding=hex;purpose=Goog-Session-Param. Esto crea un parámetro de sesión
llamado uui-headers que contiene una lista de cadenas de carga útil decodificadas.
Por ejemplo, si necesitas pasar la cadena key1=value1;key2=value2, se envía el siguiente encabezado de UUI, en el que la carga útil es el valor codificado en hexadecimal de key1=value1;key2=value2:
User-to-User: 6B6579313D76616C7565313B6B6579323D76616C756532;encoding=hex;purpose=Goog-Session-Param
Esta acción crea el siguiente parámetro de sesión:
{
"uui-headers": ["key1=value1;key2=value2"]
}
Si tu SBC admite el envío de varios encabezados de UUI, puedes enviar cadenas de pares clave-valor individuales por encabezado de UUI para que estén disponibles como valores individuales en el parámetro de sesión uui-headers.
En el siguiente fragmento, se toma el valor del parámetro y se divide varias veces para
acceder al valor adecuado de la variable key2 en la cadena:
$sys.func.GET($sys.func.SPLIT($sys.func.GET($sys.func.SPLIT($session.params.uui-headers,";"),1),"="),1)
En el siguiente ejemplo, se muestra una función a la que se llama desde un activador en los
bloques de código de la guía, por ejemplo, @PlaybookStartHandler, a la que se llama cuando
se ingresa a la guía. Otras funciones llaman a esta función para obtener valores del
parámetro uui-headers.
def _get_fromuui(attribute):
try:
uui_headers_src = history.playbook_input.action_parameters['uui-headers']
# If uui_headers_src is a string, split by ';'
if isinstance(uui_headers_src, str):
headers = uui_headers_src.split(';')
else:
# If it's a list, join and split
headers = ';'.join(uui_headers_src).split(';')
for header in headers:
header = header.strip()
if header.lower().startswith(f"{attribute.lower()}="):
return header[len(attribute) + 1:]
return ""
except Exception:
return ""
Puedes enviar datos adicionales con encabezados UUI independientes que tengan diferentes
valores de propósito. Estos valores se agregan al objeto Conversation.telephonyConnectionInfo. Ten en cuenta que estos datos no están disponibles para el agente de Dialogflow CX durante el tiempo de ejecución.
Encabezados X de SIP
Puedes pasar encabezados SIP que comiencen con x- al agente y establecerlos como un
parámetro de sesión. Los encabezados SIP están disponibles en el parámetro de sesión
x-headers. El sistema quita el prefijo x- del nombre del encabezado en el
parámetro de sesión.
Por ejemplo, si el INVITE de SIP contiene el siguiente encabezado:
x-billing-id: 12345
El parámetro de sesión x-headers contiene lo siguiente:
{
"x-headers": {
"billing-id": "12345"
}
}
Para acceder al valor, sigue estos pasos:
$session.params.x-headers.billing-id
Pasa información del agente humano
Si necesitas pasar información específica a los agentes humanos, puedes establecer el atributo de etiqueta de medios del Protocolo de descripción de sesión (SDP) para el flujo del Protocolo de transporte en tiempo real (RTP) del agente humano en el valor de datos requerido.
Ejemplo:
a=label:7382373482
Estos datos se propagan en el campo
sip_recording_media_label y están disponibles en el tema de Pub/Sub New message notification
que contiene las transcripciones. Busca el campo sip_recording_media_label
en el mensaje de Pub/Sub
Message.attributes.
Configura los roles de los participantes y el orden de las transmisiones de contenido multimedia
De forma predeterminada, el primer flujo de contenido multimedia se asocia con el rol de participante END_USER, y los flujos de contenido multimedia posteriores se asocian con el rol de participante HUMAN_AGENT.
Si necesitas un comportamiento diferente, como para un sistema de llamadas salientes, debes agregar el parámetro de roles a la URL que se pasa en el encabezado.
Ejemplo:
http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510?roles=HUMAN_AGENT,END_USER
La URL especifica que la primera transmisión de contenido multimedia debe tener el rol HUMAN_AGENT
y la segunda, el rol END_USER. Puedes aplicar el
parámetro de roles con el
encabezado SIP Call-Info o UUI.
Establece parámetros adicionales en una conversación determinada
Para establecer parámetros adicionales en una conversación determinada, usa la llamada RPC MatchIntentRequest. Puedes establecer query_params.parameters en los
pares clave-valor requeridos y query_input.text en Setting parameters.
Realiza la llamada a la API después de la respuesta 200 OK para el SIP INVITE inicial, momento en el que
se creó la conversación. El ID de sesión para MatchIntentRequest es el mismo ID de conversación que se proporciona en el encabezado Call-Info en el INVITE.
Usa SIP REFER para transferir una llamada a un extremo SIP
Para transferir una llamada de un agente virtual a un extremo SIP, usa el método SIP REFER. Incluye una carga útil en el campo Live agent handoff y establece el campo Telephony transfer call en el número que se establece en el campo SIP REFER Refer-To saliente. La carga útil de Live agent handoff es similar al siguiente ejemplo:
{
"sip-refer": true
}
Si necesitas pasar datos fuera de Dialogflow CX, puedes usar encabezados de UUI y
encabezados x para pasar cadenas de datos. Si quieres realizar un SIP REFER y pasar
dos pares clave-valor en un encabezado de UUI y dos encabezados X, puedes usar una
carga útil de Live agent handoff similar a la siguiente muestra de código:
{
"sip-refer": true,
"uui-headers": [
"key1=value1;key2=value2"
],
"x-headers": {
"header1": "value1",
"header2": "value2"
}
}
Esto genera un SIP REFER con los siguientes encabezados UUI y x-headers:
User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param
x-header1: value1
x-header2: value2
Usa SIP INVITE para realizar una llamada de conferencia con otro extremo SIP
Para realizar una conferencia de una llamada de un cliente final a un agente humano al que se puede acceder con un
extremo SIP, usa el método SIP INVITE. Esto mantiene a Google en la ruta de acceso de los medios
y te permite usar las funciones de Agent Assist. Establece el campo
Telephony transfer call en el número que se establece en el campo
SIP INVITE To de salida.
Si necesitas pasar datos fuera de Dialogflow CX, puedes usar encabezados de UUI y
encabezados x para pasar cadenas de datos. Si quieres realizar una SIP INVITE y
pasar dos pares clave-valor en un encabezado de UUI y dos encabezados X, puedes usar una
carga útil de Live agent handoff similar a la siguiente muestra de código:
{
"uui-headers": [
"key1=value1;key2=value2"
],
"x-headers": {
"header1": "value1",
"header2": "value2"
}
}
Esto genera un mensaje INVITE de SIP con los siguientes encabezados UUI y x:
User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param
x-header1: value1
x-header2: value2
Pasa datos en un mensaje BYE de SIP
Navegar a End Session genera un mensaje BYE de SIP. Para pasar datos fuera de
Dialogflow CX, puedes usar encabezados de UUI o encabezados X para pasar cadenas de datos.
Puedes enrutar la llamada a una página que defina la carga útil de Live agent handoff
similar a la siguiente muestra de código antes de realizar la transición a End Session:
{
"uui-headers": [
"key1=value1;key2=value2"
],
"x-headers": {
"header1": "value1",
"header2": "value2"
}
}
Esto genera un SIP BYE con los siguientes encabezados UUI y x:
User-to-User: <hex encoded "key1=value1;key2=value2">;encoding=hex;purpose=Goog-Session-Param
x-header1: value1
x-header2: value2
Activa una acción cuando el emisor remoto cuelga
La nueva API de BiDi (use_bidi_streaming=True en el perfil de conversación)
admite la activación de una llamada de herramienta dentro de una guía o una llamada de webhook dentro de un
flujo cuando la persona que llama de forma remota cuelga.
Cuando la persona que llama de forma remota cuelga y Dialogflow CX recibe un mensaje SIP BYE,
se activa sys.remote-call-disconnected. Si creas un controlador con este
nombre de evento específico, puedes usarlo para activar una llamada a una herramienta con una guía o una
llamada de webhook dentro de un flujo.
Permitir llamadas solo desde el SBC
Para rechazar llamadas de la PSTN y solo conectar las llamadas que se originan en tu
SBC, actualiza el objeto
PhoneNumber
para especificar el mensaje allowedSipTrunks. Si la integración usa un
enlace troncal SIP, puedes especificar una lista de IDs de enlaces troncales SIP específicos. Si el mensaje
se crea con una lista vacía, se permite cualquier enlace troncal SIP. Si se establece una interconexión privada, proporciona el ID de operador que aprovisionó el equipo de telefonía de Google.
Soluciona problemas
Es posible que el equipo de Google te pida que proporciones los siguientes artefactos para ayudar a solucionar problemas de ping de SIP OPTIONS y llamadas de prueba:
- Captura de paquetes de red.
- Seguimiento de depuración de SIP que muestra el encabezado completo y el SDP de SIP:
- Valor de Call-ID
- Valor de
Call-Info(si existe)
Captura de paquetes de red
La captura de paquetes de red debe mostrar lo siguiente:
Un protocolo de enlace TCP de 3 vías completo (SYN, SYN-ACK, ACK) entre tu SBC y los servidores SIP de GTP comunicados a través del puerto TCP 5672. Si no se puede establecer una conexión TCP, los posibles problemas incluyen los siguientes:
- Tu red está bloqueando el tráfico saliente.
- La comunicación no se envía a uno de los servidores SIP de GTP regionalizados. Consulta el requisito de red de conectividad de telefonía.
- La comunicación no se envía a través del puerto TCP 5672.
Un protocolo de enlace de conexión TLS completo con lo siguiente:
- Tu SBC inicia TLS v1.2 o una versión posterior.
- Tu SBC inicia un "Client Hello" y GTP responde con "Server Hello".
- Se produce el proceso de autenticación TLS mutua:
- GTP responde con su propio certificado TLS de servidor, que tu SBC autentica.
- El SBC envía su propio certificado TLS de cliente, que GTP autentica.
- Se establece un canal encriptado, como lo demuestra el mensaje "Encrypted Handshake Message" en la captura de paquetes.
- La evidencia de los "datos de la aplicación" se transmite a través del canal de TLS.
Si no se puede establecer una conexión TLS, los posibles problemas incluyen los siguientes: - No se creó el enlace troncal SIP en el lado de GTP. - El FQDN configurado del enlace troncal SIP no coincide con el FQDN que se presenta en el certificado TLS (atributo CN o SAN) del SBC. - No se admite la versión de TLS, ya que solo se admiten las versiones 1.2 o posteriores: - No se admite el conjunto de algoritmos de cifrado solicitado. Consulta la configuración de TLS del SBC. - Proveedores de certificados TLS no confiables, consulta la configuración de TLS del SBC.
El seguimiento de depuración de SIP debería mostrar lo siguiente:
Encabezado SIP
Call-Infodel cliente insertado en este formato:Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/$PROJECT_ID/conversations/$CONVERSATION_ID>;purpose=Goog-ContactCenter-ConversationEjemplo:
Call-Info: <http://dialogflow.googleapis.com/v2beta1/projects/gcp-project-id-12345/conversations/CID-297363723_79131759_799783510>;purpose=Goog-ContactCenter-ConversationLos encabezados SIP muestran el número de teléfono en formato E.164 (+16501234567).
Los encabezados SIP muestran las direcciones IP públicas que se usan en el URI de solicitud y otros campos de encabezado SIP, como Para, De y Vía. Se rechazan las direcciones IP privadas.
La información de conexión del SDP de SIP (c= …) se especifica con una dirección IP pública. Se rechazan las direcciones IP privadas.
Envía primero la transmisión del usuario final y, luego, la transmisión de contenido multimedia del agente humano, ya que GTP trata la primera transmisión de contenido multimedia como el usuario final de forma predeterminada.
Si recibes un código de respuesta de error de SIP, haz lo siguiente:
- Un error de clase 400 de SIP, por ejemplo, 488 No aceptable aquí, indica que GTP rechazó un encabezado SIP o una configuración de SDP de medios SIP.
- Un error de clase 600 de SIP, como el error 603 de SIP rechazado, indica un problema relacionado con la cuota. Consulta la página de cuotas y límites para obtener detalles sobre cómo solicitar un aumento.