From fal-ai
Use when creating fal.ai multi-model pipeline workflows as JSON. Triggers on "create workflow", "chain models", "multi-step pipeline", "image to video pipeline", or complex AI generation pipelines.
How this skill is triggered — by the user, by Claude, or both
Slash command
/fal-ai:fal-workflowThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
<SUBAGENT-STOP>
Generate 100% working, production-ready fal.ai workflow JSON files. Workflows chain multiple AI models together for complex generation pipelines.
Model Discovery: Use bash skills/fal/scripts/search.sh and bash skills/fal/scripts/schema.sh to discover current models and their parameters dynamically. Do not hardcode model IDs.
⚠️ ONLY TWO VALID NODE TYPES EXIST:
| Type | Purpose |
|---|---|
"run" | Execute a model/app |
"display" | Output results to user |
❌ INVALID: type: "input" - This does NOT exist! Input is defined ONLY in schema.input.
{
"name": "my-workflow",
"title": "My Workflow",
"contents": {
"name": "workflow",
"nodes": {
"output": {
"type": "display",
"id": "output",
"depends": ["node-image"],
"input": {},
"fields": { "image": "$node-image.images.0.url" }
},
"node-image": {
"type": "run",
"id": "node-image",
"depends": ["input"],
"app": "fal-ai/flux/dev",
"input": { "prompt": "$input.prompt" }
}
},
"output": { "image": "$node-image.images.0.url" },
"schema": {
"input": {
"prompt": {
"name": "prompt",
"label": "Prompt",
"type": "string",
"required": true,
"modelId": "node-image"
}
},
"output": {
"image": { "name": "image", "label": "Generated Image", "type": "string" }
}
},
"version": "1",
"metadata": {
"input": { "position": { "x": 0, "y": 0 } },
"description": "Simple text to image workflow"
}
},
"is_public": true,
"user_id": "",
"user_nickname": "",
"created_at": ""
}
| Reference | Use Case | Example |
|---|---|---|
$input.field | Input value | $input.prompt |
$node.output | LLM text output | $node-llm.output |
$node.images.0.url | First image URL | $node-img.images.0.url |
$node.image.url | Single image URL | $node-upscale.image.url |
$node.video.url | Video URL | $node-vid.video.url |
$node.audio_file.url | Audio URL | $node-music.audio_file.url |
$node.frame.url | Extracted frame | $node-extract.frame.url |
⚠️ NEVER mix text with variables! Variable MUST be the ENTIRE value.
// ❌ WRONG - WILL BREAK
"prompt": "Create image of $input.subject in $input.style"
// ✅ CORRECT - Variable is the ENTIRE value
"prompt": "$input.prompt"
"prompt": "$node-llm.output"
To combine values: Use fal-ai/text-concat or fal-ai/workflow-utilities/merge-text. Use bash skills/fal/scripts/schema.sh --model "fal-ai/text-concat" --input to see exact parameters.
// ❌ WRONG
"node-b": {
"depends": [],
"input": { "data": "$node-a.output" }
}
// ✅ CORRECT
"node-b": {
"depends": ["node-a"],
"input": { "data": "$node-a.output" }
}
// ❌ WRONG
"my-node": { "id": "different-id" }
// ✅ CORRECT
"my-node": { "id": "my-node" }
openrouter/router → Text only, no image_urlsopenrouter/router/vision → ONLY when analyzing images"schema": {
"input": {
"field": { "modelId": "first-consuming-node" }
}
}
"output": {
"depends": ["node-a", "node-b", "node-c"],
"fields": {
"a": "$node-a.video",
"b": "$node-b.images.0.url"
}
}
| Model Type | Output Reference |
|---|---|
| LLM | $node.output |
| Text Concat | $node.results |
| Merge Text | $node.text |
| Image Gen (array) | $node.images.0.url |
| Image Process (single) | $node.image.url |
| Video | $node.video.url |
| Music | $node.audio_file.url |
| Frame Extract | $node.frame.url |
Use bash skills/fal/scripts/search.sh --query "model name" to discover current models, or bash skills/fal/scripts/schema.sh --model "fal-ai/model-id" for exact parameters.
"schema": {
"input": {
"text_field": {
"name": "text_field",
"label": "Display Label",
"type": "string",
"description": "Help text",
"required": true,
"modelId": "consuming-node"
},
"image_urls": {
"name": "image_urls",
"type": { "kind": "list", "elementType": "string" },
"required": true,
"modelId": "node-id"
}
}
}
Before outputting any workflow, verify:
type: "run" or type: "display" ONLY (NO type: "input"!)$node.xxx has matching depends entryid matches object keymodelId for each fieldThe agent constructs workflow JSON files directly, following all the rules and schema definitions in this skill. No scripts or MCP tools are needed — author the JSON inline according to the Core Architecture and Critical Rules sections above.
Error: unexpected value; permitted: 'run', 'display', field required
Cause: You created a node with type: "input" which does NOT exist.
Solution: Remove ANY node with type: "input". Define input fields ONLY in schema.input.
Error: Node references $node-x but doesn't depend on it
Solution: Add the referenced node to the depends array.
Error: Node key "my-node" doesn't match id "different-id"
Solution: Ensure the object key matches the id field exactly.
Error: image_urls provided but using text-only router
Solution: Switch to openrouter/router/vision when analyzing images.
Every model's input/output schema:
https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=[endpoint_id]
Example:
https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=fal-ai/nano-banana-pro
Or use: bash skills/fal/scripts/schema.sh --model "fal-ai/model-id"
Guides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.
npx claudepluginhub morozovdd/fal-ai-skill --plugin fal-ai