Skip to main content
Documentación interna para desarrolladores. Esta página cubre los aspectos internos de la API del Asistente personal: patrones de autenticación, implementación de transmisión SSE, limitación de velocidad, programación de rutinas y arquitectura de tiempo de ejecución. No está destinado a usuarios finales.

Mapa de ruta


Planificar puerta

Cada ruta PA comienza con la validación del plan:

Patrón de autenticación

La PA está vinculada al usuario en el nivel de conversación, pero vinculada a la organización en el nivel de capacidades. El ID de usuario proviene de req.session.user.id.

Arquitectura de tiempo de ejecución


Implementación de transmisión

El punto final del chat utiliza ReadableStream con formato SSE:

Motor de rutina

Las rutinas se almacenan en la base de datos con una programación cron. Un trabajo en segundo plano (/api/crons/personal-assistant-routines o similar) los activa según lo programado.

Limitación de velocidad

El punto final del chat aplica límites de velocidad desde @zappway/lib/rate-limit:
Los encabezados de límite de velocidad se incluyen en TODAS las respuestas (transmisión + no transmisión):
  • X-RateLimit-Limit
  • X-RateLimit-Remaining
  • X-RateLimit-Reset

Inyección de contexto i18n

La ruta de chat inyecta contexto de solicitud para i18n:
Crítico: Llame siempre a cleanupReqCtx() en el bloque finally. Omitir esto hace que el contexto local se filtre entre solicitudes simultáneas.

Privacidad: eliminación de datos


Problemas conocidos / Problemas

  • sourceIdentity se elimina de la entrada antes de pasar a runtime.chat(): el panel siempre usa la identidad del usuario autenticado, nunca una etiqueta de actor proporcionada por el cliente.
  • Manejo de abortos de transmisión: Tanto el aborto del cliente (client_disconnected) como el tiempo de espera (personal_assistant_stream_timeout) activan abortController.abort(). El código de error se conserva en el evento SSE error para la diferenciación del lado del cliente.
  • El punto final estatal (GET /state) usa validación PersonalAssistantStateQuerySchema + inyección i18n: el mismo patrón que el chat.
  • Aislamiento de conversación: Las conversaciones PA tienen como alcance userId (no solo organizationId). Los usuarios no pueden ver las conversaciones PA de los demás, incluso dentro de la misma organización.