Every model repo (spark-<name>) is checked against this list.
model.yaml
.env.example
README.md
KNOBS.md
.gitmodules
.submodules/spark-agent/
compose/
image/
smoketest/
name matches the served model name and the mentat grouphuggingface id of the exact checkpoint serveddescription: what it is and why this model was chosenvram.budget_gib, vram.resident_gib (measured, with the date), vram.kv_pin_bytestp, ppapi and endpointstp, kv_pin_bytes), they agree, and the entrypoint winscompose/ that has no default, listedcompose/.env: compose reads .env beside the compose file.env and compose/.env are in .gitignorepython -m ray.register & beside the engine, no ray executableray start from the mentatd binary, plus mentatd-probe-machineMENTAT_GROUP defaults to the served nameMENTAT_OPENAI_API in port form (8000/v1), on the API rank onlyMENTAT_MCP_API in port form, on every rankMENTAT_MODEL_PROVIDER names the real engine (vllm, sglang, llamacpp). The router counts tokens for vllm only; never claim vllm to get itMENTAT_NODE_IP unset unless the stack is single-node on loopbackMENTAT_VERSION)/, and a request through the router answers/mcpvLLM engines only. For SGLang or llama.cpp, mark these N/A: the status server reads vLLM's metrics.
.submodules/spark-agent, HTTPS URLvllm -> .submodules/spark-agent/vllm symlinkstatus-server.pyAGENT_URL or /register: the agent has no registrySERVICE_NAME, STAGE_FILE, STAGES, PORT, STATUS_PORT, ROLE, PEERSSERVING_WHEN_READY=1, not a watcher loop<name>.yaml, run with docker compose -f compose/<name>.yaml up -dname: <model>: from compose/ the project would otherwise be called compose, and every recipe would share it${VAR:-default} or ${VAR:?why}network_mode: host; ports disjoint from the other tenants on the box--kv-cache-memory or equivalent), never derived from profilingdocker build -f image/Dockerfile .), so the vllm symlink stays inside itlatest or nightlyARG BASE and ARG MENTAT_VERSION above the first FROMmentat-artifacts pulled registry-qualified (mmastrac/...)--no-depsverify-base.py fails the build if the model arch, the sm_120 cubins or ray.register are missingKNOBS.md regeneratedbuild.sh with a TAG; builds from a plain rsync -a copyrun.sh <base> [served-name], exit code is the failure countlib.sh byte-identical to the other repost_* per case, every check a jq expressionTaken, so a new recipe picks a free one. API ports are in each README.
| port | recipe |
|---|---|
| 8022 | dgemma |
| 8081 | ds4-flash |
| 8082 | glm53 |
| 8083 | glm53-exl3 |
| 8084 | qwen38fn (llama.cpp's own status page) |
| 8181 | qwen36-a3b |
| 8182 | dots-ocr |
| 8183 | whisper |
| 8184 | qwen3-embedding |
| 8185 | qwen38-flashnext |
| 8186 | qwen38 |
| 8090 | the host agent |