Skip to main content

ModelCard

The persisted, declarative metadata Skulk holds for one model.

This is the model-card interface: the single source of truth for how a model is sized, sharded, placed, and run. It is created once (from a HuggingFace repo or hand-authored), broadcast cluster-wide, and read by the planner (placement), the downloader (sizing + which files to fetch), and the worker runner (engine + behavior). As a CamelCaseModel it is camelCase on the wire and strict (extra="forbid"), so every node in a cluster must run the same Skulk version (a stale node rejects newer fields).

Two layers live here: the card (this declarative metadata) and the normalized resolved capability profile derived from it plus family defaults (see capabilities.py and website/docs/model-capabilities.md). The optional reasoning / modalities / tooling / runtime / vision / placement sub-configs refine that resolution; when absent, conservative family defaults apply.

modelIdModelid (string)required

The selectable artifact alias. Historically this was always the upstream Hugging Face repository id; registry cards may use a distinct alias so two exact files or quants from one repository remain separate artifacts.

sourceRepository object

Upstream Hugging Face repository that owns the artifact bytes. None means it is identical to model_id for legacy and locally generated cards.

anyOf
string
storageSize objectrequired

On-disk size of the weights this card loads (for a GGUF card, just the selected quant's shard group, not every quant the repo hosts). The planner uses this for memory-fit and placement-width decisions.

inBytesInbytes (integer)
Default value: 0
nLayersNlayers (integer)required

Number of transformer layers. Drives pipeline sharding (how layers split across nodes) and KV-cache sizing.

Possible values: > 0

hiddenSizeHiddensize (integer)required

Model hidden dimension, used in memory/KV-cache estimates.

Possible values: > 0

supportsTensorSupportstensor (boolean)required

Whether the model may be served with tensor parallelism (Sharding.Tensor). GGUF/llama.cpp cards set this False (single-node engine).

numKeyValueHeads object

KV-head count for grouped-query attention, used in KV-cache sizing. None when unknown/not applicable.

anyOf
integer

Possible values: > 0

ggufCacheGeometry object

Artifact-derived attention and recurrent cache dimensions for GGUF admission.

This is intrinsic model metadata. Slot count, speculation and runtime buffer overhead are separate engine inputs. An absent value means unknown, never zero recurrent cost. Registry geometry is an explicit projection of the separately signed header target retained in registry_gguf_metadata.

anyOf
attentionLayersAttentionlayers (integer)required

Target full-attention layers.

Possible values: >= 0

recurrentLayersRecurrentlayers (integer)required

Target recurrent layers.

Possible values: >= 0

nextnLayersNextnlayers (integer)required

Embedded MTP attention layers.

Possible values: >= 0

keyWidthKeywidth (integer)required

Key elements per token per layer.

Possible values: > 0

valueWidthValuewidth (integer)required

Value elements per token per layer.

Possible values: > 0

convolutionWidthConvolutionwidth (integer)required

Convolution-state elements per recurrent layer and row.

Possible values: >= 0

recurrentWidthRecurrentwidth (integer)required

Recurrent-state elements per recurrent layer and row.

Possible values: >= 0

tasksModelTask (string)[]required

The task types this model serves (TextGeneration, TextEmbedding, TextToImage, ImageToImage, TextToSpeech, SpeechToText, SpeechTranslation, TextToMusic, TextToVideo, ImageToVideo, ReferenceToVideo); selects which runner handles it.

Possible values: [TextGeneration, TextToImage, ImageToImage, TextEmbedding, TextToSpeech, SpeechToText, SpeechTranslation, TextToMusic, TextToVideo, ImageToVideo, ReferenceToVideo]

components object

For multi-component models (e.g. a diffusion stack), the per-component weight layout. None for a single-weights model.

anyOf
  • Array [
  • componentNameComponentname (string)required

    Logical name of this component (e.g. text_encoder, transformer).

    componentPathComponentpath (string)required

    Repo-relative subdirectory holding this component's weights.

    storageSize objectrequired

    On-disk size of this component's weights.

    inBytesInbytes (integer)
    Default value: 0
    nLayers object

    Layer count for this component when it is shardable; None otherwise.

    anyOf
    integer

    Possible values: > 0

    canShardCanshard (boolean)required

    Whether this component may be split across nodes (vs. loaded whole).

    safetensorsIndexFilename object

    The component's *.safetensors.index.json filename when sharded across files; None for a single-file component.

    anyOf
    string
  • ]
  • familyFamily (string)

    Model family token (e.g. qwen3, gemma4) used to pick family-specific defaults during capability resolution. Empty when not classified.

    Default value:
    quantizationQuantization (string)

    Human quantization label (e.g. 4bit, Q4_K_M); informational.

    Default value:
    baseModelBasemodel (string)

    The upstream base model id when this is a quant/finetune of another; empty if not applicable.

    Default value:
    ggufFile object

    For GGUF (llama.cpp) models: the repo-relative path of the weights file the runner loads (the selected quant's first shard). Resolved once at card creation (preferring a quant over BF16) so the download fetches only that quant and the runner loads deterministically, instead of each layer re-globbing/guessing. None for non-GGUF (safetensors/MLX) cards.

    anyOf
    string
    artifactBundle object

    Exact signed file selection and engine working directory for a v2 card.

    Legacy cards omit this field and preserve repository-wide tensor downloads.

    anyOf
    bundleIdBundleid (string)required

    Content-derived immutable identity of the normalized file bundle.

    root object

    Repository-relative directory used as the engine's model root.

    anyOf
    string
    files object[]required

    Every repository file required to install and run the artifact.

  • Array [
  • pathPath (string)required

    Canonical repository-relative POSIX path.

    sizeBytesSizebytes (integer)required

    Exact upstream byte size at the card's immutable source revision.

    objectId object

    Optional algorithm-qualified Hub object identity used for verification.

    anyOf
    string
  • ]
  • downloadSizeDownloadsize (integer)required

    Total bytes transferred for the complete bundle.

    sourceRevision object

    Immutable Hugging Face commit for this card's model artifacts.

    None preserves the historical behavior of resolving the repository's mutable main branch. Curated or operator-authored cards should set this to a full commit hash when the exact artifact has been qualified, so an upstream file replacement cannot silently change what the store and workers execute.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    capabilitiesstring[]

    Free-form capability tags carried for compatibility/auxiliary use; the structured reasoning/modalities/tooling configs are authoritative for capability resolution.

    Default value: []
    contextLengthContextlength (integer)

    The model's advertised maximum context length in tokens (0 if unknown). The admission ceiling is the smaller of this and what fits in memory.

    Default value: 0
    usesCfgUsescfg (boolean)

    Whether the model uses classifier-free guidance (relevant to some image / diffusion models).

    Default value: false
    trustRemoteCodeTrustremotecode (boolean)

    Passed to the model loader: whether to execute the repo's custom Python. Defaults True to match upstream loaders; set False to refuse it.

    Default value: true
    isCustomIscustom (boolean)

    Marks an operator-added custom card (not from the curated catalog). Excluded from the persisted card file so it is recomputed per environment.

    Default value: false
    qualificationOnlyQualificationonly (boolean)

    Marks an unsigned custom card owned by the temporary qualification lifecycle.

    The registry service credential may clean up only cards carrying this marker; ordinary operator-owned custom cards remain outside its deletion authority.

    Default value: false
    generatorRevision object

    Revision of the machine card generator that produced this card (:data:CARD_GENERATOR_REVISION at generation time), persisted in the card file. None means hand-authored (or generated before revisions existed): such a card keeps full override precedence over a signed or installed card for the same id. A stamped card older than the current generator is superseded by that card at load time, since a generated card is a cache of Hugging Face metadata plus generator logic, not operator intent.

    anyOf
    integer
    vision object

    Optional vision (image-input) configuration; None for text-only models.

    anyOf
    imageTokenId object

    Token id the model uses as the image placeholder in the prompt. Required by the MLX vision path (which splices image embeddings at this token); None is allowed for a llama.cpp-only vision GGUF, whose chat handler inserts image features itself and never reads this. MLX cards always set it (from config.json).

    anyOf
    integer
    modelTypeModeltype (string)

    Vision model-type tag (from config.json's vision_config), selecting the image processor (MLX) or chat handler (llama.cpp). Empty when a bare GGUF repo only signals vision via its mmproj projector; the llama.cpp runner then falls back to its general multimodal handler.

    Default value:
    weightsRepoWeightsrepo (string)

    Repo holding the vision-tower weights when separate from the LM; empty if bundled with the main weights.

    Default value:
    weightsRevision object

    Immutable commit for a separate weights_repo.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    imageToken object

    The literal image placeholder string, when distinct from image_token_id.

    anyOf
    string
    processorRepo object

    Repo providing the image processor/preprocessor config, if not the main repo.

    anyOf
    string
    processorRevision object

    Immutable commit for processor_repo. Signed registry cards require this whenever a separate processor repository can supply executable code.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    boiTokenId object

    Begin-of-image token id, for families that bracket image spans.

    anyOf
    integer
    eoiTokenId object

    End-of-image token id, for families that bracket image spans.

    anyOf
    integer
    projectorFile object

    Exact repository-relative GGUF projector selected for served vision.

    The projector is pinned by the owning card's immutable source_revision. Legacy GGUF vision cards may omit this field and continue to use the in-process llama.cpp compatibility path.

    anyOf
    string
    projectorSize object

    Exact byte size of projector_file at source_revision.

    anyOf
    integer

    Possible values: > 0

    reasoning object

    Optional reasoning/thinking configuration (toggle, budget, format, default effort); None falls back to family defaults.

    anyOf
    supportsToggle object

    Whether the model can have reasoning turned on/off per request.

    anyOf
    boolean
    supportsBudget object

    Whether the model accepts a reasoning-effort/budget control.

    anyOf
    boolean
    format object

    How reasoning is marked in the output stream: none, token_delimited (special tokens), or channel_delimited (a separate reasoning channel).

    anyOf
    ReasoningFormat (string)

    Reasoning marker formats used by model families.

    Possible values: [none, token_delimited, channel_delimited]

    defaultEffort object

    Reasoning effort applied when the request does not specify one.

    anyOf
    string

    Possible values: [none, minimal, low, medium, high, xhigh]

    disabledEffort object

    The effort value that means "reasoning off" for this model.

    anyOf
    string

    Possible values: [none, minimal, low, medium, high, xhigh]

    modalities object

    Optional extra-modality flags (audio input, native multimodal); None falls back to family defaults.

    anyOf
    supportsAudioInput object

    Whether the model accepts audio input.

    anyOf
    boolean
    supportsNativeMultimodal object

    Whether the model natively interleaves modalities (vs. a bolt-on adapter).

    anyOf
    boolean
    audio object

    Optional speech-serving configuration (TTS/STT kind, audio formats, streaming/realtime support, voices, reference audio, translation, sample rates); None for non-speech models.

    anyOf
    kind object

    Speech serving kind: tts for text-to-speech or stt for speech-to-text.

    anyOf
    AudioCardKind (string)

    Speech model kind declared by a model card's [audio] section.

    Possible values: [tts, stt]

    defaultResponseFormat object

    Default encoded audio response format for TTS requests.

    anyOf
    AudioResponseFormat (string)

    Audio response formats supported by the speech serving API.

    Possible values: [mp3, wav, flac, ogg, opus, pcm]

    responseFormatsAudioResponseFormat (string)[]

    Encoded audio formats this model can produce for TTS requests.

    Possible values: [mp3, wav, flac, ogg, opus, pcm]

    Default value: []
    supportsStreaming object

    Whether a validated Skulk runtime path can stream partial speech or transcripts.

    anyOf
    boolean
    supportsRealtime object

    Whether the model exposes a realtime session interface.

    anyOf
    boolean
    supportsVoiceListing object

    Whether the model can enumerate voices through a voice-listing API.

    anyOf
    boolean
    voicesstring[]

    Stable built-in voice identifiers exposed by the model.

    Default value: []
    voiceCatalog object[]

    Optional display and language metadata for every declared built-in voice.

  • Array [
  • idId (string)required

    Model-specific voice identifier accepted by speech synthesis.

    nameName (string)required

    Human-readable voice name shown by clients.

    preferredLanguagesstring[]

    Ordered BCP 47 language tags for which this voice is a preferred match.

    Default value: []
    referenceProfile object

    Bundled reference profile used to condition models without built-in voices.

    anyOf
    string
  • ]
  • defaultVoice object

    Built-in voice used when a TTS request omits an explicit voice.

    anyOf
    string
    supportsReferenceAudio object

    Whether the model accepts managed reference audio for voice conditioning.

    anyOf
    boolean
    supportsTranslation object

    Whether the model can translate speech instead of only transcribing it.

    anyOf
    boolean
    sampleRatesinteger[]

    Supported output or input sample rates in hertz.

    Possible values: > 0

    Default value: []
    music object

    Text-to-music family, lyric requirement, and qualified target-duration bounds.

    anyOf
    familyMusicModelFamily (string)required

    Architecture family used by the runner's fixed option translator.

    Possible values: [minimax_music3, ace_step_1_5]

    lyricsMusicLyricRequirement (string)required

    Whether lyrics are required, permitted, or unsupported.

    Possible values: [required, optional, unsupported]

    minSecondsMinseconds (integer)required

    Shortest generation target accepted for this artifact.

    Possible values: > 0

    maxSecondsMaxseconds (integer)required

    Longest generation target accepted for this artifact, at most 120 seconds.

    Possible values: > 0

    languageModelGguf object

    MiniMax language-model component selected by this exact artifact.

    anyOf
    string
    rvqDepthDecoderGguf object

    MiniMax RVQ decoder component selected by this exact artifact.

    anyOf
    string
    flowTransformerGguf object

    MiniMax flow-transformer component selected by this exact artifact.

    anyOf
    string
    video object

    Optional audio-video generation contract (modes, duration and frame grid, canvas rules, audio output, reference bounds, sampling defaults, pinned companions); None for models that do not generate video.

    anyOf
    modesVideoMode (string)[]required

    Generation modes this artifact serves; each implies a ModelTask.

    Possible values: [t2va, fl2va, ref2va]

    minSecondsMinseconds (integer)

    Shortest output duration the model supports.

    Possible values: > 0

    Default value: 4
    maxSecondsMaxseconds (integer)

    Longest output duration the model supports.

    Possible values: > 0

    Default value: 15
    fpsFps (integer)

    Output frame rate.

    Possible values: > 0

    Default value: 24
    frameGridMultipleFramegridmultiple (integer)

    Frame counts must satisfy count % frame_grid_multiple == frame_grid_offset.

    Possible values: > 0

    Default value: 1
    frameGridOffsetFramegridoffset (integer)

    Residue a valid frame count leaves modulo frame_grid_multiple.

    Default value: 0
    canvasMultipleCanvasmultiple (integer)

    Width and height must be multiples of this many pixels.

    Possible values: > 0

    Default value: 1
    defaultShortEdge object

    Trained short-edge resolution used when a request gives no size.

    anyOf
    integer

    Possible values: > 0

    maxPixels object

    Largest width times height the model serves at native quality.

    anyOf
    integer

    Possible values: > 0

    aspectRatiosstring[]

    Advertised aspect ratios as W:H strings; empty means unconstrained.

    Default value: []
    audioOutputAudiooutput (boolean)

    Whether generated video carries a synchronized audio track.

    Default value: false
    audioSampleRate object

    Sample rate of generated audio in hertz.

    anyOf
    integer

    Possible values: > 0

    audioChannels object

    Channel count of generated audio.

    anyOf
    integer

    Possible values: > 0

    defaultStepsDefaultsteps (integer)

    Sampling steps used when a request and its companions do not decide.

    Possible values: > 0

    Default value: 20
    videoShift object

    Trained video sigma shift, when the sampler exposes one.

    anyOf
    number
    audioShift object

    Trained audio sigma shift, when the sampler exposes one.

    anyOf
    number
    referenceLimits object

    Reference bounds; required when ref2va is among the modes.

    anyOf
    maxImagesMaximages (integer)

    Maximum reference images per request.

    Default value: 0
    maxVideosMaxvideos (integer)

    Maximum reference video clips per request.

    Default value: 0
    maxAudioClipsMaxaudioclips (integer)

    Maximum reference audio clips per request.

    Default value: 0
    maxFiles object

    Maximum files across every reference type; None means the sum.

    anyOf
    integer
    clipMinSeconds object

    Minimum duration of one reference video or audio clip.

    anyOf
    integer

    Possible values: > 0

    clipMaxSeconds object

    Maximum duration of one reference video or audio clip.

    anyOf
    integer

    Possible values: > 0

    totalClipSeconds object

    Maximum combined duration of reference clips of one type.

    anyOf
    integer

    Possible values: > 0

    companions object[]

    Pinned adapters, patches, embeddings, and graph templates.

  • Array [
  • kindVideoCompanionKind (string)required

    What the companion is; selects how an engine applies it.

    Possible values: [lora, model_patch, embedding, graph_template, preprocessor]

    nameName (string)required

    Stable companion identifier callers and engines refer to.

    pathPath (string)required

    Canonical repository-relative POSIX path of the companion file.

    repo object

    Repository hosting the companion; None means the card's artifact repository, whose source_revision then also pins this file.

    anyOf
    string
    revision object

    Immutable commit of repo; required whenever repo is external.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    sizeBytes object

    Exact upstream byte size at the pinned revision when known.

    anyOf
    integer
    modesVideoMode (string)[]

    Generation modes the companion applies to; empty means every mode.

    Possible values: [t2va, fl2va, ref2va]

    Default value: []
    steps object

    For distillation adapters, the sampling step count they were trained for.

    anyOf
    integer

    Possible values: > 0

    strength object

    Default application strength when the engine supports one.

    anyOf
    number
    videoShift object

    Video sigma shift the companion expects, when it differs from the card.

    anyOf
    number
    audioShift object

    Audio sigma shift the companion expects, when it differs from the card.

    anyOf
    number
    role object

    For preprocessor companions, what the weights do; required for them and refused on every other kind.

    anyOf
    VideoPreprocessorRole (string)

    What a preprocessor companion's weights do in deriving a guide video.

    Possible values: [pose_estimator, person_detector, depth_estimator]

    license object

    The license its hosting repository declares, as a lowercase SPDX-style identifier (mit, apache-2.0), shown to the operator beside the card's own license; companions in the card's repository fall under that.

    anyOf
    string
  • ]
  • license object

    Optional operator-facing license facts surfaced by the catalog and user interfaces; never enforced by download or placement.

    anyOf
    nameName (string)required

    Human-readable license name.

    url object

    Where the license text lives.

    anyOf
    string
    spdxId object

    SPDX identifier when one exists; custom community licenses have none.

    anyOf
    string
    notice object

    Short operator-facing note, for example a territorial scope or an application requirement.

    anyOf
    string
    displayName object

    Product attribution the license requires user interfaces to show prominently, for example the model's brand name.

    anyOf
    string
    tooling object

    Optional tool-calling configuration (support, call format, builtin tools); None falls back to family defaults.

    anyOf
    supportsToolCalling object

    Whether the model supports function/tool calling.

    anyOf
    boolean
    toolCallFormat object

    The wire format the model emits tool calls in (generic, gemma4, gpt_oss, dsml), selecting the output parser.

    anyOf
    ToolCallFormat (string)

    Tool-call output formats emitted by model families.

    Possible values: [generic, gemma4, gpt_oss, dsml, atem]

    builtinTools object

    Builtin tools Skulk advertises to this model (e.g. web_search, open_url, extract_page).

    anyOf
  • Array [
  • BuiltinToolType (string)

    Builtin tool contracts that Skulk can advertise to model families.

    Possible values: [web_search, open_url, extract_page]

  • ]
  • runtime object

    Optional runtime-behavior configuration (prompt renderer, output parser, MTP/speculative-decoding sidecar, MLX knobs); None falls back to defaults.

    anyOf
    promptRenderer object

    How prompts are rendered for this model (tokenizer chat template, gemma4, dsml); None uses the family default.

    anyOf
    PromptRendererType (string)

    Prompt renderer strategies supported by the runtime.

    Possible values: [tokenizer, gemma4, dsml]

    outputParser object

    How model output is parsed (generic, gemma4, gpt_oss, deepseek_v32), e.g. for reasoning/tool-call extraction; None uses the family default.

    anyOf
    OutputParserType (string)

    Output parser strategies supported by the runtime.

    Possible values: [generic, gemma4, gpt_oss, deepseek_v32, muse_glimmer]

    metalFastSynch object

    Per-model override for the MLX MLX_METAL_FAST_SYNCH flag.

    None means "no opinion" — fall through to the cluster default selected by the runner. Set explicitly to False for models that deadlock under FAST_SYNCH on the ring backend (e.g. gemma-4 with multimodal load: the Metal command queue wedges in pipeline_last_eval_output, transitively starves WindowServer, and trips the macOS kernel watchdog into a panic). Set explicitly to True for models that have been measured to benefit and are known to be safe under the deployment's collective backend.

    anyOf
    boolean
    mtpHeads object

    True when native MTP prediction heads are available via sidecar.

    Set alongside mtp_sidecar_repo. When false or absent, the runner skips sidecar loading and uses standard autoregressive generation.

    anyOf
    boolean
    mtpMaxDepth object

    Maximum draft depth the MTP heads support.

    Start at 1 for Apple Silicon. Deeper values can be evaluated via profiling but are unlikely to amortize on Metal due to near-linear verify-pass scaling.

    anyOf
    integer
    mtpSidecarRepo object

    Hugging Face repo ID containing the published mtp.safetensors sidecar.

    Example: "FoxlightAI/qwen3-5-7b-instruct-mtp-q4k" The sidecar is downloaded alongside the base model weights and loaded into the runner for speculative decoding. Produced by SWP.

    anyOf
    string
    mtpSidecarRevision object

    Immutable commit for a separate mtp_sidecar_repo.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    mtpNormConvention object

    How the sidecar stores its RMSNorm weights.

    "zero_centered" means deviation-from-1 (the raw Qwen3.5 checkpoint convention — the runner applies a +1.0 shift at load, mirroring what mlx-lm's sanitize() does for trunk weights). "actual_scale" means the stored value is the scale itself (DeepSeek convention). None falls through to the family default keyed off the detected sidecar layout. Override per card when a publisher changes conventions — getting this wrong measured 0% draft acceptance on Qwen3.5-2B (issue #192).

    anyOf
    string

    Possible values: [zero_centered, actual_scale]

    mtpConcatOrder object

    Concatenation order of the MTP fc projection input.

    "embed_first" = fc(concat([enorm(embed(t_next)), hnorm(h)])) — verified for Qwen3.5 (72.4% offline agreement, issue #192). "hidden_first" is the inherited DeepSeek assumption (unverified). None falls through to the family default keyed off the detected sidecar layout.

    anyOf
    string

    Possible values: [embed_first, hidden_first]

    speculativeMultiNode object

    Whether speculation may run on multi-node placements of this model.

    None (default) places no restriction. Set False for models where multi-node speculation is measured SLOWER than plain distributed decode: the 2026-06-06 benchmark matrix found gemma-4-26B-A4B (MoE) at 30.2 tok/s plain vs 28.2 with MTP on a 2-node pipeline (-7%), while single-node MTP on the same model measures 2.2x — fast sharded MoE decode plus modest acceptance makes the per-round draft+verify overhead net negative. Single-node speculation is unaffected by this knob. The decision is card-driven so every rank makes the same speculate-or-not choice (the distributed agreement collective requires rank symmetry).

    anyOf
    boolean
    assistantModelRepo object

    Hugging Face repo ID of a companion assistant (drafter) model.

    Gemma 4 does speculative decoding differently from the Qwen3/DeepSeek mtp.* heads: instead of embedded prediction heads, it pairs the target with a separate small gemma4_assistant model (e.g. "mlx-community/gemma-4-26B-A4B-it-assistant-bf16") that cross-attends over the target's KV cache. When set, the assistant repo is downloaded alongside the base model. Mutually exclusive with the mtp_* fields.

    NOTE: consuming the assistant for speculative generation requires the gemma4_assistant drafter from mlx-vlm >= 0.5.0 and is not yet wired into the runner — declaring it here only pre-downloads it. See the Gemma 4 MTP initiative in the foxlight-docs hub (Phase C).

    anyOf
    string
    assistantModelRevision object

    Immutable commit for a separate assistant_model_repo.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    servedSpecType object

    Speculative-decoding mode for the llama_server (served-backend) engine.

    Maps to a llama-server --spec-type token in the runner (_SPEC_TYPE_FLAG): draft_mtp -> draft-mtp (usually the model's own built-in MTP heads; a separate draft is optional, e.g. Gemma 4's assistant; Qwen3.6/DeepSeek/GLM/Kimi/Nemotron bake theirs in), draft_eagle3 -> draft-eagle3 (an EAGLE-3 head), draft_simple -> draft-simple (a separate draft model), draft_dflash -> draft-dflash (a separate block-parallel DFlash speculator GGUF via served_spec_draft_repo/served_spec_draft_file; llama-server >= b10092), ngram -> ngram-cache (prompt-lookup), none/None plain decoding. Only the served engine reads this; the in-process mlx and llama_cpp engines ignore it (MLX speculation is the mtp_* / assistant_model_repo fields above).

    anyOf
    string

    Possible values: [none, draft_mtp, draft_eagle3, draft_simple, draft_dflash, ngram]

    servedSpecNMax object

    Max draft tokens per step for the served engine (--spec-draft-n-max).

    Must be a positive integer (validated at card load so a bad value fails fast rather than producing an undefined --spec-draft-n-max at the server). None uses the llama-server default (3). Acceptance falls off with depth (per-position acceptance drops), so 2-3 is the usual sweet spot; tune per card from measured acceptance.

    anyOf
    integer

    Possible values: > 0

    servedSpecDraftRepo object

    Hugging Face repo of a separate draft GGUF for the served engine.

    Some served speculative modes need a second model passed to llama-server via --model-draft, NOT built-in heads: draft_simple (a vocab-matched small draft model) and draft_eagle3 (an EAGLE-3 head) always require one, and Gemma 4 draft_mtp uses its assistant as a separate draft GGUF (llama.cpp PR #23398) rather than baking heads into the base. Qwen3.6/DeepSeek/GLM draft_mtp leave this unset (heads are in the base GGUF). When set, the draft GGUF is downloaded as a companion alongside the base and passed as --model-draft. Pairs with served_spec_draft_file.

    anyOf
    string
    servedSpecDraftRevision object

    Immutable commit for a separate served_spec_draft_repo.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    servedSpecDraftFile object

    Repo-relative GGUF filename of the served draft model (in served_spec_draft_repo), e.g. "mtp-gemma-4-31B-it.gguf". Required when served_spec_draft_repo is set; selects the exact draft quant the runner passes to --model-draft.

    anyOf
    string
    vllmSpecMethod object

    Speculative-decoding method for the vllm served engine.

    Maps to vLLM's --speculative-config method key. "mtp" engages the checkpoint's own native multi-token-prediction heads (vLLM resolves the matching drafter architecture, e.g. Qwen3_5MTP, with no separate draft model); requires a checkpoint that ships MTP heads (mtp_num_hidden_layers in its config). "dflash" engages a separate block-parallel DFlash speculator (Poolside's scheme, vLLM

    = 0.25.0) and requires vllm_spec_draft_repo naming the drafter. Only the vllm engine reads this; served_spec_type remains the llama_server equivalent. The vocabulary starts deliberately narrow and grows as methods are validated live.

    anyOf
    string

    Possible values: [mtp, dflash]

    vllmSpecNumTokens object

    Draft tokens per step for vLLM speculative decoding (--speculative-config num_speculative_tokens).

    Requires vllm_spec_method. Positive; acceptance falls per position (measured on Qwen3.6-27B-FP8: 86% at position 0, 69% at position 1), so 2 is the usual sweet spot for single-layer MTP heads, which re-run their one layer for deeper positions. Block-parallel drafters (dflash) predict a whole block at once, so vendor-recommended depths run much deeper (Poolside ships 15 for a block size of 16). None uses vLLM's method default.

    anyOf
    integer

    Possible values: > 0

    vllmSpecDraftRepo object

    Hugging Face repo of a separate draft/speculator model for vLLM speculative decoding (--speculative-config model).

    Required by draft-model methods (dflash); must be unset for mtp, whose drafter lives inside the target checkpoint. The vllm engine passes the repo id through to vllm serve, which resolves it from its own Hugging Face cache at engine start (the target model still stages through the Skulk model store; staging the draft through the store as a pinned companion is a follow-up).

    anyOf
    string
    vllmSpecDraftRevision object

    Immutable commit supplied to vLLM for vllm_spec_draft_repo.

    anyOf
    string

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    vllmToolCallParser object

    vLLM server-side tool-call parser name for this model (--tool-call-parser, paired with --enable-auto-tool-choice).

    Engine-specific platform knob, so it lives in runtime beside the vllm_spec_* fields rather than in tooling (which stays model truth). This explicit field is the ONLY source: one family string can span tool-call generations with different wire formats, so there is no family fallback, and an unset field launches the server without tool support (tool requests are rejected loudly). Names follow vLLM's parser registry (hermes, llama3_json, mistral, pythonic, deepseek_v3, openai, ...); pin only pod-validated names.

    anyOf
    string
    vllmReasoningParser object

    vLLM server-side reasoning parser name for this model (--reasoning-parser).

    Same doctrine as vllm_tool_call_parser: an engine-specific platform knob, explicit only, no family fallback. Without it vLLM streams a reasoning model's thinking inline with its answer (the server only splits reasoning_content when a parser is configured), so a card whose model always reasons (Muse Glimmer's to=self channel) must pin the parser that vLLM registers for the family (muse_glimmer, qwen3, deepseek_r1, openai_gptoss, ...). Pin only pod-validated names.

    anyOf
    string
    placement object

    Where the model is allowed to run and which backend is preferred: the compatible_backends hard filter and backend_preference soft score the planner uses to route the model to suitable nodes.

    compatibleBackendsstring[]

    Hard constraint: only route to nodes whose advertised backends intersect this set. Making the implicit {"mlx"} explicit is what enables future heterogeneous (llama_cpp / rocm / cuda) routing.

    Default value: ["mlx"]
    minVramGib object

    Hard constraint: planner gates on node available memory when set.

    anyOf
    number
    maxContextTokens object

    Soft: caps the placement-time KV budget check (see #145) when set.

    anyOf
    integer
    maxPipelineSplitLayer object

    Largest layer boundary at which a pipeline rank may begin.

    Some architectures end with layers that reuse KV produced by earlier concrete layers. Keeping every split at or before this boundary ensures the final rank owns those producers as well as their dependent tail. None allows the planner to split at any ordinary layer boundary.

    anyOf
    integer

    Possible values: >= 1

    backendPreferencestring[]

    Soft, ordered preference among the node's backend tags (e.g. ("llama_cpp-vulkan", "llama_cpp-rocm")).

    Unlike compatible_backends (a hard filter on which nodes are eligible), this only ranks eligible nodes/devices: the planner prefers a node that advertises an earlier-listed tag, and the runner picks the earliest-listed backend the chosen node actually has. The same model runs on any compatible backend, but their performance differs per model, so this captures "fastest on Vulkan, ROCm is an acceptable fallback" while still degrading gracefully to a node that only offers the fallback. Order is significant and preserved; an empty tuple means no preference (use the node's default).

    Default value: []
    registryCardId object

    Immutable content-derived registry card id, or None for local cards.

    anyOf
    string

    Possible values: Value must match regular expression ^card_[a-z2-7]{52}$

    registrySnapshotId object

    Signed registry snapshot that supplied this runtime card.

    anyOf
    string
    registryProvenance object

    Audited registry origin, kept separate from immutable artifact identity.

    anyOf
    string

    Possible values: [foxlight, agent, community]

    registryArchitecture object

    Trusted upstream architecture identity used for support-matrix joins.

    anyOf
    string
    registryArtifactFormat object

    Exact signed artifact format used for support-matrix joins.

    anyOf
    string
    registryCapabilityClaims object[]

    Open signed model/artifact capability claims, independent of engines.

  • Array [
  • capability_idCapability Id (string)required

    Open namespaced intrinsic capability identifier.

    Possible values: Value must match regular expression ^[a-z0-9][a-z0-9._:-]{0,199}$

    scopeScope (string)required

    Whether the claim describes the model or selected artifact.

    Possible values: [model, artifact]

    statusStatus (string)required

    Evidence state without an engine-support implication.

    Possible values: [claimed, observed, complete, incomplete, unknown]

    sourceSource (string)required

    Evidence channel that produced the claim.

    Possible values: [upstream_structured, artifact_manifest, agent_analysis]

    confidenceConfidence (number)required

    Source confidence from zero through one.

    Possible values: >= 0 and <= 1

    evidence_urlsstring[]

    Bounded evidence references.

    Possible values: <= 20

    Default value: []
    reviewer_model object

    Agent reviewer identity, if any.

    anyOf
    string

    Possible values: <= 300 characters

    input_modalitiesstring[]

    Declared input modalities.

    Possible values: <= 20

    Default value: []
    output_modalitiesstring[]

    Declared output modalities.

    Possible values: <= 20

    Default value: []
    details object

    Open capability-specific evidence details.

    property name*any

    Open capability-specific evidence details.

  • ]
  • registryGgufMetadata object

    Exact signed header evidence used for this runtime geometry projection.

    It participates in the full-card authorization digest. A changed projection cannot silently reuse an approval for a different memory contract.

    anyOf
    repositoryRepository (string)required

    Possible values: >= 3 characters and <= 512 characters

    revisionRevision (string)required

    Possible values: Value must match regular expression ^[0-9a-f]{40}$

    selected_fileSelected File (string)required

    Possible values: non-empty and <= 4096 characters

    header objectrequired

    Bounded facts read from one exact artifact's complete GGUF metadata area.

    The digest covers the file prefix through the last metadata value, including the GGUF preamble. It is evidence identity, not a full-artifact checksum. Consumers own architecture-specific interpretation and engine allocation.

    architectureArchitecture (string)required

    Possible values: non-empty and <= 128 characters

    scalars objectrequired

    Architecture-relative integer GGUF fields, without defaults.

    property name*integer
    has_recurrent_layer_overrideHas Recurrent Layer Override (boolean)required

    Whether an explicit attention.recurrent_layers field exists.

    metadata_sha256Metadata Sha256 (string)required

    Possible values: Value must match regular expression ^[0-9a-f]{64}$

    metadata_bytesMetadata Bytes (integer)required

    Possible values: >= 24 and <= 16777216

    ModelCard
    {
    "modelId": "string",
    "sourceRepository": "string",
    "storageSize": {
    "inBytes": 0
    },
    "nLayers": 0,
    "hiddenSize": 0,
    "supportsTensor": true,
    "numKeyValueHeads": 0,
    "ggufCacheGeometry": {
    "attentionLayers": 0,
    "recurrentLayers": 0,
    "nextnLayers": 0,
    "keyWidth": 0,
    "valueWidth": 0,
    "convolutionWidth": 0,
    "recurrentWidth": 0
    },
    "tasks": [
    "TextGeneration"
    ],
    "components": [
    {
    "componentName": "string",
    "componentPath": "string",
    "storageSize": {
    "inBytes": 0
    },
    "nLayers": 0,
    "canShard": true,
    "safetensorsIndexFilename": "string"
    }
    ],
    "family": "",
    "quantization": "",
    "baseModel": "",
    "ggufFile": "string",
    "artifactBundle": {
    "bundleId": "string",
    "root": "string",
    "files": [
    {
    "path": "string",
    "sizeBytes": 0,
    "objectId": "string"
    }
    ],
    "downloadSize": 0
    },
    "sourceRevision": "string",
    "capabilities": [
    "string"
    ],
    "contextLength": 0,
    "usesCfg": false,
    "trustRemoteCode": true,
    "isCustom": false,
    "qualificationOnly": false,
    "generatorRevision": 0,
    "vision": {
    "imageTokenId": 0,
    "modelType": "",
    "weightsRepo": "",
    "weightsRevision": "string",
    "imageToken": "string",
    "processorRepo": "string",
    "processorRevision": "string",
    "boiTokenId": 0,
    "eoiTokenId": 0,
    "projectorFile": "string",
    "projectorSize": 0
    },
    "reasoning": {
    "supportsToggle": true,
    "supportsBudget": true,
    "format": "none",
    "defaultEffort": "none",
    "disabledEffort": "none"
    },
    "modalities": {
    "supportsAudioInput": true,
    "supportsNativeMultimodal": true
    },
    "audio": {
    "kind": "tts",
    "defaultResponseFormat": "mp3",
    "responseFormats": [
    "mp3"
    ],
    "supportsStreaming": true,
    "supportsRealtime": true,
    "supportsVoiceListing": true,
    "voices": [
    "string"
    ],
    "voiceCatalog": [
    {
    "id": "string",
    "name": "string",
    "preferredLanguages": [
    "string"
    ],
    "referenceProfile": "string"
    }
    ],
    "defaultVoice": "string",
    "supportsReferenceAudio": true,
    "supportsTranslation": true,
    "sampleRates": [
    0
    ]
    },
    "music": {
    "family": "minimax_music3",
    "lyrics": "required",
    "minSeconds": 0,
    "maxSeconds": 0,
    "languageModelGguf": "string",
    "rvqDepthDecoderGguf": "string",
    "flowTransformerGguf": "string"
    },
    "video": {
    "modes": [
    "t2va"
    ],
    "minSeconds": 4,
    "maxSeconds": 15,
    "fps": 24,
    "frameGridMultiple": 1,
    "frameGridOffset": 0,
    "canvasMultiple": 1,
    "defaultShortEdge": 0,
    "maxPixels": 0,
    "aspectRatios": [
    "string"
    ],
    "audioOutput": false,
    "audioSampleRate": 0,
    "audioChannels": 0,
    "defaultSteps": 20,
    "videoShift": 0,
    "audioShift": 0,
    "referenceLimits": {
    "maxImages": 0,
    "maxVideos": 0,
    "maxAudioClips": 0,
    "maxFiles": 0,
    "clipMinSeconds": 0,
    "clipMaxSeconds": 0,
    "totalClipSeconds": 0
    },
    "companions": [
    {
    "kind": "lora",
    "name": "string",
    "path": "string",
    "repo": "string",
    "revision": "string",
    "sizeBytes": 0,
    "modes": [
    "t2va"
    ],
    "steps": 0,
    "strength": 0,
    "videoShift": 0,
    "audioShift": 0,
    "role": "pose_estimator",
    "license": "string"
    }
    ]
    },
    "license": {
    "name": "string",
    "url": "string",
    "spdxId": "string",
    "notice": "string",
    "displayName": "string"
    },
    "tooling": {
    "supportsToolCalling": true,
    "toolCallFormat": "generic",
    "builtinTools": [
    "web_search"
    ]
    },
    "runtime": {
    "promptRenderer": "tokenizer",
    "outputParser": "generic",
    "metalFastSynch": true,
    "mtpHeads": true,
    "mtpMaxDepth": 0,
    "mtpSidecarRepo": "string",
    "mtpSidecarRevision": "string",
    "mtpNormConvention": "zero_centered",
    "mtpConcatOrder": "embed_first",
    "speculativeMultiNode": true,
    "assistantModelRepo": "string",
    "assistantModelRevision": "string",
    "servedSpecType": "none",
    "servedSpecNMax": 0,
    "servedSpecDraftRepo": "string",
    "servedSpecDraftRevision": "string",
    "servedSpecDraftFile": "string",
    "vllmSpecMethod": "mtp",
    "vllmSpecNumTokens": 0,
    "vllmSpecDraftRepo": "string",
    "vllmSpecDraftRevision": "string",
    "vllmToolCallParser": "string",
    "vllmReasoningParser": "string"
    },
    "placement": {
    "compatibleBackends": [
    "string"
    ],
    "minVramGib": 0,
    "maxContextTokens": 0,
    "maxPipelineSplitLayer": 0,
    "backendPreference": [
    "string"
    ]
    },
    "registryCardId": "string",
    "registrySnapshotId": "string",
    "registryProvenance": "foxlight",
    "registryArchitecture": "string",
    "registryArtifactFormat": "string",
    "registryCapabilityClaims": [
    {
    "capability_id": "string",
    "scope": "model",
    "status": "claimed",
    "source": "upstream_structured",
    "confidence": 0,
    "evidence_urls": [
    "string"
    ],
    "reviewer_model": "string",
    "input_modalities": [
    "string"
    ],
    "output_modalities": [
    "string"
    ],
    "details": {}
    }
    ],
    "registryGgufMetadata": {
    "repository": "string",
    "revision": "string",
    "selected_file": "string",
    "header": {
    "architecture": "string",
    "scalars": {},
    "has_recurrent_layer_override": true,
    "metadata_sha256": "string",
    "metadata_bytes": 0
    }
    }
    }