Typed GPU errors, queue resource caps, partitioned artifacts with lineage, and volumes on every BYOC cluster.

September 2026

🚨 Typed Errors for GPU Capacity and GPU Faults

A parent task can now tell why a GPU sub-action failed and react to it in plain Python.

  • flyte.errors.MaxQueuedTimeExceededError is raised when max_queued_time fires because no GPU could be scheduled. The parent can re-run the task on a different GPU type or queue instead of failing the whole run.
  • flyte.errors.MaxRuntimeExceededError and flyte.errors.DeadlineExceededError are raised for the other timeout bounds.
  • All three timeout errors subclass flyte.errors.TaskTimeoutError, so existing handlers keep working.
  • flyte.errors.GPUFaultUserError is raised for a failure the platform attributes to a workload fault, such as Xid 31.
  • flyte.errors.GPUFaultSystemError is raised for failed hardware, such as an uncorrectable ECC error.
  • Both GPU fault errors carry the Xid number, severity, node, and GPU.
  • flyte.remote.Run.raise_for_status() raises the same typed errors for a whole run launched with flyte.run, so runs compose like sub-actions.

Platform-side GPU fault detection is not yet enabled on Union clusters in this release, so the platform does not raise the two GPU fault errors. The classes are available in the SDK.

See Error handling.

⚙️ Queue Resource Caps and Scheduling Policy

A queue can now cap the resources held by its dispatched, unfinished actions. Once a cap is reached, further actions wait instead of dispatching. An action that asks for more than the cap allows fails immediately with an error that names both.

  • max_resources caps the total CPU, memory, and ephemeral storage.
  • max_accelerators caps in-flight GPUs per accelerator type or class, for example nvidia-h100=8.
  • The scheduling policy decides what happens behind an action that does not fit. strict_fifo holds the line so smaller work cannot starve a large action. greedy_capacity lets smaller work go ahead.
  • Actions that share a reusable environment count once per environment.

Set caps and policy with flyte create queue and flyte update queue. You can also edit the CPU, memory, and storage caps and the policy on the Console queue pages. These pages show live utilization and, for a strict-FIFO queue, the action that is blocking it. flyte get queue --watch shows the same from the CLI.

See Resource caps and scheduling.

⚙️ Cluster Lifecycle

You can now drain, activate, delete, and restore a cluster from the Console or the CLI.

  • Console. An actions menu on the Clusters page and the cluster details page. The Clusters page shows Draining, Drained, Deleting, and Deleted states with a Status filter, and deleted clusters open read-only.
  • CLI. flyte update cluster NAME --drain / --activate, flyte delete cluster, and flyte undelete cluster.
  • Deletion without draining. A cluster no longer has to be drained before deletion. It is marked Deleting, its work moves elsewhere, and it is fully deleted, along with its queue, once cleanup finishes.
  • Draining with apps. Draining is rejected while apps are assigned to the cluster, and the error names them.
  • Audit fields. Clusters, cluster pools, and queues record who created and last updated them, shown in the Console and by flyte get.
  • Pool settings. A cluster can no longer override settings its pool defines. A disagreement appears under Cluster Pool Config.

See Cluster pools.

📦 Artifact Partitions and Lineage

An artifact can now declare a partition schema, with one time partition plus string partitions. Gets, lists, and triggers take partitions into account.

  • The Console adds partition columns and a partition filter to the artifacts list, and a Partitions tab with a time grid to the artifact page.
  • flyte create artifact --partition key=value publishes a partitioned version from the CLI.
  • A version can record the versions it was derived from, including merges of several, and you can follow lineage in both directions.
  • Metadata(version_from_content=True) lets a version opt in to a content-hash name.
  • flyte.artifacts.produces turns another task’s outputs into artifacts from the calling code, without changing the task.
  • Artifact.source_run_url and Artifact.source_action_url link to the run and action that produced an artifact.
  • You can delete versions from the Console, and the Versions tab sorts and filters by creator and metadata label.

See Partitioned artifacts.

🔒 Device Sign-In and Microsoft Accounts

A tool that cannot open a browser can now show a short code that you enter at the Union sign-in page, after you see which application is asking. The flyte CLI uses this to sign in on machines without a browser.

  • Self-serve users can create an account or sign in with a Microsoft work account (Microsoft Entra ID).
  • Workspaces that use SSO only no longer show username and password fields.
  • A user whose identity provider supplies no email address sees guidance and a reference to share with support.

See Authenticating.

✨ Connect Your Own Kubernetes Cluster

For self-serve organizations, the Console takes a Kubernetes cluster you already run from “connect” to a working Union data plane.

  • Connecting a cluster is a single dialog that creates the cluster pool, lists the cloud prerequisites, and gives you the install command.
  • AWS pools take your account ID and Secrets Manager region directly.
  • You can choose the namespace Union installs into (the default is union) and connect more than one cluster.
  • A misconfigured pool fails at registration with a clear reason.
  • A registered cluster shows Setting up while Union installs, and a short guided tour follows your first cluster.

The Console navigation changes too:

  • Home and Overview are now one page.
  • The Documentation link in the navigation bar becomes Help, with FAQs, your support conversations, and bug reports.
  • The Cost page becomes Plan & Invoices.

🌐 Apps Across Multiple Data Planes

Apps can run on several data planes, each under its own DNS name. Opt in per organization, domain, or project with app_dns_strategy=dataplane_specific. By default, apps keep a single shared URL.

To place an app on a named cluster instead of load-balancing across a pool, set cluster on AppEnvironment, or cluster= on flyte.with_servecontext().

🤖 LLM Gateway Updates

The LLM Gateway gains new provider types, guardrails, and a redesigned Console page. LLM Gateway is labeled Preview in the Console.

  • Data plane providers. vLLM and SGLang apps on your data plane can be gateway providers, with per-token pricing.
  • Guardrails. Guardrails check gateway traffic with a guardrail app you deploy, with a timeout and a choice of whether requests proceed when the guardrail is unavailable.
  • Routing. A gateway reaches apps on data planes that use per-project app DNS, and can be pinned to a cluster.
  • Gateway page. The redesigned page shows traffic, how to call the gateway (including through flyte proxy app for gateways behind Union sign-in), providers, guardrails, and settings. You edit them all in one dialog with Save & redeploy.
  • Virtual keys. Keys open in a side panel with usage examples and each key’s requests, errors, and spend over the last 24 hours.
  • Resilience. One unavailable provider no longer takes the gateway down. Existing gateways pick this up when they are redeployed.

✨ Factories

Factories build graphs of partitioned artifacts that are materialized on demand, with source version pinning. A factory can end in a served app and run on triggers: a new source version or a schedule. Factories are labeled Preview in the Console.

See Factories.

✨ Webhooks From Your SaaS Tools

flyte.extras.webhooks receives webhooks in a Flyte app. Provider packages for GitHub, Slack, Linear, ClickUp, and Jira verify each delivery and parse it into a typed event.

  • Slack adds interactivity, slash commands, notification helpers, and human-in-the-loop approvals.
  • GitHub adds form-encoded deliveries, GitHub App installation tokens, installation events, and a pull-request review gate.
  • Linear and ClickUp signature verification needs Flyte SDK 2.10.7 or later.

See Software development tools.

💾 Volumes on Every BYOC Cluster

Unprivileged volume mounts now cover every BYOC cluster and are on by default in the self-managed chart. Mount a volume with pod_template=allow_volumes() from flyteplugins.union.io.

  • BlockVolume.new(size="64G") creates a volume stored as a single ext4 image. Small-file, single-writer workloads such as build and package caches avoid a network round trip on every file operation.
  • A commit uploads only what changed.
  • You can mount, commit, and fork volumes from apps, sidecars, and scripts.
  • On self-managed data planes, volumes work with S3-compatible stores such as MinIO, Ceph RGW, and Cloudflare R2.
  • A volume can publish each committed version as an artifact.
  • allow_volumes(cache_size=...) puts the cache on a disk.
  • shared_node_cache=True shares a read-only cache across the pods of a namespace on a node.
  • A failed mount names its cause.

See Volumes and Block volumes.

⏳ llama.cpp Model Serving

LlamaCppAppEnvironment serves GGUF models from object storage or a Hugging Face GGUF repository behind an OpenAI-compatible endpoint, with optional speculative decoding. flyte.app.Subdomain resolves an app’s subdomain at deploy time.

✨ Safer App Rollouts

A Union platform upgrade no longer redeploys your apps; an app rolls out only when its spec changes.

  • When a new version cannot start, for example because no node fits it, the app is marked Failed with the reason once the rollout times out, and the previous version keeps serving.
  • Apps no longer return HTTP 503 errors under sustained high traffic.
  • App logs load reliably even when one replica has failed.
  • Very long status messages are truncated.

🔧 SDK Updates

  • flyte.run(trigger, ...) runs any deployed trigger from Python with its registered configuration. A trigger without a schedule works as a named launch configuration.
  • flyte get code RUN lists or unpacks the code bundle a run executed, and Run.download_code() does the same from Python.
  • flyte proxy app NAME opens an authenticated localhost proxy to an app behind Union sign-in, so local clients such as curl or an MCP server can reach it without handling tokens.
  • flyte get metrics and the Metrics remote object return the pod metrics the Console shows for task attempts and apps.
  • flyte get environment lists deployed environments and their retained versions.
  • flyte.is_control_plane_available(), Run.first_failure(), and ActionDetails.error_message help code that fixes and relaunches a failed run.
  • ClusteredTaskEnvironment gains a JaxRun runtime.
  • NVIDIA A2 and TPU v5e can be requested by name, and the task_resource.default_accelerator setting picks the accelerator for tasks that request GPUs without naming one.
  • FLYTE_AUTH_TYPE=ExternalCommand with FLYTE_AUTH_COMMAND lets tasks authenticate inside the cluster with your own narrowly scoped tokens.
  • bq:// outputs decode to pandas through the BigQuery Storage API.
  • The type engine supports IntEnum and generic dataclasses. A generic dataclass that cannot be serialized now fails with an error instead of silently falling back to pickle.
  • flyteplugins-typesafe-ai runs TypeSafe’s System One model in durable tasks.
  • flyteplugins-agents-hermes records Hermes model turns as durable traces.
  • flyte.sandbox (alpha) runs on a pool of worker processes.
  • flyte run --version sets the run’s code version.
  • flyte deploy --dry-run works for projects with app environments, and flyte.deploy(dryrun=...) is deprecated in favor of dry_run=.
  • Resource values are validated before submission.
  • File and Dir uploads size their multipart parts automatically.
  • vLLM and SGLang apps with stream_model=True no longer download the weights before streaming them.
  • flyteplugins-union 0.14.0 and later require Flyte SDK 2.10.1 or later, below 2.11.

🔧 Reliability and Fixes

Runs and caching:

  • The Runs page search matches run IDs as well as task names.
  • An action that fails before it runs shows the reason instead of a bare “Failed” or “Timed out”.
  • Recover and Rerun keep fractional seconds in datetime inputs.
  • The platform honors a task-level cache max age, and cached tasks hit the cache even when their custom_context differs.
  • Running a trigger from the Console keeps its notification rules.
  • Ray runs whose names start with a digit start normally, and a Ray job that KubeRay rejects fails with KubeRay’s reason instead of hanging.

Platform:

  • Reusable environments start sooner.
  • Users who can see every project get a NotFound error for a project that does not exist.
  • Control plane API latency for runs and actions is lower.
  • Self-serve provisioning reports a failure after three minutes instead of staying in progress.

In the Console:

  • The Busiest Users panel shows names instead of identity-provider IDs.
  • The Runs and Tracked Runs pages pin the table headers.
  • Multi-pod GPU charts keep one color per pod.
  • Run details show the cluster and queue an action ran on.
  • Run status badges use the design system’s colors.
  • The run details sidebar works in Safari.

⚙️ Self-Managed Data Plane Updates

Update the Union dataplane Helm chart to 2026.9.7 or later. Before you upgrade:

  • If your data plane serves apps through knative-operator, run the knative-migration Job before or during the upgrade to 2026.9.0 or later. Otherwise the upgrade stalls.
  • Chart 2026.9.4 moves app serving to Knative Serving 1.23, which needs Kubernetes 1.32 or later (1.34 recommended). Apply the new CRDs with kubectl apply --server-side -f crds/dataplane/.
  • Chart 2026.9.4 removes fuseDevicePlugin. Tasks that use allow_fuse() must switch to allow_volumes().
  • Chart 2026.9.7 runs flyteconnector as the union-system service account. Move any IRSA or Workload Identity bindings from the old service account.
  • Chart 2026.9.7 requires Azure GPU node pools to carry the platform.union.ai/accelerator=<device> label.

The upgrade brings:

  • The node-level mount broker, on by default from 2026.9.7 with a 30m CPU request per node, plus the shared node cache and block-mode volumes. It stays off in values.openshift.yaml, and nodes that enforce SELinux, such as Bottlerocket, EKS Auto Mode, and RHCOS, need selinuxTaskPods.
  • No app redeploys on a platform upgrade, timed-out rollouts marked Failed, no stalled revisions on busy data planes, and reliable app logs.
  • Per-cluster app URLs: set updateStatus.connectionConfig.enabled: true and updateStatus.connectionConfig.apps.domain. You manage DNS and TLS for that domain.
  • Clean worker shutdown when a cluster is deleted, faster cold starts for fast tasks, and multi-architecture operator and gateway images for Arm system nodes.
  • Settings > Clusters > Logs, which needs chart 2026.9.3 or later.

The Ray fixes reach self-managed data planes in chart 2026.10.0.

⚠️ Breaking Changes

  • allow_fuse() no longer works on BYOC clusters or with self-managed chart 2026.9.4 and later. A pod that uses it stays Pending with no error. Replace it with pod_template=allow_volumes() from flyteplugins.union.io.
  • Volumes committed with flyteplugins-union 0.14.1 or later cannot be mounted by older plugin versions. Upgrade every image that mounts volumes to 0.14.1 or later, or set UNION_VOLUME_DELTA_COMMITS=0 on writers until you have.
  • DeleteCluster requires expected_generation. Pass the generation from your last read of the cluster. The call marks the cluster Deleting, or Deleted if it was already drained, and returns the updated cluster.