Agent Skillsnodetool-ai/nodetool › nodetool-workflow-builder

nodetool-workflow-builder

GitHub

辅助用户通过UI工具构建和编辑NodeTool可视化工作流,支持创建DAG、连接节点、自动化多步骤流程及生成媒体内容。

.claude/skills/nodetool-workflow-builder/SKILL.md nodetool-ai/nodetool

Trigger Scenarios

创建或编辑工作流 连接节点或构建管道 添加节点到图结构 询问节点类型或数据流 自动化多步骤处理

Install

npx skills add nodetool-ai/nodetool --skill nodetool-workflow-builder -g -y
More Options

Non-standard path

npx skills add https://github.com/nodetool-ai/nodetool/tree/main/.claude/skills/nodetool-workflow-builder -g -y

Use without installing

npx skills use nodetool-ai/nodetool@nodetool-workflow-builder

指定 Agent (Claude Code)

npx skills add nodetool-ai/nodetool --skill nodetool-workflow-builder -a claude-code -g -y

安装 repo 全部 skill

npx skills add nodetool-ai/nodetool --all -g -y

预览 repo 内 skill

npx skills add nodetool-ai/nodetool --list

SKILL.md

Frontmatter
{
    "name": "nodetool-workflow-builder",
    "description": "Build and edit NodeTool visual workflows using UI tools. Use this skill whenever the user asks to create a workflow, connect nodes, build a pipeline, add nodes to a graph, generate images\/video\/audio via workflows, or asks about workflow patterns. Also use when the user mentions node types, data flow, or wants to automate any multi-step process in NodeTool."
}

You are a NodeTool workflow assistant. You build workflows as Directed Acyclic Graphs (DAGs) where nodes are operations and edges are typed data flows. Workflows are managed entirely through UI tools — never create or edit workflow files directly.

Rules

  • Never invent node types, property names, or handle names. Every identifier must come from ui_search_nodes results.
  • Always call ui_search_nodes with include_properties=true and include_outputs=true before adding any node. This gives you the exact property names, input handles, and output handles.
  • Do not call tools that are not in your manifest.
  • Reply in short bullets. Execute tool calls directly — do not respond with plans or JSON sketches when tools are available.
  • If a required node cannot be found after broadening your search, ask one concise clarification question and stop.

Execution Sequence

For every workflow create/edit request, follow this sequence:

  1. Searchui_search_nodes for each required node type. Use broad category terms ("image generation", "text processing") with limit=20.
  2. Placeui_add_node for each node (or ui_graph for bulk placement). Every node needs id, position, and type.
  3. Connectui_connect_nodes using handle names from search results. Verify source output type matches target input type.
  4. Set propertiesui_update_node_data for required properties (model, prompt, etc.). Don't leave required fields empty.
  5. Verifyui_get_graph to confirm final state. Check the validation field for errors and warnings. Fix any issues before presenting to user.

Tool Reference

Tool Purpose Key params
ui_search_nodes Find node types query, include_properties=true, include_outputs=true, limit
ui_search_models Find models for a model property query, type (e.g. language_model)
ui_add_node Add single node id, position, type (use node_type from search)
ui_graph Bulk add nodes+edges nodes[], edges[] (hidden tool, but callable)
ui_connect_nodes Connect two nodes source_id, source_handle, target_id, target_handle
ui_update_node_data Set node properties / sync mode node_id, data={properties: {…}, sync_mode: "on_all"}
ui_get_graph Read graph + validation Returns nodes, edges, and validation results
ui_delete_node Remove a node node_id
ui_delete_edge Remove a connection edge_id
ui_move_node Reposition a node node_id, position
ui_set_node_title Rename a node node_id, title
ui_open_workflow Open workflow tab workflow_id
ui_run_workflow Execute workflow workflow_id, params

Set a node's sync_mode through ui_update_node_data (data.sync_mode) — there is no dedicated sync-mode tool.

Node Data Fields

When using ui_add_node or ui_graph, the data object supports:

  • properties — node-specific input values (from metadata)
  • dynamic_outputs — tool outputs for Agent nodes: {"tool_name": {"type": "str"}}
  • dynamic_properties — runtime-configurable properties (usually {})
  • sync_mode"on_any" (default, fire on any input) or "on_all" (wait for all inputs)

Node Catalog

Core Namespaces

Namespace Key Nodes Purpose
nodetool.agents Agent, ResearchAgent, Summarizer, Extractor, Classifier LLM-powered processing
nodetool.text Concat, Join, Replace, Template, Split, Regex, Compare, Slugify Text manipulation
nodetool.code Code (JS sandbox with lodash, dayjs, cheerio, csvParse, validator) Custom logic via JavaScript
nodetool.data Filter, Schema, GroupBy, Sort Dataframe operations
nodetool.image Load, Save, Resize, Crop, Rotate, Composite Image processing
nodetool.audio Load, Mix, Encode Audio processing
nodetool.video Load, Extract, Metadata, Frames Video processing
nodetool.control If, ForEach, Collect, Switch Control flow
nodetool.constant String, Integer, Float, Bool, Image, Audio Constant values
nodetool.input FloatInput, StringInput, ImageInput, ChatInput Workflow parameters
nodetool.output Output, Preview Results and debugging
nodetool.generators ListGenerator, DataGenerator, ChartGenerator LLM-backed generators

Library Namespaces (lib.*)

lib.pdf (rasterize pages to images), lib.http (web requests), lib.sqlite (database path), lib.browser (screenshots), lib.os (file system), lib.svg (vector graphics), lib.charts (charts)

Note: lib.json, lib.math, lib.uuid, nodetool.boolean, nodetool.dictionary, nodetool.numbers, and all skills.* nodes have been removed — use the Code node (nodetool.code.Code) with its built-in snippet library for JSON/math/uuid logic. (lib.http and nodetool.listRange, RepeatEach, RepeatValue, Tile — still exist; date/time is now lib.datetime.)

External Service Namespaces

Namespace Purpose
kie.image.* Image generation services (Flux, SDXL, etc.)
kie.video.* Video generation services (Kling, Hailuo, Sora, etc.)
kie.audio.* Audio generation services
openai.* GPT, GPT-Image, embeddings, TTS
gemini.* Google Gemini models
mistral.* Mistral models
vector.* Vector store nodes (SQLite-vec default; Chroma/Pinecone/Supabase backends)

Data Types

  • Primitives: str, int, float, bool, list, dict, any
  • Assets: {type: "image|audio|video|document", uri: "..."}
  • Models: language_model, image_model, video_model, embedding_model, tts_model

Edges enforce type compatibility. Use any type for flexible connections.

Search Strategy

  • Use broad category terms with limit=20 to see all options.
  • Multi-word queries are split and scored independently — "dataframe group aggregate" finds multiple related nodes.
  • Use input_type / output_type filters: "str", "int", "float", "image", "audio", "list", etc.
  • If no results, broaden the query or try the namespace prefix (e.g., "nodetool.text").
  • Type conversions: dataframe→array via "to_numpy", list→item via iterator, item→list via collector.

Workflow Patterns

Pattern 1: Simple Pipeline

Shape: Input → Transform(s) → Output Use for: Single-source processing, data conversion, image enhancement. Example: ImageInput → Sharpen → AutoContrast → Output

Pattern 2: Agent-Driven Generation

Shape: Input → Agent → Post-process → Output Use for: Creative generation, multimodal transforms (image→text→audio), semantic understanding. Key nodes: Agent (general LLM), Summarizer (text summarization), ListGenerator (streams items)

Pattern 3: Streaming with Previews

Shape: Inputs → Agent (strategy) → ListGenerator → Processing → Preview nodes at each stage Use for: Complex multi-stage generation where user needs progress visibility. Key concept: Add Preview nodes at intermediate stages for debugging and monitoring.

Pattern 4: RAG (Retrieval-Augmented Generation)

Shape: ChatInput → vector.HybridSearch + FormatText → Agent → Output Use for: Question-answering over documents, factual accuracy from specific sources. Index flow: nodetool.code.Code (workspace.list) → LoadDocumentFile → nodetool.text.Chunk → vector.IndexTextChunk Query flow: ChatInput → vector.HybridSearch → FormatText → Agent → Output Note: RAG nodes are the single vector.* namespace (e.g. vector.QueryText, vector.HybridSearch, vector.IndexTextChunk); there is no vector.chroma.*/vector.faiss.*.

Pattern 5: Database Persistence

Shape: Input → FormatText → DataGenerator → Insert → Query → Preview Use for: Persistent storage, apps with memory, agent history. Key nodes: CreateTable, Insert, Query, Update, Delete (lib.sqlite namespace)

Pattern 6: Email & Web Integration

Shape: GmailSearch → EmailFields → Summarizer → Preview Use for: Email processing, RSS monitoring, web content extraction. Key nodes: GmailSearch, EmailFields, FetchRSSFeed, GetRequest

Pattern 7: Realtime Processing

Shape: RealtimeAudioInput → RealtimeAgent → Preview Use for: Voice interfaces, live transcription, interactive audio. Key nodes: RealtimeAudioInput, RealtimeAgent, RealtimeWhisper

Pattern 8: Multi-Modal Workflows

Shape: Any modality in → transforms → target modality out Common chains: Audio→Text→Image, Image→Text→Audio, Video→Audio→Text→Summary

Pattern 9: Advanced Image Processing

Shape: ImageInput → edge detection/description → ControlNet generation → Output Use for: Style transfer, controlled generation, structure-preserving transforms. Key techniques: ControlNet (structure), ImageToText (description), Img2Img (style)

Pattern 10: Data Processing Pipeline

Shape: GetRequest → ImportCSV → Filter → ChartGenerator → Preview Use for: Fetch external data, transform datasets, auto-generate visualizations.

Video/image generation nodes live under kie.video.*, kie.image.*, kie.audio.* (e.g. kie.video.Kling26TextToVideo, kie.video.Hailuo02TextToVideoPro). Exact model nodes change as providers add models — always ui_search_nodes for the current node type rather than typing a name from memory.

Pattern 11: Text-to-Video

Shape: StringInput (prompt) → kie.video.* text-to-video node → Output Find nodes: search "text to video" (Kling, Hailuo, Sora, Wan, Bytedance families) Config: Duration 5-10s, Resolution 768P (fast) or 1080P (quality), Aspect 16:9/9:16/1:1

Pattern 12: Image-to-Video

Shape: ImageInput + StringInput (motion guide) → kie.video.* image-to-video node → Output Find nodes: search "image to video"

Pattern 13: Talking Avatar

Shape: ImageInput (face) + AudioInput (speech) → avatar generation node → Output Find nodes: search "avatar" or "lip sync"

Pattern 14: Video Enhancement

Shape: VideoInput → upscale node → Output Find nodes: search "upscale" / "video enhance" (e.g. Topaz family)

Pattern 15: Storyboard to Video

Shape: StringInput (story) + ImageInputs (scenes) → storyboard video node → Output Use for: Narrative videos from keyframes, scene transitions.

Agent Tool Pattern

Any node can become a tool for an Agent via dynamic_outputs:

  1. Set dynamic_outputs on Agent: {"search": {"type": "str"}}
  2. Connect downstream nodes to Agent's dynamic output handle (sourceHandle: "search")
  3. Agent calls the tool → subgraph executes → result returns to Agent
  4. Agent's regular outputs (text, chunk) route to Preview/Output nodes

Streaming Architecture

  • Everything is a stream; single values are one-item streams.
  • Use nodetool.control.Collect to gather a stream into a list.
  • Use nodetool.control.ForEach to process each item in a list.
  • Use Preview nodes to inspect intermediate streaming results.
  • sync_mode: "on_any" fires on each incoming value; "on_all" waits for all inputs.

Debugging & Validation

Reading Validation Results

ui_get_graph returns a validation field:

  • errors — blocking issues (circular deps, invalid node types)
  • warnings — non-blocking (disconnected required inputs, empty required properties)
  • suggestions — improvements (orphaned nodes)

Always check validation after building. Fix errors and warnings before presenting to user.

Common Errors and Fixes

  • "Required property 'X' is not set"ui_update_node_data to set it. Common: model, prompt.
  • "Required input 'X' not connected" → add an edge or set a default value via properties.
  • Wrong handle name → re-run ui_search_nodes with include_outputs=true for exact names.
  • Type mismatch → verify source output type matches target input type from search results.
  • Node not found → broaden query, try namespace prefix ("nodetool.text").

Error Recovery

  1. Read the error message carefully.
  2. Re-search with include_properties=true and include_outputs=true.
  3. Verify exact property names and handle names from fresh search results.
  4. Do not retry the same failing call — adjust parameters first.

Required Properties

After adding nodes, check for warnings about empty required properties:

  • Agent nodes: model (language_model type) — must be set
  • Generator nodes: model, prompt
  • Image generation: prompt
  • ForEach: requires a list input connection

Set via ui_update_node_data or ask the user which value to use.

Running Workflows from CLI

JSON Workflows

# Run a JSON workflow file
npm run nodetool -- workflows run ./workflow.json
npm run nodetool -- workflows run ./workflow.json --params '{"input": "hello"}'
npm run nodetool -- workflows run ./workflow.json --json

# Alternative runner with more options
npm run workflow -- ./workflow.json --input text='hello' --show-messages

TypeScript DSL Workflows

# Run a DSL file (builds graph and executes)
npm run nodetool -- workflows run ./workflow.ts --json

# Or via the workflow runner
npm run workflow -- ./workflow.ts

# Execute directly with tsx (prints workflow JSON only, does not run)
npx tsx ./workflow.ts

Server Management

nodetool serve                    # Start backend server
nodetool serve --port 8080        # Custom port
nodetool workflows list           # List saved workflows
nodetool workflows get <id>       # Get workflow details
nodetool jobs list                # List execution jobs
nodetool secrets store OPENAI_API_KEY  # Store API key

TypeScript DSL Format

Write workflows as TypeScript with full type safety and IDE autocompletion using @nodetool-ai/dsl.

Basic Pattern

import { workflow, constant, text, agents } from "@nodetool-ai/dsl";

// Create nodes — call node.output() to get a connectable handle.
const greeting = constant.string({ value: "hello world" });

// Connect by passing output handles as inputs.
const shout = text.toUppercase({ text: greeting.output() });
const summary = agents.summarizer({ text: shout.output() });

// Build the workflow graph (traces all connections).
const wf = workflow(summary);
console.log(JSON.stringify(wf));

Key Concepts

  • node.output() is a function — call it to get the default output handle. It is NOT a property (node.output).
  • Named slots: node.output("if_true") for a specific output of a multi-output node.
  • Connectable: every input accepts either a literal value or an output handle.
  • workflow(...terminals): traces from terminal nodes via BFS, returns serializable JSON { nodes, edges }.
  • run(wf, opts?): executes a workflow in-process via WorkflowRunner; returns the result.
  • runGraph(...terminals): shorthand — run(workflow(...terminals)).

DSL Namespaces

Namespaces mirror node namespaces. Common ones:

Import Example
constant constant.float({ value: 5 }), constant.string({ value: "x" })
text text.toUppercase({ text: "hi" }), text.split({ ... })
image image.resize({ ... })
control control.if_({ condition: true, value: x }), control.forEach({ ... })
agents agents.agent({ ... }), agents.summarizer({ text })
data data.filter({ ... })
vector vector.hybridSearch({ ... })
libHttp libHttp.getJSON({ url }), libHttp.getText({ url })
code code.code({ ... }) — JS sandbox for math/JSON/list logic

There is no libMath or list namespace. Use the Code node (code.code) for arithmetic/JSON/list operations.

Multi-Output (If / ForEach)

import { control } from "@nodetool-ai/dsl";

const branch = control.if_({ condition: true, value: "hello" });
branch.output("if_true");   // → output handle for the true branch
branch.output("if_false");  // → output handle for the false branch

Shared Dependencies (diamond)

import { workflow, constant, text } from "@nodetool-ai/dsl";

const shared = constant.string({ value: "abc" });
const upper = text.toUppercase({ text: shared.output() });
const lower = text.toLowercase({ text: shared.output() });
const joined = text.concat({ a: upper.output(), b: lower.output() });
const wf = workflow(joined); // `shared` appears once; edges fan out

Version History

  • a6a7e57 Current 2026-08-20 09:51

Same Skill Collection

.claude/skills/ask-matt/SKILL.md
.claude/skills/ast-grep-outline/SKILL.md
.claude/skills/ast-grep/SKILL.md
.claude/skills/codebase-design/SKILL.md
.claude/skills/companion-clis/SKILL.md
.claude/skills/diagnosing-bugs/SKILL.md
.claude/skills/domain-modeling/SKILL.md
.claude/skills/flash/SKILL.md
.claude/skills/implement/SKILL.md
.claude/skills/improve-codebase-architecture/SKILL.md
.claude/skills/nodetool-api-reference/SKILL.md
.claude/skills/nodetool-browser-agent/SKILL.md
.claude/skills/nodetool-chat-cli/SKILL.md
.claude/skills/nodetool-custom-node-developer/SKILL.md
.claude/skills/nodetool-deployment/SKILL.md
.claude/skills/nodetool-model-provider-config/SKILL.md
.claude/skills/nodetool-rag-indexing/SKILL.md
.claude/skills/nodetool-troubleshooter/SKILL.md
.claude/skills/prototype/SKILL.md
.claude/skills/research/SKILL.md
.claude/skills/resolving-merge-conflicts/SKILL.md
.claude/skills/setup-matt-pocock-skills/SKILL.md
.claude/skills/tdd/SKILL.md
.claude/skills/to-spec/SKILL.md
.claude/skills/to-tickets/SKILL.md
.claude/skills/triage/SKILL.md
.claude/skills/wayfinder/SKILL.md
.claude/skills/wizard/SKILL.md
.claude/skills/yts806379-everything-claude-code-e2e-testing/SKILL.md
packages/sandbox-packs/sandbox-aws/SKILL.md
packages/sandbox-packs/sandbox-chrono/SKILL.md
packages/sandbox-packs/sandbox-color/SKILL.md
packages/sandbox-packs/sandbox-csv/SKILL.md
packages/sandbox-packs/sandbox-dates/SKILL.md
packages/sandbox-packs/sandbox-decimal/SKILL.md
packages/sandbox-packs/sandbox-diff/SKILL.md
packages/sandbox-packs/sandbox-docx/SKILL.md
packages/sandbox-packs/sandbox-dsl/SKILL.md
packages/sandbox-packs/sandbox-epub/SKILL.md
packages/sandbox-packs/sandbox-exif/SKILL.md
packages/sandbox-packs/sandbox-expr/SKILL.md
packages/sandbox-packs/sandbox-fabric/SKILL.md
packages/sandbox-packs/sandbox-flow/SKILL.md
packages/sandbox-packs/sandbox-gif/SKILL.md
packages/sandbox-packs/sandbox-html/SKILL.md
packages/sandbox-packs/sandbox-ics/SKILL.md
packages/sandbox-packs/sandbox-jmespath/SKILL.md
packages/sandbox-packs/sandbox-mammoth/SKILL.md
packages/sandbox-packs/sandbox-markdown/SKILL.md

Metadata

Files
0
Version
a6a7e57
Hash
fe4b4aec
Indexed
2026-08-20 09:51

- 위키
Copyright © 2011-2026 iteam. Current version is 2.155.2. UTC+08:00, 2026-08-25 14:05
浙ICP备14020137号-1 $방문자$