Skip to content

v0.29.0

Latest

Choose a tag to compare

@applied-ai-release-bot applied-ai-release-bot released this 30 Oct 11:09

Release Notes

fix(router): apply per-route thresholds before max_k truncation (#766)

Fixed SemanticRouter.route() and route_many() sometimes missing a route that met its distance_threshold. Each route's threshold is now applied before results are truncated to max_k, so a closer route that fails its own threshold no longer displaces a farther one that passes. Previously route() could return an empty RouteMatch and route_many() could return fewer matches than expected.

fix(message-history): fall back within the requested session in get_relevant() (#765)

SemanticMessageHistory.get_relevant() and SemanticSessionManager.get_relevant() called with both session_tag and fall_back=True now fall back to the recent messages of that session. Previously they returned the recent messages of the instance's default session.

perf(embeddings-cache): refresh and set TTLs in the same round trip as each lookup and write (#764)

EmbeddingsCache lookups and writes with a TTL configured, including those a vectorizer makes through cache=, now refresh or set the expiry in the same round trip, so cached embedding calls are faster. With a TTL configured, a credential that cannot run EXPIRE on the cache's keys now fails on a cache miss as well as on a hit.

fix(index,router): keep SemanticRouter in step with the keyspace when a cluster UNLINK fails (#748)

On Redis Cluster, SemanticRouter.remove_route and delete_route_references now raise PartialDeletionError when some reference keys cannot be deleted, instead of returning normally. Deleting a route's last reference now removes the route, so code that reads to_dict()["routes"] by position should look routes up by name.

fix(router): make Route.distance_threshold inclusive (#763)

SemanticRouter now treats Route.distance_threshold as inclusive, consistent with VectorRangeQuery and SemanticCache: a reference whose distance exactly equals a route's threshold now matches that route instead of being dropped.

perf: refresh SemanticCache hit TTLs in one pipelined round trip (FDE-84) (#753)

SemanticCache.check() and acheck() refresh the TTLs of all hits in one round trip, so lookups that return several hits from a cache with a TTL are faster.


🚀 Enhancement

  • feat(index): debug-log query type, latency and result count in query() #750 (@jackiectl2)

🐛 Bug Fix

  • fix(migration): support RESP3 key enumeration #730 (@Kuang-xianxin)
  • fix(router): apply per-route thresholds before max_k truncation #766 (@vishal-bala)
  • fix(message-history): fall back within the requested session in get_relevant() #765 (@vishal-bala)
  • chore(deps): bump the uv group across 1 directory with 2 updates #751 (@dependabot[bot])
  • fix(index,router): keep SemanticRouter in step with the keyspace when a cluster UNLINK fails #748 (@vishal-bala)
  • fix: keep vector fields in from_existing on RESP2 unified FT.INFO replies #742 (@desty)
  • fix(router): make Route.distance_threshold inclusive #763 (@vishal-bala)
  • fix(message-history): return the whole session from the messages property #752 (@ericdelorefice)
  • fix(mcp): apply the Host/Origin guard to every HTTP transport #746 (@vishal-bala)

🏎 Performance

  • perf(embeddings-cache): refresh and set TTLs in the same round trip as each lookup and write #764 (@vishal-bala)
  • perf: refresh SemanticCache hit TTLs in one pipelined round trip (FDE-84) #753 (@vishal-bala)

📝 Documentation

  • docs(agents): replace the Review record with a Reviewer Brief #778 (@vishal-bala)
  • docs(agents): agent-neutral pre-PR review skill and Review record #767 (@vishal-bala)

Authors: 5