dataset_id), and datasets never share nodes: the same entity remembered into two datasets is two separate rows, and query only sees the graph of the dataset it targets. Its embeddings are isolated the same way, in vector datasets of its own, one per purpose (see Vectors).
- Every dataset is owned by a
user_id, and that ownership covers all its artifacts, entities and edges. All endpoints requireuser_id(see Identity) (a non-empty string of at most 128 bytes): in the JSON body forPOST, in the query string forGETandDELETE. A missing or invalid one returns400. A user only sees and changes their own datasets; names are unique per user, so two users can each have a dataset calledwork. rememberandquerytake an optionaldataset(name). If omitted, the default datasetmainis used. There is no dataset until it is created:mainis created for a user by their firstremember.remembercreates the dataset on demand if it does not exist.queryon a dataset that does not exist (or was deleted) returns404.- Names are 1-64 characters of letters, digits,
.,_,-, starting with a letter or digit. Invalid names return400. - A dataset has
id,user_id,name,description,tags(list of strings),created_at,deletedanddeleted_at.
Vectors
The vector store isolates vectors by dataset too (a chromem collection, a Pinecone namespace; see Vector storage): a gligabao dataset keeps its vectors in one vector dataset per purpose, an index, nameddataset-<id>-<index> after the dataset’s numeric id (memory_core.VectorDataset):
They are keyed by the id, not the name, so:
- datasets never share vectors, including two users’ datasets with the same name;
- a name reused after a delete is a new dataset with a new id, and so new, empty vector datasets;
- no setup is needed on create: a vector dataset appears with the first vector stored in it, and a dataset without vectors has none.
remember writes both indexes, see Vector storage for what is embedded and how a failure is handled. query does not read vectors yet.
Soft delete
Deleting setsdeleted = true (and deleted_at); no relational rows are removed. A deleted dataset is invisible to list, remember and query. Its name can be reused: creating (or remembering into) that name makes a new dataset with a new id and an empty graph. The old rows stay in the database under the old id.
The vectors are the exception: they are removed with the dataset (DeleteAll on each of its dataset-<id>-<index> vector datasets), since a deleted dataset can never be read again and its vectors could only take up memory or storage. If that cleanup fails, the delete still succeeds (the vector datasets are unreachable) and the error is logged.
Endpoints
POST /v1/gb/datasets: {"user_id": "u1", "name": "work", "tags": ["project"], "description": "optional"} returns 201 with the dataset. 409 if a live dataset with that name exists, 400 for a bad name.
GET /v1/gb/datasets?user_id=u1: lists that user’s datasets: {"datasets": [{"id": 1, "user_id": "u1", "name": "main", "tags": [], "created_at": "...", "deleted": false}, ...]}, oldest first. ?include_deleted=true also lists soft-deleted ones.
DELETE /v1/gb/datasets/{name}?user_id=u1: soft-deletes the dataset and removes its vectors. 204, or 404 if the user has no live dataset with that name.
GET /v1/gb/datasets/{name}/graph?user_id=u1: exports the dataset’s whole graph as JSON; see Graph export.