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.
65 lines
4.0 KiB
Markdown
65 lines
4.0 KiB
Markdown
# 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](./09-deployment.md#phase-add-on-graph-db-phase-34) |
|
|
| **TEI** (HF text-embeddings-inference) | Self-hosted embeddings (`bge-m3` / TBD — see [11/Q15](./11-open-questions.md)) | 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](./08-graphrag-architecture.md).
|
|
|
|
## Dual-context routing
|
|
|
|
Every input is classified `work` or `personal` before any side effect (task creation, calendar write). See [04 — Integration matrix](./04-integration-matrix.md) and [06 — Classification logic](./06-classification-logic.md).
|