Skip to content

[FEATURE] Make the Go runtime agent image independently configurable #2018

@marians

Description

@marians

📋 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?

  • I am willing to submit a PR for this feature

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels
    No fields configured for Feature.

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions