Skip to main content

What's new in Hindsight 0.9.1

· 5 min read
Nicolò Boschi
Hindsight Team

Hindsight 0.9.1 builds on 0.9.0 by hardening what shipped there and widening what you can plug into it: faster recall, a new xAI OAuth provider, transfers that carry Knowledge Pages, a sharper reflect, and a large round of reliability and correctness fixes. Self-managed deployments should upgrade — several of the fixes protect data integrity and stop background work from stalling.

Hindsight 0.9.1 highlights: faster recall (~9x faster temporal extraction), more model control, portable transfers, a sharper reflect, and operate with confidence
  • More Model Control: An xAI OAuth provider, forced-tool structured output for LiteLLM, restored prompt caching on load-balanced backends, and broader provider compatibility.
  • Portable Transfers: Async document export, bank transfers that carry Knowledge Pages, and every bank config field made export+importable.
  • A Sharper Reflect: Current-time temporal reasoning, entity-name resolution on sub-recalls, and synthesis that never drops evidence.
  • Faster Recall: Recall's read path got substantially quicker with no change to what it returns.
  • Operate with Confidence: A database-free liveness probe, strict per-bank scoping, and a large reliability and performance pass.

More Model Control

  • An xAI OAuth provider. Set HINDSIGHT_API_LLM_PROVIDER=xai-oauth to run Hindsight's LLM lanes on a SuperGrok subscription, authenticating with OAuth instead of a raw API key.
  • Forced-tool structured output for LiteLLM. Some LiteLLM-routed backends (for example Bedrock in certain regions) reject the response_format route to structured output. Set HINDSIGHT_API_LLM_STRUCTURED_OUTPUT_FORCED_TOOL=true to opt those backends into a forced tool call instead, so structured extraction works where response-format schemas don't.
  • Prompt caching restored on load-balanced backends. Server-side prompt caching now works again on load-balanced OpenAI-compatible backends, cutting latency and cost on repeated prefixes.
  • Configurable Ollama thinking. Native think behavior on Ollama is now controlled through extra_body, so you can turn reasoning on or off per your model and setup.
  • Broader provider compatibility. Reasoning effort is now sent explicitly whenever you configure it, so a model doesn't silently fall back to its own default. extra_body passthrough is fixed for Llama.cpp / OpenAI-compatible and Codex backends, so provider-specific options actually reach the model. And inline <think> text you send as content is preserved verbatim instead of being stripped as if it were the model's own reasoning.

Portable Transfers

Moving a bank between instances got more complete this release.

  • Async document export. A large document export no longer runs as a single blocking request that can tie up the API — it runs as an asynchronous operation you start and then download when it's ready.
  • Transfers carry Knowledge Pages. A whole-bank transfer now includes the Knowledge Pages tree and regenerates mental-model search state on import, so a bank arrives with its wiki intact and immediately searchable — not just its raw memory.
  • Every bank config field travels. Bank template export/import now round-trips every configuration field, so a restored bank is configured exactly like the original.
  • Per-bank store capabilities. The storage capabilities behind a bank can now be set per bank, so different banks can enable different storage features under the same engine.

A Sharper Reflect

  • It knows what time it is. Reflect now receives the current date and time, so "last week" and "recently" resolve against the actual clock instead of being left ambiguous.
  • Entity names on sub-recalls. Reflect's internal sub-recalls now resolve entity names, so reasoning references real, canonical names rather than opaque identifiers.
  • Synthesis never drops evidence. When reflect is forced into synthesis, it no longer discards retrieved evidence — it splits the work so every retrieved fact still reaches the answer.

Faster Recall

Recall is the hot path — an agent hits it on every turn — so its latency is felt everywhere. 0.9.1 makes it substantially faster without changing what it returns:

  • Temporal extraction is ~9x faster. Working out the time window a query implies ("last week", "in 2023") used to be a meaningful slice of every recall; it's now a small one.
  • Set-wise scoring. Observation expansion is scored over the whole candidate set at once instead of row by row, cutting redundant work on larger recalls.
  • No redundant entity lookups. When a result already carries its entity IDs, recall reuses them instead of re-fetching — fewer round-trips per query.

Operate with Confidence

  • A database-free liveness probe. A slow database no longer trips the liveness check and restarts otherwise-healthy pods. Liveness answers on its own, so a database incident stays a database incident instead of turning into a restart storm.
  • Strict per-bank scoping. Document update and delete operations are now scoped by bank, closing a path where an operation could touch another bank's memory units.

0.9.1 also carries a large round of reliability and performance fixes: concurrent appends to one document no longer lose turns, retain no longer holds a database connection across a separate-store write, several deadlocks in retain and bank deletion are gone, and extreme relative date offsets no longer crash recall. Graph maintenance is faster and steadier — stale-cooccurrence pruning and chunk-delete link matching both dropped from tens of seconds to milliseconds, and the entity prune is now queue-driven instead of sweeping whole banks. Bank config values are type-validated so a bad value can't wedge background tasks, and consolidation, recall, and Knowledge Pages each pick up their own correctness fixes. See the changelog for the full list.