Deploy Redis Intent Router
Install Redis Intent Router, then create a Router, mint an agent key, and make one authenticated match.
For a supported install, see Install with the Redis Iris suite chart. The standalone steps on this page show what each value does.
Follow these steps to install the Intent Router control plane and data plane with the redis-intent-router Helm chart, connect them to your Identity Service release, and end with one authenticated match request.
You use three credentials along the way: the control-plane admin token, the Identity Service control token, and an agent key. For what each credential unlocks, see Credentials.
Before you begin, review the prerequisites.
1. Create the namespace
kubectl create namespace <namespace-name>
2. Create Secrets
Configure the Identity Service release first
For every Identity Service setting, and for running one release that serves several products, see the Identity Service guide.
The chart deploys no Identity Service. Set these values on your Identity Service release so that it checks Router grants and accepts the data plane's runtime credential. The examples assume this chart is installed as release intent in the same namespace as an Identity Service release named ids.
| Identity Service value | Setting |
|---|---|
runtime.serviceCredentials[] |
An entry with name: intent-dp, subject: intent-dp, allowedOperations: [api-key-introspect], allowedProducts: [intent], and the same existingSecret and secretKey as identityService.credential. |
productValidation.products.intent.enabled |
true |
productValidation.products.intent.baseURL |
The control-plane Service, http://intent-redis-intent-router-controlplane:9400. |
productValidation.products.intent.credential |
The same Secret and key as controlplane.internalToken. |
runtime.apiKeyTenant.singleTenantID |
The same value as tenantId. |
Neither chart checks these values against the other. If the Identity Service release also serves other Iris products, add these entries to its existing lists. All products use the one tenant.
Create the connection files
Save the two Redis connections as intent-controlplane-storage.yaml and intent-dataplane-storage.yaml, as shown in Storage Secret. The file names become the Secret's keys.
Create the Secrets
Generate three distinct tokens, then create the Secrets:
umask 077
for token in admin-token internal-token dp-credential; do
openssl rand -base64 32 > "$token"
done
kubectl -n <namespace-name> create secret generic intent-storage \
--from-file=intent-controlplane-storage.yaml \
--from-file=intent-dataplane-storage.yaml
kubectl -n <namespace-name> create secret generic intent-license --from-file=license=./license
kubectl -n <namespace-name> create secret generic intent-controlplane-admin --from-file=token=./admin-token
kubectl -n <namespace-name> create secret generic intent-controlplane-internal --from-file=token=./internal-token
kubectl -n <namespace-name> create secret generic intent-dp-credential --from-file=token=./dp-credential
The Identity Service release mounts intent-controlplane-internal and intent-dp-credential too, so create them in its namespace as well if it runs in another one.
To let the chart generate the admin or internal token instead, skip its Secret and delete its existingSecret line from the values file. The chart keeps a generated token across upgrades and never rotates it. The chart never generates intent-dp-credential.
For an embedding provider other than noop, also create the inference Secret, as shown in Embedding models.
3. Create intent-values.yaml
Write the values file from Helm values, with your tenant, image tags, and Secret names.
Before you install: check your values
Check each value before you install. If one is wrong, you see the symptom in its row.
| Check | Symptom | Fix |
|---|---|---|
tenantId is set |
Rendering fails with a named message | Set the tenant. |
Each image has a tag |
Rendering fails, or pods ImagePullBackOff |
Set controlplane.image.tag and dataplane.image.tag. |
| The admin token, internal token, and Identity Service credential come from three different Secrets or keys | Rendering fails | Create three distinct token files. |
dataplane.identityServiceBaseURL is https://, or identityService.allowInsecureTransport is true |
Rendering fails | Choose one. |
tenantId equals the Identity Service's runtime.apiKeyTenant.singleTenantID |
Minting an agent key for a Router fails | Set both to the same tenant. |
inference.models lists one model, and noop only with inference.allowLocalModels=true |
Rendering fails | List the one model the deployment offers. |
The inference Secret has an embedders_connection_details entry named after the model's provider |
A new Router stays PROVISIONING or fails |
Add the entry under that provider name. |
| The data-plane Redis has Search | A new Router is FAILED and failureReason mentions vector search |
Use a Redis 8 build that includes Search, or load the Search and Query engine. |
4. Install
helm repo add redis-ai https://helm.redis.io/ai
helm repo update redis-ai
helm install intent redis-ai/redis-intent-router \
--version 1.0.0 \
--namespace <namespace-name> \
-f intent-values.yaml \
--wait --timeout 5m
To add helm test pods that probe each service and run the shared security-profile checks, set tests.enabled to true in your values.
5. Verify pods and health
kubectl -n <namespace-name> rollout status deployment/intent-redis-intent-router-controlplane
kubectl -n <namespace-name> rollout status deployment/intent-redis-intent-router-dataplane
Run each port-forward in its own terminal and leave it running:
kubectl -n <namespace-name> port-forward svc/intent-redis-intent-router-controlplane 9400:9400
kubectl -n <namespace-name> port-forward svc/intent-redis-intent-router-dataplane 9401:9401
kubectl -n <namespace-name> port-forward svc/ids-iris-identity-service 9200:9200
Then check readiness on every service:
curl -sS http://localhost:9400/health/readiness
curl -sS http://localhost:9401/health/readiness
curl -sS http://localhost:9200/health/readiness
6. Create a Router
Load the admin token, then create a Router. See Manage Routers for every option.
export IRIS_INTENT_ROUTER_SERVICE_URL='http://localhost:9400'
export IRIS_INTENT_ROUTER_SERVICE_TOKEN="$(kubectl -n <namespace-name> get secret \
intent-controlplane-admin -o jsonpath='{.data.token}' | base64 --decode)"
If the chart generated the admin token, read it from intent-redis-intent-router-controlplane-admin-token instead.
The API examples create the Router and wait until its state is READY.
7. Mint an agent key
Mint a key with a grant on the Router through the Identity Service. See Mint an agent key.
8. Make one authenticated call
Match a query with the key against the data plane:
curl -sS -X POST "$IRIS_INTENT_ROUTER_URL/iris/data/v1/intent/routers/$IRIS_INTENT_ROUTER_ID/match" \
-H "Authorization: Bearer $IRIS_INTENT_ROUTER_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"query": "hello"}'
A Router with no intents returns 200 and {"items": []}. A 401 means the key is wrong, and a 403 means it lacks a grant on the Router. A 409 means the Router isn't READY yet.
Install with the Redis Iris suite chart
The redis-iris Helm chart installs Intent Router with the Identity Service and the UI in one release. global.iris.products.intent.enabled turns Intent Router on, and is true by default. The other products are on by default too, so set global.iris.products.<product>.enabled: false for each one you don't install. Put this chart's values under the intent: key.
The suite derives these values from global.iris. Don't set them under intent:: a value that differs fails the render and names the field.
tenantIdandlicense.*, fromglobal.iris.tenantIdandglobal.iris.license.dataplane.identityServiceBaseURLandidentityService.allowInsecureTransport, which point at the suite's Identity Service.identityService.credentialandcontrolplane.internalToken, which the suite generates or reads fromglobal.iris.secrets. The suite registers them and the tenant on its Identity Service, so skip Configure the Identity Service release first.auth.oidc.audience,dataplane.oidc, andcontrolplane.oidc.enabled, fromglobal.iris.auth.
The suite also fixes fullnameOverride, the Service ports, dataplane.strategy, and podDisruptionBudget.enabled, and runs two data-plane replicas by default. Its Services are redis-intent-router-controlplane, redis-intent-router-dataplane, and iris-identity-service. By default it generates the admin token in the Secret iris-intent-admin-token. The suite chart doesn't support the FIPS profile.
You still set the storage Secret and the embedding model:
intent:
storage:
existingSecret: intent-storage
inference:
existingSecret: intent-inference
models:
- provider: openai
model: text-embedding-3-small
dimensions: 1536
helm install iris redis-ai/redis-iris \
--version 1.0.0 \
--namespace <namespace-name> \
-f iris-values.yaml
The rest of this guide applies to the values under intent:.