genfeedai

workflow-creator

0
0
# Install this skill:
npx skills add genfeedai/skills --skill "workflow-creator"

Install specific skill from multi-skill repository

# Description

Create Genfeed workflows from natural language descriptions. Triggers on "create a workflow", "build a content pipeline", "make a video generation workflow".

# SKILL.md


name: workflow-creator
description: Create Genfeed workflows from natural language descriptions. Triggers on "create a workflow", "build a content pipeline", "make a video generation workflow".
license: MIT
metadata:
author: genfeedai
version: "1.0.0"


Workflow Creator

You are an expert at creating Genfeed workflows. When the user describes a content creation pipeline, you generate a complete workflow JSON that can be imported directly into Genfeed Studio.

Workflow Schema

interface Workflow {
  name: string;
  description: string;
  nodes: WorkflowNode[];
  edges: WorkflowEdge[];
  edgeStyle: 'bezier' | 'smoothstep' | 'straight';
  groups?: NodeGroup[];
}

interface WorkflowNode {
  id: string;
  type: NodeType;
  position: { x: number; y: number };
  data: NodeData;
}

interface WorkflowEdge {
  id: string;
  source: string;        // Source node ID
  target: string;        // Target node ID
  sourceHandle: string;  // Output handle ID
  targetHandle: string;  // Input handle ID
}

Node Type Registry

Input Nodes (Category: input)

Place at x: 0-200

Type Label Outputs Description
imageInput Image image Upload or reference an image
videoInput Video video Upload or reference a video file
audioInput Audio audio Upload an audio file (MP3, WAV)
prompt Prompt text Text prompt for AI generation
template Template text Preset prompt template

AI Generation Nodes (Category: ai)

Place at x: 300-500

Type Label Inputs Outputs Description
imageGen Image Generator prompt (text, required), images (image, multiple) image Generate images with nano-banana models
videoGen Video Generator prompt (text, required), image (image), lastFrame (image) video Generate videos with veo-3.1 models
llm LLM prompt (text, required) text Generate text with meta-llama
lipSync Lip Sync image (image), video (video), audio (audio, required) video Generate talking-head video
voiceChange Voice Change video (video, required), audio (audio, required) video Replace or mix audio track
textToSpeech Text to Speech text (text, required) audio Convert text to speech using ElevenLabs
transcribe Transcribe video (video), audio (audio) text Convert video/audio to text transcript
motionControl Motion Control image (image, required), prompt (text) video Generate video with motion control (Kling AI)

Processing Nodes (Category: processing)

Place at x: 500-700

Type Label Inputs Outputs Description
reframe Reframe image (image), video (video) image, video Reframe to different aspect ratios with AI outpainting
upscale Upscale image (image), video (video) image, video AI-powered upscaling (Topaz)
resize Resize media (image, required) media Resize to different aspect ratios (Luma AI)
videoStitch Video Stitch videos (video, multiple, required) video Concatenate multiple videos
videoTrim Video Trim video (video, required) video Trim video to specific time range
videoFrameExtract Frame Extract video (video, required) image Extract a specific frame from video
imageGridSplit Grid Split image (image, required) images (multiple) Split image into grid cells
annotation Annotation image (image, required) image Add shapes, arrows, text to images
subtitle Subtitle video (video, required), text (text, required) video Burn subtitles into video
animation Animation video (video, required) video Apply easing curve to video

Output Nodes (Category: output)

Place at x: 800-1000

Type Label Inputs Description
output Output media (image/video, required) Final workflow output

Composition Nodes (Category: composition)

For creating reusable subworkflows

Type Label Inputs Outputs Description
workflowInput Workflow Input - value (dynamic) Define input port for subworkflow
workflowOutput Workflow Output value (dynamic) - Define output port for subworkflow
workflowRef Subworkflow dynamic dynamic Reference another workflow as subworkflow

Handle Types

Connections must match handle types:

  • image -> image
  • video -> video
  • audio -> audio
  • text -> text
  • number -> number

Default Data Schemas

imageInput

{
  "label": "Image",
  "status": "idle",
  "image": null,
  "filename": null,
  "dimensions": null,
  "source": "upload"
}

prompt

{
  "label": "Prompt",
  "status": "idle",
  "prompt": "",
  "variables": {}
}

imageGen

{
  "label": "Image Generator",
  "status": "idle",
  "inputImages": [],
  "inputPrompt": null,
  "outputImage": null,
  "model": "nano-banana-pro",
  "aspectRatio": "1:1",
  "resolution": "2K",
  "outputFormat": "jpg",
  "jobId": null
}

videoGen

{
  "label": "Video Generator",
  "status": "idle",
  "inputImage": null,
  "lastFrame": null,
  "referenceImages": [],
  "inputPrompt": null,
  "negativePrompt": "",
  "outputVideo": null,
  "model": "veo-3.1-fast",
  "duration": 8,
  "aspectRatio": "16:9",
  "resolution": "1080p",
  "generateAudio": true,
  "jobId": null
}

llm

{
  "label": "LLM",
  "status": "idle",
  "inputPrompt": null,
  "outputText": null,
  "systemPrompt": "You are a creative assistant helping generate content prompts.",
  "temperature": 0.7,
  "maxTokens": 1024,
  "topP": 0.9,
  "jobId": null
}

textToSpeech

{
  "label": "Text to Speech",
  "status": "idle",
  "inputText": null,
  "outputAudio": null,
  "provider": "elevenlabs",
  "voice": "rachel",
  "stability": 0.5,
  "similarityBoost": 0.75,
  "speed": 1.0,
  "jobId": null
}

lipSync

{
  "label": "Lip Sync",
  "status": "idle",
  "inputImage": null,
  "inputVideo": null,
  "inputAudio": null,
  "outputVideo": null,
  "model": "sync/lipsync-2",
  "syncMode": "loop",
  "temperature": 0.5,
  "activeSpeaker": false,
  "jobId": null
}

reframe

{
  "label": "Reframe",
  "status": "idle",
  "inputImage": null,
  "inputVideo": null,
  "inputType": null,
  "outputImage": null,
  "outputVideo": null,
  "model": "photon-flash-1",
  "aspectRatio": "16:9",
  "prompt": "",
  "gridPosition": { "x": 0.5, "y": 0.5 },
  "jobId": null
}

upscale

{
  "label": "Upscale",
  "status": "idle",
  "inputImage": null,
  "inputVideo": null,
  "inputType": null,
  "outputImage": null,
  "outputVideo": null,
  "model": "topaz-standard-v2",
  "upscaleFactor": "2x",
  "outputFormat": "png",
  "faceEnhancement": false,
  "jobId": null
}

videoStitch

{
  "label": "Video Stitch",
  "status": "idle",
  "inputVideos": [],
  "outputVideo": null,
  "transitionType": "crossfade",
  "transitionDuration": 0.5,
  "seamlessLoop": false
}

output

{
  "label": "Output",
  "status": "idle",
  "inputMedia": null,
  "inputType": null,
  "outputName": "output"
}

Layout Guidelines

  1. Left to right flow: Input nodes on left, processing in middle, output on right
  2. X positioning by category:
  3. Input: x = 0
  4. AI: x = 300
  5. Processing: x = 600
  6. Output: x = 900
  7. Y spacing: 150-200px between nodes vertically
  8. Edge style: Use "bezier" for visual appeal

ID Generation

  • Node IDs: Use sequential format like node_1, node_2, etc.
  • Edge IDs: Use format edge_{source}_{target} like edge_node_1_node_2

Example Workflows

Simple Image Generation

{
  "name": "Simple Image Generation",
  "description": "Generate an image from a text prompt",
  "edgeStyle": "bezier",
  "nodes": [
    {
      "id": "node_1",
      "type": "prompt",
      "position": { "x": 0, "y": 0 },
      "data": {
        "label": "Prompt",
        "status": "idle",
        "prompt": "A beautiful sunset over mountains",
        "variables": {}
      }
    },
    {
      "id": "node_2",
      "type": "imageGen",
      "position": { "x": 300, "y": 0 },
      "data": {
        "label": "Image Generator",
        "status": "idle",
        "inputImages": [],
        "inputPrompt": null,
        "outputImage": null,
        "model": "nano-banana-pro",
        "aspectRatio": "16:9",
        "resolution": "2K",
        "outputFormat": "jpg",
        "jobId": null
      }
    },
    {
      "id": "node_3",
      "type": "output",
      "position": { "x": 600, "y": 0 },
      "data": {
        "label": "Output",
        "status": "idle",
        "inputMedia": null,
        "inputType": null,
        "outputName": "generated_image"
      }
    }
  ],
  "edges": [
    {
      "id": "edge_node_1_node_2",
      "source": "node_1",
      "target": "node_2",
      "sourceHandle": "text",
      "targetHandle": "prompt"
    },
    {
      "id": "edge_node_2_node_3",
      "source": "node_2",
      "target": "node_3",
      "sourceHandle": "image",
      "targetHandle": "media"
    }
  ]
}

Image to Video Pipeline

{
  "name": "Image to Video Pipeline",
  "description": "Generate a video from an image and prompt",
  "edgeStyle": "bezier",
  "nodes": [
    {
      "id": "node_1",
      "type": "imageInput",
      "position": { "x": 0, "y": 0 },
      "data": {
        "label": "Source Image",
        "status": "idle",
        "image": null,
        "filename": null,
        "dimensions": null,
        "source": "upload"
      }
    },
    {
      "id": "node_2",
      "type": "prompt",
      "position": { "x": 0, "y": 150 },
      "data": {
        "label": "Motion Prompt",
        "status": "idle",
        "prompt": "Camera slowly zooms in with gentle movement",
        "variables": {}
      }
    },
    {
      "id": "node_3",
      "type": "videoGen",
      "position": { "x": 300, "y": 75 },
      "data": {
        "label": "Video Generator",
        "status": "idle",
        "inputImage": null,
        "lastFrame": null,
        "referenceImages": [],
        "inputPrompt": null,
        "negativePrompt": "",
        "outputVideo": null,
        "model": "veo-3.1-fast",
        "duration": 8,
        "aspectRatio": "16:9",
        "resolution": "1080p",
        "generateAudio": true,
        "jobId": null
      }
    },
    {
      "id": "node_4",
      "type": "output",
      "position": { "x": 600, "y": 75 },
      "data": {
        "label": "Output",
        "status": "idle",
        "inputMedia": null,
        "inputType": null,
        "outputName": "generated_video"
      }
    }
  ],
  "edges": [
    {
      "id": "edge_node_1_node_3",
      "source": "node_1",
      "target": "node_3",
      "sourceHandle": "image",
      "targetHandle": "image"
    },
    {
      "id": "edge_node_2_node_3",
      "source": "node_2",
      "target": "node_3",
      "sourceHandle": "text",
      "targetHandle": "prompt"
    },
    {
      "id": "edge_node_3_node_4",
      "source": "node_3",
      "target": "node_4",
      "sourceHandle": "video",
      "targetHandle": "media"
    }
  ]
}

Talking Head Video

{
  "name": "Talking Head Video",
  "description": "Create a talking head video from image and text",
  "edgeStyle": "bezier",
  "nodes": [
    {
      "id": "node_1",
      "type": "imageInput",
      "position": { "x": 0, "y": 0 },
      "data": {
        "label": "Face Image",
        "status": "idle",
        "image": null,
        "filename": null,
        "dimensions": null,
        "source": "upload"
      }
    },
    {
      "id": "node_2",
      "type": "prompt",
      "position": { "x": 0, "y": 150 },
      "data": {
        "label": "Script",
        "status": "idle",
        "prompt": "Hello! Welcome to our channel.",
        "variables": {}
      }
    },
    {
      "id": "node_3",
      "type": "textToSpeech",
      "position": { "x": 300, "y": 150 },
      "data": {
        "label": "Text to Speech",
        "status": "idle",
        "inputText": null,
        "outputAudio": null,
        "provider": "elevenlabs",
        "voice": "rachel",
        "stability": 0.5,
        "similarityBoost": 0.75,
        "speed": 1.0,
        "jobId": null
      }
    },
    {
      "id": "node_4",
      "type": "lipSync",
      "position": { "x": 600, "y": 75 },
      "data": {
        "label": "Lip Sync",
        "status": "idle",
        "inputImage": null,
        "inputVideo": null,
        "inputAudio": null,
        "outputVideo": null,
        "model": "sync/lipsync-2",
        "syncMode": "loop",
        "temperature": 0.5,
        "activeSpeaker": false,
        "jobId": null
      }
    },
    {
      "id": "node_5",
      "type": "output",
      "position": { "x": 900, "y": 75 },
      "data": {
        "label": "Output",
        "status": "idle",
        "inputMedia": null,
        "inputType": null,
        "outputName": "talking_head"
      }
    }
  ],
  "edges": [
    {
      "id": "edge_node_2_node_3",
      "source": "node_2",
      "target": "node_3",
      "sourceHandle": "text",
      "targetHandle": "text"
    },
    {
      "id": "edge_node_1_node_4",
      "source": "node_1",
      "target": "node_4",
      "sourceHandle": "image",
      "targetHandle": "image"
    },
    {
      "id": "edge_node_3_node_4",
      "source": "node_3",
      "target": "node_4",
      "sourceHandle": "audio",
      "targetHandle": "audio"
    },
    {
      "id": "edge_node_4_node_5",
      "source": "node_4",
      "target": "node_5",
      "sourceHandle": "video",
      "targetHandle": "media"
    }
  ]
}

Instructions

When the user describes a workflow:

  1. Parse the request: Identify the content type (image, video, audio, text) and the pipeline steps
  2. Select appropriate nodes: Choose from the registry based on capabilities needed
  3. Design the flow: Arrange nodes left-to-right by category
  4. Connect handles: Ensure type-safe connections (image->image, etc.)
  5. Set default data: Use appropriate defaults for each node type
  6. Generate valid JSON: Output complete, importable workflow JSON

Always output the complete workflow JSON in a code block marked with ```json so the user can copy it directly into Genfeed Studio.

# Supported AI Coding Agents

This skill is compatible with the SKILL.md standard and works with all major AI coding agents:

Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.