Arquitetura do Synapse
Como o Synapse é construído — Fastify, PostgreSQL, FTS5, embeddings, servidor MCP.
Arquitetura do Synapse
O Synapse é uma API de memória multi-tenant construída sobre Fastify, PostgreSQL com FTS5 e um serviço opcional de embeddings para busca semântica.
Arquitetura de alto nível
┌──────────────────────────────────────────────────────────┐
│ Clients │
├──────────────┬──────────────┬──────────────┬─────────────┤
│ LLM Agents │ Web Browsers│ MCP Clients │ Webhooks │
│ (curl/SDK) │ (humans) │ (Claude/etc) │ (external) │
└──────┬───────┴──────┬───────┴──────┬───────┴──────┬──────┘
│ │ │ │
└──────────────┴──────────────┴──────────────┘
│
▼
┌───────────────────────────────┐
│ Synapse API (Fastify) │
│ port 12800 │
│ - REST endpoints │
│ - Auth (Mind Key / JWT) │
│ - Rate limiting │
│ - Static file serving │
└───────────────┬───────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ PostgreSQL │ │ Embeddings │ │ MCP Server │
│ + FTS5 │ │ Service │ │ (separate) │
│ │ │ (optional) │ │ port 13100 │
│ - memories │ │ │ │ │
│ - tasks │ │ - generate │ │ - 79 tools │
│ - chat │ │ embeddings│ │ - stdio/SSE │
│ - scripts │ │ │ │ - WebSocket │
└─────────────┘ └─────────────┘ └─────────────┘Componentes principais
1. Synapse API (Fastify)
O servidor HTTP principal. Cuida de:
- Endpoints REST (
/memory,/chat,/mind/tasks, etc.) - Autenticação (Mind Key para agentes, JWT para humanos)
- Limites de taxa (apenas auth
?key=) - Servimento de arquivos estáticos (interface web em
/human,/docs, etc.) - Dispatch de webhooks
Construído com Fastify 5 para desempenho. Roda na porta 12800 em produção.
2. PostgreSQL com FTS5
O armazenamento principal de dados. Usa PostgreSQL com a extensão FTS5 para busca em texto completo.
Tabelas principais:
| Tabela | Finalidade |
|---|---|
users |
Contas de usuário |
minds |
Escopos de mind (cada um tem uma Mind Key) |
memories |
Registros de memória com tabela virtual FTS5 |
tasks |
Gerenciamento de tarefas |
chat_messages |
Histórico de chat |
scripts |
Scripts persistentes |
webhooks |
Registros de webhook |
cron_jobs |
Tarefas agendadas |
variables |
Armazenamento key-value |
audit_log |
Trilha de auditoria |
FTS5 permite busca em texto completo sub-milissegundo em todo o conteúdo das memórias. Consulte Busca FTS5 para detalhes.
3. Serviço de Embeddings (opcional)
Para busca semântica, o Synapse gera embeddings vetoriais do conteúdo das memórias. Eles são armazenados junto com as memórias e usados para busca por similaridade.
- Provedor: configurável (OpenAI, modelo local, etc.)
- Armazenado como coluna
vectorna tabelamemories - Usado pelo endpoint
/memory/semantic-search - Consulte Busca semântica
4. Servidor MCP (serviço separado)
O servidor MCP do Synapse roda como um processo separado (porta 13100). Ele:
- Expõe 79 ferramentas via Model Context Protocol
- Suporta transportes stdio, HTTP/SSE e WebSocket
- Traduz chamadas de ferramentas MCP em chamadas da API do Synapse
- Multi-tenant: uma Mind Key por sessão
5. Browser Proxy (serviço separado)
Para automação de navegador, um serviço separado baseado em Playwright roda na
porta 13000. O servidor MCP pode chamá-lo para ferramentas browser_*.
6. SSH Proxy (serviço separado)
Para comandos remotos via SSH, um serviço separado roda na porta 12900.
Modelo multi-tenant
User Account (email + password)
│
├── Mind 1 (Mind Key 1)
│ ├── Memories
│ ├── Tasks
│ ├── Chat
│ └── Scripts
│
├── Mind 2 (Mind Key 2)
│ └── ... (isolated from Mind 1)
│
└── Mind 3 (Mind Key 3)
└── ...Cada mind é totalmente isolado. Mind Keys concedem acesso a exatamente um mind. JWTs concedem acesso à conta do usuário (para gerenciar minds).
Consulte Multi-tenancy para detalhes.
Fluxo de requisição
Requisição de armazenamento de memória
1. Client sends POST /memory with Authorization: Bearer mk_xxx
2. Fastify receives request
3. Auth middleware validates Mind Key, attaches mind_id to request
4. Memory route handler:
a. Validate JSON body (zod schema)
b. Insert into memories table
c. Update FTS5 index
d. (Async) Generate embedding if embeddings enabled
e. Trigger webhooks for memory.store event
5. Return { id, status: "stored" }Requisição de busca de memória
1. Client sends GET /memory/search?q=docker
2. Auth middleware validates Mind Key
3. Memory route handler:
a. Parse query (FTS5 syntax)
b. Execute FTS5 MATCH against memories table
c. Filter by mind_id (tenant isolation)
d. Rank by relevance
e. Return resultsDeploy
O Synapse é implantado como um container Docker. Consulte docker-compose.yml:
services:
synapse:
image: registry.gitlab.com/schaefer-services/synapse:latest
ports:
- "12800:12800"
environment:
- DATABASE_URL=postgres://...
- JWT_SECRET=...
- SYNAPSE_HOST=0.0.0.0
- SYNAPSE_PORT=12800
depends_on:
- postgres
postgres:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
environment:
- POSTGRES_DB=synapse
- POSTGRES_PASSWORD=...Características de desempenho
| Operação | Latência | Throughput |
|---|---|---|
| Armazenar memória | ~5ms | 1000+ req/s |
| Recall de memória | ~20ms | 500 req/s |
| Busca FTS5 | ~10ms | 800 req/s |
| Busca semântica | ~50ms | 200 req/s |
| Poll de chat | ~5ms | 2000 req/s |