agent-platform release v3.21.0

Added

  • llmRouting (default enabled: false) in both charts: agent inference traffic through the installation’s agentgateway, so the data plane emits GenAI metrics — tokens by type, cost in USD, request duration, time to first token — for every model call. An installation that sets nothing renders byte-identically (the golden check pins this). When on, the connectivity chart renders an llm listener on the data-plane Gateway (llmRouting.listener, default port 8081), an AgentgatewayBackend for the provider, an HTTPRoute pinned to that listener by sectionName and matching the provider path prefixes (llmRouting.pathPrefixes, default /v1) so it outranks the agent-platform-mcps catch-all route, which attaches to every listener of the same Gateway and wins an equal match, one Gateway-scoped AgentgatewayPolicy carrying the route-type map (llmRouting.routes) and the agent attribution labels (llmRouting.metricLabels), and the model-price ConfigMap (llmRouting.modelCatalog) that the Gateway’s AgentgatewayParameters references. The gateway holds no provider credential: agent pods keep their own key and the client x-api-key header passes through, so reach to the listener grants no spend. Turning the listener on routes nothing by itself — the cutover is a second value, kagent.providers.anthropic.config.baseUrl, and rollback is its removal. The render fails when llmRouting.enabled is true without the agentgateway data plane, when the listener port collides with an existing one, or when llmRouting.pathPrefixes is empty or contains a bare /. See the connectivity chart README for the rollout.
  • A PodMonitor for the agentgateway data plane, gated on the agentgateway component and the shared metrics helper — not on llmRouting.enabled, so the MCP path is scraped too and the monitor exists before an LLM cutover. The data plane serves Prometheus text on pod port 15020; the controller-provisioned Service exposes listener ports only, so a ServiceMonitor would match nothing. It carries the same tenant label as the kagent ServiceMonitor, which alloy-metrics discovers monitors by.
  • kagent.modelConfigs[].baseUrl (optional): sends a chart-owned ModelConfig’s traffic through the LLM listener. Without it an extra ModelConfig calls the provider directly and its usage is unmetered.