{ "$comment": "Active catalog. It contains real engines only — there are no mock entries and nothing here is synthetic. Adding a model means editing this file: copy the host and model entries you run from config/examples/real-models.example.json, adjust them, and restart DSH. No code changes are needed for any engine whose adapter kind is already registered. See docs/adding-a-model.md. This machine opted into hub-managed process launching (the profile patch sets allowProcessLaunch: true), so the comfyui host declares a lifecycle and can be cold-started and stopped on demand; the ollama host stays startable:false, because its service is managed outside the hub.", "version": "1", "hosts": [ { "$comment": "Ollama runs as a background service you manage. `ollama serve` owns port 11434, and every pulled model is reachable through the same OpenAI-compatible surface. Set startable/stoppable to true and add a `start` command if you want the hub to launch it for you.", "id": "ollama", "name": "Ollama", "adapter": "openai_compatible", "runtime": { "engine": "ollama", "adapter": "openai_compatible", "endpoint": "http://127.0.0.1:11434", "path": "/v1/chat/completions" }, "health": { "kind": "http", "path": "/api/tags", "timeoutMs": 2000, "expect": "json-key", "expectKeys": ["models"] }, "lifecycle": { "startable": false, "stoppable": false }, "resources": { "vramGb": 0, "ramGb": 0 }, "notes": "External process. The hub probes /api/tags and posts to /v1/chat/completions. `expect: json-key` with `expectKeys: [\"models\"]` is readiness, not just liveness: a 200 carrying anything other than Ollama's own tags document does not count as ready." }, { "$comment": "ComfyUI providers are explicit API-format workflows, not automatically discovered checkpoint or saved-workflow entries. The configured workflow declares exact input bindings and output selector; graph internals are opaque to the hub.", "id": "comfyui", "name": "ComfyUI", "adapter": "comfyui", "runtime": { "engine": "comfyui", "adapter": "comfyui", "endpoint": "http://127.0.0.1:8188", "path": "/prompt" }, "health": { "kind": "http", "path": "/system_stats", "timeoutMs": 3000, "expect": "json-key", "expectKeys": ["system", "devices"] }, "lifecycle": { "startable": true, "stoppable": true, "startupTimeoutMs": 300000, "awaitHealthOnStart": true, "start": { "command": "C:/ComfyUI/venv/Scripts/python.exe", "args": ["main.py", "--lowvram"], "cwd": "C:/ComfyUI/src" } }, "resources": { "vramGb": 0, "ramGb": 0 }, "notes": "Startable on this machine: `invoke_model` cold-starts ComfyUI when it is down, `start_model` starts it explicitly, and `stop_model` releases its VRAM afterwards. The command is this install's own launcher — C:/ComfyUI/venv/Scripts/python.exe running src/main.py from C:/ComfyUI/src, which is where the venv's relative paths and the install log expect it to run from. `--lowvram` is required here, not a preference: the GPU has 8 GB and the Z-Image Turbo graph stages about 5.9 GB, which the default mode OOMs on. `startupTimeoutMs: 300000` is deliberate — loading the checkpoint and the text encoder genuinely takes minutes on this hardware, so a shorter budget would abort a start that was going to succeed. `awaitHealthOnStart: true` is what keeps `start_model` and a cold `invoke_model` from returning before /system_stats answers. Set startable/stoppable back to false (or override this row in your profile's cordis.patch.yml) if the engine should be managed by hand, and remember the deployment must also set allowProcessLaunch: true — a startable descriptor alone launches nothing." } ], "models": [ { "$comment": "A generic starter. `adapterConfig.model` is the name Ollama knows the checkpoint by, so point it at something you have actually pulled: `ollama list` shows the names, `ollama pull llama3.2` gets this one.", "id": "ollama_text_model", "name": "Ollama text model", "type": "text_generation", "version": "1.0.0", "host": "ollama", "capabilities": ["text_to_text"], "adapterConfig": { "model": "llama3.2", "temperature": 0.7, "maxTokens": 2048 }, "resources": { "vramGb": 0, "ramGb": 0 }, "limits": { "contextTokens": 8192 }, "priority": 100, "tags": ["local", "text"], "notes": "Rename this to the checkpoint you run, or add one entry per checkpoint — several models may share the `ollama` host." }, { "$comment": "The template in config/workflows/ was captured from a real run. Z-Image Turbo is step-distilled: 8 steps at cfg 1.0 is its intended operating point. A relative `workflowPath` is relative to the catalog that writes it, and this catalog lives in `config/` — so `workflows/z-image-turbo.api.json` means `config/workflows/z-image-turbo.api.json`. Writing `config/workflows/…` here would compose to `config/config/workflows/…`, which has never existed.", "id": "comfyui_z_image_turbo", "name": "Z-Image Turbo (ComfyUI)", "providerKind": "workflow", "workflowId": "comfyui_z_image_turbo", "type": "image_generation", "version": "1.0.0", "host": "comfyui", "capabilities": ["text_to_image"], "adapterConfig": { "providerKind": "workflow", "workflowId": "comfyui_z_image_turbo", "workflowPath": "workflows/z-image-turbo.api.json", "bindings": { "prompt": { "node": "13", "input": "text" }, "seed": { "node": "15", "input": "seed" } }, "outputs": { "image": { "node": "18", "type": "image" } }, "steps": 8, "cfg": 1, "sampler": "res_multistep", "scheduler": "simple", "width": 1024, "height": 1024, "filenamePrefix": "deadlock/z_image" }, "resources": { "vramGb": 0, "ramGb": 0 }, "limits": { "maxWidth": 1024, "maxHeight": 1024, "resolutions": ["512x512", "768x768", "1024x1024"] }, "priority": 100, "tags": ["local", "gpu", "image", "comfyui"], "notes": "The template names the checkpoint, text encoder and VAE, so those files must exist in your ComfyUI models directory. Delete this entry if you do not run ComfyUI." } ] }