Architecture

Plane and gateway,
operator and agent.

Wingsmith picks clusters; each cluster picks its own devices. An operator in every cluster dials out, renders NVIDIA Dynamo deployments, and reports what it observes. Inference takes a separate path through the gateway.

01 / Topology

Hub and spoke, with an outbound agent.

The control path and the request path share no process, and every connection is opened from inside the cluster.

Control path
  1. Consoleor hgr
    HTTP
  2. API
  3. Postgres
  4. Hub
    dials out
  5. Operatorone per cluster
Inference path
  1. CallerOpenAI API
  2. Gateway
    HTTP/2 tunnel
  3. Agentone per cluster
  4. Model frontendNVIDIA Dynamo

An operator runs in every cluster, opens a single WebSocket to the hub, receives Wingsmith's own domain objects, renders them into a Dynamo graph with vLLM, SGLang or TensorRT-LLM as the engine, and reports what it observes back up. The plane holds no kubeconfigs.

The gateway takes OpenAI-compatible requests and forwards them over an HTTP/2 tunnel that the agent in each cluster dials out to, using a routing table the plane derives and the gateway caches.

Outage

Clusters keep serving when the control plane is down, and a running gateway keeps routing from its cached table. A gateway that restarts during the outage cannot load a table and stays down until the plane is back.

02 / Principles

Four rules the object model follows.

01

Every object is declared, observed, or an operation.

Declared objects are written by the plane and obeyed by the cluster. Observed objects are written by the cluster and read by the plane. Operations are imperative, long-running, and able to fail.

Drain is not a field on a node. It is cordon, evict, wait for in-flight requests, confirm, and possibly time out. It has a lifecycle, an actor, a reason, and a failure mode.

02

The wire carries domain objects, never Kubernetes manifests.

The plane sends Wingsmith's own Deployment, Pool, and Operation. The operator in each cluster expands them into whatever Kubernetes objects it currently favors.

All knowledge of Kubernetes stays on the cluster side. That is what lets the fleet be non-uniform: the operator absorbs the differences.

03

Scheduling splits into global and local.

Cluster selection is global, coarse, and infrequent: capacity, device class, region, residency, cost. It lives in the plane.

Device selection is local, hot, and frequent: bin-packing and topology. It stays with the scheduler inside the cluster.

04

Inference traffic never passes through the control plane.

If it did, the control plane's availability would become the availability of every model it manages.

The gateway is the one process in the request path. It keeps serving from its last routing table when the plane is unreachable, but needs the plane to start.

03 / Object model

Objects, grouped by who writes them.

The console and hgr are two clients of the same HTTP API over these objects.

GroupObjectsOwner
Supply
What capacity exists
Cluster, Node, Device, TopologyDomain, PoolCluster observes; Cluster and Pool are also declared
Demand
What should be running
Artifact, Workload, Deployment, Replica, EndpointPlane declares; Replica is observed
Binding
Where supply and demand meet
Tenant/Project, Quota, PriorityClass, Policy, AllocationPlane declares; Allocation is observed
Machinery
What makes it operable
Component, Operation, Event, CacheEntry, CredentialMixed

The schedulable unit is the accelerator, not the node. Topology (NVLink, NVSwitch, PCIe, NUMA) is an object rather than an annotation, and heterogeneity across the fleet is a placement constraint.

04 / Lifecycle

From weights to a stable endpoint.

What you serve, how you serve it, where it runs, and the name clients call are four separate objects.

01 / 04

Artifact: the weights.

Immutable, content-addressed weights with their format, digest, license, and storage locations. Kept separate from how they are served.

Identity / Provenance / Locations

Models already running in a cluster are discovered and observed first. Bringing one under management is an explicit decision, and it does not restart the model.

05 / Components

One repository, one directory per component.

Paths and binary names are from the current pre-release codebase, which still uses its original names.

PathLanguageWhat it is
libs/planePythonThe control plane: the HTTP API, the hub that terminates operator streams, and the reactor that derives alerts. One package, three processes, one Postgres.
libs/operatorGohangar-operator, one per cluster. Syncs desired state from the hub into CRDs, renders each deployment as an NVIDIA Dynamo graph, and reports observed state.
libs/gatewayGoThe data plane. One OpenAI-compatible hop that routes on model, terminates the agents' tunnels, and identifies tenants.
libs/agentGohangar-agent, one per cluster. Dials out to every gateway replica and proxies inference to the model's frontend inside the cluster.
libs/consoleTypeScriptThe web console. Talks to the plane's HTTP API only, and runs against built-in fixtures with no backend.
libs/cliGohgr, the command line. Same API as the console, with stable JSON output and an offline --fake backend.
libs/chartHelmcluster-setup: the operator, the agent, CRDs, the NVIDIA Dynamo platform, the DCGM exporter, and optional monitoring.
libs/packages/contractMarkdown, JSONThe plane-operator wire protocol, the HTTP API conventions and OpenAPI schema, the device-class table, and a shared fixture corpus.
libs/packages/tunnelGoBoth ends of the gateway-agent tunnel, in its own module because neither side owns it.
libs/benchmarkingPythonhgrbench. Four load generators against one OpenAI-compatible endpoint, reported side by side.
libs/transitGohgrtransit. Measures the request path on one host, with no GPU and no cluster.
libs/conformancePythonhgrconform. Probes an OpenAI-compatible endpoint and diffs its behavior against a reference provider.

07 / Scope

Out of scope.

Standalone, inference-only for now, NVIDIA Dynamo inside each cluster, and built for an organization that owns every cluster it manages.

  • Not a device scheduler.The scheduler inside each cluster picks cards. Wingsmith picks clusters.
  • Not a Kubernetes dashboard.It shows Wingsmith's own objects and operations, not the CRD trees the operator renders them into.
  • Not a training or batch platform.It does not run jobs to completion, and it does not preempt.
  • Not a per-cluster configuration repository.A cluster is registered, handed a token and its values, and installs itself. The plane's registry is the list of clusters.

Status

Open source,
under Apache 2.0.

Wingsmith is pre-release. The first public release, and everything after it, will be under Apache 2.0.

Built and not built

Built

Multi-cluster placement and routing, Dynamo deployments, device inventory, endpoints and quotas, the console, the CLI, and three measurement tools.

Not built

Published images and charts, per-user roles and SSO, batch and training workloads, and a Helm chart for the control plane.

Pre-release. No tagged release, images, or charts yet, and APIs and protocols can change.