diff --git a/charts/rhdh/Chart.yaml b/charts/rhdh/Chart.yaml index 48b05a76..a7bf94ed 100644 --- a/charts/rhdh/Chart.yaml +++ b/charts/rhdh/Chart.yaml @@ -1,7 +1,7 @@ apiVersion: v2 name: redhat-developer-hub type: application -version: 3.1.0 +version: 3.2.0 appVersion: 2.1.0 annotations: artifacthub.io/category: integration-delivery diff --git a/charts/rhdh/README.md b/charts/rhdh/README.md index 1f2edb81..57b74b2b 100644 --- a/charts/rhdh/README.md +++ b/charts/rhdh/README.md @@ -1,7 +1,7 @@ # RHDH Helm Chart for OpenShift and Kubernetes -![Version: 3.1.0](https://img.shields.io/badge/Version-3.1.0-informational?style=flat-square) +![Version: 3.2.0](https://img.shields.io/badge/Version-3.2.0-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) 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: helm repo add bitnami https://charts.bitnami.com/bitnami helm repo add redhat-developer https://redhat-developer.github.io/rhdh-chart -helm install my-rhdh redhat-developer/redhat-developer-hub --version 3.1.0 +helm install my-rhdh redhat-developer/redhat-developer-hub --version 3.2.0 ``` ## Introduction @@ -247,7 +247,7 @@ Kubernetes: `>= 1.31.0-0` | image.digest | Overrides the image tag with an image digest. | string | `""` | | imagePullSecrets | Secrets for pulling images from private registries (merged with global.imagePullSecrets). | list | `[]` | | ingress | Kubernetes Ingress configuration. | object | `{"annotations":{},"className":"","enabled":false,"hosts":[{"host":"{{ .Values.host }}","paths":[{"path":"/","pathType":"ImplementationSpecific"}]}],"tls":[]}` | -| intelligentAssistant | Built-in Intelligent Assistant feature configuration. | object | `{"config":{"profile":{"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-20260824-cbd182b"},"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":"","okp":{"affinity":{},"enabled":false,"httpd":{"compressed":"true","encrypt":"false","serverName":"localhost"},"image":{"digest":"","pullPolicy":"IfNotPresent","registry":"registry.redhat.io","repository":"offline-knowledge-portal/rhokp-rhel9","tag":"1.2.12-1788274041"},"imagePullSecrets":[],"ingress":{"annotations":{},"className":"","enabled":true,"host":"","tls":{"enabled":false,"secretName":""}},"livenessProbe":{"initialDelaySeconds":30,"periodSeconds":30},"nodeSelector":{},"readinessProbe":{"initialDelaySeconds":10,"periodSeconds":10},"replicaCount":1,"resources":{"limits":{"cpu":"2","memory":"4Gi"},"requests":{"cpu":"200m","memory":"2Gi"}},"route":{"enabled":true,"tls":{"insecureEdgeTerminationPolicy":"Redirect","termination":"edge"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}},"service":{"type":"ClusterIP"},"solr":{"hostBind":"0.0.0.0","memory":"1g"},"tolerations":[],"topologySpreadConstraints":[]},"plugins":[{"enabled":true,"package":"ref://red-hat-developer-hub-backstage-plugin-intelligent-assistant"},{"enabled":true,"package":"ref://red-hat-developer-hub-backstage-plugin-intelligent-assistant-backend"}],"runtimeVolume":{"emptyDir":{},"persistentVolumeClaim":{},"type":"emptyDir"}}` | +| intelligentAssistant | Built-in Intelligent Assistant feature configuration. | object | `{"config":{"profile":{"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.7.0rc3"},"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":"","okp":{"affinity":{},"enabled":false,"httpd":{"compressed":"true","encrypt":"false","serverName":"localhost"},"image":{"digest":"","pullPolicy":"IfNotPresent","registry":"registry.redhat.io","repository":"offline-knowledge-portal/rhokp-rhel9","tag":"1.2.12-1788274041"},"imagePullSecrets":[],"ingress":{"annotations":{},"className":"","enabled":true,"host":"","tls":{"enabled":false,"secretName":""}},"livenessProbe":{"initialDelaySeconds":30,"periodSeconds":30},"nodeSelector":{},"readinessProbe":{"initialDelaySeconds":10,"periodSeconds":10},"replicaCount":1,"resources":{"limits":{"cpu":"2","memory":"4Gi"},"requests":{"cpu":"200m","memory":"2Gi"}},"route":{"enabled":true,"tls":{"insecureEdgeTerminationPolicy":"Redirect","termination":"edge"}},"securityContext":{"allowPrivilegeEscalation":false,"capabilities":{"drop":["ALL"]},"runAsNonRoot":true,"seccompProfile":{"type":"RuntimeDefault"}},"service":{"type":"ClusterIP"},"solr":{"hostBind":"0.0.0.0","memory":"1g"},"tolerations":[],"topologySpreadConstraints":[]},"plugins":[{"enabled":true,"package":"ref://red-hat-developer-hub-backstage-plugin-intelligent-assistant"},{"enabled":true,"package":"ref://red-hat-developer-hub-backstage-plugin-intelligent-assistant-backend"}],"runtimeVolume":{"emptyDir":{},"persistentVolumeClaim":{},"type":"emptyDir"}}` | | intelligentAssistant.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":""}},"stack":{"existingConfigMap":{"key":"","name":""}}}` | | intelligentAssistant.config.profile | Python profile with prompt templates (rhdh-profile.py). | object | `{"existingConfigMap":{"key":"","name":""}}` | | intelligentAssistant.config.profile.existingConfigMap | Use an existing ConfigMap instead of the bundled default. | object | Created from bundled rhdh-profile.py | @@ -257,7 +257,7 @@ Kubernetes: `>= 1.31.0-0` | intelligentAssistant.config.stack.existingConfigMap | Use an existing ConfigMap instead of the bundled default. | object | Created from bundled lightspeed-stack.yaml | | intelligentAssistant.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 | `""` | | intelligentAssistant.config.stack.existingConfigMap.name | Name of the existing ConfigMap. | string | `""` | -| intelligentAssistant.core | Lightspeed Core sidecar container. | object | `{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"lightspeed-core/lightspeed-stack","tag":"dev-20260824-cbd182b"},"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"}}}` | +| intelligentAssistant.core | Lightspeed Core sidecar container. | object | `{"argsOverride":[],"commandOverride":[],"extraArgs":[],"extraEnv":[],"extraVolumeMounts":[],"image":{"digest":"","registry":"quay.io","repository":"lightspeed-core/lightspeed-stack","tag":"0.7.0rc3"},"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"}}}` | | intelligentAssistant.core.argsOverride | Override the container's default args. Leave empty to use the chart defaults. | list | `[]` | | intelligentAssistant.core.commandOverride | Override the container's default command. Leave empty to use the image entrypoint. | list | `[]` | | intelligentAssistant.core.extraArgs | Extra arguments appended after the default arguments. Ignored when argsOverride is set. | list | `[]` | diff --git a/charts/rhdh/files/intelligent-assistant/secret.example.yaml b/charts/rhdh/files/intelligent-assistant/secret.example.yaml index 3e98f30a..d5513cef 100644 --- a/charts/rhdh/files/intelligent-assistant/secret.example.yaml +++ b/charts/rhdh/files/intelligent-assistant/secret.example.yaml @@ -12,16 +12,23 @@ # Then set in your values override: # intelligentAssistant: # existingSecret: "my-lightspeed-secret" - +# # Set to question_validity to enable question validation. -ENABLE_VALIDATION: "" +KV_STORE_PATH: "/tmp/kvstore.db" +SQL_STORE_PATH: "/tmp/sql_store.db" +SQLITE_STORE_DIR: "/tmp/llama-stack-files" VLLM_URL: "" VLLM_API_KEY: "" VLLM_MAX_TOKENS: "" VLLM_TLS_VERIFY: "" OPENAI_API_KEY: "" VERTEX_AI_PROJECT: "" -VERTEX_AI_LOCATION: "" -GOOGLE_APPLICATION_CREDENTIALS: "" +VERTEX_AI_LOCATION: "global" +GOOGLE_APPLICATION_CREDENTIALS_HOST_PATH: "" +GOOGLE_APPLICATION_CREDENTIALS: "/app-root/gcp-credentials.json" +ENABLE_VALIDATION: "" VALIDATION_PROVIDER: "" VALIDATION_MODEL_NAME: "" +OKP_ACCESS_KEY: "" +LLAMA_STACK_LOGGING: "" +OTEL_SDK_DISABLED: "true" diff --git a/charts/rhdh/values.schema.json b/charts/rhdh/values.schema.json index 7cbe2a1e..0c2a9bd5 100644 --- a/charts/rhdh/values.schema.json +++ b/charts/rhdh/values.schema.json @@ -798,7 +798,7 @@ "digest": "", "registry": "quay.io", "repository": "lightspeed-core/lightspeed-stack", - "tag": "dev-20260824-cbd182b" + "tag": "0.7.0rc3" }, "imagePullPolicy": "IfNotPresent", "resources": { diff --git a/charts/rhdh/values.yaml b/charts/rhdh/values.yaml index df7c020c..13937b17 100644 --- a/charts/rhdh/values.yaml +++ b/charts/rhdh/values.yaml @@ -580,7 +580,7 @@ intelligentAssistant: image: registry: "quay.io" repository: "lightspeed-core/lightspeed-stack" - tag: "dev-20260824-cbd182b" + tag: "0.7.0rc3" digest: "" imagePullPolicy: "IfNotPresent" # -- Override the container's default command. Leave empty to use the image entrypoint. diff --git a/docs/intelligent-assistant.md b/docs/intelligent-assistant.md index e8808cd6..e0181a33 100644 --- a/docs/intelligent-assistant.md +++ b/docs/intelligent-assistant.md @@ -181,7 +181,6 @@ Key environment variables in the secret: | `OPENAI_API_KEY` | OpenAI inference key | If using OpenAI provider | | `VLLM_URL`, `VLLM_API_KEY` | vLLM inference endpoint | If using vLLM provider | | `VERTEX_AI_PROJECT`, `VERTEX_AI_LOCATION` | Google Vertex AI | If using Vertex AI | -| `OLLAMA_URL` | Ollama endpoint | If using Ollama | | `ENABLE_VALIDATION`, `VALIDATION_PROVIDER`, `VALIDATION_MODEL_NAME` | Input validation | Optional | ## HTTPS and TLS diff --git a/hack/sync-lightspeed-configs.sh b/hack/sync-lightspeed-configs.sh index 6a8bc2c7..58314182 100755 --- a/hack/sync-lightspeed-configs.sh +++ b/hack/sync-lightspeed-configs.sh @@ -32,6 +32,25 @@ strip_okp_config() { render_secret_yaml_from_env() { local source_file=$1 local destination_file=$2 + + cat > "${destination_file}" << 'EOF' +# This file is a reference template — it is NOT deployed by the chart. +# +# Use it as a starting point to create a Kubernetes Secret containing credentials +# and settings for providers configured in lightspeed-stack.yaml. The Secret does +# not enable a provider. Supply a provider-enabled stack through +# intelligentAssistant.config.stack.existingConfigMap. +# +# Example: +# kubectl create secret generic my-lightspeed-secret \ +# --from-env-file=<(grep -v '^#' secret.example.yaml | grep -v '^$') +# +# Then set in your values override: +# intelligentAssistant: +# existingSecret: "my-lightspeed-secret" +# +# Set to question_validity to enable question validation. +EOF awk ' /^[[:space:]]*$/ { next } @@ -55,7 +74,7 @@ render_secret_yaml_from_env() { gsub(/"/, "\\\"", value) printf "%s: \"%s\"\n", key, value } - ' "${source_file}" > "${destination_file}" + ' "${source_file}" >> "${destination_file}" } usage() {