v0.25.1
๐ Bug Fix
- fix: check index existence with FT.INFO instead of listing every index #672 @vishal-bala
- fix: de-duplicate cursor keys in update_by_filter #671 @vishal-bala
- fix: bound Timestamp date comparisons to the whole UTC day #670 @vishal-bala
- fix(mcp): escape text filter values and reject an empty projection #667 @vishal-bala
- fix: anchor Timestamp date filters to the UTC day #666 @vishal-bala
- fix: negate the day range in Timestamp != date filters #655 @TheSaiEaranti
- fix: tolerate matched docs with missing field payload (Redis 8.8 expiry race) #653 @vishal-bala
๐ Documentation
- docs: add exception reference and error handling guide #654 @TheSaiEaranti
- chore(ci): stop notebook tests wasting 33 minutes on a blocking cell #665 @vishal-bala
๐ฉ Dependency Updates
- chore(mcp): upper-bound the MCP dependency pins #669 @vishal-bala
- chore(deps): bump the uv group across 1 directory with 14 updates #664 (@dependabot[bot] @vishal-bala
Notes
Timestamp date filters now return different rows (affected versions 0.5.1โ0.25.0). With a bare date or date-only string, != matched the day it was asked to exclude, > behaved like >=, and <= behaved like <. Day boundaries also followed the host timezone rather than UTC, so the same filter resolved differently by machine. All of it failed silently. If you compensated for the old behavior, remove the workaround; if you assert on generated query strings, expect them to change. datetime, full ISO string, and Unix timestamp filters were never affected.
exists() now raises RedisSearchError instead of leaking raw redis-py exceptions. create() already wrapped every other Redis failure this way; the existence check was the one path that escaped. Code catching redis.exceptions.ResponseError around create() โ or around a SemanticCache, MessageHistory, SemanticMessageHistory, or SemanticRouter constructor, all of which call create() โ should catch RedisSearchError and read __cause__ for the original. This includes NoPermissionError handlers, since that subclasses ResponseError.
v0.25.0
๐ Enhancement
Notes
Memory leak fixed (affected versions 0.4.0โ0.24.0). SearchIndex/AsyncSearchIndex instances were never garbage-collected due to a self-referencing cleanup callback, causing unbounded memory growth in services that create indexes per request or operation. This release fixes the underlying issue; on older versions, reusing a single long-lived index instance or supplying a caller-owned Redis client (redis_client=...) avoids the leak โ disconnect() does not.
v0.24.0
๐ Enhancement
- feat: enable client-side bulk update/delete operations with
SearchIndex(RAAE-1326) #651 @vishal-bala - feat: GoogleGenAIVectorizer โ migrate Google embeddings to the supported google-genai SDK #652 @vishal-bala
๐ Bug Fix
- fix: honor distance_threshold=0 in semantic cache and message history #650 @nickleodoen
๐ Documentation
- docs: fix 404 vector range query link in docstring #647 @vishal-bala
v0.23.0
๐ Enhancement
- feat(mcp): multi-index MCP server support (RAAE-1603) #646 (@vishal-bala)
- Drop nltk #645 (@rbs333)
๐ Bug Fix
- feat(mcp): validate Host/Origin headers on MCP HTTP transports #643 (@vishal-bala)
- fix(router): remove persisted route_config key on SemanticRouter.delete() #635 (@vishal-bala)
๐งช Tests
- tests: eliminate NLTK stopwords download race under pytest-xdist #644 (@vishal-bala)
- test: harden Redis-backed test isolation under pytest-xdist (#546) #636 (@vishal-bala)
CI/CD Changes
- ci: pin RediSearch WORKERS to 0 to fix flaky redis:latest tests #641 (@vishal-bala)
- Use PyPI Trusted Publishing for publishing releases #640 (@limjoobin)
Additional Notes
- MCP Host/Origin validation now defaults ON (#643, security). sse/streamable-http servers reject requests with a non-allowlisted Host or cross-site Origin. Loopback is unaffected; reverse-proxy / non-loopback deployments must set transport_security.allowed_hosts (and allowed_origins for browsers). stdio is never affected.
- nltk removed (#645). The redisvl[nltk] extra no longer exists; stopwords (33 languages) now ship in-package. stopwords="english" is unchanged aside from no longer downloading at runtime. Remove [nltk] from your install extras.
- Multi-index MCP is backward compatible (#646). Existing single-index configs and callers are unchanged; multi-index is additive.
Authors: 3
v0.22.0
๐ Enhancement
- test: Add regression coverage for RedisVL CLI foundation contracts #596 (@limjoobin @hillarytoh)
๐ Bug Fix
- Feat/raae 1322/hybrid support #639 (@rbs333)
- fix(docs): broken link to Redis Software page #638 (@andy-stark-redis)
- fix(index): use UNLINK instead of DEL in SearchIndex.drop_keys #616 (@Joshuaakaspace)
Authors: 5
- @andy-stark-redis
- @limjoobin
- ht (@hillarytoh)
- Joshua (@Joshuaakaspace)
- Robert Shelton (@rbs333)
v0.20.1
v0.20.0
v0.19.0
v0.18.2
v0.18.1
๐ Bug Fix
- docs(cli): Clean up CLI command structure and improve documentation #594 (@limjoobin @vishal-bala)
- Add JSON output for RedisVL CLI read commands #593 (@limjoobin)
- fix(MCP): Avoid required search config fields that aren't relevant to the configured search type #591 (@vishal-bala)
- Fix/cli: standardize exit codes, messages and streams #592 (@hillarytoh)
- feat(MCP): Give agents a hint about available fields for filtering and return #590 (@vishal-bala)
๐ Documentation
- docs(user-guide): clean notebook outputs (#588, #589) #597 (@hillarytoh)
Additional Notes
rvl index and rvl stats now require shared flags such as --url, --host, and --json to appear after the subcommand (for example, rvl index listall --url ...) rather than supporting them being placed before it.