CawCut Generate
Generate images and videos via CawCut official node capabilities. Wraps
. Always checks the live App catalog for a similar published App before generating, and hands off to
when one is a good fit.
Skill files are English-only. and
must not contain Chinese or other non-English prose (including YAML
trigger phrases). Match the user's language only in live replies via
.
Step 0 — Bootstrap
Run bootstrap as a silent guardrail, not as a user-facing phase.
- At most once per AI session. If any command has already succeeded in this AI session, skip all bootstrap checks and continue.
- Use only one explicit check command:
cawcut upgrade check --json
.
- Do not also run , , or .
- If , run yourself via Bash (do not ask the user to type it). It refreshes CLI + skills. After it succeeds, continue this skill from Step 1 — do not stop or ask the user to re-invoke.
- If
"ahead_of_registry": true
(local is newer than npm ), continue without upgrading. This usually means a local/dev build; do not ask the user to downgrade or run .
- If the check fails because is missing, ask the user to install the CLI via npm (external users — no git clone or repo ):
bash
npm install -g @ubnt/cawcut
After install succeeds, continue bootstrap; auth is handled in step 4 below.
- For other check failures, continue and mention the warning only if a later CLI command fails.
- Do not print "bootstrap checks passed" after bootstrap — move directly to Step 1 (or, under the bare-invoke exception, straight to asking what to generate).
- Let the first real command (,
cawcut capabilities list --models --json --capability <cap>
, or ) validate auth. If it fails with token/auth errors (including ), run yourself via Bash — do not ask the user to type it. Briefly tell the user a browser tab will open for OAuth consent; wait for login to finish, then retry the command that failed once. Only escalate to the user if login fails (denied, timeout, port conflict).
- This skill's references (
references/troubleshooting.md
, ) live under the base directory printed at the top of this skill body — them directly at <base_dir>/references/<file>.md
. Do not / to locate them; that base directory can be a symlink that a plain silently fails to traverse.
- Structured user-ask tool (check every session). In Claude Code, use for every enumerable choice. In Cursor, use . If either tool is in your allowed-tools list, you must use it for all enumerable decisions in this skill — App vs official generation, capability/mode, model pick, Phase A/B settings, enum values, media source, upload recovery — unless overflow forces a numbered text table for that batch only (see Interactive selection). Never default to a numbered text menu while / is available and the option count fits. A user declining one such call is not grounds to stop using it for the next decision — see Interactive selection's opening rule for how to read the decline message.
Catalog freshness (mandatory)
Source of truth: only the output of a
command you run in
this user message's turn for the
current subject/capability/style. Never treat app names, IDs, counts, or JSON from earlier messages as authoritative — conversation memory is not a catalog. A
"no App match" conclusion from a
prior user message is never reusable.
Per-user-message rule (highest priority): On
every new user message, before writing any reply or calling any other tool, run
first — this is a
mechanical step, not a judgment call; do not reason about whether the message "could involve" App matching before running it. The catalog may have changed on the server since the last message (e.g. the user published a new App on the web).
The bare-invoke case below is the only content-based exception — do not construct another one by analogy.
Bare-invoke exception (the only content-based skip): If the message is
only the skill invocation itself — no prompt, subject, media, or capability mentioned anywhere in it — there is nothing yet to match against any App's name/description, so skip
for this message and ask the user what they want to generate instead (free text; see Workflow step 3's bare-invoke handling). The moment their reply contains real content, it's a new user message — run
per the rule above before anything else, no carry-over.
Also re-run Step 1 when any of these is true:
- User's tool call ( / / menu) was rejected or interrupted and their next message changes subject, capability, or style — treat exactly like a new user message and restart from Step 1, even as a "follow-up" in the same exchange
- User switched account, re-logged in, or just succeeded
- User says they published, shared, or created a new App
- User asks to refresh or re-list Apps
Skip Step 1 catalog check only when all are true (same user message's turn, same subject/capability/style):
- You already ran for this user message and completed the smell test (or the user chose official generation after a plausible-match prompt)
- User is only tuning settings on the plan already in flight (ratio, resolution, quality, count, duration, "one more", "make it bigger")
- Or this turn started from handoff where the user already picked "Official generation instead" in this user message (see Decide-once guard in Step 1)
Never skip the per-user-message
across user messages — even if subject, capability, style, and wording are unchanged.
Hard gate: Workflow step 9 runs a pre-flight check immediately before
— see there.
Step 1 — Check the App catalog first (before every call)
Decide-once guard (same user message only) — skip this entire step if this turn started because
already ran the per-user-message
in
this user message and decided there's no matching App, or the user picked "Official generation instead" there. Go straight to capability/model discovery below; do not re-run
to double-check a decision already made
in this user message.
Otherwise, apply the
Per-user-message rule,
Bare-invoke exception, and
Skip Step 1 checklists in
Catalog freshness above. If you have not yet run
for this user message and the bare-invoke exception doesn't apply, execute Step 1 below — do not reuse a prior message's list or "no match" conclusion.
- Run without (lean JSON: name, description, credits, source — no ; token-efficient smell test).
- Check whether any App's / clearly overlaps with the user's ask. This is a quick smell test, not full scoring — owns the formal scoring rubric and re-checks properly once you hand off.
- No plausible match — continue below with raw generation. Do not mention the catalog check to the user.
- Plausible match — always call / first (numbered text only if the tool is unavailable):
Found a published App that does this: <name> — <description> (N credits).
1. Use <name>
2. Continue with official generation
- User picks the App → hand off to with that App name already decided. It skips catalog scoring/menus (its Step -1) and goes straight to + tables + input menu; it still live-fetches in that turn when it needs the internal app ID.
- User picks official generation → continue this skill's flow below. Do not ask about the catalog again for the rest of this turn.
Interactive selection (mandatory — tool first)
If the user just declined an / call: the tool result carries harness boilerplate telling you to "STOP what you are doing and wait for the user to tell you how to proceed." That sentence is attached automatically to
every declined tool call by the runtime — it is not the user speaking, and it is not an instruction to stop using the tool. Read it as: stop the
one specific action you were mid-way through (don't retry the identical question, don't proceed to
on unconfirmed choices) and look at what the user's actual next message says. It does
not, by itself, license falling back to numbered text for the
next enumerable decision — that next decision still must open with the tool, exactly as if the rejection had never happened. Only an explicit plain-text request from the user ("stop popping up menus", "just ask me in text") licenses a session-wide fallback. The STOP wording's urgency is not evidence of that request — do not let it override this rule.
Default behavior: For every enumerable choice,
always call
(Claude Code) or
(Cursor)
before showing a numbered text menu or asking the user to type capability names, model IDs, aspect ratios, or enum values. Text-only menus are
fallback only.
Tool names by host:
| Host | Tool name |
|---|
| Claude Code | |
| Cursor | |
Below, structured user-ask tool means whichever of these is available in the current session. Do not guess from capability alone — check your allowed-tools list.
Session checklist (before the first menu in this turn):
0.
Self-check before sending any reply: if the sentence you're about to send asks the user to pick between fixed options (image or video, capability, model, ratio, …) — even folded inside a friendlier sentence that also asks something open-ended like "what's the subject?" — stop. That sentence is forbidden as plain text. Split it: fire
/
for the enumerable part now; keep only the open-ended part as prose, asked separately (same turn is fine, just not merged into one sentence).
- Is or available? If yes, you must use it for every row in the table below that fits in one call.
- If no tool exists (CLI-only host), use numbered text in .
- If the tool exists but the candidate count exceeds one call (model-list overflow, long enums), use a numbered text table for that batch only; then resume / for the next small decision.
Forbidden while the tool is available: numbered text menus (
), "reply with the number or name", or asking the user to type capability names, model IDs, or enum values from memory.
| Step | Always use structured user-ask tool for |
|---|
| Image vs video | Output type |
| Capability / input mode | text-to-image, image-to-image, text-to-video, … |
| Model | Each plan-visible model (mark default in label) — see Model-list overflow (Rule 10, Phase A Choice 2) when the candidate count exceeds what the tool can hold |
| Settings gate | Defaults / change model / customize settings (Phase A, single-select) |
| Settings — customize | One structured user-ask tool call, one question per axis from the current model's live schema (Phase B) — never collapse multiple axes into one single-select pick |
| Each enum | Every value from JSON |
| Media | Same three-way branch as |
Fallback only: Use numbered text menus in
only when /
is unavailable, or when option count/structure exceeds what the tool supports for that batch (model-list overflow, long enum lists). Falling back for one decision does
not exempt the next small decision — re-check and use the tool again when it fits. UX rule 10 and Workflow step 7 text examples are fallback shape only —
not the default when the tool is present. Only ask for free-text
prompt content or a
URL/path after the user picks a Custom / URL / path branch.
UX Rules
- Be concise. Default output is the result URL(s). Do not dump raw JSON unless debugging.
- Always pass — jobs are async, CLI blocks and prints the URL when done.
- Always pass for image and video generations. The CLI resolves the platform-appropriate downloads folder automatically ( on macOS/Linux, on Windows) — do not hardcode a path or download the result yourself. Only skip if the user explicitly says they only want the URL.
- Reply language:
- Bare skill invoke → English. If the user only runs the skill command with no substantive text (e.g. , , or the skill name alone), set to English for menus, summaries, and questions.
- Follow the conversation after that. Once the user adds a real request or follow-up in another language, switch to match that language for the rest of the session (unless they explicitly ask for English).
- All prose, status summaries, option labels, questions, and recovery guidance use .
- Keep CLI commands/flags, model IDs, app IDs, JSON keys, URLs, and raw error codes in English.
- Do not paste raw English CLI output as the user-facing answer; summarize it in .
- Do not call CawCut HTTP APIs with curl — the CLI handles auth, media upload, and token refresh.
- Template first — see Step 1 (Check the App catalog first) above; it runs for every request, not just ones that sound template-like. When the user picks the offered App, follow 's disclose app on selection rule — name the App, show metadata + inputs tables, then collect inputs via menus; never say only "this app" without details.
- Staged discovery (required) — never fetch all capabilities with full schema in one shot (
cawcut capabilities list --models --schema --json
without dumps ~100KB and may be truncated). Use this sequence instead:
- After capability is known →
cawcut capabilities list --simple --capability <cap>
(or --models --json --capability <cap>
) to pick a model.
- After model is chosen →
cawcut capabilities list --models --schema --json --capability <cap> --model "<model_id>"
for that model's parameters only.
Forbidden: writing Python/shell scripts to parse capabilities JSON; use CLI , , or filters (or a one-line if the host already has it).
- Choice-first — if the user did not specify enough information, always call / first (numbered text only when the tool is unavailable or overflow applies). Fixed or enumerable parameters must always be clickable menus — the user picks options; never types parameter names, capability names, model IDs, or enum values from memory:
- image or video output
- text-only, image input, video input, audio input, or omni input
- model options from live discovery, with the BE default first
- enum/options/ranges from the selected model's parameters
- No unbounded preference questions — never ask only "Any preference on resolution, aspect ratio, quality, or number of images?". Always show concrete options from the live schema via / (per Interactive selection above), plus "use default" and "custom" when customization is possible.
- Settings menu before running — once prompt/media/capability/model are known, resolve settings in two phases. Image and video use the same shape. Precedence: always use / for Phase A (one call: defaults / change model / customize) and Phase B (one batched call, one question per axis) when the tool is present — do not merge into a single numbered text block. Workflow step 7 combined text examples are fallback rendering only (tool unavailable, or overflow per model-list / long enum caps).
- Phase A — gate (one / call):
- Choice 1: run now with schema defaults on the current model (show the default values).
- Choice 2: change model — list every model from
cawcut capabilities list --simple --capability <cap>
(or the lean JSON equivalent); mark . Model-list overflow: / typically caps at ~2–4 options per question; when the model count for this capability exceeds that, present a numbered text table (columns: , name, default marker, key specs) instead of an unnumbered list, and tell the user they can reply with either the number or the model name — this mirrors 's App-picker overflow (Interactive selection rule 7). Apply the same numbered-table treatment to any other live-schema-driven candidate list (models, capabilities, or a long enum) that exceeds the cap. On pick, re-fetch schema for the new model (--capability <cap> --model "<id>" --schema --json
), then re-enter Phase A for the new model.
- Choice 3: customize settings — proceed to Phase B.
- Phase B — customize (one batched / call, one question per axis): build the axis list from the current model's live schema only (Step 5) — different models expose different axes (e.g. GPT Image 2 has ///; Kling 3.0 Pro has // instead, no ). For every cost- or visual-impacting axis present (aspect ratio, resolution/size, quality, duration, image count, audio on/off, …), ask one question with its own options, first option always "use default (show value)".
- Never fold two different axes into one single-select pick. The point of Phase B is that the user can independently touch any subset of axes while the rest silently default — forcing one exclusive choice among axes (e.g. "customize duration" vs. "customize ratio" as alternatives) drops the unpicked axes without ever showing them.
- / caps at 4 questions per call. If the current model exposes more than 4 cost/visual-impacting axes, batch the 4 most impactful first; the rest still fall under Rule 12 (advanced/non-impacting params stay defaulted without asking).
- A custom numeric value (e.g. a duration inside ) is an option within that axis's own question, not a separate top-level choice.
- For common settings (each is its own Phase B question/axis):
- Aspect ratio: list every value or the selected model's ratio/aspect_ratio parameter ; mark the default. If the schema has no aspect-ratio field, do not invent a .
- Resolution/size/quality/style: list from the matching parameter; mark defaults. For min/max ranges, show default, min, max, and "custom within range".
- Image count: offer , , , with marked default unless the schema says otherwise. If the model has , use ; otherwise use .
- Video duration: list ; for , show default, min, max, and custom seconds within range.
- Boolean toggle (e.g. ): offer On (default) / Off as the two options for that axis's question whenever the parameter description flags a cost/time effect (Rule 14).
- Do not ask for advanced params the user did not mention unless they are required or clearly cost/visual-impacting. Use defaults from the live model schema for the rest.
- Session reuse — after the first generation, capture from the JSON result. For every follow-up in the same session, pass — including when capability or model changes (e.g. text-to-image → image-to-image → text-to-video). Each call appends new generation nodes to that workflow (history is preserved). Omit only when the user explicitly wants a new project or the request is clearly unrelated to this session.
- Multi-image / multi-candidate () — is how many parallel generation nodes to add in this request (max 4). It is not how many times the workflow runs overall. If the user wants more than 4 candidates (e.g. "5 candidates"), do not call CLI; reply that the model/platform supports at most 4 parallel candidates. For : if the model schema has and the user wants multiple images in one API call, prefer ; otherwise use (works for image and video). Credits and time scale roughly with (and with per node when set).
- Never assume models or params from training data — available models depend on the user's plan. Always discover via CLI first.
- Never use illustrative media examples as actual inputs. When , , or is required, any example URL or path in SKILL.md, , model schema, or docs (including , placeholders) is hint only — not a usable resource. Do not pass them to the CLI unless the user explicitly provided that exact file or URL in this conversation.
- Media input — menu, not invented assets — always present the three-way branch via / per Interactive selection (above). The numbered list below is text fallback shape only. Same bar as . For required media, offer: 1) file already in chat 2) HTTPS URL 3) local path. Map the choice to / / yourself. If required media is missing, show this menu and wait — do not run with fabricated or placeholder examples.
- Don't pre-inspect local media before attempting — do not shell out to //
sips -g pixelWidth/pixelHeight
(or similar) to check a local file's size or dimensions before running. Attempt directly; if upload pre-flight fails, the CLI's error already reports the exact size/dimension and its limit — act on that error (see "Upload limits" above / Errors below), not on a manual inspection you ran first.
Capabilities
| What it does | Media input |
|---|
| Text → image | — |
| Text → video | — |
| Edit / stylize image | required |
| Animate a still | required |
| Any media → video | at least one of / / required; types may be combined (e.g. avatar image + music audio) |
Discover models and parameters (required)
Use staged CLI discovery — do not pull full schema for all five capabilities at once.
Step A — pick capability (if not already obvious from the user request):
Step B — list models for that capability only (after capability is known):
bash
cawcut capabilities list --simple --capability text-to-video
# or: cawcut capabilities list --models --json --capability text-to-image
Each
line is
with
when applicable. Split on the
first colon only.
Step C — load parameters for the chosen model only:
bash
cawcut capabilities list --models --schema --json --capability text-to-video --model "Seedance 2.0"
This returns a small JSON payload (one capability, one model) with BE-sourced metadata:
- , ,
- — names, types, defaults, options, min/max, descriptions
- , , when applicable
- — input limits for image/video/audio capabilities (count, roles, and optional per-model )
Never run bare
cawcut capabilities list --models --schema --json
(all capabilities) unless the user explicitly asks to browse every capability's full schema at once.
Upload limits (platform): Before uploading local files, CLI loads
and validates size/format/dimensions. CLI does
not compress. On failure, do
not just print the error and stop, and never suggest CawCut Web as a workaround —
always call
/
first with: (1) compress/resize it for you now via
/
and retry automatically, (2) they'll fix it and re-upload, or (3) cancel. Numbered text
only if the tool is unavailable. If they pick (1), run the fix command yourself, then retry the upload. See
references/troubleshooting.md
for the exact commands per failure type. Run
to show current caps.
Rules:
- Only suggest or pass values that appear in the JSON for the chosen capability.
- Read keys and allowed values from that model's (and related fields). Do not invent param names.
- Treat BE's as the source of truth. Each capability should have exactly one default; if none or more than one is present, ask the user to choose from the listed models.
- For the default model, omit , or pass its explicitly.
- Only when live discovery is unavailable and the user still asks to proceed, use fallback defaults: image/image edit = ; video/animate/omni = .
- Quote values that contain spaces or parentheses.
Human-readable summary (names only, no parameters):
bash
cawcut capabilities list --models
Human-readable summary with parameters (text, not JSON — for a quick look, not for building the table below):
bash
cawcut capabilities list --schema
See
for a short field guide — not a model catalog.
Present parameters to users (required)
cawcut capabilities list --models
alone lists names only — no params.
cawcut capabilities list --schema
(implies
) adds one dense line per parameter in plain text — useful for a quick look, but still render a markdown table for the user from the
scoped form; do not paste raw CLI text/JSON or prose-only bullets when explaining models.
cawcut capabilities list --models --json --capability <cap>
is
lean —
/
/
/
only, for picking a model within one capability. Add
and
when you need
,
,
/
, or
for a single model.
cawcut capabilities list --simple --capability <cap>
is the lightest human output for model menus (one line per model).
When the user asks what a model supports or which settings to pick, build a markdown table from live JSON for the selected capability + model:
| Name | Type | Constraints / options | Default | Required | Notes |
|---|
| JSON field | Table column |
|---|
| Name — the key |
| Type (, , , , …) |
| or / | Constraints — comma-join ; for ranges write |
| Default — when absent |
| Required — only when is ; else |
| + CLI hint | Notes — e.g. ; arrays use JSON value |
Also include non-
fields when present:
| Source field | Present as |
|---|
| Extra row or note for ratio when no param |
| / | Row for video length |
| Separate media inputs table (below) |
| Top-level (implicit) | Row: / / — / — / yes / CLI positional arg |
CLI flags table — show once when explaining
(not per model):
| Name | Type | Constraints / options | Default | Required | Notes |
|---|
| string | — | — | yes | positional arg |
| enum | , , , , | — | yes | sets input/output mode |
| string | values from JSON only | capability default | no | quote if spaces |
| key=value | from selected model | per-field defaults | no | repeatable; arrays/objects as JSON string |
| file | url | local path or HTTPS | — | yes for image/omni caps | repeatable; local auto-upload |
| file | url | local path or HTTPS | — | omni optional | repeatable |
| file | url | local path or HTTPS | — | omni optional | repeatable |
| number | 1–4 | 1 | no | parallel candidates; not workflow run count |
| string | existing workflow UUID | — | no | reuse same project for all session follow-ups |
| flag | — | off | recommended | block until task completes |
| flag | path | omit = system Downloads | off | recommended | auto-save image/video |
| flag | — | off | recommended | structured output; preserves signed URLs |
Example — GPT Image 2 / (shape reference; values must match live JSON):
| Name | Type | Constraints / options | Default | Required | Notes |
|---|
| string | — | — | yes | text description |
| string | , , , , , , , , , | | no | |
| string | , , | | no | |
| string | , , | | no | |
| number | 1–4 | | no | multiple images per API call; or use |
Example — GPT Image 2 / — same params plus:
| Name | Type | Constraints / options | Default | Required | Notes |
|---|
| file | url | up to 16 reference images | — | yes | or URL |
Always re-fetch JSON before presenting — plans and BE config change.
Workflow
- Check the App catalog — see Step 1 above (runs for every request, with the decide-once guard and the bare-invoke exception). Continue below only after the user chooses official generation or no App matches.
- Discover capability — infer from the user request or offer image vs video + input mode choices.
- List models —
cawcut capabilities list --simple --capability <cap>
(or lean --models --json --capability <cap>
). Put the default model first in menus.
- Pick output and input mode with choices (when not obvious):
- Image output: or
- Video output: , , or
If the user's prompt/media makes the answer obvious, state the inferred choice and continue. If not, always call / first (per Interactive selection above); numbered menu in only when the tool is unavailable.
Bare invoke, zero signal: call / for Image vs Video in this same turn — do not defer it while waiting to also collect the subject in plain text. The subject/idea ask (free text, unbounded) runs alongside it, never merged into one sentence with the image/video choice.
- Choose model — from Step 2 output only. Put the / model first and mark it recommended; offer change model again in the settings menu (UX rule 10) for both image and video.
- Load schema —
cawcut capabilities list --models --schema --json --capability <cap> --model "<model_id>"
before building param tables or the settings menu.
- Collect prompt/media — ask for the generation prompt and any required , , or input. If required media is missing, show the three-way menu (UX rules 16–17) and wait for the user's real file or URL — never substitute example or placeholder media from docs or schema.
- Present the settings menu before generating, per Rule 10's two phases. Must include change model in Phase A (same for image and video). Do not ask an open-ended preference question.
Fallback example (English) — when
/
is unavailable or overflow applies (
shape reference only — every value shown, including which one is "(default)", must come from that model's live schema, not from this example):
Phase A — single-select gate (text fallback):
Run with defaults, change model, or customize settings:
1. Use defaults (recommended) on GPT Image 2: ratio 16:9, resolution 1K, quality low, count 1
2. Change model: GPT Image 2 (default) / GPT Image 1 / …
3. Customize settings
If the user picks 3, Phase B (text fallback shape for one axis — repeat per axis, or batch via
/
):
- Aspect ratio: 16:9 (default) / 1:1 / 9:16 / 4:3 / 3:4 / custom
- Resolution: 1K (default) / 2K / 4K
- Quality: low (default) / medium / high
- Count: 1 (default) / 2 / 3 / 4
When / is available (required path) — same GPT Image 2 /
scenario, decomposed (labels in
):
- Phase A gate — one / call:
- — Run with schema defaults on current model (show default values)
- — Open model picker (overflow → numbered text table per Rule 10 if model count exceeds cap)
- — Proceed to Phase B
- Phase B customize — one batched / call, one question per axis (never one pick across axes):
- Aspect ratio — options from live schema; first option = use default (show value)
- Resolution — same pattern
- Quality — same pattern
- Count — same pattern
Video example — Phase B axes come from that model's own schema, not GPT Image 2's (tool-available: same batched one-question-per-axis pattern; text fallback shape):
- Duration: 5s (default) / 10s / 15s / custom (4–15s)
- Aspect ratio: adaptive (default) / 16:9 / 9:16 / 1:1 / 21:9 / 4:3 / 3:4
- Resolution: 720p (default) / 480p / 1080p / 4k
- Audio: On (default) / Off
A model like Kling 3.0 Pro exposes no
axis but does have
— build Phase B strictly from that model's live
/
/
; never reuse another model's axis list or default marker.
If the user later writes in another language, present the same menu in
.
Only include options that exist in the selected model's schema. If a schema uses different values (for example
,
,
,
, or numeric seconds), display those exact values instead.
8.
Build flags from the chosen model's
/
/
. Use selected values, or schema defaults when the user chooses the default option.
9.
Run with :
Pre-flight check (do this immediately before building the command): Has
been run
for this user message before routing for the
current subject/capability/style? If
no → stop and go back to
Step 1 now. Do
not call
first. A prior user message's catalog check or "no match" does not count.
bash
cawcut generate "<prompt>" \
--capability <capability> \
[--model "<model_id from JSON>"] \
[--param key=value ...] \
[--loop <1-4>] \
[--image|--video|--audio <file|url>] \
--wait --download --json
Array/object params use JSON in the value:
bash
--param 'colors=[]'
--param 'colors=["#004035","#008C65","#025940","#008C3E","#072621"]'
- Capture for every session follow-up (any capability or model):
bash
cawcut generate "<revised prompt>" \
--capability <cap> \
--workflow-id <id from prior JSON> \
--wait --download --json
When switching to a media capability (e.g. image-to-image after text-to-image), pass
/
/
with the prior
entry or user-provided file — nodes are appended side-by-side; BE does not auto-wire prior outputs.
Omit
only for a clearly unrelated request or when the user asks for a new project.
- Deliver — parse JSON; share every / . Use exact signed URLs (do not strip query parameters). Always also report (or if is absent) and (or ) from the same JSON — every single completed generation, even back-to-back ones in the same session. Never omit this because it was already shown for a prior task.
Async tasks
The CLI prints
before polling. Capture it as a recovery handle.
- With : CLI blocks, then prints result URLs on success.
- Without :
cawcut task status <task_id> --wait
- On timeout: resume with
cawcut task status <task_id> --wait
Errors
| Symptom | Action |
|---|
| Run via Bash, then retry the failed command |
| |
| Invalid / unknown model | Re-run cawcut capabilities list --models --schema --json --capability <cap> --model "<id>"
for this user |
| CLI not found | npm install -g @ubnt/cawcut
(Step 0); then via Bash |
See
references/troubleshooting.md
and
(discovery guide only).