Repository navigation
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)