Skip to content

MOD-17747: Add self-managed LangCache documentation - #3925

Open
tptodorov wants to merge 4 commits into
mainfrom
MOD-17747-langcache-onprem-docs
Open

MOD-17747: Add self-managed LangCache documentation#3925
tptodorov wants to merge 4 commits into
mainfrom
MOD-17747-langcache-onprem-docs

Conversation

@tptodorov

@tptodorov tptodorov commented Sep 4, 2026

Copy link
Copy Markdown

Summary

Documents LangCache on-prem (self-managed) deployment and usage, per MOD-17747, based on the self-managed Redis Agent Memory (RAM) docs and verified against the LangCache Helm chart and source in the iris monorepo (read-only reference, not part of this repo).

Adds content/operate/iris/langcache/self-managed/:

  • _index.md, prerequisites.md, deploy.md, configuration.md
  • authentication.md
  • control-plane-api-reference.md + a generated openapi-control-plane.json (built from the LangCache Control Plane's own Smithy API via the repo's own Smithy build, not hand-written)
  • operations.md, reference.md, api-examples.md

Also adds one link from the existing LangCache Cloud index page to the new self-managed section, mirroring the "Deployment options" pattern already used on Agent Memory's index page.

Structural decision: where the docs live

The ticket's recommended default was content/operate/iris/langcache/self-managed/*, mirroring Agent Memory's current (post-move) location. While investigating, I found the LangCache Cloud page had already been moved to content/operate/iris/langcache/_index.md (the old rc/context-engine/langcache path is now just a redirect stub) — so I used that clearer, already-established precedent: the new docs sit at content/operate/iris/langcache/self-managed/*, a sibling of the migrated Cloud page, exactly mirroring content/operate/iris/agent-memory/self-managed/*.

What this product actually looks like today (this took two passes to get right)

The self-managed LangCache product moved fast underneath this PR. My first pass (based on the state of the iris reference repo when I started) documented a Data-Plane-only Helm chart with a hand-rolled Control Plane Kubernetes manifest, a legacy per-cache token auth mode, and no public image/chart registry — all accurate at the time, but superseded within the same work window by two upstream changes: MOD-17459 ("Evolve langcache/helm into the canonical LangCache on-prem chart") and MOD-17460 (removing the on-prem Data Plane's own database registry).

The docs now reflect the current shape, verified against langcache/helm/{values.yaml,README.md,Chart.yaml}, the on-prem config structs in controlplane-onprem/dataplane, and the real example configs in development/langcache/onprem/*.config.yaml:

  • One helm install deploys everything. The chart always installs the Data Plane, Control Plane, and either a bundled or an external Identity Service — there's no lighter-weight "Data Plane only" mode anymore, and no manual Kubernetes manifest needed for the Control Plane (the chart templates it now).
  • Config is a clean two-layer model: non-secret structure in Helm values, sensitive material (Redis URLs, the Cache Redis database registry, the embedding credential) in per-component overlay Secrets that the chart deep-merges over the rendered base config at container startup. This replaces my first pass's manual subPath-mount workarounds entirely.
  • Agent-key auth via the Identity Service (bundled or external) is the only Data Plane auth mode. Static caches and the legacy per-cache token are gone from this product's self-managed shape, per the explicit instruction that prompted this rewrite — dropped that material entirely rather than leaving it as a stale "also supported" path.
  • There's now a public release channel: redislabs/iris-langcache-data, redislabs/iris-langcache-control, and redislabs/iris-identity-service publish to Docker Hub, and the chart syncs to the Redis Enterprise Helm chart repo (ai/charts/langcache) the same way RAM's chart does. This closes the "no public registry" gap flagged in my first pass.
  • The chart also newly ships FIPS-oriented posture, support-bundle, and preflight features (security.profile: fips, supportPackage.enabled, preflight.enabled) — documented in operations.md.

Verification approach

Every config key, endpoint, port, and Secret/resource name in these docs was checked against langcache/helm/values.yaml and README.md, the Go config-validation source for the Control Plane and Data Plane, the Control Plane's Smithy API (and its generated OpenAPI, shipped as-is rather than hand-written), and the real dev-stack config files under development/langcache/onprem/. Two rounds of a Codex content/meaning review against the rendered staging pages also caught and fixed several bugs before this rewrite superseded them (wrong default port, a missing required config field, an incorrect FIPS claim, and a Helm chart-value convention copied from RAM that didn't actually exist in LangCache's then-current chart).

One inference I couldn't directly verify: the published Helm chart's exact repository coordinates (prerequisites.md says "contact your Redis representative" rather than guessing a specific helm repo add URL) — the sync target is RedisLabs/redis-enterprise-helm at ai/charts/langcache, and by analogy with RAM's redis-ai/redis-agent-memory from https://helm.redis.io/ai, it's very likely redis-ai/langcache from the same repo, but I didn't have a way to confirm the live Helm repo index from this environment, so I left it as a contact-your-rep pointer rather than asserting a specific chart ref.

🤖 Generated with Claude Code

Document LangCache on-prem (self-managed) deployment and usage, based on
the self-managed Redis Agent Memory (RAM) docs and verified against the
LangCache ADR/TDD, Helm chart, and controlplane-onprem/dataplane source.

Adds content/operate/iris/langcache/self-managed/:
- _index.md, plan-deployment.md, prerequisites.md
- deploy-static.md, deploy-control-plane.md, data-plane-configuration.md
- authentication.md
- control-plane-api-reference.md + generated openapi-control-plane.json
- operations.md, reference.md, api-examples.md

Also adds one link from the existing LangCache Cloud index page
(content/operate/iris/langcache/_index.md) to the new self-managed section,
mirroring the Agent Memory index's "Deployment options" pattern.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@CLAassistant

Copy link
Copy Markdown

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

🧠 Redis Memory

Found 8 related items from repository history (1 new this commit):

Memory updated at ad5c284

tptodorov and others added 3 commits September 4, 2026 14:47
- _index.md: split the single Data Plane port entry into static-caches
  (8080) vs. Control Plane managed caches (9000) — they're different
  binaries with different defaults, and the single row was misleading.
- data-plane-configuration.md: add the required embedding.endpoint.base_url
  to the Control Plane managed caches example; pkg/inference.Config.Validate
  requires it for non-noop providers, so the example would fail startup
  without it.
- operations.md: correct the FIPS posture claim. The on-prem-hardened
  binaries are FIPS-*capable* (GOFIPS140), but ship with runtime FIPS mode
  off by default (GODEBUG=fips140=off); the strict rediss:// checks are
  opt-in, not automatic just from using the hardened image.
- deploy-control-plane.md: add the missing Secret-mount steps (license,
  Identity Service introspection token) for the Data Plane, since the
  config example referenced mount paths the chart doesn't wire up on its
  own; uses the chart's existing generic volumes/volumeMounts passthrough.
- authentication.md: strengthen the Identity Service caveat to note it
  needs its own control credential, a per-Data-Plane introspection
  credential, and product wiring — not just one extra container.

Found via a Codex content/meaning review of the rendered staging pages,
cross-checked against the actual Go source in the iris monorepo.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The langcache chart takes dataplane.config.yaml inline as the `config`
value, rendered into a ConfigMap — it has no existingSecret/
existingSecretChecksum option for it (that's an RS-Agent-Memory-chart
convention I'd copied without checking against this chart's actual
values.yaml/configmap.yaml). Corrected across deploy-static.md,
deploy-control-plane.md, prerequisites.md, reference.md, and operations.md:

- Config is now shown inline under `config:` in the Helm values examples,
  with an explicit callout that this renders to a ConfigMap (not a Secret)
  so the values file itself should be treated as sensitive.
- License and Identity Service introspection-token files (which the chart
  doesn't support at all) are now mounted via the chart's generic
  volumes/volumeMounts passthrough, using dedicated directories
  (/etc/license, /etc/introspection) instead of subPath mounts into
  /etc/langcache — subPath mounts don't pick up Secret updates without a
  pod restart, whole-directory mounts do.
- Removed the SHA-256-checksum-based rollout pattern for config/license
  (it assumed a chart field, existingSecretChecksum, that doesn't exist);
  replaced with explicit `kubectl rollout restart` guidance for license and
  introspection-token rotation in operations.md.
- Added `nameOverride`/`fullnameOverride: langcache` to the values examples
  so the chart's actual default resource names (derived from
  nameOverride=langcache-app) don't silently mismatch the `svc/langcache`,
  `deploy/langcache`, and `app.kubernetes.io/name=langcache` used throughout
  the verification commands.
- deploy-control-plane.md: added `service.port: 9000` since the
  managed-cache Data Plane binary's default port doesn't match the chart's
  default service.port (8080); fixed the intro note, which claimed the page
  deploys the Identity Service when it doesn't.
- authentication.md: `full` grant wording corrected to not imply it grants
  Control Plane admin API access.
- api-examples.md: noted the 8080/9000 port split for static vs.
  Control-Plane-managed Data Plane calls.

Found via a second Codex content/meaning review pass, cross-checked against
the actual Go source, Helm chart, and Kubernetes subPath semantics.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…m chart

Static caches / "Data Plane only" self-managed LangCache is no longer a
thing: since MOD-17459 ("Evolve langcache/helm into the canonical LangCache
on-prem chart") and MOD-17460 (removing the on-prem Data Plane's own
database registry), the langcache chart always installs the Data Plane,
Control Plane, and a bundled-or-external Identity Service together. There
is no deployment-mode choice anymore and no supported no-Control-Plane
path — the previous docs described an earlier, now-superseded shape of the
product (a DP-only chart, a hand-rolled CP manifest, no public images).

Rewritten against langcache/helm/{values.yaml,README.md,Chart.yaml},
controlplane-onprem/dataplane on-prem config structs, and
development/langcache/onprem/*.config.yaml at origin/main (HEAD's checkout
of this reference repo was 15 commits behind and missing all of this):

- Removed plan-deployment.md and deploy-static.md — no modes to choose.
- Renamed deploy-control-plane.md -> deploy.md: one `helm install` now
  stands up DP+CP+IdS together; no more manual Control Plane Deployment
  manifest, the chart templates it.
- Renamed data-plane-configuration.md -> configuration.md: config is now a
  values.yaml (non-secret structure) + per-component overlay Secret
  (Redis URLs, database registry, embedding credential) split, chart-native
  end to end, replacing the old hand-mounted subPath workarounds.
- authentication.md: agent-key auth via Identity Service (bundled or
  external) is the only Data Plane auth mode; dropped the legacy
  static-cache-token material entirely, since static caches aren't part of
  this product's self-managed shape anymore.
- operations.md: rotation now uses the chart's real
  `*.existingSecretChecksum` mechanism; added the chart's own FIPS posture,
  support bundle, and preflight features, all newly chart-native.
- _index.md/reference.md: updated component list, ports, and images
  (redislabs/iris-langcache-data, iris-langcache-control,
  iris-identity-service — now published to public Docker Hub, closing the
  "no public registry" gap noted in the previous revision).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@mich-elle-luna mich-elle-luna self-assigned this Sep 4, 2026

@mich-elle-luna mich-elle-luna left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you! This is looking good so far, just a few small suggestions.

hideListLinks: true
---

LangCache is a semantic caching service that stores LLM responses for fast,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
LangCache is a semantic caching service that stores LLM responses for fast,
LangCache is a semantic caching service that stores LLM responses for faster,

---

LangCache is a semantic caching service that stores LLM responses for fast,
cheaper retrieval. Applications send prompts to LangCache, which returns a

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
cheaper retrieval. Applications send prompts to LangCache, which returns a
cheaper retrieval. Applications send prompts to LangCache, which either returns a


One `helm install` of the `langcache` chart always creates the Data Plane and
the Control Plane, plus either a bundled or an external Identity Service.
There is no lighter-weight "Data Plane only" install for self-managed

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
There is no lighter-weight "Data Plane only" install for self-managed
There is no lighter-weight install of only the Data Plane for self-managed

One `helm install` of the `langcache` chart always creates the Data Plane and
the Control Plane, plus either a bundled or an external Identity Service.
There is no lighter-weight "Data Plane only" install for self-managed
LangCache — every cache is created and managed through the Control Plane, and

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
LangCache — every cache is created and managed through the Control Plane, and
LangCache. Every cache is created and managed through the Control Plane, and

(see [External Identity Service](#external-identity-service)).

The admin token and internal token must always be different values; the
Control Plane rejects config where they match.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Control Plane rejects config where they match.
Control Plane rejects a configuration where admin token and internal token match.

--namespace <namespace-name> \
-f langcache-values.yaml \
--atomic --wait
```

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add a next steps section

directly. Write a NetworkPolicy for your cluster's CNI that default-denies
ingress to the `langcache`, `langcache-controlplane`, and (bundled mode)
`langcache-identity-service` Services, then allow TCP traffic on their
respective ports (`9000`, `9100`, `9200`) from approved callers only.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe a see also section here for links to info about backups how tos?


LangCache self-managed is distributed as container images on Docker Hub plus
the `langcache` Helm chart. One `helm install` of the chart deploys the
LangCache Data Plane, the LangCache Control Plane, and (by default) a

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
LangCache Data Plane, the LangCache Control Plane, and (by default) a
LangCache Data Plane, the LangCache Control Plane, and a


The chart never puts Redis URLs, the database registry, or the embedding
credential in `values.yaml` or a rendered ConfigMap. Each of the Data Plane,
Control Plane, and (bundled) Identity Service reads its own pre-created

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Control Plane, and (bundled) Identity Service reads its own pre-created
Control Plane, and bundled Identity Service reads its own pre-created

| Identity Service mode | `identityService.mode` (`bundled` or `external`) | Choosing whether this release runs its own Identity Service or joins one the suite already runs. |
| Config overlays | `dataplane.secrets.*`, `controlplane.secrets.*`, `identityService.bundled.metadata.*` | Pointing the chart at your pre-created overlay Secrets. |
| Rotation | `*.existingSecretChecksum` fields throughout | Rolling pods after an externally managed Secret changes. |
{{< /table-scrollable >}}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add the next steps here

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants