Skip to content

Commit 03f9ea9

Browse files
maysunfaisalclaudecursoragent
committed
feat(lightspeed): replace RAG init container with OKP deployment [RHIDP-16102]
Replace the RAG init container / FAISS vector store with an OKP (Offline Knowledge Portal) Deployment, Service, and Route. Add platform-aware config selection: OpenShift (or K8s with okp.ingress.host set) uses the full OKP config; vanilla K8s uses the lightspeed-stack-no-okp.yaml variant so LCORE does not crash without an OKP backend. Add OKP Ingress support, imagePullSecrets, vector_store config, and align/pin the OKP and LCORE (OGX) images. Swap Lightspeed plugins to Intelligent Assistant. Add systemArgs/systemEnv for LCORE sidecar (HF_HOME, OTEL_SDK_DISABLED, --synthesized-config-output). Sync vendored Lightspeed configs from lightspeed-configs@main. Add docs/lightspeed.md with deployment scenarios, vanilla K8s prerequisites, and OKP configuration reference. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent a278c69 commit 03f9ea9

20 files changed

Lines changed: 1082 additions & 597 deletions

charts/rhdh/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
apiVersion: v2
22
name: redhat-developer-hub
33
type: application
4-
version: 1.0.2
4+
version: 1.1.0
55
appVersion: 2.1.0
66
annotations:
77
artifacthub.io/category: integration-delivery

charts/rhdh/README.md

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
# RHDH Helm Chart for OpenShift and Kubernetes
33

4-
![Version: 1.0.2](https://img.shields.io/badge/Version-1.0.2-informational?style=flat-square)
4+
![Version: 1.1.0](https://img.shields.io/badge/Version-1.1.0-informational?style=flat-square)
55
![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)
66

77
A Helm chart for deploying Red Hat Developer Hub, which is a Red Hat supported version of Backstage.
@@ -36,7 +36,7 @@ For the **Generally Available** version of this chart, see:
3636
helm repo add bitnami https://charts.bitnami.com/bitnami
3737
helm repo add redhat-developer https://redhat-developer.github.io/rhdh-chart
3838

39-
helm install my-rhdh redhat-developer/redhat-developer-hub --version 1.0.2
39+
helm install my-rhdh redhat-developer/redhat-developer-hub --version 1.1.0
4040
```
4141

4242
## Introduction
@@ -243,7 +243,7 @@ Kubernetes: `>= 1.31.0-0`
243243
| image.digest | Overrides the image tag with an image digest. | string | `""` |
244244
| imagePullSecrets | Secrets for pulling images from private registries (merged with global.imagePullSecrets). | list | `[]` |
245245
| ingress | Kubernetes Ingress configuration. | object | `{"annotations":{},"className":"","enabled":false,"hosts":[{"host":"{{ .Values.host }}","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}],"tls":[]}` |
246-
| lightspeed | Built-in Lightspeed AI feature configuration. | object | `{"config":{"profile":{"existingConfigMap":{"key":"","name":""}},"server":{"existingConfigMap":{"key":"","name":""}},"stack":{"existingConfigMap":{"key":"","name":""}}},"core":{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"lightspeed-core/lightspeed-stack","tag":"0.6.2"},"imagePullPolicy":"IfNotPresent","resources":{"limits":{"cpu":"1000m","memory":"2Gi"},"requests":{"cpu":"100m","memory":"512Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}}},"enabled":true,"existingSecret":"","plugins":[{"enabled":true,"package":"oci://registry.access.redhat.com/rhdh/red-hat-developer-hub-backstage-plugin-lightspeed:{{ \"{{inherit}}\" }}"},{"enabled":true,"package":"oci://registry.access.redhat.com/rhdh/red-hat-developer-hub-backstage-plugin-lightspeed-backend:{{ \"{{inherit}}\" }}"}],"ragInit":{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"redhat-ai-dev/rag-content","tag":"release-1.10-lls-0.5.0-8c231a3b5177f12fff9db042dfa4091d8f2f26b3"},"imagePullPolicy":"IfNotPresent","resources":{"limits":{"cpu":"100m","memory":"500Mi"},"requests":{"cpu":"50m","memory":"150Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}}},"runtimeVolume":{"emptyDir":{},"persistentVolumeClaim":{},"type":"emptyDir"}}` |
246+
| lightspeed | Built-in Lightspeed AI feature configuration. | object | `{"config":{"profile":{"existingConfigMap":{"key":"","name":""}},"server":{"existingConfigMap":{"key":"","name":""}},"stack":{"existingConfigMap":{"key":"","name":""}}},"core":{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"lightspeed-core/lightspeed-stack","tag":"dev-20260811-0da4b12"},"imagePullPolicy":"IfNotPresent","resources":{"limits":{"cpu":"1000m","memory":"2Gi"},"requests":{"cpu":"100m","memory":"512Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}},"systemArgs":["--synthesized-config-output","/tmp/.generated/run.yaml"],"systemEnv":[{"name":"HF_HOME","value":"/tmp/hf_cache"},{"name":"OTEL_SDK_DISABLED","value":"true"}]},"enabled":true,"existingSecret":"","okp":{"chunkFilterQuery":"product:*developer_hub*","httpd":{"compressed":"true","encrypt":"false","serverName":"localhost"},"image":{"digest":"","pullPolicy":"IfNotPresent","registry":"registry.redhat.io","repository":"offline-knowledge-portal/rhokp-rhel9","tag":"1.2.10-1786628394"},"imagePullSecrets":[],"ingress":{"annotations":{},"className":"","enabled":true,"host":"","tls":{"enabled":false,"secretName":""}},"replicaCount":1,"resources":{"limits":{"cpu":"2","memory":"4Gi"},"requests":{"cpu":"200m","memory":"2Gi"}},"route":{"enabled":true,"tls":{"insecureEdgeTerminationPolicy":"Allow","termination":"edge"}},"service":{"type":"ClusterIP"},"solr":{"hostBind":"0.0.0.0","memory":"1g"}},"plugins":[{"enabled":true,"package":"oci://quay.io/rhdh/red-hat-developer-hub-backstage-plugin-intelligent-assistant:{{ \"{{inherit}}\" }}","pluginConfig":{"dynamicPlugins":{"frontend":{"red-hat-developer-hub.backstage-plugin-intelligent-assistant":{"dynamicRoutes":[{"importName":"LightspeedPage","module":"Legacy","path":"/intelligent-assistant"}],"mountPoints":[{"importName":"LightspeedFAB","module":"Legacy","mountPoint":"application/listener"},{"importName":"LightspeedDrawerProvider","module":"Legacy","mountPoint":"application/provider"},{"config":{"id":"intelligent-assistant"},"importName":"LightspeedDrawerStateExposer","module":"Legacy","mountPoint":"application/internal/drawer-state"},{"config":{"id":"intelligent-assistant","priority":100},"importName":"LightspeedChatContainer","module":"Legacy","mountPoint":"application/internal/drawer-content"}],"translationResources":[{"importName":"lightspeedTranslations","module":"Alpha","ref":"intelligentAssistantTranslationRef"}]}}}}},{"enabled":true,"package":"oci://quay.io/rhdh/red-hat-developer-hub-backstage-plugin-intelligent-assistant-backend:{{ \"{{inherit}}\" }}"}],"runtimeVolume":{"emptyDir":{},"persistentVolumeClaim":{},"type":"emptyDir"}}` |
247247
| lightspeed.config | Configuration files mounted into the sidecar. By default, the chart creates ConfigMaps from bundled source files. Set existingConfigMap to use a pre-existing ConfigMap instead. | object | `{"profile":{"existingConfigMap":{"key":"","name":""}},"server":{"existingConfigMap":{"key":"","name":""}},"stack":{"existingConfigMap":{"key":"","name":""}}}` |
248248
| lightspeed.config.profile | Python profile with prompt templates (rhdh-profile.py). | object | `{"existingConfigMap":{"key":"","name":""}}` |
249249
| lightspeed.config.profile.existingConfigMap | Use an existing ConfigMap instead of the bundled default. | object | Created from bundled rhdh-profile.py |
@@ -257,16 +257,14 @@ Kubernetes: `>= 1.31.0-0`
257257
| lightspeed.config.stack.existingConfigMap | Use an existing ConfigMap instead of the bundled default. | object | Created from bundled lightspeed-stack.yaml |
258258
| lightspeed.config.stack.existingConfigMap.key | Key within the ConfigMap that holds the file content. Defaults to the bundled filename (lightspeed-stack.yaml) if not set. | string | `""` |
259259
| lightspeed.config.stack.existingConfigMap.name | Name of the existing ConfigMap. | string | `""` |
260-
| lightspeed.core | Lightspeed Core sidecar container. | object | `{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"lightspeed-core/lightspeed-stack","tag":"0.6.2"},"imagePullPolicy":"IfNotPresent","resources":{"limits":{"cpu":"1000m","memory":"2Gi"},"requests":{"cpu":"100m","memory":"512Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}}}` |
260+
| lightspeed.core | Lightspeed Core sidecar container. | object | `{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"lightspeed-core/lightspeed-stack","tag":"dev-20260811-0da4b12"},"imagePullPolicy":"IfNotPresent","resources":{"limits":{"cpu":"1000m","memory":"2Gi"},"requests":{"cpu":"100m","memory":"512Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}},"systemArgs":["--synthesized-config-output","/tmp/.generated/run.yaml"],"systemEnv":[{"name":"HF_HOME","value":"/tmp/hf_cache"},{"name":"OTEL_SDK_DISABLED","value":"true"}]}` |
261261
| lightspeed.core.argsOverride | Override the container's default args. Leave empty to use the image defaults. | list | `[]` |
262262
| lightspeed.core.commandOverride | Override the container's default command. Leave empty to use the image entrypoint. | list | `[]` |
263263
| lightspeed.core.extraArgs | Extra arguments appended after the default arguments. Ignored when argsOverride is set. | list | `[]` |
264264
| lightspeed.existingSecret | Name of an existing Secret to inject via envFrom into the lightspeed-core container. If empty, no secret is mounted. Expected keys (all optional — only set the ones for the providers you use): ENABLE_VLLM, VLLM_URL, VLLM_API_KEY, VLLM_MAX_TOKENS, VLLM_TLS_VERIFY, ENABLE_OPENAI, OPENAI_API_KEY, ENABLE_VERTEX_AI, VERTEX_AI_PROJECT, VERTEX_AI_LOCATION, GOOGLE_APPLICATION_CREDENTIALS, ENABLE_OLLAMA, OLLAMA_URL, ENABLE_VALIDATION, VALIDATION_PROVIDER, VALIDATION_MODEL_NAME, LLAMA_STACK_LOGGING See files/lightspeed/secret.example.yaml for a reference template. | string | `""` |
265-
| lightspeed.plugins | Lightspeed dynamic plugin packages. | list | `[{"enabled":true,"package":"oci://registry.access.redhat.com/rhdh/red-hat-developer-hub-backstage-plugin-lightspeed:{{ \"{{inherit}}\" }}"},{"enabled":true,"package":"oci://registry.access.redhat.com/rhdh/red-hat-developer-hub-backstage-plugin-lightspeed-backend:{{ \"{{inherit}}\" }}"}]` |
266-
| lightspeed.ragInit | RAG data bootstrap init container. | object | `{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"redhat-ai-dev/rag-content","tag":"release-1.10-lls-0.5.0-8c231a3b5177f12fff9db042dfa4091d8f2f26b3"},"imagePullPolicy":"IfNotPresent","resources":{"limits":{"cpu":"100m","memory":"500Mi"},"requests":{"cpu":"50m","memory":"150Mi"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"readOnlyRootFilesystem":true,"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}}}` |
267-
| lightspeed.ragInit.argsOverride | Override the default arguments for the RAG init container. | list | `[]` |
268-
| lightspeed.ragInit.commandOverride | Override the default command for the RAG init container. | list | `[]` |
269-
| lightspeed.ragInit.extraArgs | Extra arguments appended after the default arguments. Ignored when argsOverride is set. | list | `[]` |
265+
| lightspeed.okp | OKP (Offline Knowledge Portal) configuration. Deploys an OKP instance for document retrieval when lightspeed is enabled. | object | `{"chunkFilterQuery":"product:*developer_hub*","httpd":{"compressed":"true","encrypt":"false","serverName":"localhost"},"image":{"digest":"","pullPolicy":"IfNotPresent","registry":"registry.redhat.io","repository":"offline-knowledge-portal/rhokp-rhel9","tag":"1.2.10-1786628394"},"imagePullSecrets":[],"ingress":{"annotations":{},"className":"","enabled":true,"host":"","tls":{"enabled":false,"secretName":""}},"replicaCount":1,"resources":{"limits":{"cpu":"2","memory":"4Gi"},"requests":{"cpu":"200m","memory":"2Gi"}},"route":{"enabled":true,"tls":{"insecureEdgeTerminationPolicy":"Allow","termination":"edge"}},"service":{"type":"ClusterIP"},"solr":{"hostBind":"0.0.0.0","memory":"1g"}}` |
266+
| lightspeed.okp.imagePullSecrets | Image pull secrets for the OKP container image. Required on vanilla Kubernetes to authenticate with registry.redhat.io. Not needed on OpenShift where the cluster-wide pull secret covers Red Hat registries. | list | `[]` |
267+
| lightspeed.plugins | Intelligent Assistant dynamic plugin packages. | list | `[{"enabled":true,"package":"oci://quay.io/rhdh/red-hat-developer-hub-backstage-plugin-intelligent-assistant:{{ \"{{inherit}}\" }}","pluginConfig":{"dynamicPlugins":{"frontend":{"red-hat-developer-hub.backstage-plugin-intelligent-assistant":{"dynamicRoutes":[{"importName":"LightspeedPage","module":"Legacy","path":"/intelligent-assistant"}],"mountPoints":[{"importName":"LightspeedFAB","module":"Legacy","mountPoint":"application/listener"},{"importName":"LightspeedDrawerProvider","module":"Legacy","mountPoint":"application/provider"},{"config":{"id":"intelligent-assistant"},"importName":"LightspeedDrawerStateExposer","module":"Legacy","mountPoint":"application/internal/drawer-state"},{"config":{"id":"intelligent-assistant","priority":100},"importName":"LightspeedChatContainer","module":"Legacy","mountPoint":"application/internal/drawer-content"}],"translationResources":[{"importName":"lightspeedTranslations","module":"Alpha","ref":"intelligentAssistantTranslationRef"}]}}}}},{"enabled":true,"package":"oci://quay.io/rhdh/red-hat-developer-hub-backstage-plugin-intelligent-assistant-backend:{{ \"{{inherit}}\" }}"}]` |
270268
| lightspeed.runtimeVolume | Writable scratch volume for the sidecar (/tmp). | object | `{"emptyDir":{},"persistentVolumeClaim":{},"type":"emptyDir"}` |
271269
| lightspeed.runtimeVolume.type | Volume type: "emptyDir" or "persistentVolumeClaim". | string | `"emptyDir"` |
272270
| livenessProbe | Liveness probe configuration. | object | `{"failureThreshold":3,"httpGet":{"path":"/.backstage/health/v1/liveness","port":"backend","scheme":"HTTP"},"periodSeconds":10,"successThreshold":1,"timeoutSeconds":4}` |
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# CI: test lightspeed with SERVICE_HOST override and OKP disabled.
2+
# The chart features under test (deployment, config, probes, etc.) don't depend on actual plugins.
3+
dynamicPlugins:
4+
includes: []
5+
lightspeed:
6+
plugins: []
7+
core:
8+
extraEnv:
9+
- name: SERVICE_HOST
10+
value: "0.0.0.0"
11+
okp:
12+
route:
13+
enabled: false
14+
ingress:
15+
enabled: false
16+
orchestrator:
17+
plugins: []

0 commit comments

Comments
 (0)