From fbfafc2dc1ce6597a57889fa66a8be7d3a067ad7 Mon Sep 17 00:00:00 2001 From: openab-bot Date: Sat, 11 Apr 2026 22:03:03 +0000 Subject: [PATCH 1/4] helm: add first-class STT config to chart MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add stt as a first-class config block in the Helm chart so users can enable STT with a single helm upgrade command: helm upgrade openab openab/openab \ --set agents.kiro.stt.enabled=true \ --set agents.kiro.stt.apiKey=gsk_xxx - values.yaml: add stt defaults (enabled, apiKey, model, baseUrl) - configmap.yaml: render [stt] section when enabled, using ${STT_API_KEY} - secret.yaml: store apiKey in K8s Secret (same pattern as botToken) - deployment.yaml: inject STT_API_KEY env var from Secret API key stays out of the configmap — follows the existing DISCORD_BOT_TOKEN pattern. Closes #227 --- charts/openab/templates/configmap.yaml | 8 ++++++++ charts/openab/templates/deployment.yaml | 7 +++++++ charts/openab/templates/secret.yaml | 3 +++ charts/openab/values.yaml | 5 +++++ 4 files changed, 23 insertions(+) diff --git a/charts/openab/templates/configmap.yaml b/charts/openab/templates/configmap.yaml index 95bd68ef..69ab02da 100644 --- a/charts/openab/templates/configmap.yaml +++ b/charts/openab/templates/configmap.yaml @@ -40,6 +40,14 @@ data: [reactions] enabled = {{ ($cfg.reactions).enabled | default true }} remove_after_reply = {{ ($cfg.reactions).removeAfterReply | default false }} + {{- if ($cfg.stt).enabled }} + + [stt] + enabled = true + api_key = "${STT_API_KEY}" + model = "{{ ($cfg.stt).model | default "whisper-large-v3-turbo" }}" + base_url = "{{ ($cfg.stt).baseUrl | default "https://api.groq.com/openai/v1" }}" + {{- end }} {{- if $cfg.agentsMd }} AGENTS.md: | {{- $cfg.agentsMd | nindent 4 }} diff --git a/charts/openab/templates/deployment.yaml b/charts/openab/templates/deployment.yaml index f1ab9b0b..0d45041d 100644 --- a/charts/openab/templates/deployment.yaml +++ b/charts/openab/templates/deployment.yaml @@ -45,6 +45,13 @@ spec: name: {{ include "openab.agentFullname" $d }} key: discord-bot-token {{- end }} + {{- if and ($cfg.stt).enabled ($cfg.stt).apiKey }} + - name: STT_API_KEY + valueFrom: + secretKeyRef: + name: {{ include "openab.agentFullname" $d }} + key: stt-api-key + {{- end }} - name: HOME value: {{ $cfg.workingDir | default "/home/agent" }} {{- range $k, $v := $cfg.env }} diff --git a/charts/openab/templates/secret.yaml b/charts/openab/templates/secret.yaml index fd090208..2cdd27c8 100644 --- a/charts/openab/templates/secret.yaml +++ b/charts/openab/templates/secret.yaml @@ -14,6 +14,9 @@ metadata: type: Opaque data: discord-bot-token: {{ $cfg.discord.botToken | b64enc | quote }} + {{- if and ($cfg.stt).enabled ($cfg.stt).apiKey }} + stt-api-key: {{ $cfg.stt.apiKey | b64enc | quote }} + {{- end }} {{- end }} {{- end }} {{- end }} diff --git a/charts/openab/values.yaml b/charts/openab/values.yaml index 22b7a255..01be5561 100644 --- a/charts/openab/values.yaml +++ b/charts/openab/values.yaml @@ -69,6 +69,11 @@ agents: reactions: enabled: true removeAfterReply: false + stt: + enabled: false + apiKey: "" + model: "whisper-large-v3-turbo" + baseUrl: "https://api.groq.com/openai/v1" persistence: enabled: true storageClass: "" From 0968cc1723c5c6503cb7f34bd1d5632dc3a8b6ed Mon Sep 17 00:00:00 2001 From: openab-bot Date: Sat, 11 Apr 2026 22:06:11 +0000 Subject: [PATCH 2/4] docs: add Helm chart deployment section to stt.md --- docs/stt.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/stt.md b/docs/stt.md index 1eea3978..157b6f66 100644 --- a/docs/stt.md +++ b/docs/stt.md @@ -125,6 +125,26 @@ base_url = "http://192.168.1.100:8080/v1" - **Ollama** — does not expose an `/audio/transcriptions` endpoint. +## Helm Chart (Kubernetes) + +When deploying via the openab Helm chart, STT is a first-class config block — no manual configmap patching needed: + +```bash +helm upgrade openab openab/openab \ + --set agents.kiro.stt.enabled=true \ + --set agents.kiro.stt.apiKey=gsk_xxx +``` + +The API key is stored in a K8s Secret and injected as an env var (never in plaintext in the configmap). You can also customize model and endpoint: + +```bash +helm upgrade openab openab/openab \ + --set agents.kiro.stt.enabled=true \ + --set agents.kiro.stt.apiKey=gsk_xxx \ + --set agents.kiro.stt.model=whisper-large-v3-turbo \ + --set agents.kiro.stt.baseUrl=https://api.groq.com/openai/v1 +``` + ## Disabling STT Omit the `[stt]` section entirely, or set: From a69b1d869ac860e64f36b1881447e7923ff5dd78 Mon Sep 17 00:00:00 2001 From: openab-bot Date: Sat, 11 Apr 2026 22:07:41 +0000 Subject: [PATCH 3/4] docs: mention STT support in README with link to docs/stt.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3a3b2fc6..772f5f72 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ A lightweight, secure, cloud-native ACP harness that bridges Discord and any [Ag - **Session pool** — one CLI process per thread, auto-managed lifecycle - **ACP protocol** — JSON-RPC over stdio with tool call, thinking, and permission auto-reply support - **Kubernetes-ready** — Dockerfile + k8s manifests with PVC for auth persistence +- **Voice message STT** — auto-transcribes Discord voice messages via Groq, OpenAI, or local Whisper server ([docs/stt.md](docs/stt.md)) ## Quick Start From 3b18be028568a9170af2d332eb387ae6c27916ce Mon Sep 17 00:00:00 2001 From: openab-bot Date: Sat, 11 Apr 2026 22:11:08 +0000 Subject: [PATCH 4/4] fix(helm): fail fast when stt.enabled=true but apiKey is empty --- charts/openab/templates/configmap.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/charts/openab/templates/configmap.yaml b/charts/openab/templates/configmap.yaml index 69ab02da..194d8c25 100644 --- a/charts/openab/templates/configmap.yaml +++ b/charts/openab/templates/configmap.yaml @@ -41,6 +41,9 @@ data: enabled = {{ ($cfg.reactions).enabled | default true }} remove_after_reply = {{ ($cfg.reactions).removeAfterReply | default false }} {{- if ($cfg.stt).enabled }} + {{- if not ($cfg.stt).apiKey }} + {{ fail (printf "agents.%s.stt.apiKey is required when stt.enabled=true" $name) }} + {{- end }} [stt] enabled = true