Repository navigation
feat: ship the kagent-tools skills with a k8s-agent, and add skills to the agent template form - #3554
danielle-mustillo wants to merge 7 commits into
Conversation
819f7ed to
29f2818
Compare
29f2818 to
eb66003
Compare
…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>
eb66003 to
543e5fc
Compare
Signed-off-by: Danielle Mustillo <danielle.mustillo@solo.io>
pr3554-reel.mp4ScreenshotsWritten by 🤖 |
Charlesthebird
left a comment
There was a problem hiding this comment.
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-valuesfrom a release withoutbuiltins: every read goes throughdigon.Values.AsMap - ✅
global.imageRegistry: the catalog andk8s-agentboth 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
- ✅
pluginsandpromptTemplateon save:specFromDraftreplaces onlyspec.skills - ✅
KAGENT_UI_BUILTIN_SKILLSescaping through the entrypoint intoJSON.parse - ✅ CI: only the Harness named
kagentclashes with the lifecycle suite, andk8s-agentdrops out with kagent-tools off - ✅ Default
s3://ate-snapshots/kagent/matches the RustFS store insetup-cluster.sh - ✅ No internal brand terms in the diff
Written by 🤖
| 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>.`); | ||
| } |
There was a problem hiding this comment.
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.
| 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 🤖
There was a problem hiding this comment.
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)
|
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>






![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
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
builtinsvalues group gives a new install a starting point:builtins.harness: a Go ADK Harness namedkagenton the chart's worker pool.builtins.k8sAgent: an Agent namedk8s-agenton that Harness. It uses the kagent-tools Kubernetes tools and thek8s-troubleshootingskill. Tools that change the cluster wait for approval.builtins.skills: the skills the UI offers.builtins.skills.imagewithbuiltins.skills.listoffers skills from another image instead.builtins.enabled: falseturns all three off. Each also has its ownenabled.The Harness and the Agent need
substrateWorkerPool.create, whichkagent installsets.Skills come from kagent-tools. kagent does not build a skills image of its own.
k8s-troubleshooting,helm-release-managementandistio-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.jsonholds the list and the kagent-tools image pinned by digest.make builtin-skills-catalogregenerates it from the image.KAGENT_UI_BUILTIN_SKILLS.global.imageRegistrymirrors the image.Skills in the agent template form.
spec.skills. The form rejects what the CRD or the runtime would reject, and each message names the skill.pluginsandpromptTemplate, which the form does not show, are kept on save.Limits
helm upgrade --reuse-valuesfrom an older release keeps the old chart's defaults, which have nobuiltinsvalues. The chart then renders no built-ins instead of failing.--reset-then-reuse-valuespicks up the new defaults and turns them on.builtins.harness.enabled: false, because the lifecycle suite applies its own Harness namedkagent. CI also turns kagent-tools off, so CI does not runk8s-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.k8s-agentis Ready with its skill fromghcr.io/kagent-dev/kagent/tools@sha256:607cb0ac…. Asked about a crash-looping pod, it calledload_skillfork8s-troubleshootingand got the kagent-tools text back.builtins.enabled=falseremoved the Harness, the Agent and the UI skill list. Turning it back on restored them, andk8s-agentbecame Ready again.--reuse-valuessucceeded with no built-ins. A following--reset-then-reuse-valuesupgrade brought them back, andk8s-agentbecame Ready.