New: plnt v0.1 — Helm charts + Temporal deploy saga + InferenceModel CRD
Y Open source · Apache-2.0

Multi-model inference
on Kubernetes.

One Helm chart per runtime — vLLM, TGI, TRT-LLM, SGLang. A Temporal saga drives every deploy: pull weights, canary, smoke, promote or rollback. An InferenceModel CRD makes kubectl apply the entire trigger.

~/plnt · deploy llama-3-70b-instruct
$ kubectl apply -f examples/llama-3-70b-instruct.yaml
04:17:33 apply InferenceModel/llama-3-70b-instruct · runtime=vllm · gpu=2×H100
04:17:33 workflow temporal://plnt/deploy · run=r-9c4f218e0a
04:17:34 validate values.yaml ok · storage_uri reachable · image pullable
04:17:39 pull safetensors · 141 GiB · CAS hit=partial · verified
04:18:02 helm install release=llama-70b-canary · replicas=1 · traffic=5%
04:19:41 smoke TTFT p50=182ms · tokens/s/GPU=87 · pass
04:19:42 promote canary → stable · replicas=1→3 · traffic=100%
04:19:42 ready https://llama-3-70b-instruct.plnt.svc/v1/chat/completions
01 / 06 — WHAT

plnt is a mini inference-factory for Kubernetes. Helm charts per runtime, a Temporal saga per deploy, a CRD per model. The pieces that turn "I trained a model" into "the model is serving traffic on a cluster."

architecture · plnt platform
                    plnt CLI · Python API
                             │
                             ▼
             ┌─────────────────────────────────┐
             │  InferenceModel  (K8s CRD)      │
             │  kubectl apply -f llama-70b.yaml│
             └───────────────┬─────────────────┘
                             │  watch(create|update|delete)
                             ▼
             ┌─────────────────────────────────┐
             │  plnt operator  (Python · kopf) │
             └───────────────┬─────────────────┘
                             │  start_workflow
                             ▼
    ┌──────────────────────────────────────────────────┐
    │  Temporal · DeployModelWorkflow                  │
    │                                                  │
    │  validate → pull → helm_install → smoke → promote│
    │            │       │              │              │
    │            └───────┴──────────────┴──▶ rollback  │
    └───────────────────────┬──────────────────────────┘
                            │  helm install / rollback
                            ▼
       ┌────────┬────────┬─────────┬─────────┬─────────┐
       │  vLLM  │  TGI   │ TRT-LLM │ SGLang  │ router  │
       │ chart  │ chart  │  chart  │ chart   │ (envoy) │
       └────────┴────────┴─────────┴─────────┴─────────┘
                            │
                            ▼
             ┌─────────────────────────────────┐
             │  plnt-cloud  (bookings product) │
             │  consumes /v1/chat/completions  │
             └─────────────────────────────────┘
02 / 06 — HOW

Three steps. No custom control plane. No hand-rolled deploy scripts. The Kubernetes primitives do the work.

01
Declare

Write an InferenceModel resource: model name, runtime (vllm/tgi/trt-llm/sglang), GPU class, replicas, canary budget. kubectl apply.

02
Reconcile

The plnt operator picks up the resource and starts a Temporal DeployModelWorkflow. The workflow is durable — a restart resumes from the last completed step.

03
Serve

Once the canary passes smoke tests and gets promoted, the model is reachable at <name>.plnt.svc/v1/chat/completions. OpenAI-shape API, streaming via SSE.

THE PLATFORM
LAYER FOR
MULTI-MODEL
INFERENCE.

Built on primitives platform teams already trust — Helm, Kubernetes, Temporal. No proprietary control plane. No cloud lock-in. Same YAML runs on kind, GKE, EKS, on-prem.

vLLM TGI TRT-LLM SGLang
03 / 06 — RUNTIMES

Four inference backends, one control API. Each ships as a Helm chart; each speaks OpenAI wire format at the pod boundary.

vLLM

Paged attention · continuous batching · prefix cache. Default runtime for general LLM serving. Chart: plnt/charts/vllm-runtime.

TGI

Hugging Face Text Generation Inference. Flash-attention 2, tensor parallel, GPTQ / AWQ / FP8. Chart: plnt/charts/tgi-runtime.

TRT-LLM

Precompiled TensorRT engines on Triton. Highest per-GPU throughput; engine build runs as a workflow step. Chart: plnt/charts/trt-llm-runtime.

SGLang

RadixAttention prefix caching. Strong for multi-turn and structured generation. Chart: plnt/charts/sglang-runtime.

04 / 06 — SAGA

Every deploy is five steps of a Temporal workflow. Any step failing triggers compensation. Retries are per-activity with budgets — not per hop.

01
validate_manifest

values.yaml is schema-valid, storage URI reachable, image pullable, GPU class available on the target node pool.

02
pull_and_verify_weights

Weights fetched from the CAS-backed registry. Hash checked against the manifest. Idempotent — a partial pull resumes.

03
helm_install_canary

helm install at 5% traffic via Envoy VirtualService weights. Canary replica scheduled on the target GPU class.

04
run_smoke_test

N test prompts. TTFT / TPOT / tokens-per-sec measured against baseline. KPI budget from InferenceModel.spec.canary.

05
promote_or_rollback

KPIs pass → scale to replicas.min at 100%. KPIs fail → helm rollback. Compensation on any earlier step failure.

05 / 06 — CHOICES

Six decisions that shape the platform. Each is a hill the project will die on.

Declarative CRD

InferenceModel is the entire deploy contract. One kubectl apply triggers pull, deploy, smoke, promote. Reconciliation is the operator's job — not a bash script.

Saga, not script

Every deploy is a Temporal workflow. Compensation on failure, retries with budgets (not per-hop), resume-across-restart. The saga is inspectable in the Temporal UI.

Operator, not glue

A Python kopf operator watches the CRD. Create/update/delete on the resource is the trigger. Nothing else runs kubectl on your behalf.

Canary, not YOLO

Every deploy is a canary first. 5% traffic → smoke test → promote. KPI budget in the manifest. Failed canaries roll back automatically.

Runtime-agnostic

One RuntimeAdapter interface, four backends. vLLM / TGI / TRT-LLM / SGLang share a control API. The chart per runtime is the deployment shape; the adapter is the code shape.

OpenAI wire format

Every runtime exposes /v1/chat/completions. Existing OpenAI clients work unmodified. Streaming via SSE. No proprietary SDK.

06 / 06 — INSTALL

One chart. One CRD. One curl.

install · plnt on kind
# local kind cluster
$ kind create cluster --name plnt
# install the operator + playground API
$ helm install plnt oci://ghcr.io/devdattatalele/charts/plnt --version 0.1.0
# deploy a model
$ kubectl apply -f examples/llama-3-70b-instruct.yaml
# chat
$ curl -s https://play.plnt.work/v1/chat/completions \
    -H "content-type: application/json" \
    -d '{"model":"llama-3.1-70b-instruct","messages":[{"role":"user","content":"hi"}]}'