AI Agents

  • Fixed

    • auth://status no longer points SSO servers in reauth_required at core_auth_login. A token-forwarding or token-exchange server whose SSO attempt failed read reauth_required with auth_tool: core_auth_login, but core_auth_login refuses every SSO server, so a client that followed the field got an error and used up its login attempts. auth_tool is now set only for servers that are not SSO, whatever their status, which matches list_tools’ servers_requiring_auth. For an SSO server in reauth_required, the fix is to re-authenticate to muster, and sso_attempt_failed and error say why. (#1000)
  • Fixed

    • The sign-in pages no longer send portal users back to an IDE. The OAuth proxy’s pages ended with “Please return to your IDE and try again” and “Retry the previous command to continue”, but the Backstage portal starts the same flow in a browser tab. They now say to close the window and go back to where the sign-in started. A sign-in link opened after its state expired (10 minutes) or was already used said “Authentication session expired. Please try again”, and opening the same link again kept failing. It now says the link has expired and that a new sign-in is needed. (#1127)
  • Added

    • qwen3-5-4b-hf: Qwen3.5 4B from the Hugging Face Hub on one 24 GB GPU (giantswarm/model-manager#98, #106; epic giantswarm/giantswarm#37639). This is the qwen3-5-4b recipe (arguments, resources, fit 9 + 6 GiB) with storageUri: hf://Qwen/Qwen3.5-4B in place of the signed model image. Every other preset that fits a 24 GB card ships as an oci:// model image, which pull_model refuses by design, so the Hub download Job, the model cache claim and a predictor starting from the cache could not run on the smallest GPU pool. An installation serves qwen3-5-4b. verify-gpu-pool leaves a preset added to or retired from the line-up out of its comparison with the golden ref.
  • Removed

    • Kubernetes ServiceAccount-token trust. muster is not a gateway for ServiceAccount tokens: callers present a Dex ID token, which muster forwards or exchanges. oauth.server.trustedIssuers[].allowedClaims, added to pin a system:serviceaccount:<namespace>:* subject for the retired kagent ServiceAccount-token bridge, is removed from the config and the chart values, as are the ServiceAccount examples in the config reference and the values, and the ServiceAccount identities in the tests. A config that still sets allowedClaims has it ignored: remove any ServiceAccount issuer from trustedIssuers before upgrading. trustedIssuers is documented as the list of Dex issuers muster accepts; the config reference now lists allowPrivateIPJWKSHosts, subjectClaim and acceptedTypHeaders. (#1349)
  • Added

    • (model-serving) The pre-pull waits for the GPU to be usable in #742 by @teemow

    Full Changelog: https://github.com/giantswarm/agent-platform/compare/v4.97.0...v4.98.0

  • Added

    • model-manager’s egress opens GitHub’s API with commit mode on. With model-manager.github.enabled, which pins the MCPServer to the GitHub App giantswarm-model-manager, the connectivity chart’s Cilium egress policy for model-manager adds api.github.com on 443. model-manager needs it for GET /user and for the pull request it opens as the person. agent-manager’s default egress already names it. The kubernetes flavor already opens 443 to public destinations while OAuth is on. Off, the default, nothing changes. make verify-managers asserts both.
  • Fixed

    • modelServing.imageVerification admits images signed by a scheduled CircleCI pipeline (giantswarm/agent-platform#740). A pipeline a legacy scheduled trigger starts has no pipeline definition, so its signing certificate’s subject ends in pipeline-definitions/nil. retagger’s nightly mirror run signs so, the storage-initializer every hf:// preset starts with among its images, and the default subjectRegExp accepted a UUID only: Kyverno denied every hf:// predictor pod (no matching signatures found). The default of both charts is now ^https://circleci\.com/api/v2/projects/[a-f0-9-]+/pipeline-definitions/([a-f0-9-]+|nil)$. make verify-model-serving-policies asserts it admits both subjects and keeps out null, a trailing path, a nil project and another host. An installation that sets its own attestors is unchanged.
  • Changed

    • nemotron-3-super-nvfp4 serves with CUDA graphs: --enforce-eager is gone from its arguments (giantswarm/giantswarm#37941). Measured on one DGX Spark (128 GB unified memory) with the preset’s other arguments unchanged, 134 requests, no error: a single stream decodes at 15.7 instead of 15.1 tok/s, aggregate throughput at 8 to 32 concurrent requests is unchanged (57, 81, 114 tok/s), and the time to first token drops by 10–15 % for short prompts and by 29 % for 5.8k-token prompts (3.3 to 2.3 s). Split across two Sparks the gain is larger: 16.3 to 26.3 tok/s single stream once the tensor-parallel all-reduce also runs over RoCE. The costs: the captured graph pool (2.2 GiB) counts inside --gpu-memory-utilization=0.72, so one node keeps 287k instead of 372k KV-cache tokens (35 full 8k contexts), and a start takes about 40 seconds longer on one node (torch.compile 18 s, cached on the model cache claim for the next pod, and 24 s of graph capture), next to the 6 minutes of weight loading. The tool-calling turn with the qwen3_coder parser passes unchanged.
  • Fixed

    • The kagent controller board’s Error ratio and Streams / s panels (giantswarm/agent-platform#732). Both exprs carried an escaped quote inside a label matcher (code!=\"OK\", rpc_type=\"stream\"), which Mimir refuses, so the two stats showed an error on every installation. Error ratio also reads 0 instead of no data while every request answers OK. make verify-dashboards fails on an escaped quote in any board.
  • Fixed

    • atelet no longer evicts the cluster’s workloads: substrate.atelet.priorityClass.preemptionPolicy: Never and components.substrate{,-crds}.versionRange is >=1.1.3 <1.2.0 (giantswarm/agent-platform#731). atelet ran on the PriorityClass ate-node-critical (value 1000000000, PreemptLowerPriority), so a first enable over nodes without room for its 50m CPU / 128Mi evicted whatever the cluster already ran: monitoring, admission webhooks. The Substrate line’s 1.1.3 takes the policy (giantswarm/substrate#87) and renders the non-preempting class under its own name, ate-node-critical-non-preempting, because a PriorityClass’s preemptionPolicy is immutable. atelet keeps its priority and schedules ahead of every other pending pod, but it evicts nothing and stays Pending on a full node until capacity arrives. make verify-components asserts the forwarded value. The upgrade rolls atelet once onto the new class. The kagent WorkerPool’s worker image follows the floor to ateom-gvisor:1.1.3.