Model or dataset
redis/redis-vl-python avatar
redis/redis-vl-python

RedisVL: A Python Client That Puts Index Schema in Front of Redis Vector Search

Redis Vector Library. The AI-native Python client for Redis.

426 stars101 forksPythonMIT

At a glance

What is it?
RedisVL wraps Redis vector indexes in a declarative schema, a search API with filters, and add-on layers for semantic caching, agent memory, and MCP. It is a good fit if you already run Redis 8 or Redis Cloud; it is the wrong tool if you want a database-agnostic retrieval layer.
Who is it for?
Adopt RedisVL if your retrieval already lives in Redis 8, Redis Cloud, or Redis Enterprise and you want the index definition expressed in Python or YAML rather than assembled from raw FT.CREATE arguments. Do not adopt it as a portable vector abstraction: the schema, field types, and filter syntax are Redis Search concepts, so moving to another engine means rewriting the retrieval layer.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem RedisVL solves is index definition drift, not vector math

Redis already performs vector similarity search. What it does not give you is a durable, reviewable description of the index your application depends on. In raw Redis you issue FT.CREATE with a long argument string, and that string lives wherever you happened to write it: a migration script, a notebook, a shell history. Change the embedding dimension and the index and the application code can silently disagree.

RedisVL moves that definition into a schema object. The README shows an IndexSchema built from a YAML file or a Python dictionary, with an index block (name, key prefix, storage_type) and a fields list where each field declares a type such as tag, text, or vector, plus attributes. A vector field carries algorithm, dims, distance_metric, and datatype. A text field carries sortable, no_index, and unf. That is the whole pitch: the index becomes a file in your repository, and the client reads it.

The audience is Python teams building retrieval-augmented generation, agent memory, or recommendation features on Redis. The repository topics list anthropic, openai, huggingface, embedding, and retrieval-augmented-generation, which tells you which stacks the maintainers expect to sit next to. If you are a data engineer who only queries an existing index somebody else created, the schema layer buys you less.

Schema in, search out: the data flow RedisVL exposes

The flow has three stages. First, you construct an IndexSchema, either with IndexSchema.from_yaml("schemas/schema.yaml") or IndexSchema.from_dict({...}). Second, you create the index from that schema. Third, you load records and query them.

The README truncates at step two ("2. [Create a Searc"), so I cannot describe the exact search class names or method signatures from the supplied material. What is documented in the capability table is the shape of the query surface: similarity search with metadata filters, complex filtering that combines multiple filter types, and hybrid search that combines semantic and full-text signals. The field types in the schema map onto that: tag fields for exact-match filters, numeric and geo fields for range and proximity filters, text fields for the full-text half of hybrid search, vector fields for the similarity half.

That mapping is the design decision worth noticing. RedisVL does not invent a query language. It exposes Redis Search semantics with Python types in front of them, so a tag filter is a tag filter, not an abstract predicate the library translates. The cost is portability, discussed below. The benefit is that what you write in Python corresponds closely to what Redis executes, which makes debugging an empty result set tractable.

Around the core sit optional layers: semantic caching to reduce LLM calls, LLM memory for agent context, semantic routing for query classification, embedding caching, rerankers, and a set of vectorizer integrations the README counts as "8+" embedding providers. Each is a separate concern you can adopt or ignore.

Getting it running: pip, a Redis 8 container, and a YAML schema

Installation is a single command against Python 3.10 or newer:

pip install redisvl

The MCP server is an extra, not part of the base install:

pip install redisvl[mcp]

For a local Redis, the README gives a Docker one-liner and states that it runs Redis 8 or later with built-in vector search:

docker run -d --name redis -p 6379:6379 redis:latest

Connection strings are plain Redis URLs. The README shows the Sentinel form explicitly:

redis_url="redis+sentinel://sentinel1:26379,sentinel2:26379/mymaster"

Other deployment options listed are Redis Cloud (with a free tier), Redis Enterprise, and Azure Managed Redis. That list matters more than it looks: the managed options are where most teams will actually run this, and the Sentinel form is the only high-availability connection string the README spells out.

The schema file is where the real configuration lives. In the YAML example the index block sets name, prefix, and storage_type: json, and each field entry has a name, a type, and optional attrs. The vector field in that example uses algorithm: flat, dims: 4, distance_metric: cosine, datatype: float32. Four dimensions is a toy value for illustration; a real embedding model dictates the number, and it must match what your vectorizer produces. The text field example sets sortable: true, no_index: false, and unf: false, with the README noting that no_index controls whether the field is indexed for search and unf controls case normalization for sorting. Those two flags are the kind of detail that decides whether a sort returns the order you expect.

Where RedisVL is the wrong tool

The library is a client for one engine. Every abstraction in it, from field types to filter composition to the storage_type of json versus hash, is a Redis Search concept. If your requirement is to run the same retrieval code against two vector stores, or to switch engines without touching application code, RedisVL is the wrong layer. You would be adopting Redis semantics with a Python syntax, and the migration cost lands on you later.

The second constraint is the server. The README's Docker instruction targets Redis 8 and later because vector search is built in there. If you are pinned to an older Redis, or to a managed offering whose version you do not control, the index features the schema declares may not exist on the server. The README points at Redis Cloud, Redis Enterprise, and Azure Managed Redis as supported deployments, which is a hint about where the maintainers expect this to run, but it does not enumerate minimum server versions for each. Verify that yourself before designing around it.

Third, the optional layers are not free. Semantic caching and embedding caching introduce a correctness question: a cached answer is only as good as the similarity threshold that decided it was a hit. The README lists the capability but the supplied material does not give the threshold configuration or the failure behaviour when a near-miss is served. Treat that as something to read the docs for, not something to assume.

Finally, the README is a marketing-shaped document. It calls the library "production-ready" and "AI-native" without defining either, and the capability table lists features without version or maturity markers. The release cadence (three releases in the eight days before the snapshot) suggests active development, which cuts both ways: fixes arrive quickly, and so does churn.

How it differs from a general-purpose vector store client

The obvious alternative is a dedicated vector database with its own Python client, for example one of the standalone vector stores that ship an SDK and a hosted service. The difference in approach is not speed or recall. It is where the data lives relative to everything else.

A dedicated vector store is a second system. You run it, you pay for it, you keep it in sync with the source of truth, and you accept that a filtered query has to combine results from two places or be pushed entirely into the vector store's own metadata filtering. RedisVL's premise is that the vectors sit in the same Redis instance as the rest of your application state, so a retrieval query and a cache read and an agent's memory write are the same connection to the same server. The README's capability list is consistent with that: semantic caching, LLM memory, and semantic routing are all things you would otherwise build as separate services.

That premise is also the limitation. If your team has no Redis, adopting RedisVL means adopting Redis, its persistence model, its memory-based pricing, and its operational shape. If you already run Redis for sessions or queues, the marginal cost is close to zero and the argument is strong. If you do not, you are choosing a database, not a library.

Within the Redis ecosystem there is also the plain redis-py client. RedisVL sits on top of it and adds the schema, the search wrapper, and the AI extensions. If your index is small and static and you are comfortable writing FT.CREATE and FT.SEARCH by hand, the schema layer is convenience rather than necessity.

Maintenance, versioning, and the MIT licence

RedisVL is MIT licensed, which permits commercial use, modification, and redistribution provided the copyright notice and permission notice are preserved. That is the standard permissive arrangement and it is the same licence as many Python clients. It does not, by itself, say anything about the Redis server you connect to: Redis Enterprise and Azure Managed Redis are commercial products with their own terms, and the MIT licence on the client does not extend to them. I am not a lawyer and this is not legal advice; check the licence of the server deployment separately from the client.

The upgrade cost is behavioural, not financial. The library is at v0.27.x, which is pre-1.0, and the release history shows three patch and minor releases inside eight days. Pre-1.0 semver means minor versions may change behaviour. The schema format is the surface most exposed to that: a YAML file pinning algorithm, dims, and distance_metric is a contract between your data and the index, and a change in how the client interprets those keys would require reindexing. Pin the version in your requirements file and read the release notes before bumping.

The operational cost is the Redis instance itself. Vector indexes consume memory proportional to the number of vectors times their dimensionality times the datatype size (float32 in the README examples), and the flat algorithm the README uses as its example keeps vectors uncompressed, which is the accurate but memory-heavy choice. If you scale to millions of vectors, the algorithm choice in your schema becomes a capacity decision, and the README's example does not discuss the alternatives. That is a gap worth closing in the docs before you size a cluster.

Who should adopt RedisVL, and what to check first

Adopt it if Redis is already in your stack, you are on Redis 8 or a managed Redis that supports vector search, and you want the index definition to live in version control next to the code that queries it. The schema-as-YAML pattern is the strongest part of the design: it makes the index reviewable in a pull request, and it removes the class of bug where the application and the index disagree about dimensions or field names.

Do not adopt it if you need engine portability, if you cannot control the Redis server version, or if your retrieval volume is small enough that a hand-written FT.SEARCH call is less machinery than a schema file plus a client. Do not adopt it expecting the AI extensions (semantic caching, memory, routing) to be drop-in either; the README lists them as capabilities, and the supplied material does not document their thresholds or failure modes.

Before you commit, verify three things against the live documentation rather than the README. One, the minimum Redis server version your deployment actually runs and whether it supports every field type and algorithm your schema declares. Two, which of the "8+" vectorizer integrations matches your embedding provider and what the resulting vector dimensions are, since that number goes straight into the schema. Three, the exact search class and method names, because the README truncates before showing a complete query example. That last one is the first thing you will hit when you try to run anything.

Editorial conclusion

Adopt RedisVL if your retrieval already lives in Redis 8, Redis Cloud, or Redis Enterprise and you want the index definition expressed in Python or YAML rather than assembled from raw FT.CREATE arguments. Do not adopt it as a portable vector abstraction: the schema, field types, and filter syntax are Redis Search concepts, so moving to another engine means rewriting the retrieval layer. Before committing, verify which Redis deployment you can actually run, since the README's Docker example starts Redis 8 and older servers may not support the index features the schema relies on, and check that your embedding provider appears among the vectorizer integrations the docs list.

Official sources

  1. License: MIT
  2. Project website
  3. README
  4. redis/redis-vl-python on GitHub
  5. Releases
Community notes

Community notes