Docs · reference
denv.yaml
Every field of the file that defines recipes, releases and the environments they ship through.
One file, checked into your repository. denv recipe validate reads recipes; denv release reads release; denv env apply reads environment. Providers, fleets and customers belong to your organization and are not in this file.
Full example
recipes:
- name: ds-flash-h200
version: 1
extends: deepseek-v4.1-flash/sglang@2
hardware: [h200]
engine: { name: sglang, version: 0.6.1 }
args: { tp: 8, ep: 8, enable-dp-attention: true }
release:
model: ds-flash
weights: hf://deepseek-ai/DeepSeek-V4.1-Flash-1017@c41a7e2
recipe: deepseek-v4.1-flash/deepinfer@3
topology:
mode: disaggregated
prefill: { gpus: 4, replicas: 2 }
decode: { gpus: 64, replicas: 1 }
placement: same-domain
kv-cache:
tiers: [gpu, host-memory, nvme]
share: stage
api: [chat-completions, responses, messages]
health:
startup-timeout: 30m
warmup: 64
golden: tests/golden.jsonl
parity:
reference: { url: https://api.deepseek.com, secret: deepseek-api-key, model: deepseek-v4.1-flash }
suite: parity/flash.jsonl
pass: { tool-calls: 99%, exact: 95% }
environment:
name: ds-flash
stages:
- name: canary
fleets: [gb200-rack]
replicas: 1
promote: { bake: 1h }
- name: prod-us
fleets: [gb200-rack, h200-use1]
recipes: { h200-use1: ds-flash-h200@1 }
replicas: { min: 2, max: 6 }
routing: { policy: priority, order: [gb200-rack, h200-use1] }
rollout: { batch: 1, min-healthy: 75%, bake: 2h }
alarms: { ttft-p99: 1500ms, error-rate: 1%, throughput-drop: 15%, parity-fail: 1 }
promote: { approval: required }
recipes[]
Your own recipes. Catalog recipes (denv recipe list) need no entry here.
| Field | Required | Meaning |
|---|---|---|
name, version |
yes | A recipe is referenced as name@version. Versions are immutable once used by a release. |
extends |
no | Start from another recipe and override only what differs. |
models |
no | Model families this recipe accepts, such as deepseek-v4.1. Inherited when extends is set. |
engine |
yes | { name, version }. name is vllm, sglang, tensorrt-llm or deepinfer. |
hardware |
yes | Hardware ids this recipe is tested on: h100, h200, b200, b300, gb200-nvl72, gb300-nvl72, mi300x, mi355x, ascend-950, l40s. See Hardware. |
topology |
no | Default topology; a release may override it. |
args |
no | Engine arguments, validated against the engine version. |
adapter |
no | API adapter that turns requests into prompts and output into responses: engine (the engine's own OpenAI server) or a model-specific adapter such as deepseek-recipe. Default from extends or engine. |
parity |
no | Default parity suite for the model family. |
release
| Field | Required | Meaning |
|---|---|---|
model |
yes | Name shared by every release of this model; also the model value callers send. |
weights |
yes | Pinned: hf://org/repo@revision, s3://bucket/path@<versionId>, gs://bucket/path#<generation>, or denv://<model>/<version>. A branch is resolved to a commit when the release is created. |
weights-auth |
no | Secret used to read private weights. |
recipe |
yes | name@version, from the catalog or recipes. |
overrides |
no | Any recipe field (engine, args, adapter) changed for this release only. |
topology.mode |
no | aggregated or disaggregated. Default from the recipe. |
topology.gpus, topology.replicas |
aggregated | GPUs per replica and replica count per stage, unless the stage sets replicas. |
topology.prefill, topology.decode |
disaggregated | { gpus, replicas } for each pool. |
topology.placement |
no | same-domain keeps prefill and decode of one serving unit inside one scale-up domain (default for disaggregated); any allows crossing domains. |
kv-cache.tiers |
no | Ordered tiers: gpu, host-memory, nvme. Default [gpu, host-memory]. |
kv-cache.share |
no | replica (no sharing) or stage (prefixes shared across the stage's replicas). Default stage. |
adapters |
no | LoRA adapters, each pinned like weights. Callers select one with model: <model>:<adapter>. |
api |
no | Surfaces to expose: chat-completions, responses, messages, completions, embeddings. Default [chat-completions, responses]. |
health |
no | startup-timeout, warmup request count, golden prompts file. See Rollout policy. |
parity |
no | reference (url, secret, model), suite file (JSONL; see Run parity checks), pass thresholds as per-kind pass shares (exact, tool-calls, logprobs). See Parity. |
The release id (v8) and digest are assigned when it is created. The digest covers the resolved weights revision, recipe version, resolved engine image digest, overrides, topology, KV cache settings, API list, health and parity configuration.
environment
| Field | Required | Meaning |
|---|---|---|
name |
yes | Lowercase, digits, hyphens. |
stages |
yes | Ordered; a release is promoted from each stage to the next. |
stages[]
| Field | Required | Meaning |
|---|---|---|
name |
yes | Part of the endpoint URL. |
fleets |
yes | Fleets this stage serves from. Each must offer hardware the release's recipe supports. |
recipes |
no | Per-fleet recipe overrides, for serving the same weights on different hardware: { <fleet>: <recipe>@<v> }. |
replicas |
yes | A number or { min, max }. For disaggregated releases, a replica is one serving unit (its prefill and decode pools). |
routing |
no | { policy: priority, order }, { policy: weighted, weights }, { policy: latency }, { policy: cost }. Default latency. KV cache locality is applied within each policy. |
rollout |
no | batch, min-healthy, bake, on-alarm: rollback | pause. See Rollout policy. |
alarms |
no | ttft-p99, itl-p99 (inter-token latency), error-rate, throughput-drop, parity-fail, and custom: [{ metric, above | below, for }]. |
promote |
no | bake, approval: required, windows, auto: true. |
residency |
no | eu, us, or a list of regions. Fleets outside it are refused; the router never fails over outside it. |
Validation
--dry-run on denv recipe validate, denv release and denv env apply checks without changing anything: weights resolve and are pinned, the engine version supports the hardware and arguments, every stage's fleets can fit the topology (including domain size for same-domain), the parity reference is reachable, residency holds.