updated memory service documentation
This commit is contained in:
@@ -9,7 +9,8 @@
|
|||||||
|
|
||||||
Responsible for all reading and writing of long-term memory. Acts as the
|
Responsible for all reading and writing of long-term memory. Acts as the
|
||||||
sole interface to both SQLite and Qdrant — no other service accesses these
|
sole interface to both SQLite and Qdrant — no other service accesses these
|
||||||
stores directly.
|
stores directly. On episode creation, automatically calls the embedding
|
||||||
|
service to generate and store a vector in Qdrant.
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
|
|
||||||
@@ -26,6 +27,7 @@ stores directly.
|
|||||||
| PORT | No | 3002 | Port to listen on |
|
| PORT | No | 3002 | Port to listen on |
|
||||||
| SQLITE_PATH | Yes | — | Path to SQLite database file |
|
| SQLITE_PATH | Yes | — | Path to SQLite database file |
|
||||||
| QDRANT_URL | No | http://localhost:6333 | Qdrant instance URL |
|
| QDRANT_URL | No | http://localhost:6333 | Qdrant instance URL |
|
||||||
|
| EMBEDDING_SERVICE_URL | No | http://localhost:3003 | Embedding service URL |
|
||||||
|
|
||||||
## Internal Structure
|
## Internal Structure
|
||||||
|
|
||||||
@@ -35,7 +37,7 @@ src/
|
|||||||
│ ├── index.js # SQLite connection + initialization
|
│ ├── index.js # SQLite connection + initialization
|
||||||
│ └── schema.js # Table definitions, indexes, FTS5, triggers
|
│ └── schema.js # Table definitions, indexes, FTS5, triggers
|
||||||
├── episodic/
|
├── episodic/
|
||||||
│ └── index.js # Session + episode CRUD and FTS search
|
│ └── index.js # Session + episode CRUD, FTS search, embedding write path
|
||||||
├── semantic/
|
├── semantic/
|
||||||
│ └── index.js # Qdrant collection management, upsert, search, delete
|
│ └── index.js # Qdrant collection management, upsert, search, delete
|
||||||
├── entities/
|
├── entities/
|
||||||
@@ -93,6 +95,25 @@ Each collection exposes three operations via helper functions in `src/semantic/i
|
|||||||
The `wait: true` flag is used on all write operations so the caller receives confirmation
|
The `wait: true` flag is used on all write operations so the caller receives confirmation
|
||||||
only after Qdrant has committed the change.
|
only after Qdrant has committed the change.
|
||||||
|
|
||||||
|
## Embedding Write Path
|
||||||
|
|
||||||
|
When a new episode is created, the memory service automatically generates and stores
|
||||||
|
a vector embedding in Qdrant via the embedding service:
|
||||||
|
|
||||||
|
1. Episode is saved to SQLite synchronously — the response is returned immediately
|
||||||
|
2. Both sides of the exchange are combined into a single text:
|
||||||
|
```
|
||||||
|
User: {userMessage}
|
||||||
|
Assistant: {aiResponse}
|
||||||
|
```
|
||||||
|
3. This text is sent to the embedding service (`POST /embed`)
|
||||||
|
4. The returned vector is upserted into the `episodes` Qdrant collection with a
|
||||||
|
payload of `{ sessionId, createdAt }` for filtering and lookups
|
||||||
|
|
||||||
|
The embedding step is **fire-and-forget** — it runs asynchronously after the SQLite
|
||||||
|
insert succeeds. If embedding fails, the episode is still saved and searchable via
|
||||||
|
FTS. The error is logged but does not affect the API response.
|
||||||
|
|
||||||
### Hybrid Retrieval Pattern
|
### Hybrid Retrieval Pattern
|
||||||
|
|
||||||
Qdrant and SQLite work as a pair — neither operates in isolation:
|
Qdrant and SQLite work as a pair — neither operates in isolation:
|
||||||
@@ -139,7 +160,7 @@ Entities and relationships are stored in SQLite with two key constraints:
|
|||||||
|
|
||||||
| Method | Path | Description |
|
| Method | Path | Description |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| POST | /episodes | Create a new episode |
|
| POST | /episodes | Create episode + auto-embed into Qdrant |
|
||||||
| GET | /episodes/search?q=&limit= | Full-text search across episodes |
|
| GET | /episodes/search?q=&limit= | Full-text search across episodes |
|
||||||
| GET | /episodes/:id | Get episode by ID |
|
| GET | /episodes/:id | Get episode by ID |
|
||||||
| GET | /sessions/:id/episodes?limit=&offset= | Get paginated episodes for a session |
|
| GET | /sessions/:id/episodes?limit=&offset= | Get paginated episodes for a session |
|
||||||
|
|||||||
Reference in New Issue
Block a user