📋 Prerequisites
📝 Feature Summary
Allow the Go (ADK) runtime agent image to be configured independently, instead of deriving its repository from the Python agent image repository.
❓ Problem Statement / Motivation
When a declarative Agent uses spec.declarative.runtime: go, the controller does not read a dedicated image setting for the Go runtime. Instead it derives the Go repository from the configured Python repository (controller.agentImage.repository, surfaced as IMAGE_REPOSITORY) by replacing the last path segment with golang-adk.
This derivation breaks for any registry layout where the Python image repository is a flat name (org/namespace carried in the registry, not in the repository path) — a very common pattern for mirrored/proxy registries.
We would like to mirror the images in our registry, using a consistent name prefix kagent-. This is currently not configurable.
💡 Proposed Solution
Add a dedicated, independent image configuration for the Go runtime — mirroring how the Python agent image and skills-init image are already configured — instead of deriving it.
Concretely:
- New Helm values, e.g.
controller.goAgentImage.{registry,repository,tag,pullPolicy}, defaulting to today's derived behavior so existing setups don't change.
- New controller config keys surfaced from those values, e.g.
GO_IMAGE_REGISTRY / GO_IMAGE_REPOSITORY / GO_IMAGE_TAG (parallel to the existing IMAGE_* and SKILLS_INIT_IMAGE_* keys in the kagent-controller ConfigMap).
getRuntimeImageRepository uses the explicit Go repository when set, and only falls back to the current derive-from-Python logic when it is not — preserving backward compatibility.
This makes the Go runtime image a first-class, configurable input rather than a value inferred from an unrelated repository's path structure.
🔄 Alternatives Considered
- Mirror the Go image as plain
golang-adk to match what the controller derives. Works as an immediate unblock, but forces an inconsistent naming exception for this one image and doesn't fix the underlying assumption for other registry layouts.
- Restructure
controller.agentImage.repository into a path form (e.g. kagent/app) so the last-segment replacement yields kagent/golang-adk. Still cannot produce a hyphen-prefixed flat name like kagent-golang-adk, and changes the Python image path as a side effect.
- Make the derivation prefix-aware (preserve a
kagent--style prefix when replacing the suffix). Fragile — it bakes one naming convention into the controller. Explicit configuration is more general and predictable.
🎯 Affected Service(s)
Controller Service
📚 Additional Context
- Source:
go/core/internal/controller/translator/agent/deployments.go (getRuntimeImageRepository).
- Existing comparable configuration that this would follow:
controller.agentImage.* and controller.skillsInitImage.* → IMAGE_* / SKILLS_INIT_IMAGE_* keys in helm/kagent/templates/controller-configmap.yaml.
- Observed on kagent
0.9.6.
🙋 Are you willing to contribute?
📋 Prerequisites
📝 Feature Summary
Allow the Go (ADK) runtime agent image to be configured independently, instead of deriving its repository from the Python agent image repository.
❓ Problem Statement / Motivation
When a declarative
Agentusesspec.declarative.runtime: go, the controller does not read a dedicated image setting for the Go runtime. Instead it derives the Go repository from the configured Python repository (controller.agentImage.repository, surfaced asIMAGE_REPOSITORY) by replacing the last path segment withgolang-adk.This derivation breaks for any registry layout where the Python image repository is a flat name (org/namespace carried in the registry, not in the repository path) — a very common pattern for mirrored/proxy registries.
We would like to mirror the images in our registry, using a consistent name prefix
kagent-. This is currently not configurable.💡 Proposed Solution
Add a dedicated, independent image configuration for the Go runtime — mirroring how the Python agent image and skills-init image are already configured — instead of deriving it.
Concretely:
controller.goAgentImage.{registry,repository,tag,pullPolicy}, defaulting to today's derived behavior so existing setups don't change.GO_IMAGE_REGISTRY/GO_IMAGE_REPOSITORY/GO_IMAGE_TAG(parallel to the existingIMAGE_*andSKILLS_INIT_IMAGE_*keys in thekagent-controllerConfigMap).getRuntimeImageRepositoryuses the explicit Go repository when set, and only falls back to the current derive-from-Python logic when it is not — preserving backward compatibility.This makes the Go runtime image a first-class, configurable input rather than a value inferred from an unrelated repository's path structure.
🔄 Alternatives Considered
golang-adkto match what the controller derives. Works as an immediate unblock, but forces an inconsistent naming exception for this one image and doesn't fix the underlying assumption for other registry layouts.controller.agentImage.repositoryinto a path form (e.g.kagent/app) so the last-segment replacement yieldskagent/golang-adk. Still cannot produce a hyphen-prefixed flat name likekagent-golang-adk, and changes the Python image path as a side effect.kagent--style prefix when replacing the suffix). Fragile — it bakes one naming convention into the controller. Explicit configuration is more general and predictable.🎯 Affected Service(s)
Controller Service
📚 Additional Context
go/core/internal/controller/translator/agent/deployments.go(getRuntimeImageRepository).controller.agentImage.*andcontroller.skillsInitImage.*→IMAGE_*/SKILLS_INIT_IMAGE_*keys inhelm/kagent/templates/controller-configmap.yaml.0.9.6.🙋 Are you willing to contribute?