agent-platform release v4.72.0
Added
- The LLM listener routes by model: every
llmRouting.models entry is an AgentgatewayModel attached directly to the data plane’s LLM listener, and served models join it through the LLMEndpoint document (giantswarm/agent-platform#603). The request’s model picks the model; the default list is anthropic (provider Anthropic, baseURL: https://api.anthropic.com/v1 — agentgateway 2.1 builds the upstream path from the baseURL’s path, and a managed provider without one sends Anthropic /messages —, match: claude-*), credential-free as the AgentgatewayBackend it replaces. The models attach to the Gateway’s llm listener by sectionName, with no HTTPRoute and no path prefix in front: agentgateway 2.1.2 strips the matched PathPrefix of a rule whose backend is the model router, so a route at /v1 handed it /messages, which it proxied as Passthrough with no agentgateway_gen_ai_* token or cost metric, and the Gateway-scoped route-type map overrode its classification for every other path; listener-attached models match the serving endpoints (/v1/messages, /v1/chat/completions, …), which outrank the MCP catch-all. The in-cluster HTTPRoute, the route-type map policy and the llmRouting.pathPrefixes and llmRouting.routes values are gone; ModelConfig base URLs stay the listener’s origin with no path. With LLM routing and a serving model-manager — this release’s serving slice, or a GPU node pool’s, which comes as a second release of the chart with model-manager off — the chart renders the LLMEndpoint document (ConfigMap <name>-llm-endpoint, labelled agent-platform.giantswarm.io/llm-endpoint: "true": parentRefs exactly the provider models’, endpoint the listener’s in-cluster URL, externalEndpoint with the external endpoint), model-manager’s ServiceAccount gets a Role on the release namespace’s agentgatewaymodels and nothing else, and the data plane’s egress reaches the workload pods where model-manager serves (both flavours), so model-manager attaches one AgentgatewayModel per served model under its preset’s name (giantswarm/model-manager#145); the serving slice’s discovery ConfigMap no longer carries spec.llmEndpoint, which a node pool’s topology never rendered. llmRouting.external (off by default) puts the endpoint on https://llm.<global.domain> behind the installation’s API keys (apiKeyAuthentication Strict over one Secret or ConfigMap source) on a route at PathPrefix: / — a root model route, whose hostname outranks the catch-all: on the data plane’s HTTPS listener with the chart’s edge, else on a data-plane listener of its own, llmRouting.external.listener (llm-external, 8082), to which the public Gateway forwards the hostname and which the data-plane network policies admit from the cluster, since the controller refuses a root model route beside directly attached models; every model attaches to it, the LLMEndpoint document names it, and the data plane’s metrics carry each key’s metadata.name as api_key. A key reaches every model until agentgateway enforces allowedModels on the Kubernetes contract (the README says so). Breaking for an installation that set llmRouting.backend, llmRouting.pathPrefixes or llmRouting.routes: the schema refuses them; see UPGRADE.md. verify-llm-routing covers the listener-attached models and their guards (a duplicate name, a wildcard the CRD refuses, an empty list), the absence of the in-cluster route and the routes map, the external route and its listener in both edge shapes, the LLMEndpoint document’s content, the Role and the egress with this release’s slice and a node pool’s, and nothing of it without LLM routing or a serving model-manager.