Архітектура Synapse
Як побудовано Synapse — Fastify, PostgreSQL, FTS5, ембеддинги, MCP-сервер.
Архітектура Synapse
Synapse — це мультитенантний API пам'яті, побудований на Fastify, PostgreSQL із FTS5 та опціональній службі ембеддингів для семантичного пошуку.
Архітектура високого рівня
┌──────────────────────────────────────────────────────────┐
│ 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 │
└─────────────┘ └─────────────┘ └─────────────┘Основні компоненти
1. Synapse API (Fastify)
Головний HTTP-сервер. Обробляє:
- REST-кінцеві точки (
/memory,/chat,/mind/tasksтощо) - Автентифікацію (Mind Key для агентів, JWT для людей)
- Обмеження частоти (лише для автентифікації
?key=) - Віддачу статичних файлів (веб-інтерфейс на
/human,/docsтощо) - Диспетчеризацію webhook-ів
Побудовано на Fastify 5 для високої продуктивності. У продакшені працює на порту 12800.
2. PostgreSQL з FTS5
Основне сховище даних. Використовує PostgreSQL із розширенням FTS5 для повнотекстового пошуку.
Основні таблиці:
| Таблиця | Призначення |
|---|---|
users |
Облікові записи користувачів |
minds |
Області mind-ів (кожен має Mind Key) |
memories |
Записи спогадів із віртуальною таблицею FTS5 |
tasks |
Керування завданнями |
chat_messages |
Історія чату |
scripts |
Постійні скрипти |
webhooks |
Реєстрації webhook-ів |
cron_jobs |
Заплановані завдання |
variables |
Сховище ключ-значення |
audit_log |
Журнал аудиту |
FTS5 забезпечує повнотекстовий пошук за всіма спогадами з затримкою менше мілісекунди. Докладніше дивіться у пошуку FTS5.
3. Служба ембеддингів (опціональна)
Для семантичного пошуку Synapse генерує векторні ембеддинги вмісту спогадів. Вони зберігаються разом зі спогадами та використовуються для пошуку за подібністю.
- Постачальник: настроюваний (OpenAI, локальна модель тощо)
- Зберігається у колонці
vectorу таблиціmemories - Використовується кінцевою точкою
/memory/semantic-search - Дивіться Семантичний пошук
4. MCP-сервер (окрема служба)
MCP-сервер Synapse працює як окремий процес (порт 13100). Він:
- Надає 79 інструментів через Model Context Protocol
- Підтримує транспорти stdio, HTTP/SSE та WebSocket
- Перетворює виклики MCP-інструментів у виклики API Synapse
- Мультитенантний: один Mind Key на сесію
5. Браузерний проксі (окрема служба)
Для автоматизації браузера окрема служба на основі Playwright працює на порту
13000. MCP-сервер може викликати її для інструментів browser_*.
6. SSH-проксі (окрема служба)
Для віддалених команд через SSH окрема служба працює на порту 12900.
Модель мультитенантності
User Account (email + password)
│
├── Mind 1 (Mind Key 1)
│ ├── Memories
│ ├── Tasks
│ ├── Chat
│ └── Scripts
│
├── Mind 2 (Mind Key 2)
│ └── ... (ізольований від Mind 1)
│
└── Mind 3 (Mind Key 3)
└── ...Кожен mind повністю ізольований. Mind Keys надають доступ лише до одного mind-у. JWT надають доступ до облікового запису користувача (для керування mind-ами).
Докладніше дивіться у Мультитенантності.
Потік запитів
Запит на збереження спогаду
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" }Запит на пошук спогадів
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 resultsРозгортання
Synapse розгортається як Docker-контейнер. Дивіться 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=...Характеристики продуктивності
| Операція | Затримка | Пропускна здатність |
|---|---|---|
| Збереження спогаду | ~5мс | 1000+ запитів/с |
| Відкликання спогадів | ~20мс | 500 запитів/с |
| Пошук FTS5 | ~10мс | 800 запитів/с |
| Семантичний пошук | ~50мс | 200 запитів/с |
| Опитування чату | ~5мс | 2000 запитів/с |