Skip to main content

Quick start

session=memory ansi=false no-result
session=memory ansi=false
Append observations:
session=memory ansi=false

Filters

Queries are lazy - chaining filters builds a pipeline without fetching:
session=memory ansi=false
Available filters: .after(t), .before(t), .at(t), .near(pose, radius), .tags(**kv), .filter(predicate), .search(embedding, k), .order_by(field), .limit(k), .offset(n).

Terminals

Terminals materialize or consume the stream:
session=memory ansi=false
Available terminals: .to_list(), .first(), .last(), .count(), .exists(), .summary(), .get_time_range(), .drain(), .drain_thread(). .save(target) is a lazy pass-through - pair it with a terminal (e.g. .drain() or .drain_thread()).

Transforms

.map(fn) transforms each observation, returning a new stream:
session=memory ansi=false

Live queries

Live queries backfill existing matches, then emit new ones as they arrive:
session=memory ansi=false

Spatial + live

Filters compose freely. Here .near() + .live() + .map() watches for logs near a physical location - backfilling past matches and tailing new ones:
session=memory ansi=false

Embeddings

Use EmbedText transformer with CLIP to enrich observations with embeddings, then search by similarity: .search(embedding, k) returns the top-k most similar observations by cosine similarity:
session=memory ansi=false
The embedded stream above was ephemeral - built on the fly for one query. To persist embeddings automatically as logs arrive, pipe a live stream through the transform into a stored stream:
skip