yyh211/fastgpt-workflow-generator
Generates production-ready FastGPT workflow JSON from natural language requirements. Uses AI-powered semantic template matching from built-in workflows (document translation, sales training, resume screening, financial news). Performs three-layer validation (format, connections, logic completeness). Supports incremental modifications to add/remove/modify nodes. Activates when user asks to "create FastGPT workflow", "generate workflow JSON", "design FastGPT application", or mentions workflow automation, multi-agent systems, or FastGPT templates.
npx skills add https://github.com/YYH211/Claude-meta-skill --skill fastgpt-workflow-generator
> Automatically generate production-ready FastGPT workflow JSON from natural language requirements
Use this skill when you need to:
Trigger Keywords: FastGPT, workflow, JSON, multi-agent, 工作流, template matching, workflow automation, node configuration, workflow validation
This skill follows a 5-phase process to generate production-ready workflow JSON:
Goal: Extract structured requirements from natural language input
Process:
{
"purpose": "Workflow objective (e.g., 'Travel planning assistance')",
"domain": "Application domain (travel/event/document/data/general)",
"complexity": "simple | medium | complex",
"features": ["aiChat", "knowledgeBase", "httpRequest", "parallel"],
"inputs": ["userChatInput", "city", "date"],
"outputs": ["Complete plan", "Recommendations"],
"externalIntegrations": ["Weather API", "Feishu API"],
"specialRequirements": ["Multi-agent", "Real-time data"]
}
Output: Structured requirements object
Goal: Find the most similar built-in template
Built-in Templates (stored in templates/ directory):
templates/文档翻译助手.json - Simple workflow (document processing)templates/销售陪练大师.json - Medium complexity (conversational AI)templates/简历筛选助手_飞书.json - Complex workflow (data processing + external integration)templates/AI金融日报.json - Scheduled trigger + multi-agent (news aggregation)Matching Strategy:
Step 1: Coarse Filtering (Metadata-based)
Calculate similarity scores:
- Domain match: travel vs travel = 1.0, travel vs event = 0.3
- Complexity match: simple vs simple = 1.0, simple vs complex = 0.3
- Feature overlap: Jaccard similarity of feature sets
- Node count similarity: 1 - |count1 - count2| / max(count1, count2)
Combined score = 0.3 * domain + 0.2 * complexity + 0.3 * features + 0.2 * nodeCount
Select Top 3 candidate templates
Step 2: Fine Filtering (Semantic Similarity)
For Top 3 candidates:
1. Analyze user requirements vs template characteristics
2. Evaluate workflow structure similarity
3. Calculate comprehensive score
Final score = 0.3 * domain + 0.2 * complexity + 0.3 * features + 0.2 * semantic
Step 3: Selection Strategy
- Highest score < 0.5: Start from blank template
- Highest score 0.5-0.7: Use template as reference, major modifications
- Highest score > 0.7: Use template as base, minor adjustments
Output:
Scenario 1: Generate Based on Template
1. Copy template structure
2. Modify nodes
- Keep: structurally similar nodes (workflowStart, userGuide)
- Modify: nodes requiring prompt/parameter adjustments
- Delete: unnecessary nodes
- Add: new requirement nodes
3. Regenerate NodeId
function generateNodeId(nodeType, nodeName, existingIds) {
// Fixed ID mapping
if (nodeType === 'workflowStart') return 'workflowStart';
if (nodeType === 'userGuide' || nodeType === 'systemConfig') return 'userGuide';
// Generate semantic ID (camelCase)
const baseName = nodeName.replace(/[\s\u4e00-\u9fa5]+/g, '');
let nodeId = baseName ? `${baseName}Node` : `${nodeType}Node`;
// Ensure uniqueness
let counter = 1;
while (existingIds.has(nodeId)) {
nodeId = `${baseName}Node_${counter}`;
counter++;
}
return nodeId;
}
4. Update references
- Traverse all inputs, replace old nodeId with new nodeId
- Update edges' source/target
- Handle two reference formats:
- Array: ["nodeId", "key"]
- Template: {{$nodeId.key$}} (Note: double braces with single $)
5. Auto-layout positions (hierarchical layout algorithm)
function autoLayout(nodes, edges) {
// Topological sort to determine layers
const layers = topologicalLayering(nodes, edges);
// Calculate positions for each layer
const LAYER_GAP_X = 350;
const NODE_GAP_Y = 150;
layers.forEach((layer, layerIndex) => {
const x = -200 + layerIndex * LAYER_GAP_X;
const totalHeight = (layer.length - 1) * NODE_GAP_Y;
const startY = -totalHeight / 2;
layer.forEach((nodeId, nodeIndex) => {
positions[nodeId] = {
x: x,
y: startY + nodeIndex * NODE_GAP_Y
};
});
});
// Fixed position for special nodes
positions['userGuide'] = { x: -600, y: -250 };
}
6. Update configuration
- Modify chatConfig.welcomeText
- Update chatConfig.variables
Scenario 2: Create from Scratch
1. Determine node list
- Required: workflowStart, userGuide
- Add based on features: chatNode, datasetSearchNode, httpRequest468, etc.
- Required: answerNode (output node)
2. Generate nodes and connections
- Use standard node templates
- Fill required fields
- Customize inputs/outputs based on requirements
3. Calculate positions and generate configuration
Output: Complete FastGPT workflow JSON
Level 1: JSON Format Validation
✅ JSON is parseable
✅ Top level contains nodes, edges, chatConfig
✅ Each node contains: nodeId, name, flowNodeType, position, inputs, outputs
✅ flowNodeType is in valid type list (40+ types)
✅ position contains x, y numeric coordinates
Level 2: Node Connection Validation
✅ edges' source/target nodes exist
✅ sourceHandle/targetHandle format correct (nodeId-source-right, nodeId-target-left)
✅ Node input references' nodes and output keys exist
✅ Reference types match (string → string)
✅ Template references {{$nodeId.key$}} nodes and keys exist
✅ No self-loops, no duplicate connections
Level 3: Logic Completeness Validation
✅ Required nodes exist (workflowStart, userGuide, at least one output node)
✅ All nodes reachable from workflowStart (connectivity)
✅ No illegal cycles (unless using loop node)
✅ loop nodes correctly configured with parentNodeId and childrenNodeIdList
✅ No dead ends (non-output nodes without outgoing edges)
✅ All required inputs have values
Output: Validation report (containing errors, warnings, fix suggestions)
Use Cases: Add/delete/modify nodes
Processing Steps:
1. Understand modification intent
Use AI to analyze user request, extract:
{
"action": "add" | "delete" | "modify" | "reconnect",
"targetNodes": ["aiChatNode"],
"insertBefore": "aiChatNode",
"newNodes": [{ "type": "datasetSearchNode", "name": "Knowledge Base Search" }],
"modifications": {
"aiChatNode": {
"inputs": { "quoteQA": ["knowledgeBaseSearch", "searchResult"] }
}
}
}
2. Execute modifications
- Add node: generate new node, reconnect, calculate position
- Delete node: remove node, bypass reconnect, clean references
- Modify node: update inputs/outputs, validate references
3. Re-layout and validate
User Request:
"Create a simple AI Q&A workflow where users input questions and AI responds directly"
Skill Processing:
{
"purpose": "AI question answering",
"domain": "general",
"complexity": "simple",
"features": ["aiChat"],
"inputs": ["userChatInput"],
"outputs": ["AI response"]
}
文档翻译助手.json - Score: 0.85 (simple workflow, direct processing)Generated JSON (key parts):
{
"nodes": [
{
"nodeId": "userGuide",
"name": "System Configuration",
"flowNodeType": "userGuide",
"position": {"x": -600, "y": -250}
},
{
"nodeId": "workflowStart",
"name": "Start",
"flowNodeType": "workflowStart",
"position": {"x": -150, "y": 100},
"outputs": [
{"key": "userChatInput", "type": "static", "valueType": "string"}
]
},
{
"nodeId": "aiChatNode",
"name": "AI Response",
"flowNodeType": "chatNode",
"position": {"x": 200, "y": 100},
"inputs": [
{
"key": "model",
"valueType": "string",
"value": "gpt-4"
},
{
"key": "systemPrompt",
"valueType": "string",
"value": "You are a professional AI assistant that can answer various questions. Please provide accurate and helpful answers based on user questions."
},
{
"key": "userChatInput",
"valueType": "string",
"value": ["workflowStart", "userChatInput"]
}
],
"outputs": [
{"key": "answerText", "type": "static", "valueType": "string"}
]
},
{
"nodeId": "outputNode",
"name": "Output Answer",
"flowNodeType": "answerNode",
"position": {"x": 550, "y": 100},
"inputs": [
{
"key": "text",
"valueType": "string",
"value": ["aiChatNode", "answerText"]
}
]
}
],
"edges": [
{
"source": "workflowStart",
"target": "aiChatNode",
"sourceHandle": "workflowStart-source-right",
"targetHandle": "aiChatNode-target-left"
},
{
"source": "aiChatNode",
"target": "outputNode",
"sourceHandle": "aiChatNode-source-right",
"targetHandle": "outputNode-target-left"
}
],
"chatConfig": {
"welcomeText": "Welcome to the AI Q&A assistant! Please enter your question.",
"variables": []
}
}
User Request:
"Create a document translation workflow that translates user-uploaded documents from Chinese to English"
Skill Processing:
{
"purpose": "Document translation",
"domain": "document",
"complexity": "medium",
"features": ["readFiles", "aiChat", "textOutput"],
"inputs": ["userFiles"],
"outputs": ["translated document"]
}
文档翻译助手.json - Score: 0.95 (perfect match!)Generated Workflow Structure:
workflowStart → readFiles → translateNode → outputNode
Key Node Configuration:
User Request:
"I have an existing AI Q&A workflow (simple_qa_workflow.json),
I want to search the knowledge base first before AI answers,
find relevant information then generate response"
Existing Workflow Structure:
workflowStart → aiChatNode → outputNode
Modification Goal:
workflowStart → knowledgeBaseSearch → aiChatNode → outputNode
Skill Processing:
{
"action": "add",
"targetNodes": ["aiChatNode"],
"insertBefore": "aiChatNode",
"newNodes": [
{
"type": "datasetSearchNode",
"name": "Knowledge Base Search"
}
],
"modifications": {
"aiChatNode": {
"inputs": {
"quoteQA": ["knowledgeBaseSearch", "searchResult"]
}
}
}
}
knowledgeBaseSearch nodeworkflowStart → knowledgeBaseSearchknowledgeBaseSearch → aiChatNodeModified JSON (new and modified parts):
{
"nodes": [
{
"nodeId": "knowledgeBaseSearch",
"name": "Knowledge Base Search",
"flowNodeType": "datasetSearchNode",
"position": {"x": 50, "y": 100},
"inputs": [
{
"key": "datasetIds",
"valueType": "selectDataset",
"value": [],
"required": true
},
{
"key": "searchQuery",
"valueType": "string",
"value": ["workflowStart", "userChatInput"],
"required": true
},
{
"key": "similarity",
"valueType": "number",
"value": 0.5
},
{
"key": "limitCount",
"valueType": "number",
"value": 5
}
],
"outputs": [
{
"key": "searchResult",
"type": "static",
"valueType": "datasetQuote"
}
]
},
{
"nodeId": "aiChatNode",
"inputs": [
{
"key": "quoteQA",
"valueType": "datasetQuote",
"value": ["knowledgeBaseSearch", "searchResult"]
}
]
}
],
"edges": [
{
"source": "workflowStart",
"target": "knowledgeBaseSearch"
},
{
"source": "knowledgeBaseSearch",
"target": "aiChatNode"
},
{
"source": "aiChatNode",
"target": "outputNode"
}
]
}
Modification Summary Report:
knowledgeBaseSearch (datasetSearchNode)aiChatNode (added quoteQA input)knowledgeBaseSearch → aiChatNodeworkflowStart → knowledgeBaseSearch (originally workflowStart → aiChatNode)Rules:
workflowStart, userGuide (systemConfig)_1, _2 suffixExamples:
generateNodeId('chatNode', 'Travel Planning Assistant') → TravelPlanningAssistantNodegenerateNodeId('httpRequest468', 'Weather Query') → WeatherQueryNodegenerateNodeId('chatNode', 'Assistant', {TravelPlanningAssistantNode}) → AssistantNode_1Algorithm: Hierarchical Layout
Steps:
Parameters:
Two Reference Formats:
1. Array Format (direct value reference):
"value": ["workflowStart", "userChatInput"]
2. Template Syntax (string concatenation):
"value": "Please create a plan for me.\n\nDestination: {{$workflowStart.userChatInput$}}\n\nWeather: {{$weatherQueryNode.httpRawResponse$}}"
Important: Template syntax is {{$nodeId.key$}} (double braces with single $)
loop Node:
childrenNodeIdList fieldparentNodeId fieldifElse Node:
weatherQueryNode)["nodeId", "key"]{{$nodeId.key$}}{{nodeId.key}} (missing $)Q1: Import to FastGPT reports "Invalid node type"
A: Check the flowNodeType field, ensure using supported types. Reference references/node_types_reference.md. Common errors:
chatNode is correct (not aiChat)httpRequest468) should be retainedQ2: References between nodes not working
A: Check reference format:
["workflowStart", "userChatInput"] or {{$workflowStart.userChatInput$}}{$workflowStart.userChatInput$} (single brace, should be double)Q3: Some nodes not executing at runtime
A: Use built-in validation to check Level 3, ensure all nodes reachable from workflowStart
Q4: Parallel nodes not executing in parallel
A: Ensure multiple nodes' targets are the same aggregation node, and these nodes have no dependencies
Q5: Loop workflow errors
A: Must use flowNodeType: "loop" node, configure parentNodeId and childrenNodeIdList
## Phase 1: JSON Format Check
- [ ] JSON is parseable
- [ ] Contains nodes, edges, chatConfig
- [ ] All strings use double quotes
- [ ] No trailing commas
## Phase 2: Node Check
- [ ] workflowStart node exists
- [ ] At least one output node exists
- [ ] All flowNodeType valid
- [ ] All nodeId unique
- [ ] All position contains x, y
## Phase 3: Connection Check
- [ ] All edges' source and target exist
- [ ] All handle format correct
- [ ] No duplicate edges, no self-loops
## Phase 4: Reference Check
- [ ] All array references' nodes and keys exist
- [ ] All template references' nodes and keys exist
- [ ] Reference types match
## Phase 5: Logic Check
- [ ] All nodes reachable from workflowStart
- [ ] No illegal cycles
- [ ] No dead-end nodes
- [ ] All required inputs have values
## Phase 6: Runtime Test
- [ ] Import to FastGPT without errors
- [ ] Configure necessary parameters
- [ ] Run test cases
- [ ] Check output meets expectations
templates/文档翻译助手.json - Simple workflow, document processingtemplates/销售陪练大师.json - Medium complexity, conversational AItemplates/简历筛选助手_飞书.json - Complex workflow, data + external integrationtemplates/AI金融日报.json - Scheduled trigger, multi-agentreferences/node_types_reference.md - Complete reference of 40+ node typesreferences/validation_rules.md - Detailed three-layer validation rulesreferences/template_matching.md - Template matching algorithmreferences/json_structure_spec.md - Complete FastGPT JSON structure specificationexamples/example1_simple_qa.md - Complete example: Simple Q&A workflowexamples/example2_travel_planning.md - Complete example: Travel planning workflowexamples/example3_incremental_modify.md - Complete example: Incremental modification# Validate workflow JSON
node scripts/validate_workflow.js path/to/workflow.json
# Copy template
cp templates/文档翻译助手.json my_workflow.json
# View template list
ls -lh templates/
Version: 1.0
Last Updated: 2025-01-02
Compatibility: FastGPT v4.8+
Take yyh211/fastgpt-workflow-generator from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.