a1e14c64c3
- Q1 → Ontotext GraphDB (SPARQL). docs/08 fully rewritten with RDF schema, example SPARQL queries (transitive deps via property paths, time-windowed topic counts, cross-pillar joins via nexa:vectorId). - Q2 → reuse qdrant_scientific with nexa_* collection prefix; docs/09 step 2 now points there explicitly. - Q3 → no OpenAI embeddings. Self-host on the docker host. Use TEI (HuggingFace text-embeddings-inference) — single Rust binary, ~500 MB image, OpenAI-compatible — instead of Ollama, since we only need embeddings. - docs/09 Phase-3.4 add-on simplified to a single Ontotext compose snippet (Neo4j option dropped) plus repo creation curl. - docs/11 Q3 marked resolved; new Q15 picks the model (bge-m3 vs nomic-embed) and adds the open question of whether SAIA already proxies an embedding model that would let us skip TEI entirely. - docs/03 + CLAUDE.md updated with the new decisions so future runs don't re-litigate.
4.0 KiB
4.0 KiB
03 — Architecture Overview
A one-page mental model. For details follow the cross-links.
Topology
┌────────────────┐
voice / typing ──────▶│ Memos │◀──── Nexa replies as comments
│ (interface) │
└───────┬────────┘
│ webhook (- [ ] / #nexa:*)
▼
┌────────────────┐
IMAP / RSS / NC ────▶│ n8n │◀──── workflows live in
Karakeep / Bluesky │ (logic) │ ./nexa-core/n8n-workflows
└───┬────────┬───┘
classify ▲ │ │ ▲ retrieve
│ ▼ ▼ │
┌──────────┐ ┌──────────┐
│ SAIA │ │ Qdrant │
│ LiteLLM │ │ vector │
└──────────┘ └────┬─────┘
│
▼
┌──────────┐
│ GraphDB │ Ontotext, SPARQL
│ (RDF) │ Phase 3.4
└──────────┘
│
▼ writes
┌──────────────────────────────┐
│ Nextcloud (Tasks, Calendar, │
│ Mail, Files / Obsidian) │
└──────────────────────────────┘
Components
| Component | Role | Where it runs (today) |
|---|---|---|
| Memos | Interface, voice input, webhook source | docker host LXC 104 → memos.nuclide.systems |
| n8n | Workflow / logic engine | docker host LXC 104 → n8n.nuclide.systems |
| SAIA / LiteLLM | Model gateway, embeddings, classification | docker host LXC 104 → ai.nuclide.systems (LiteLLM internal :4000) |
| Qdrant | Vector memory (semantic recall) | docker host LXC 104 — reuse existing qdrant_scientific with nexa_* collection prefix |
| Ontotext GraphDB | Structural memory via SPARQL (Phase 3.4) | not yet deployed; see 09-deployment |
| TEI (HF text-embeddings-inference) | Self-hosted embeddings (bge-m3 / TBD — see 11/Q15) |
docker host LXC 104, CPU only — single-binary embedding server |
| Nextcloud | Tasks, calendar, mail, files | dedicated LXC 105 → nc.nuclide.systems |
| ntfy | Push channel for system alerts | docker host → ntfy.nuclide.systems |
| Backrest | Backup orchestration | LXC 103 |
| Zoraxy | Reverse proxy + TLS | LXC 108 (192.168.1.4:8000) |
| AdGuard DNS | Internal name resolution | LXC 102 |
| Home Assistant | Voice + house automation | VM 100 (HAOS) |
Two-pillar memory
- Qdrant answers "what is similar / relevant?" (cosine search over embeddings).
- Ontotext GraphDB answers "who, what depends on what, how is it structured?" (SPARQL over RDF).
Both pillars are queried in parallel for #nexa:ask and merged before SAIA generates the final answer. See 08 — GraphRAG architecture.
Dual-context routing
Every input is classified work or personal before any side effect (task creation, calendar write). See 04 — Integration matrix and 06 — Classification logic.