Saltar al contenido principal

WebChat (UI WebSocket del Gateway)

Estado: la UI de chat SwiftUI de macOS/iOS se comunica directamente con el WebSocket del Gateway.

Qué es

  • Una UI de chat nativa para el gateway (sin navegador incrustado ni servidor estático local).
  • Usa las mismas sesiones y reglas de enrutamiento que otros canales.
  • Enrutamiento determinista: las respuestas siempre vuelven a WebChat.

Inicio rápido

  1. Inicia el gateway.
  2. Abre la UI de WebChat (app de macOS/iOS) o la pestaña de chat de la Control UI.
  3. Asegúrate de que esté configurada una ruta de autenticación válida del gateway (shared-secret de forma predeterminada, incluso en loopback).

Cómo funciona (comportamiento)

  • La UI se conecta al WebSocket del Gateway y usa chat.history, chat.send y chat.inject.
  • chat.history está acotado por estabilidad: Gateway puede truncar campos de texto largos, omitir metadatos pesados y sustituir entradas sobredimensionadas por [chat.history omitted: message too large].
  • chat.history también está normalizado para visualización: se eliminan del texto visible las etiquetas de directivas de entrega en línea como [[reply_to_*]] y [[audio_as_voice]], las cargas útiles XML de llamadas a herramientas en texto plano (incluidas <tool_call>...</tool_call>, <function_call>...</function_call>, <tool_calls>...</tool_calls>, <function_calls>...</function_calls> y bloques truncados de llamadas a herramientas), y los tokens de control del modelo filtrados en ASCII/de ancho completo, y se omiten las entradas del asistente cuyo texto visible completo sea solo el token silencioso exacto NO_REPLY / no_reply.
  • chat.inject añade una nota del asistente directamente a la transcripción y la difunde a la UI (sin ejecución del agente).
  • Las ejecuciones abortadas pueden mantener salida parcial visible del asistente en la UI.
  • Gateway persiste en el historial de la transcripción el texto parcial abortado del asistente cuando existe salida almacenada en búfer, y marca esas entradas con metadatos de aborto.
  • El historial siempre se obtiene del gateway (sin observación de archivos local).
  • Si no se puede acceder al gateway, WebChat es de solo lectura.

Panel de herramientas de agentes de la Control UI

  • El panel de herramientas de /agents de la Control UI tiene dos vistas separadas:
    • Available Right Now usa tools.effective(sessionKey=...) y muestra lo que la sesión actual puede usar realmente en runtime, incluidas herramientas core, de plugins y propias del canal.
    • Tool Configuration usa tools.catalog y sigue centrado en perfiles, anulaciones y semántica de catálogo.
  • La disponibilidad en runtime está acotada a la sesión. Cambiar de sesión en el mismo agente puede cambiar la lista de Available Right Now.
  • El editor de configuración no implica disponibilidad en runtime; el acceso efectivo sigue la precedencia de políticas (allow/deny, anulaciones por agente y por proveedor/canal).

Uso remoto

  • El modo remoto tuneliza el WebSocket del gateway a través de SSH/Tailscale.
  • No necesitas ejecutar un servidor WebChat independiente.

Referencia de configuración (WebChat)

Configuración completa: Configuración Opciones de WebChat:
  • gateway.webchat.chatHistoryMaxChars: recuento máximo de caracteres para campos de texto en respuestas de chat.history. Cuando una entrada de la transcripción supera este límite, Gateway trunca los campos de texto largos y puede sustituir mensajes sobredimensionados por un marcador. El cliente también puede enviar maxChars por solicitud para anular este valor predeterminado en una sola llamada a chat.history.
Opciones globales relacionadas:
  • gateway.port, gateway.bind: host/puerto del WebSocket.
  • gateway.auth.mode, gateway.auth.token, gateway.auth.password: autenticación shared-secret del WebSocket.
  • gateway.auth.allowTailscale: la pestaña de chat de la Control UI del navegador puede usar encabezados de identidad de Tailscale Serve cuando está habilitado.
  • gateway.auth.mode: "trusted-proxy": autenticación de proxy inverso para clientes del navegador detrás de un origen de proxy fuera de loopback con reconocimiento de identidad (consulta Autenticación de proxy de confianza).
  • gateway.remote.url, gateway.remote.token, gateway.remote.password: destino del gateway remoto.
  • session.*: valores predeterminados para almacenamiento de sesiones y clave principal.