Skip to content

feat: ship the kagent-tools skills with a k8s-agent, and add skills to the agent template form - #3554

Open
danielle-mustillo wants to merge 7 commits into
mainfrom
danielle-mustillo/k8s-agent-skills
Open

danielle-mustillo wants to merge 7 commits into
mainfrom
danielle-mustillo/k8s-agent-skills

Conversation

@danielle-mustillo

@danielle-mustillo danielle-mustillo commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Why

A new kagent install has no example agent and no skills to start from, and the UI has no way to add a skill to an agent. Today skills can only be set with kubectl.

What changed

Built-ins in the chart. A new builtins values group gives a new install a starting point:

  • builtins.harness: a Go ADK Harness named kagent on the chart's worker pool.
  • builtins.k8sAgent: an Agent named k8s-agent on that Harness. It uses the kagent-tools Kubernetes tools and the k8s-troubleshooting skill. Tools that change the cluster wait for approval.
  • builtins.skills: the skills the UI offers. builtins.skills.image with builtins.skills.list offers skills from another image instead.
  • builtins.enabled: false turns all three off. Each also has its own enabled.

The Harness and the Agent need substrateWorkerPool.create, which kagent install sets.

Skills come from kagent-tools. kagent does not build a skills image of its own.

  • The kagent-tools dependency goes from 0.3.0 to 0.3.1, the first release that ships skills, so the skills match the tool server the chart deploys.
  • The UI offers three of them: k8s-troubleshooting, helm-release-management and istio-traffic-debugging. The image's other skills need Argo Rollouts, Cilium, Kubescape or Prometheus, so the list leaves them out.
  • helm/kagent/files/builtin-skills.json holds the list and the kagent-tools image pinned by digest. make builtin-skills-catalog regenerates it from the image.
  • The chart passes the list to the UI as KAGENT_UI_BUILTIN_SKILLS. global.imageRegistry mirrors the image.

Skills in the agent template form.

  • A user can pick a built-in skill, or add their own from an OCI image (pinned by digest), Git (URL and full commit) or S3 (with object version), with an optional path.
  • Saving writes spec.skills. The form rejects what the CRD or the runtime would reject, and each message names the skill.
  • A built-in skill saved from an older kagent-tools image shows "Older version" and an Update button.
  • plugins and promptTemplate, which the form does not show, are kept on save.

Limits

  • A Git or S3 skill source keeps an Agent from becoming Ready until fix(substrate): let the golden actor fetch git and S3 skill sources #3435 merges. The form offers them anyway.
  • A skill only names tools. An Agent a user builds must also bind the tools its skills use.
  • helm upgrade --reuse-values from an older release keeps the old chart's defaults, which have no builtins values. The chart then renders no built-ins instead of failing. --reset-then-reuse-values picks up the new defaults and turns them on.
  • CI e2e sets builtins.harness.enabled: false, because the lifecycle suite applies its own Harness named kagent. CI also turns kagent-tools off, so CI does not run k8s-agent.

Testing

  • helm unittest helm/kagent: 378 tests pass.
  • yarn typecheck, vitest (810 tests), the UI entrypoint Go tests and the mock Playwright agent-templates journey pass.
  • On a Kind cluster running this chart:
    • The UI serves the three skills, and the agent template form lists them.
    • k8s-agent is Ready with its skill from ghcr.io/kagent-dev/kagent/tools@sha256:607cb0ac…. Asked about a crash-looping pod, it called load_skill for k8s-troubleshooting and got the kagent-tools text back.
    • builtins.enabled=false removed the Harness, the Agent and the UI skill list. Turning it back on restored them, and k8s-agent became Ready again.
    • An upgrade from main with --reuse-values succeeded with no built-ins. A following --reset-then-reuse-values upgrade brought them back, and k8s-agent became Ready.

@github-actions github-actions Bot added the enhancement New feature or request label Nov 6, 2026
@danielle-mustillo
danielle-mustillo force-pushed the danielle-mustillo/k8s-agent-skills branch from 819f7ed to 29f2818 Compare November 6, 2026 14:37
@danielle-mustillo danielle-mustillo changed the title feat: ship kagent skills with a k8s-agent, and add skills to the agent template form feat: ship the kagent-tools skills with a k8s-agent, and add skills to the agent template form Nov 6, 2026
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Nov 6, 2026
@danielle-mustillo
danielle-mustillo force-pushed the danielle-mustillo/k8s-agent-skills branch from 29f2818 to eb66003 Compare November 6, 2026 15:09
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Nov 6, 2026
…ols skills

The chart now creates a default Go ADK Harness and a k8s Agent on it. The
Agent uses the kagent-tools Kubernetes tools, with tools that change the
cluster behind approval, and the k8s-troubleshooting skill.

The skill comes from the kagent-tools image that the chart already deploys.
The chart packages files/builtin-skills.json, which pins that image by
digest and lists the skills in it. make builtin-skills-catalog regenerates
the file from the image. Bump kagent-tools to 0.3.1, the release that ships
the skills.

Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
The UI ConfigMap passes the catalog as KAGENT_UI_BUILTIN_SKILLS, so the UI
can offer the built-in skills when a user builds an agent.

Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
The UI image writes KAGENT_UI_BUILTIN_SKILLS into env-config.js as
BUILTIN_SKILLS, and runtimeConfig parses it into a typed catalog. A
missing or invalid catalog means the UI offers no built-in skills.

Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
A user building an agent can now add one of the built-in skills or their
own skill from an OCI image, a Git commit or an S3 object version. The
form owns spec.skills and checks the same rules as the CRD. A row that
holds a built-in skill unchanged shows as a kagent skill with its
description. The mock backend serves a built-in catalog, and the agent
templates journey adds both kinds of skill and reads them back.

Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
…roller

A live spec builds an AgentTemplate with a kagent skill and an OCI, a Git
and an S3 skill through the form. It reads spec.skills back from the
controller, keeps them through an edit, and refuses a short Git commit and
a name with a slash. A second test builds an Agent with only the kagent
skill and checks in chat that load_skill returns the skill's text.

Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
@danielle-mustillo
danielle-mustillo force-pushed the danielle-mustillo/k8s-agent-skills branch from eb66003 to 543e5fc Compare November 6, 2026 15:20
@github-actions github-actions Bot added enhancement New feature or request and removed enhancement New feature or request labels Nov 6, 2026
Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
@danielle-mustillo

danielle-mustillo commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor Author
  • Agent template form: before, there is no way to add a skill. After, a Skills field adds a built-in kagent skill (k8s-troubleshooting) from the chart's catalog, or your own OCI, Git or S3 skill.
  • Agent template details: before, a template's skills are hidden behind a notice saying to use kubectl. After, each skill is listed with its full source.
  • Fresh Helm install: before, there is no Harness and no Agent. After, the chart ships Harness kagent and a Ready k8s-agent with the k8s-troubleshooting skill from the kagent-tools image.
pr3554-reel.mp4

Screenshots

Before: new template form has no Skills field before-template-form-skills
After: Skills field with a kagent skill after-template-form-skills
Before: template's skills hidden behind a notice before-template-details-skills
After: template details list both skills in full after-template-details-skills

Written by 🤖

@danielle-mustillo
danielle-mustillo marked this pull request as ready for review November 6, 2026 16:12
@danielle-mustillo
danielle-mustillo requested a review from a team as a code owner November 6, 2026 16:12
Charlesthebird

This comment was marked as outdated.

@Charlesthebird Charlesthebird left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This automated review is a first pass. A manual review will follow once the blockers are addressed.


Nothing blocks merge. One non-blocking gap: the skill form accepts an OCI image the controller rejects.

✅ What I checked
  • ✅ --reuse-values from a release without builtins: every read goes through dig on .Values.AsMap
  • ✅ global.imageRegistry: the catalog and k8s-agent both use the mirrored image, so "Older version" compares like with like
  • ✅ Git, S3, path, 50-skill limit and duplicate-name checks against the v1alpha3 CRD and the translator
  • ✅ plugins and promptTemplate on save: specFromDraft replaces only spec.skills
  • ✅ KAGENT_UI_BUILTIN_SKILLS escaping through the entrypoint into JSON.parse
  • ✅ CI: only the Harness named kagent clashes with the lifecycle suite, and k8s-agent drops out with kagent-tools off
  • ✅ Default s3://ate-snapshots/kagent/ matches the RustFS store in setup-cluster.sh
  • ✅ No internal brand terms in the diff

Written by 🤖

Comment on lines +435 to +437
if (draft.sourceKind === "oci" && !OCI_DIGEST_REF.test(source.oci ?? "")) {
problems.push(`${label} needs an OCI image pinned by digest, like ghcr.io/org/skills@sha256:<64 hex characters>.`);
}

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Level: 🟠 Medium · Not Blocking

The controller parses this with name.NewDigest (skills.go#L71), so ghcr.io/MyOrg/skills@sha256:… saves here but the Agent never becomes Ready.

Suggested change
if (draft.sourceKind === "oci" && !OCI_DIGEST_REF.test(source.oci ?? "")) {
problems.push(`${label} needs an OCI image pinned by digest, like ghcr.io/org/skills@sha256:<64 hex characters>.`);
}
if (draft.sourceKind === "oci" && !OCI_DIGEST_REF.test(source.oci ?? "")) {
problems.push(`${label} needs an OCI image pinned by digest, like ghcr.io/org/skills@sha256:<64 hex characters>.`);
} else if (draft.sourceKind === "oci" && /[A-Z]/.test((source.oci ?? "").split("@")[0])) {
problems.push(`${label} needs an image name in lowercase.`);
}

Written by 🤖

@Charlesthebird Charlesthebird left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On second review, this LGTM overall. Couple notes:

  • Could /improve-ui for both of these areas. Specifically, it could be clearer what skill the delete button is for, and the link could look more like a link.
Image Image

Comment thread helm/kagent/templates/k8s-agent.yaml Outdated

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For this, would there be another agent for the built in skills like "helm-release-management" or other skills from istio-traffic-debugging?

Maybe we could start with this and then add other agents for those other groups of skills (for example the argo-rollouts or other agents from v0.x)

Comment thread ui/entrypoint/main.go Resolved
@iplay88keys
iplay88keys self-requested a review November 9, 2026 22:18
@younsl

younsl commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

The kagent-tools bump to 0.3.1 in this PR also fixes a downgrade for users upgrading from 0.10.x. The v0.10.6 chart depends on kagent-tools 0.3.1, while v1.0.0 pins 0.3.0, so moving from 0.10.6 to 1.0.0 rolls kagent-tools back.

Keeping this dependency on the latest tools release matters because operational fixes land there. For example, kagent-dev/tools#84 (the Streamable HTTP server leaking heap on every MCP initialize request) was fixed in 0.3.0 by kagent-dev/tools#85. Users only get fixes like that without overriding the subchart when the chart tracks the current release.

Changes between kagent-tools 0.3.0 and 0.3.1:

If the rest of this PR needs more review time, landing the dependency bump on its own would keep the next 1.0.x release from shipping the older tools chart.

- k8s-agent is now an AgentTemplate plus an Agent that references it.
- platform-agent is a second example Agent with the k8s, Helm, Istio and
  Argo Rollouts skills and their tools; tools that change things need approval.
- The UI skill catalog also offers Argo Rollouts and Kubescape, and offers
  Prometheus only when kagent-tools.tools.prometheus.url is an http(s) URL.
- The built-in agents render from builtin-agents.yaml and the Harness from
  builtin-harness.yaml.

Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
@blacksmith-sh

blacksmith-sh Bot commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

Found 2 test failures on Blacksmith runners:

Failures

Test View Logs
github.com/kagent-dev/kagent/go/core/test/upgrade/TestUpgrade View Logs
github.com/kagent-dev/kagent/go/core/test/upgrade/TestUpgrade/upgrade_to_current_build View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants