En este resumen, abordaremos un problema relativo a un sistema de programación de citas en tiempo real que utiliza la API en tiempo real de OpenAI con conexiones WebSocket. El problema se presenta cuando la conexión WebSocket se desconecta después de devolver los horarios disponibles, impidiendo que el usuario seleccione un horario y proceda a la programación de la cita.
Flujo actual
- El usuario solicita programar una cita.
- El asistente de IA pregunta por la fecha y llama a la función
getAvailableSlots
. - Los horarios disponibles se devuelven y se muestran al usuario.
- Se le solicita al usuario que seleccione un horario.
- En este punto, la conexión WebSocket se desconecta (Código de cierre: 1000) antes de que el usuario pueda responder.
Observaciones Clave
- La conexión WebSocket se mantiene abierta hasta que la función
getAvailableSlots
se completa. - Después de devolver los horarios, la conexión se cierra intencionalmente antes de que el usuario responda.
- Aunque se establece un intervalo de mantenimiento (keepAliveInterval) de 25 segundos, la conexión sigue cayendo.
- No se registran errores en los logs; la desconexión parece ser intencional.
Código WebSocket
Aquí hay un fragmento del código utilizado para establecer la conexión WebSocket:
const openAiWs = new WebSocket(
"wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview-2024-10-01",
{
headers: {
Authorization: `Bearer ${OPENAI_API_KEY}`,
"OpenAI-Beta": "realtime=v1",
},
}
);
El mecanismo de mantener la conexión activa es el siguiente:
const keepAliveInterval = setInterval(() => {
if (openAiWs.readyState === WebSocket.OPEN) {
openAiWs.send(JSON.stringify({ type: "ping" }));
console.log("🔄 Sent keep-alive ping");
}
}, 25000); // Cada 25 segundos
Manejo de mensajes de WebSocket
La función que maneja los mensajes entrantes es la siguiente:
openAiWs.on("message", (data) => {
try {
const response = JSON.parse(data);
console.log("📥 Received event from OpenAI:", response.type);
// ... manejo de la respuesta
} catch (error) {
console.error("❌ Error processing OpenAI message:", error);
}
});
Problema y Solución
El problema puede estar relacionado con cómo se manejan las respuestas en la función handleFunctionCall
. Es posible que, después de enviar los horarios disponibles, se intente cerrar la conexión. Para solucionar este problema, se recomienda:
-
Verificar el flujo de control: Asegúrese de que el flujo de control no cierre la conexión de forma prematura después de enviar los horarios disponibles.
-
Revisar el código de cierre: Confirme que no haya un cierre de conexión intencionado después de que se envían los horarios.
-
Implementar un protocolo de espera: Considere implementar un mecanismo de espera (timeout) que permita al usuario interactuar antes de cerrar la conexión.
- Monitorear la actividad del usuario: Mantenga la conexión abierta siempre que haya actividad del usuario y sólo ciérrela si se da un tiempo prolongado de inactividad o si se completa satisfactoriamente el flujo de programación.
Siguiendo estas pautas, se espera que se pueda resolver el problema de desconexión de WebSocket y mejorar la experiencia del usuario al seleccionar la cita.