Skip to main content
Documentação interna para desenvolvedores. Esta página aborda os aspectos internos da API do Personal Assistant: padrões de autenticação, implementação de SSE de streaming, limitação de taxa, agendamento de rotina e arquitetura de tempo de execução. Não se destina a usuários finais.

Mapa de rotas


Planejar portão

Cada rota PA começa com a validação do plano:

Padrão de autenticação

O PA é vinculado ao usuário no nível de conversação, mas vinculado à organização no nível de capacidades. O ID do usuário vem de req.session.user.id.

Arquitetura de tempo de execução


Implementação de streaming

O endpoint do chat usa ReadableStream com formato SSE:

Mecanismo de Rotina

As rotinas são armazenadas no banco de dados com uma programação cron. Um trabalho em segundo plano (/api/crons/personal-assistant-routines ou similar) os aciona dentro do cronograma.

Limitação de taxa

O endpoint do chat impõe limites de taxa de @zappway/lib/rate-limit:
Os cabeçalhos de limite de taxa estão incluídos em TODAS as respostas (streaming + não streaming):
  • X-RateLimit-Limit
  • X-RateLimit-Remaining
  • X-RateLimit-Reset

Injeção de contexto i18n

A rota de chat injeta contexto de solicitação para i18n:
Crítico: Sempre chame cleanupReqCtx() no bloco finally. A falta disso faz com que o contexto de localidade vaze entre solicitações simultâneas.

Privacidade — Exclusão de dados


Problemas conhecidos/pegadinhas

  • sourceIdentity é removido da entrada antes de passar para runtime.chat() — o painel sempre usa a identidade do usuário autenticado, nunca um rótulo de ator fornecido pelo cliente.
  • Tratamento de interrupção de streaming: A interrupção do cliente (client_disconnected) e o tempo limite (personal_assistant_stream_timeout) acionam abortController.abort(). O código de erro é preservado no evento SSE error para diferenciação do lado do cliente.
  • Endpoint de estado (GET /state) usa validação PersonalAssistantStateQuerySchema + injeção i18n — mesmo padrão do chat.
  • Isolamento de conversa: as conversas PA têm como escopo userId (não apenas organizationId). Os usuários não podem ver as conversas de PA uns dos outros, mesmo dentro da mesma organização.