AI Agents

  • Fixed

    Full Changelog: https://github.com/giantswarm/muster/compare/v5.32.2...v5.32.3

  • Changed

    • agent-manager.agentChart.semver is >=1.0.0 <1.5.0 (was 1.x) (giantswarm/agent#41; epic giantswarm/giantswarm#37705). Generic agent chart 1.5.0 renders no spec.context.compaction on the AgentTemplate: the kagent line from 1.1.0 refuses the field at admission and the platform Harness carries the compaction there. The kagent 1.0 line this release delivers has no other place for it, so an agent rendered by 1.5.0 on a 1.0 installation would run without context compaction. The cap keeps every installation’s agents on 1.4.x until the meta chart moves to the 1.1 lines, where the range becomes >=1.5.0 <2.0.0 together with kagent.harness.compaction. agent-manager composes the range into every agent namespace’s OCIRepository, so the agents’ releases stay where they are and nothing rolls.
  • Changed

    • Substrate’s six metrics endpoints are collected: substrate.metrics.podMonitor (giantswarm/giantswarm#36711). ate-api-server, atelet, atenet-router, atenet-egress, k8s-credential-provider and ate-controller each serve metrics, the fleet’s collector discovers monitors and nothing else, and the chart shipped no monitor, so the whole ate registry was served and thrown away: actor crashes, lifecycle and scheduler durations, checkpoint and restore phases, actor CPU and memory, image-cache hits, worker pool desired against ready, router route duration and parking, and ate-controller’s controller_runtime_* and workqueue_*. The block follows the resolved global.observability.metrics.serviceMonitor.enabled (auto | true | false) and carries observability.giantswarm.io/tenant. The floor 1.0.3 already carries the monitors (giantswarm/substrate#50, upstream kagent-dev/substrate#46, open).
    • The kagent controller’s metrics are collected: kagent.controller.metrics, with the kagent chart’s own ServiceMonitor (giantswarm/giantswarm#36711). The controller served no endpoint before the line’s 1.0.2 (metricsserver.Options{BindAddress: "0"}, which no variable changed, so the METRICS_BIND_ADDRESS this chart set had no effect); from 1.0.2 on it reads METRICS_BIND_ADDRESS and METRICS_SECURE, and the controller-runtime families and the line’s kagent_grpc_server_requests_total / ..._request_duration_seconds reach a scrape. metrics.enabled: true, plain HTTP on :8080 (secureServing: false: the secure endpoint authenticates the scraper with a TokenReview and authorizes it with a SubjectAccessReview, which the fleet’s collector does not do), serviceMonitor.enabled: auto following the resolved global.observability.metrics.serviceMonitor.enabled, the tenant label on the monitor. The floor 1.0.3 carries the keys.

    Removed

    • kagent.serviceMonitor and the connectivity chart’s kagent controller metrics Service and ServiceMonitor (templates/kagent/servicemonitor.yaml; giantswarm/giantswarm#36711). Both were a workaround for a kagent chart that exposed only the API port; the line’s chart ships the metrics Service and its ServiceMonitor since 1.0.2 (kagent.controller.metrics), and keeping ours would have scraped one endpoint twice. An installation that set kagent.serviceMonitor.* drops the key.
  • Fixed

    • The Substrate bootstrap hook’s kubectl container is limited to 256Mi, the connectivity chart’s other hook containers stay at 128Mi (giantswarm/agent-platform#513). The bootstrap script runs up to two kubectl processes at once (kubectl create --dry-run=client | kubectl apply --server-side for actor-id-ca-certs, kubectl into jq for the trust anchors), each some 30 MiB resident, next to jq, the shell and the key candidates on its in-memory /work, all charged to the pod’s memory cgroup. At the shared 128Mi limit the Job’s first pod was OOM-killed on a busy node and the install completed only on the Job’s retry; a hook that exhausts its backoffLimit fails the release. agent-platform.hooks.job takes an optional memory (the main container’s limit, default 128Mi); the bootstrap passes 256Mi. Every request stays 10m/32Mi, the openssl init container keeps 128Mi. make verify-hooks-memory asserts the four hook Jobs’ resources.
  • Fixed

    • A fresh install of the serving slice comes back Ready: components.kserve-runtime-configs.driftDetection ignores the configs’ /spec (giantswarm/agent-platform#508). Once Helm has applied the well-known LLMInferenceServiceConfigs, KServe writes the fields its API types default (spec.model.uri, a port’s protocol and appProtocol, an empty resources, a backendRef’s group) into kserve-config-llm-scheduler and -latency-predictor; helm-controller compared them with the chart’s manifest, corrected them on every reconcile and left the release Ready=Unknown, so a first install (agentlab up, a new slice through cluster-manager) never finished. A config that is gone is still re-created on the next reconcile. make verify-serving-slice asserts the rule.
  • Added

    • model-manager may read a served model’s route list: with the serving slice on, its egress policy (both flavours) reaches the serving namespace’s workload pods on the workload port, and a preset may not turn the route list off (giantswarm/agent-platform#602). model-manager reads a Ready LLMInferenceService’s GET /version and GET /openapi.json to report the API interfaces it answers (giantswarm/model-manager#144); model-manager’s egress policy had no rule into the serving namespace, so under an enforcing policy engine the read was dropped and every served model reported none. The serving namespace’s ingress admits the release namespace on that port already. The render refuses a preset, shipped or under modelServing.presets, whose spec.args carry --disable-fastapi-docs, naming the flag; the preset schema and the README say the interfaces are discovered, never declared. make verify-model-serving-policies and make verify-serving-slice hold both.
  • Added

    • Every emptyDir of a model pod has a sizeLimit (giantswarm/agent-platform#556). The serving policies bound the volumes KServe composes into the pod and into its Deployment’s template — dshm at modelServing.serving.shmSizeLimit (8Gi, room for tensor parallelism), the download’s volume at modelCacheSizeLimit (100Gi) when the cache is off, every other one at emptyDirSizeLimit (1Gi) — so Kyverno’s require-emptydir-requests-and-limits audit no longer reports a served model’s pod and Deployment. A modelCacheSizeLimit below an hf:// preset’s weights fails the render.
  • Fixed

    • A well-known LLMInferenceServiceConfig that went missing is re-created on the release’s next reconcile: components.kserve-runtime-configs.driftDetection.mode: enabled by default (giantswarm/agent-platform#508). The kserve-runtime-configs HelmRelease carried no drift detection, so helm-controller judged it by its Helm storage alone: a slice torn down at once left the ten configs terminating under the llm-d controller’s finalizer, the next install adopted them, the new controller then finished their deletion, and the release stayed “in-sync” with no config behind it — every LLMInferenceService composed from them failed PresetsCombined=False ConfigNotFound until flux reconcile helmrelease kserve-runtime-configs --force. With spec.driftDetection.mode: enabled helm-controller compares the release manifest with the cluster on every reconcile (gitops.interval) and re-applies a missing or changed config as a server-side apply, without a Helm revision. No ignore rule: the configs are configuration only, the controller’s finalizer survives the apply and no webhook mutates them. The third release to carry it, after kagent and muster; the other serving releases keep helm-controller’s default. examples/serving-slice.yaml shows the setting; tests/verify-serving-slice.py asserts it on the slice’s render and on no other release of the slice, tests/verify-kagent-wiring.py adds it to the set of releases that carry drift detection.
  • Fixed

    • (deps) Update module github.com/giantswarm/mcp-toolkit to v0.2.15 in #510 by @renovate[bot]

    Full Changelog: https://github.com/giantswarm/klaus/compare/v0.1.39...v0.1.40

  • Fixed

    Full Changelog: https://github.com/giantswarm/klausctl/compare/v0.4.17...v0.4.18