Skip to main content

What's new in Hindsight 0.10.1

· 7 min read
Nicolò Boschi
Hindsight Team

Hindsight 0.10.1 adds TypeSafe Jev as a reranker and makes a bank something you can move: clone it in one call, export and import it with a defined scope, or rename it in place via admin cli. It also adds server-side time filtering to the memories and documents APIs, lets automatic mental-model refreshes run on their own LLM, and fixes a set of isolation, deadlock and provider bugs. Everyone on 0.10.x should upgrade — see the changelog for the full list of fixes.

Hindsight 0.10.1 highlights: reranking with TypeSafe Jev, moving a bank with clone, export and rename, server-side time filtering, a separate LLM for mental-model refreshes, more work out of the same box, and provider and platform fixes

Reranking with TypeSafe Jev

Set HINDSIGHT_API_RERANKER_PROVIDER=typesafe and recall's reranking runs on TypeSafe's Jev model (jev-latest by default). It isn't a Cohere-style /rerank endpoint: instead of scoring each candidate on its own, the model is asked one question with every candidate as an option, and the answer is the ranking — one request, however many candidates.

That is both more accurate and much faster, because judged together the model only has to say which candidate beats which, rather than pin each one to an absolute scale it re-derives on every call. Measured on LoCoMo, gold = the dataset's own evidence turns, against the current default reranker on the same tasks.

30 candidates per query, 200 questions:

recall@1recall@5NDCG@10s/query
local MiniLM (current default)0.8000.8760.8500.12
typesafe, ranking only (the default)0.9500.9660.9570.027

240 candidates per query — the pool size a production recall actually reranks — 60 questions:

recall@1recall@5NDCG@10s/query
local MiniLM0.5830.7190.6820.41
typesafe, ranking only0.7830.9030.8560.063

The gap widens with the pool: +15 points of recall@1 at 30 candidates, +20 at 240, in a fraction of the wall time because the whole pool goes out as one request. Above the model's 255-option ceiling the pool is ranked in rounds and the winners ranked against each other.

Cutting the irrelevant tail is opt-in. Set HINDSIGHT_API_RERANKER_TYPESAFE_PRUNE_CANDIDATES=true and a second question asks how far down the ranked shortlist relevance actually extends; everything past that point is left out, so recall returns the relevant memories in order and nothing else. There is no threshold to tune — the model picks the depth, and at least one candidate always survives, so no query comes back empty.

On the same 30-candidate run it keeps 1.6 candidates out of 30 and lifts the precision of what survives from 0.051 to 0.850 — 17x — at the cost of cutting 19% of the gold evidence. That trade is why the flag is off by default: on a real bank it took 300 candidates down to 3, which is a very different answer to hand an agent. Try it on your own data first.

Scores from this provider are rank positions, not confidences — a probability out of one pool says "best of these", not "relevant", and two pools aren't comparable. A score of exactly 0.0 means the backend judged that candidate past the cut.

Set the credentials with HINDSIGHT_API_RERANKER_TYPESAFE_API_KEY; ..._MODEL, ..._BASE_URL, ..._TIMEOUT and ..._MAX_CONCURRENT are there if you need them.

Move a bank

A bank used to be somewhere your memories lived, not something you could pick up. Three changes in 0.10.1 make it portable:

  • Clone a bank in a single API call instead of orchestrating an export and an import yourself.
  • Unified export and import with an explicit transfer scope, so an archive says what it carries and an import puts it back the same way. Banks whose memories live in the memories store now export, import and clone correctly, and converted files and attachments survive the trip.
  • Rename a bank in place with hindsight-admin. The bank's stored files move to the new prefix with it, so nothing becomes unreachable after the rename.

One migration ships with this release: attachments are now associated directly with their documents, replacing the separate document_attachments table. It touches only attachment bookkeeping, so it's quick on any size of deployment.

Filter by time on the server

Listing memories or documents and then narrowing by date meant pulling pages you were going to throw away. Both APIs now take time filters and sort options directly, and the control plane's document list exposes them as presets (last 24 hours, last week, and so on) plus a custom range. Knowledge pages get an advanced search dialog on top of the same idea, and knowledge-page search scores are now normalized to a consistent 0–1 range, so a score means the same thing between queries.

A separate LLM for mental-model refreshes

Automatic mental-model refreshes ran on whatever LLM the bank used for everything else. They're background work with different economics from a user-facing retain, so 0.10.1 lets you configure a provider and model for refreshes on their own — a cheaper model for the background pass, your usual one for the path a user is waiting on.

Two related controls landed alongside it: the reflection search-observation budget and which entities it considers are now configurable, and the default trigger for newly created knowledge pages can be set rather than being fixed.

More work out of the same box

  • Retain on chunked documents stops rebuilding the prompt and schema for every chunk of the same document.
  • Bank lists are no longer slow on deployments holding many memory units.
  • Archive creation doesn't block the event loop or hold a read transaction open for its whole duration, so exporting a large bank stops making everything else wait.
  • Recall reuses observation source memory IDs through the pipeline instead of re-deriving them.
  • Startup fails fast with a clear error when the configured API port is already in use, instead of failing obscurely later.

Providers and platforms

  • Anthropic responses are no longer truncated for callers that don't set an output cap.
  • Rate-limit recovery works when a provider supplies retry timing as a number.
  • Apple Silicon: MLX installs only on supported machines, the unreliable MPS acceleration path is off for local models, and the MLX reranker releases memory after each batch.
  • Windows: local embeddings start correctly under uv-managed virtual environments.
  • Non-English content keeps its original writing script when retained, and entity clustering is more accurate within a batch.
  • The control-plane UI is reachable when the server is bound to a loopback address, and recall/reflect options there are simpler and documented inline.

0.10.1 carries a long list of further fixes across retain, recall, storage and the supported providers. See the changelog for the full list.