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
- Overall System Architecture
- Database Layer
- Queue & Worker Architecture
- Ingestion Engine & Loaders
- Vector Database Layer — Qdrant
- Embedding Pipeline
- RAG & Retrieval Pipeline
- Chat & Conversation Engine
- Multi-Tenant Isolation & Auth
- Sync Orchestrator
- External Integrations & Channels
- File Storage & Media Pipeline
- LLM Orchestration & Model Router
- Observability & Monitoring
- Gaps & Recommendations
1. Arquitetura geral do sistema
ZappWay é um pnpm monorepo estruturado em 3 aplicativos e 2 árvores de pacotes. O aplicativoapps/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
- Enable cloud logging — Uncomment Axiom or use Datadog / Grafana Loki for production log retention.
- Add rate limiting — Per-organization token-bucket on chat endpoints.
- Implement DLQ — BullMQ supports
deadLetterQueueoption; enable for all 3 queues. - Embedding fallback —
text-embedding-3-largefrom OpenAI (3072-dim compatible) as secondary. - Qdrant snapshots — Cron-based snapshot to S3 for disaster recovery.
- 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

