Skip to main content
O que você aprenderá: Esta página é a referência de arquitetura oficial para ZappWay, gerada a partir de uma varredura completa da base de código (commit 14982f37). Ele cobre todos os principais subsistemas: a estrutura monorepo, esquema de banco de dados, topologia de fila/trabalhador, carregadores de ingestão, camada vetorial Qdrant, pipeline de incorporação, RAG multi-shot adaptativo, mecanismo de chat, autenticação, orquestrador de sincronização, todas as integrações de 13 canais, armazenamento de arquivos, roteador de modelo LLM e observabilidade.

🔢 Índice

  1. Overall System Architecture
  2. Database Layer
  3. Queue & Worker Architecture
  4. Ingestion Engine & Loaders
  5. Vector Database Layer — Qdrant
  6. Embedding Pipeline
  7. RAG & Retrieval Pipeline
  8. Chat & Conversation Engine
  9. Multi-Tenant Isolation & Auth
  10. Sync Orchestrator
  11. External Integrations & Channels
  12. File Storage & Media Pipeline
  13. LLM Orchestration & Model Router
  14. Observability & Monitoring
  15. Gaps & Recommendations

1. Arquitetura geral do sistema

ZappWay é um pnpm monorepo estruturado em 3 aplicativos e 2 árvores de pacotes. O aplicativo apps/zappway hospeda o Dashboard, Landing, Blog e Docs. Toda a lógica de negócios principal reside em packages/zappway/lib (cerca de 160 arquivos). Um aplicativo apps/workers-services dedicado executa todos os trabalhadores em segundo plano e a API WhatsApp Bridge isoladamente, consumindo trabalhos de filas BullMQ-Pro apoiadas por Redis.

Mapa do aplicativo

Mapa do pacote


2. Camada de banco de dados

Fonte: packages/zappway/prisma/schema.prisma (1548 linhas) · 33 modelos · 23 enums PostgreSQL via Prisma com recursos de visualização fullTextSearch e fullTextIndex habilitados. O modelo Organization é o limite do locatário raiz – todas as outras entidades têm como escopo direto ou transitivo.

Inventário completo de modelos

Enums-chave


3. Arquitetura de filas e trabalhadores

Fonte: packages/zappway/lib/types/index.ts, apps/workers-services/workers/ Três filas BullMQ-Pro dedicadas separam as preocupações. A fila load-datasource é a fila ativa principal; os outros dois estão parcialmente implementados.

Configuração do Worker — Carregador de fonte de dados

Mecanismo de desduplicação: Redis SET NX com chave ld:lock:{datasourceId} impede que a mesma fonte de dados seja executada em paralelo. Desligamento Gracioso: Lida com SIGTERM e SIGINT – fecha o trabalhador e sai do Redis de forma limpa.

Inventário de Trabalhadores


4. Mecanismo de ingestão e carregadores

Fonte: packages/zappway/lib/datastores/datasources/, packages/zappway/lib/loaders/ Todos os carregadores estendem DatasourceLoaderBase. O ponto de entrada taskLoadDatasource() seleciona o carregador correto em tempo de execução com base em DatasourceType. A saída é uma matriz AppDocument[] normalizada alimentada no mecanismo de chunking e depois no Qdrant.

Mapeamento do carregador

Carregador de site – Detalhe do pipeline

Fonte: packages/zappway/lib/loaders/web-site.ts (515 linhas) O WebSiteLoader é o carregador mais complexo. Seu pipeline é executado em 6 estágios: (1) Discovery — analisa XML do mapa do site ou rastreia via findDomainPages(); (2) Normalização — desduplicação de URL, remoção de parâmetros UTM, nome de host em minúsculas; (3) Filtragem de lista negra — aplica a configuração black_listed_urls; (4) Investigação HTTP — HEAD → GET com reparo de caminho semver em 404s; (5) Gerenciamento infantil — atualiza web_page fontes de dados infantis, exclui órfãos; (6) Enfileiramento — emite trabalhos filhos com pontuações de prioridade (home = 5, mapa do site = 8, outros = 10). A simultaneidade é limitada a 6 por meio de mapWithConcurrency. Limite do plano aplicado via accountConfig[plan].limits.maxWebsiteURL (padrão: 25).

5. Camada de banco de dados vetorial - Qdrant

Fonte: packages/zappway/lib/datastores/qdrant.ts (731 linhas) Cada Datastore é mapeado para exatamente uma coleção Qdrant chamada zw_{datastoreId}, fornecendo isolamento vetorial estrito por locatário. QdrantManager inclui uma rotina de migração automática que detecta incompatibilidades de dimensões ou métricas de distância e recria a coleção de forma transparente, permitindo atualizações de modelos de incorporação sem tempo de inatividade.

Configuração da coleção

Esquema de carga útil (por ponto)


6. Incorporação de pipeline

Fonte: packages/zappway/lib/datastores/gemini-embeddings.ts, packages/zappway/lib/multimodal-memory/ Todos os embeddings usam Gemini Embedding 2 Preview, produzindo vetores de 3.072 dimensões que correspondem ao VECTOR_SIZE do Qdrant. O pipeline usa valores taskType assimétricos por site de chamada — RETRIEVAL_DOCUMENT durante a ingestão e RETRIEVAL_QUERY no momento da pesquisa — o que é crítico para a qualidade da recuperação com o modelo de incorporação assimétrica do Gemini.

Configuração

Suporte multimodal

embedMultimodal() aceita GeminiPart[][] onde cada parte pode ser { text } ou { inlineData: { mimeType, data } } (imagens codificadas em base64, quadros de vídeo, áudio, páginas PDF). Isso incorpora conteúdo não textual no mesmo espaço de 3.072 dimensões que o texto, permitindo uma verdadeira pesquisa semântica multimodal. O módulo multimodal-memory/ fornece indexação dedicada (indexer.ts — 24,5 KB), chunkers específicos de mídia (media-chunkers.ts), gerenciamento de coleção, pesquisa e acionadores de fila assíncrona.

7. RAG e pipeline de recuperação

Fonte: packages/zappway/lib/chat-v4/rag.ts (493 linhas) ZappWay implementa Multi-Shot Adaptive RAG ​​com até 6 tentativas de recuperação progressiva em 3 níveis de qualidade. Cada tentativa relaxa os limites de similaridade para maximizar a recuperação, enquanto evaluateRagQuality() permite a saída antecipada quando os resultados são fortes o suficiente. Um disjuntor evita falhas em cascata e ragMemo (cache na memória) desduplica tentativas idênticas em uma sessão.

Limites adaptativos

Modo profundo é acionado por shouldFavorDeepRag(query) e aplica limites iniciais mais altos. minUcount é 1 para consultas de armazenamento de dados único e 2 para consultas de vários armazenamentos de dados. Os tempos limite variam de 8s (Nível 1) a 12s (Nível 3), limitados pelo orçamento restante do chat. Se remainingMs() < 120s, o máximo de tentativas é reduzido para 4.

8. Mecanismo de bate-papo e conversação

Fonte: packages/zappway/lib/chat-v4/chat.ts (1147 linhas), packages/zappway/lib/agent/tools/ A função de bate-papo orquestra a montagem do prompt do sistema, o truncamento do histórico de mensagens, o RAG multi-shot, a construção de ferramentas de tempo de execução, a execução do LLM com streaming e a cadeia de fallback do modelo completo – tudo dentro de um orçamento de tempo compartilhado aplicado em cada ponto de verificação.

Tipos de eventos SSE

Ferramentas de tempo de execução


9. Isolamento e autenticação multilocatário

Fontes: packages/zappway/lib/auth/authConfig.ts, authAdapter.ts e authProviders.ts Auth.js Core processa diretamente as requisições HTTP do servidor com um adaptador Prisma personalizado; next-auth/react permanece restrito ao cliente. Quatro métodos de login são suportados. No primeiro login, a plataforma provisiona automaticamente toda a pilha de locatários de forma atômica.

Isolamento de locatário por camada

Modelo RBAC

Configuração da Sessão

Suporte local: 37 localidades, incluindo RTL (árabe, hebraico, persa, urdu). Ordem de resolução: caminho do URL → cookie NEXT_LOCALE → cookie i18next → cabeçalho Accept-Language → padrão en.

10. Sincronizar orquestrador

Fonte: apps/workers-services/workers/check-and-sync-cron.ts Um trabalhador orientado por cron verifica todas as fontes de dados com status = synched, filtra por lastSyncAt + syncInterval e distribui trabalhos load-datasource individuais. Um trabalhador check-stalled lida com a recuperação de fontes de dados presas no status running além de um limite configurável.

11. Integrações e canais externos

Fonte: packages/zappway/integrations/ — adaptadores de 13 canais Todos os canais normalizam as mensagens de entrada para o mesmo modelo interno Conversation + Message e roteiam através do mecanismo unificado chat-v4.

Capacidades do canal

Autenticação do Provedor de Serviços


12. Armazenamento de arquivos e pipeline de mídia

Fonte: packages/zappway/lib/aws.ts Suporta armazenamento compatível com S3 (AWS S3, Cloudflare R2, MinIO) via AWS SDK v3. Os arquivos são carregados por meio de URLs pré-assinados, armazenados em organizations/{orgId}/ e extraídos por FileLoader para extração e ingestão.

Variáveis ​​de ambiente S3


13. Orquestração LLM e roteador modelo

Fonte: packages/zappway/lib/config.ts (943 linhas), packages/zappway/lib/chat-model/model.ts (745 linhas) 50+ models across 12 providers via a unified OpenAI-SDK-compatible interface. Provider routing is automatic based on each model’s baseUrl in ModelConfig. OpenAI, Google Gemini, and OpenRouter are all accessed through the same OpenAI SDK client with different base URLs and API keys.

Inventário de Modelos

🧠 OpenAI — Direto

🟡 Google — Direto via API Gemini

🔶 Antrópico — via OpenRouter

Outros provedores — via OpenRouter

Modelos de nível gratuito: gpt_4o_mini, gpt_5_mini, gpt_5_nano, gpt_5_4_mini, gpt_5_4_nano, gemini_flash_2_0
Importante: Os modelos da família GPT-5 não suportam ajuste manual de temperatura — eles usam reconhecimento automático de temperatura.

14. Observabilidade e monitoramento

Fonte: packages/zappway/lib/logger.ts, apps/workers-services/sentry.*.config.ts Os trabalhadores publicam uma carga útil WorkerHealth no Redis (health:worker:{name}, TTL de 30s) a cada 10s. Campos: status, startedAt, lastActivityAt, jobsProcessed, jobsFailed, queueLength, system.memoryMB, system.uptimeMs. Exposto via /api/workers/health. Os trabalhadores também transmitem logs em tempo real para o canal Redis Pub/Sub logs:datasource para monitoramento do painel ao vivo.

15. Lacunas e recomendações

Lacunas identificadas

Recomendações

  1. Enable cloud logging — Uncomment Axiom or use Datadog / Grafana Loki for production log retention.
  2. Add rate limiting — Per-organization token-bucket on chat endpoints.
  3. Implement DLQ — BullMQ supports deadLetterQueue option; enable for all 3 queues.
  4. Embedding fallbacktext-embedding-3-large from OpenAI (3072-dim compatible) as secondary.
  5. Qdrant snapshots — Cron-based snapshot to S3 for disaster recovery.
  6. Test coverage — Integration tests for the RAG pipeline and ingestion workers as a starting priority.

Pontos fortes da arquitetura


Vocabulário


· Última atualização: março de 2026