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.