feat: install an unreleased chart (platform.apsPath) and route agent inference through agentgateway (platform.llmRouting) - #52
Open
paurosello wants to merge 1 commit into
Open
Conversation
…inference through agentgateway (platform.llmRouting) The lab could not test an unreleased chart change at all. Every hop of the delivery chain consumes a released artifact: agent-platform-connectivity is published to gsoci, agent-platform-standalone generates its whole chart from that release, and this lab vendors agent-platform-standalone from git at platform.apsRef. So the platform change most worth testing — the one not yet shipped — was the one change the lab could not install. platform.apsPath closes the last hop: it installs a local agent-platform-standalone checkout instead of the pinned commit, skipping the fetch and only building the chart's dependencies. The checkout is read, never written (helm fills its gitignored charts/). apsRepo/apsRef are ignored while it is set and the boot says which chart it used. `agentlab configure --defaults --aps-path <dir>` sets it, `--aps-path ""` clears it. The standalone side of the same gap is `hack/curate.sh -fleet-dir` (giantswarm/agent-platform-standalone#93); together they are the loop: curate there, install here. The first thing tested through that loop is platform.llmRouting: agent inference stops leaving the agent pods for api.anthropic.com and goes through the platform's own agentgateway, so the data plane emits GenAI metrics for every model call. One toggle renders both halves — the cluster-internal `llm` listener on the edge Gateway, and the base URL kagent's default ModelConfig dials — because a listener nothing uses and agents pointed at a closed port are both broken labs. The port is one constant, written into the listener and into that URL, so the pair cannot drift; it has nothing to do with platform.agentsPort, the HOST port for the kagent UI. Off by default: the chart change is unreleased, and the released umbrella's values.schema.json rejects an undeclared top-level key outright, so a block emitted by default would fail every install (HACKS.md U13). It needs platform.agents, since the cutover is a kagent ModelConfig. Verified on the lab: the listener answers a real completion, and after one agent turn the lab Prometheus serves agentgateway_gen_ai_client_token_usage_sum and agentgateway_gen_ai_client_cost_usd_total keyed by agent="<serviceaccount>", agent_namespace="kagent", with agentgateway_cost_catalog_lookups_total{status="Exact"} growing.
paurosello
force-pushed
the
llm-routing-local-chart
branch
from
September 3, 2026 08:15
926ee13 to
77b1d59
Compare
This was referenced Sep 3, 2026
Closed
This was referenced Sep 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The lab could not test an unreleased chart change at all. Every hop of the
delivery chain consumes a released artifact:
agent-platform-connectivityispublished to gsoci,
agent-platform-standalonegenerates its whole chart fromthat release, and this lab vendors
agent-platform-standalonefrom git atplatform.apsRef. So the platform change most worth testing — the one not yetshipped — was the one change the lab could not install.
platform.apsPathInstalls a local
agent-platform-standalonecheckout instead of the pinnedcommit:
ensurePlatformChartskips the fetch and only builds the chart'sdependencies. The checkout is read, never written (helm fills its gitignored
charts/).apsRepo/apsRefare ignored while it is set and the boot sayswhich chart it used.
--aps-path ""clears it. Theagent-platform-standaloneside of the samegap is
hack/curate.sh -fleet-dir(giantswarm/agent-platform-standalone#93); together they are the loop: curate
there, install here.
platform.llmRoutingThe first thing tested through that loop. Agent inference stops leaving the
agent pods for
api.anthropic.comand goes through the platform's ownagentgateway, so the data plane emits GenAI metrics for every model call.
One toggle renders both halves — the cluster-internal
llmlistener on theedge Gateway, and the base URL kagent's default ModelConfig dials — because a
listener nothing uses and agents pointed at a closed port are both broken
labs. The port is one constant, written into the listener and into that URL,
so the pair cannot drift. It has nothing to do with
platform.agentsPort, theHOST port for the kagent UI.
Off by default: the chart change is unreleased
(giantswarm/agent-platform#254), and the released umbrella's
values.schema.jsonrejects an undeclared top-level key outright, so a blockemitted by default would fail every install (HACKS.md U13). It needs
platform.agents, since the cutover is a kagent ModelConfig.Verified on the lab
The listener answers a real completion, and after one agent turn the lab
Prometheus serves, through the edge:
agentlab platform-testpasses with routing on. The same run caught a routingbug in giantswarm/agent-platform#254 (the
agent-platform-mcpscatch-allHTTPRoute outranked the LLM route on its own listener, so every inference call
answered
mcp: client must accept both application/json and text/event-stream), fixed on that PR — which is what this loop is for.