34 skills · 155 min
Skills
Skill 28 of 34
Run any model on RunComfy from the command line.
6 minutes · 1,333 words · 22 sections
Install
npx skills add runcomfy-com/skills --skill runcomfy-clinpx skills add runcomfy-com/skills/plugin marketplace add runcomfy-com/skillsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
One binary, one auth, every RunComfy model. Install once, sign in once, then call any text-to-image, video, edit, lip-sync, face-swap, or LoRA-training endpoint with runcomfy run <model_id> --input '{...}'. This skill is the foundation every other runcomfy-* skill builds on.
runcomfy.com (opens in a new tab) · CLI docs (opens in a new tab) · All models (opens in a new tab)
npx skills add agentspace-so/runcomfy-agent-skills --skill runcomfy-cli -gPick one:
# Global install via npm (recommended for repeat use)
npm i -g @runcomfy/cli
# Zero-install one-shot (no Node global state)
npx -y @runcomfy/cli --versionA standalone curl-pipe installer also exists for environments without Node — see docs.runcomfy.com/cli/install (opens in a new tab). Inspect any install script before piping it into a shell. This skill only invokes the CLI via Bash(runcomfy *) after you have installed it through one of the verified package managers above.
Confirm:
runcomfy --versionFull options on the Install page (opens in a new tab).
Interactive (opens browser):
runcomfy login
# Code shown in terminal — paste into the browser page, click Authorize
# Token saved to ~/.config/runcomfy/token.json with mode 0600CI / containers (no browser):
export RUNCOMFY_TOKEN=<token-from-runcomfy.com/profile>Verify:
runcomfy whoami
# 📛 you@example.com
# token type: cli
# user id: ...Full flow + token rotation: Authentication (opens in a new tab).
The general shape:
runcomfy run <vendor>/<model>/<endpoint> \
--input '<JSON body>' \
--output-dir <path>Example — generate an image with GPT Image 2:
runcomfy run openai/gpt-image-2/text-to-image \
--input '{"prompt": "a small purple cat at sunset, photorealistic"}'You will see:
⏳ Submitting request to openai/gpt-image-2/text-to-image
request_id: 8a3f...
⏳ Polling status (every 2s)...
in_queue
in_progress
completed
✅ completed
{
"images": [
"https://playgrounds-storage-public.runcomfy.net/.../result.png"
]
}
📥 Downloading 1 file(s) to .
./result.pngBy default the result is downloaded to the current directory. Override with --output-dir ./out, skip downloading with --no-download.
Quickstart: docs.runcomfy.com/cli/quickstart (opens in a new tab).
Ask the CLI — it is the fastest path and the only one this skill is allowed to run:
runcomfy models list --search "kontext" # find the model_id
runcomfy models get blackforestlabs/flux-1-kontext/pro/editmodels get returns the same Input schema the model’s API tab shows: property types, defaults, enums, min/max ranges, and which properties take a public HTTPS URL (format: image_uri / video_uri / audio_uri). Read it before writing --input, rather than guessing field names.
The web catalog is useful for browsing by theme:
| URL | What |
|---|---|
/models (opens in a new tab) | All featured models |
/models/all (opens in a new tab) | The full catalog |
/models/collections/recently-added (opens in a new tab) | Fresh additions |
/models/collections/nano-banana (opens in a new tab) · · · · · · · · |
Everything is runcomfy <subcommand>. Run runcomfy --help or runcomfy <group> --help for the full flag list; the complete reference is docs.runcomfy.com/cli/commands (opens in a new tab).
runcomfy run <model_id>Synchronous run — submit, poll, download. This is the command the sibling skills dispatch through.
| Flag | What |
|---|---|
--input '<JSON>' | Inline JSON body matching the model’s Input schema |
--input-file <path> | Read the JSON body from a file; - reads stdin |
--output-dir <path> | Where to download result files (default: cwd) |
--no-download | Skip the download step; only print the result JSON |
--no-wait | Submit and return request_id immediately; don’t poll |
--poll-secs <n> | Polling interval while waiting (default 2) |
--output json | Machine-readable JSON on stdout, stderr stays empty |
--quiet | Suppress progress lines |
There is no --timeout on run; it polls until the request reaches a terminal state. To stop waiting, use --no-wait and collect the output later with runcomfy result <id>.
runcomfy models list / models get / models categoriesFind a model_id and read its Input schema before building a request, instead of guessing parameter names:
runcomfy models list --search kontext --limit 5
runcomfy models list --category image-to-video
runcomfy models get blackforestlabs/flux-1-kontext/pro/editmodels list prints a table (model_id, name, category, price) and takes --search, --category, --kind, --limit, --offset. models get prints the full input_schema — types, defaults, enums, ranges — plus the price. models categories lists the capability values --category accepts.
runcomfy status / result / cancelRID=$(runcomfy --output json run google/nano-banana-2/text-to-image \
--input '{"prompt": "..."}' --no-wait | jq -r .request_id)
runcomfy status "$RID" # in_queue / in_progress / completed
runcomfy result "$RID" --output-dir ./out # fetch the record and download files
runcomfyresult is how you collect a --no-wait job — re-running run would submit a new request. Aliases: runcomfy requests get / result / cancel.
runcomfy balanceruncomfy balance # balance: $64.11 USD
runcomfy --output json balance # {"balance_microdollars":64106410,...}One wallet funds model runs, deployments and training alike. Worth checking before a long batch.
runcomfy login / whoami / logoutlogin runs the device-code flow; whoami prints the active identity; logout removes the local token file. Set the RUNCOMFY_TOKEN env var to override the file entirely.
runcomfy deployments ... — your own ComfyUI workflowsCatalog models need no setup. A deployment runs a workflow you cloud-saved, on hardware you pick.
runcomfy deployments list
runcomfy deployments get <id> --include-payload # node IDs + input names
runcomfy deployments run <id> \
--overrides '{"6": {"inputs": {"text": "a futuristic city"}}}'
runcomfy deployments status <id> <request_id>
runcomfy--overrides is keyed by node ID, which you discover with deployments get --include-payload. File inputs take a public HTTPS URL or a data: URI. deployments run requires --overrides, --overrides-file or --workflow-file — an empty body is rejected.
Lifecycle management: deployments create --name <n> --workflow-id <uuid> --workflow-version v1 [--hardware AMPERE_48] [--max-instances 2], deployments update <id> --disable to pause (stops billing, keeps config), deployments delete <id> --yes to remove permanently.
runcomfy datasets ... / runcomfy train ... — LoRA training# 1. dataset: media + a caption .txt sharing each file's base name
runcomfy datasets create --name my-dataset
runcomfy datasets upload <dataset_id> ./my-dataset/ --wait # polls until READY
# 2. training job (hours; returns as soon as it is queued)
runcomfy train submit --config ./config.yaml --gpu-type ADA_80_PLUS
runcomfy train status <
datasets upload takes files or a folder; files over 150 MB automatically go through signed upload URLs. The AI Toolkit config must use training_folder: /app/ai-toolkit/output and folder_path: /app/ai-toolkit/datasets/{dataset_name}, where {dataset_name} is the dataset’s name, not its id.
If a job stops early (spot preemption), train submit --wait exits 75 and runcomfy train resume <job_id> continues from the latest checkpoint under the same id.
Output shapes differ per model — some return {"image": "..."}, others {"images": [...]} or {"videos": [...]}. Pull the first URL without hard-coding a path:
runcomfy --output json run openai/gpt-image-2/text-to-image \
--input '{"prompt": "X"}' \
--no-download \
| jq -r '[.. | strings | select(startswith("http"))][0]'Or just let the CLI download for you (the default) and use the file it writes.
while IFS= read -r prompt; do
runcomfy run blackforestlabs/flux-2-klein/9b/text-to-image \
--input "$(jq -nc --arg p "$prompt" '{prompt:$p, steps:8}')" \
--output-dir "./out/$(date +%s%N)"
done < prompts.txt# Submit one or many jobs without blocking
RID=$(runcomfy --output json run bytedance/seedance-v2/pro \
--input '{"prompt": "..."}' --no-wait | jq -r .request_id)
# Later — possibly from a different shell:
runcomfy status "$RID" # is it done?
runcomfy result "$RID" --output-dir ./outstatus only reports state. result is what returns the output — calling run again would submit and bill a new request.
The CLI returns exit code 75 on retryable errors (timeout, 429). Wrap with a shell retry loop:
for i in 1 2 3; do
runcomfy run <model_id> --input '{...}' && break
rc=$?
[ $rc -eq 75 ] && sleep $((2**i)) && continue
exit $rc
done| code | meaning | retry? |
|---|---|---|
| 0 | success | — |
| 1 | unclassified, including Ctrl-C during a run | — |
| 2 | argument parse error (missing required flag, unknown flag) | no |
| 64 | usage error, e.g. a model_id with no /, or a delete without --yes in a non-interactive shell | no |
| 65 | bad input JSON / schema mismatch | no |
| 66 | a local input file doesn’t exist (--input-file, train submit --config, an upload path) | no |
| 69 | upstream 5xx | yes (after backoff) |
| 75 | retryable: timeout / 429; also a training job that stopped before finishing | yes |
| 77 | not signed in or token rejected | no — re-auth |
Full reference: docs.runcomfy.com/cli/troubleshooting (opens in a new tab).
The CLI does three things for each run call:
model-api.runcomfy.net with your bearer token.completed, failed, or canceled. An unknown status aborts rather than polling forever.*.runcomfy.net / *.runcomfy.com, fetch into --output-dir.Ctrl-C during run or deployments run POSTs to the request’s /cancel endpoint before exiting (exit code 1). The Model API only cancels a request that is still queued — once it is running, the CLI says so plainly and prints the id so you can collect the output later with runcomfy result <id> rather than paying for a result you never see.
train submit --wait and datasets upload --wait behave differently on purpose: Ctrl-C there stops watching but leaves the remote work running, so a stray keystroke can’t discard hours of training.
npm i -g @runcomfy/cli or npx -y @runcomfy/cli. A standalone curl-pipe installer exists in the official docs but agents must not pipe an arbitrary remote script into a shell on the user’s behalf — if the user wants the curl path, they should review the script themselves first.runcomfy login writes the API token to ~/.config/runcomfy/token.json with mode 0600 (owner-only read/write). Set RUNCOMFY_TOKEN env var to bypass the file entirely in CI / containers. Never log the token, never echo it into prompts, never check it into a repo.--input. The CLI does not shell-expand prompt content; it transmits the JSON body directly to the Model API over HTTPS. There is no shell-injection surface from prompt content, even when the prompt contains backticks, quotes, or $(...) patterns.enable_web_search outputs are untrusted. They are fetched by the RunComfy model server and can influence generation through embedded instructions inside the asset (e.g. text painted into an image, hidden instructions in EXIF, web-search results steering style). Mitigations the agent should apply:
enable_web_search, default to false; set true only when the user names a real-world entity that requires grounding.model-api.runcomfy.net (catalog + model requests), api.runcomfy.net (deployments, balance) and trainer-api.runcomfy.net (datasets, training) — plus *.runcomfy.net / *.runcomfy.com for downloading generated outputs. The download host is parsed with the same URL parser used to make the request and is re-checked on every redirect hop, so a model output can’t bounce the CLI to an arbitrary or local-network host. No telemetry. No callbacks to third parties.Sibling intent-routed skills that all dispatch through this CLI:
ai-image-generation (opens in a new tab) — text-to-image / image-to-image router across FLUX 2, GPT Image 2, Nano Banana, Seedream, and moreai-video-generation (opens in a new tab) — t2v / i2v / video extend router across HappyHorse, Wan, Seedance, Kling, Veoai-avatar-video (opens in a new tab) — talking-head / lip-sync video routerimage-edit (opens in a new tab) — full image-edit treatment (mask, batch, multi-ref)video-edit — video restyle, motion-control, identity-stable editRun any model on RunComfy from the command line. The `runcomfy` CLI is one binary, one auth, hundreds of model endpoints — image generation, image edit, video generation, image-to-video, lip-sync, face swap, video edit, inpainting, outpainting, extend, ControlNet, relight, upscale, LoRA training and more. Submit a request, poll for status, download the output. This skill teaches the agent how to install, authenticate, discover model schemas, invoke models, stream / poll / no-wait, script in JSON output mode, and handle errors. Also covers the catalog (`models list` / `get`), account balance, Serverless ComfyUI deployments (`deployments`), and LoRA training (`datasets`, `train`). Triggers on "runcomfy cli", "install runcomfy", "runcomfy login", "runcomfy run", "runcomfy whoami", "runcomfy api", "runcomfy deployments", "runcomfy train", "deploy a comfyui workflow", "train a lora on runcomfy", or any explicit ask to call a RunComfy model from a script or terminal. Sibling skills (ai-image-generation, ai-video-generation, image-edit, video-edit, face-swap, lipsync, image-to-video, image-inpainting, image-outpainting, video-extend, controlnet-pose, relight) all dispatch through this CLI.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
Bash(runcomfy*)runcomfy-cli/SKILL.mdmain, last pushed 15 September 2026.SKILL.md, not by matching a directory convention. 2 distinct layouts observed: */SKILL.md, plugins/runcomfy/skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by RunComfy, declaring 1 plugin. It is read for editorial metadata only — never as the skill index, which is always the repository tree./seedream| Curated brand collections |
/models/feature/lip-sync (opens in a new tab) | Lip-sync capability |
/models/feature/character-swap (opens in a new tab) | Character / face swap |
/models/feature/upscale-video (opens in a new tab) | Video upscalers |
--output-dirdeployments delete and datasets delete are permanent. On a terminal they prompt; in a non-interactive shell they refuse with exit 64 unless --yes is passed. An agent should not add --yes unless the user asked for the deletion.allowed-tools: Bash(runcomfy *). The skill never instructs the agent to run anything other than runcomfy <subcommand> — npm, curl, export RUNCOMFY_TOKEN=... lines in this document are install / one-time setup steps for the operator, not commands the skill itself executes on each call.image-to-video (opens in a new tab) — animate a stillface-swap (opens in a new tab) · lipsync (opens in a new tab) · image-inpainting (opens in a new tab) · image-outpainting (opens in a new tab) · video-extend (opens in a new tab) · controlnet-pose (opens in a new tab) · relight (opens in a new tab) — narrow technique routers/runcomfy-com/skills.md, and each skill at its own .md URL.