Saltar al contenido principal
Comfy Router retransmite una sesión de voz a voz en tiempo real con Grok Voice de xAI, servida por fal. Abres un WebSocket a Router con tu Clave API de Comfy. Router verifica tu cuenta y tus créditos, abre la sesión en el servicio upstream y luego retransmite eventos en ambas direcciones. Pagas por segundo de sesión con tus créditos de Comfy.

Punto de conexión

La solicitud es una actualización a WebSocket (GET con Connection: Upgrade y Upgrade: websocket). El servidor rechaza cualquier otra solicitud con 426.

Autenticación

Envía tu Clave API de Comfy en un encabezado de la solicitud de actualización, ya sea como X-API-Key: comfyui-... o como Authorization: Bearer comfyui-.... Router no lee ninguna clave de la cadena de consulta ni del subprotocolo WebSocket.
Los navegadores no pueden establecer encabezados en un WebSocket, y una Clave API de Comfy nunca debe llegar a un navegador. Abre la sesión desde tu servidor y retransmite el audio al navegador tú mismo.

Conectar

Cuando la actualización se complete correctamente, envía y recibe los eventos en tiempo real que xAI documenta para Grok Voice. Este ejemplo configura la sesión, envía un turno de texto e imprime cada tipo de evento que recibe.
Cierra el socket en cuanto termines. Se te factura hasta que se cierre la sesión, no hasta la última respuesta.

Eventos

Router no define su propio protocolo de eventos. Los eventos del servidor te llegan exactamente como los envía fal, y Router reenvía sin cambios los eventos de cliente que acepta. Para consultar la lista de eventos, los campos de sesión, las voces y los formatos de audio, consulta: Envía cada evento de cliente como un único mensaje binario msgpack, como en los ejemplos. Este es el formato de trama que usan los clientes en tiempo real de fal, y los eventos del modelo regresan de la misma manera, como mensajes binarios msgpack que comienzan con session.created. fal también envía sus propios mensajes de texto JSON de tipo x-fal-message (información de temporización); puedes omitirlos. Las comprobaciones de Router también aceptan un evento de cliente como un único mensaje de texto JSON, pero usa msgpack a menos que hayas probado JSON con tu cliente. Router comprueba cada evento de cliente antes de reenviarlo:
  • Tipos de evento: session.update, input_audio_buffer.append, input_audio_buffer.commit, input_audio_buffer.clear, conversation.item.create, conversation.item.delete, conversation.item.truncate, response.create, response.cancel y x-fal-session.configure de fal.
  • Modelos: un model en session.update debe ser grok-voice-latest, grok-voice-3.0 o grok-voice-2.0.
  • Herramientas: las herramientas de función que ejecuta tu cliente están permitidas. Router rechaza las herramientas del lado del servidor (búsqueda web, búsqueda en X, búsqueda de archivos y MCP).
  • Multimedia: Router rechaza la entrada de imagen y video. La sesión es solo de voz y texto.
  • Tamaño: un mensaje de cliente puede ocupar como máximo 1 MiB.
Un evento rechazado no se reenvía, y Router cierra la sesión con el código de cierre 1008.

Precios

Una sesión cuesta **$0.0011869 por segundo** (aproximadamente $0.0712 por minuto, o 0.2504 créditos por segundo, alrededor de 15.0 créditos por minuto, con 211 créditos = $1 USD). Se factura en incrementos de 15 segundos mientras la sesión está abierta, y el último incremento parcial se factura por segundo, redondeado hacia arriba. La facturación corre desde la actualización de la conexión hasta que se cierra el socket, independientemente de que haya o no audio en transmisión.

Límites

Cuando una sesión alcanza su límite de tiempo o se queda sin créditos, la conexión puede cerrarse sin una trama de cierre (a menudo aparece como el código de cierre 1006). Vuelve a conectarte solo después de recargar, o inicia una nueva sesión si necesitas más tiempo.

Errores

Antes de la actualización

Si Router rechaza la conexión, responde con un estado HTTP y un cuerpo JSON en lugar de cambiar de protocolo:
Cambia según code; detail es para las personas.

Después de la actualización

Cualquier otro cierre proviene de fal o xAI. Consulta su documentación enlazada en Events.

Siguiente