SF
STS Forge

Graph Editing

Graph editing verbs: add-node (40 types), connect, disconnect, set-pin-default, remove-node, trace-path.

Back to AI Guide

Graph editing verbs create, connect, modify, and remove nodes in Blueprint graphs. This page is the complete reference for add-node (all 40+ node types), connect, disconnect, set-pin-default, and remove-node.


Workflow: getting node GUIDs#

Most graph editing verbs require 8-character node GUIDs. To obtain them:

  1. Export the Blueprint with --format=detail. This appends GUIDs after every node name.
  2. Or use read-graph -asset=<path> -graph=<name> --format=detail.
  3. Or use find-nodes to search by type or name. Results include GUIDs.

Always use detail format before write operations. The summary format omits GUIDs.


add-node#

Add a graph node. 40+ node types supported. All type names are case-insensitive.

Common parameters (all types)#

Param Required Description
-asset= Yes Blueprint asset path (e.g., /Game/Blueprints/BP_Player)
-type= Yes Node type (see tables below)
-graph= No Graph name (defaults to first EventGraph/UbergraphPage)
-posX= No X position in graph (default 0)
-posY= No Y position in graph (default 0)

Idempotency: If a matching node already exists within 50px of the specified position, the verb returns it with "action":"already_exists" instead of creating a duplicate.


Function call types#

Type Extra Params Description
CallFunction -function= (required), -class= (optional) Call any function. Searches BP parent class hierarchy if no -class= given.
PrintString (none) Convenience wrapper for UKismetSystemLibrary::PrintString.
Delay (none) Convenience wrapper for UKismetSystemLibrary::Delay.
SpawnActor -actorClass= (required) Spawn an actor. Class must be an AActor subclass.
CallParentFunction -function= (required) Call parent implementation. Auto-maps: BeginPlay -> ReceiveBeginPlay, Tick -> ReceiveTick, EndPlay -> ReceiveEndPlay.
CreateWidget (none) Convenience wrapper for WidgetBlueprintLibrary::Create.

Event types#

Type Extra Params Description
Event -eventName= (required), -class= (optional) Built-in event node. Auto-maps: BeginPlay, Tick, EndPlay, AnyDamage, ActorBeginOverlap, ActorEndOverlap, Hit, Destroyed, ActivateAbility, ActivateAbilityFromEvent, OnEndAbility, CommitExecute.
CustomEvent -eventName= (required) User-defined custom event. Works correctly via BAA.
InputAction -inputAction= (optional) Legacy K2Node_InputAction.

WARNING: Event type cannot create BlueprintImplementableEvent overrides. The node compiles but the override is never generated. At runtime, FindFunction() returns the base C++ stub. See Known Limitations. Use the editor's function override list for these events; BAA can handle all subsequent wiring.

Flow control types#

Type Extra Params Description
Branch (none) If/Then/Else branching.
Sequence (none) Execution sequence (Then 0, Then 1, ...).
ForEachLoop (none) For-each array loop (macro).
DoOnce (none) Execute once (macro).
Gate (none) Gate flow control (macro).
FlipFlop (none) Alternating execution (macro).
IsValid (none) Object validity check (macro).
WhileLoop (none) While loop (macro).

Variable types#

Type Extra Params Description
GetVariable -varName= (required) Get a Blueprint member variable.
SetVariable -varName= (required) Set a Blueprint member variable.

Cast type#

Type Extra Params Description
Cast -targetClass= (required) Dynamic cast. Tries exact match first, then U/A/F prefixes.

Struct types#

Type Extra Params Description
MakeArray (none) Make array literal.
MakeStruct -structType= (required) Make struct. Tries name, then F prefix.
BreakStruct -structType= (required) Break struct into individual fields.
SetFieldsInStruct -structType= (required) Set individual struct fields (preserves unset fields).

Macro and routing types#

Type Extra Params Description
MacroInstance -macro= (required), -macroLibrary= (optional, defaults to StandardMacros) Generic macro instantiation.
Knot (none) Reroute node for cleaner wiring.
Reroute (none) Alias for Knot.
Self (none) Get Reference to Self.

Async / latent types#

Type Extra Params Description
LatentTask -class= (required), -function= (required) Async task node. Resolves LatentAbilityCall (GAS) or LatentGameplayTaskCall.
LatentAbilityCall (same as LatentTask) Alias for LatentTask.

Operator types#

Type Extra Params Description
Operator -operator= (required) Math, comparison, or boolean operator.

Operator values (case-insensitive, symbol aliases accepted):

Name Symbol UE Function
Add + Add_DoubleDouble
Subtract - Subtract_DoubleDouble
Multiply * Multiply_DoubleDouble
Divide / Divide_DoubleDouble
Equal == EqualEqual_DoubleDouble
NotEqual != NotEqual_DoubleDouble
Greater > Greater_DoubleDouble
GreaterEqual >= GreaterEqual_DoubleDouble
Less < Less_DoubleDouble
LessEqual <= LessEqual_DoubleDouble
And && BooleanAND
Or || BooleanOR
Not ! Not_PreBool

Switch types#

Type Extra Params Description
SwitchEnum -enumType= (required) Switch on enum value.
SwitchInteger (none) Switch on integer.
SwitchGameplayTag (none) Switch on gameplay tag.

Delegate / event binding types#

Type Extra Params Description
AddDelegate -delegateName= (required) Bind function to multicast delegate.
RemoveDelegate -delegateName= (required) Unbind function from delegate.
AssignDelegate -delegateName= (optional) Assign delegate node.
ComponentBoundEvent -componentName= (required), -delegateName= (required) Bind to component event (e.g., OnComponentBeginOverlap). Blueprint must be compiled first.

Utility types#

Type Extra Params Description
Comment -text= (optional), -width= (optional, default 400), -height= (optional, default 100) Comment box.
FormatText -format= (optional, e.g., "{Name} has {Health} HP") Format text with wildcard arguments.
Timeline -name= (optional, defaults to "NewTimeline") Timeline node.

Generic fallback#

Type Extra Params Description
Generic -nodeClass= (required), -properties= (optional JSON object) Any UEdGraphNode / UK2Node subclass. Searches BlueprintGraph, UnrealEd, GameplayAbilitiesEditor, GameplayTasksEditor, and more. Accepts /Script/Module.ClassName paths.

Use Generic only when no specific type above matches your needs.


connect#

Connect two node pins together.

Param Required Description
-asset= Yes Blueprint asset path.
-graph= No Graph name.
-srcnode= Yes Source node GUID (8-char, from detail format).
-srcpin= Yes Source pin name.
-dstnode= Yes Destination node GUID (8-char).
-dstpin= Yes Destination pin name.

Execution flow: Source then pin -> destination exec pin. Data flow: Source output pin -> destination input pin.

Pin names are the display names shown in the detail export (e.g., then, execute, ReturnValue, Condition, InString).


disconnect#

Break pin connections on a node.

Param Required Description
-asset= Yes Blueprint asset path.
-graph= No Graph name.
-node= Yes Node GUID (8-char).
-pin= Yes Pin name to disconnect.
-targetnode= No Specific target node GUID (breaks only this one link).
-targetpin= No Specific target pin name (paired with -targetnode=).

Without -targetnode / -targetpin: breaks all connections on the specified pin. With them: breaks only the specific link, leaving other connections intact.


set-pin-default#

Set the default value on a node pin.

Param Required Description
-asset= Yes Blueprint asset path.
-graph= No Graph name.
-node= Yes Node GUID (8-char).
-pin= Yes Pin name.
-value= Yes Value as string. Empty string "" is valid.

Values are always strings, even for numeric types. Examples:

  • Boolean: "true" or "false"
  • Integer: "42"
  • Float: "3.14"
  • Name/String: "Hello World"
  • Enum: "EnumValueName"
  • Struct: "(X=1.0,Y=2.0,Z=3.0)" (UE struct text format)

remove-node#

Remove a node from a graph. All connections to/from the node are broken first.

Param Required Description
-asset= Yes Blueprint asset path.
-graph= No Graph name.
-node= Yes Node GUID (8-char).

Practical examples#

Example 1: BeginPlay prints "Hello World"#

Add a BeginPlay event and a PrintString node, then connect them.

Step 1: Add the nodes:

# Add BeginPlay event
curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{
    "verb": "add-node",
    "args": {
      "asset": "/Game/Blueprints/BP_Player",
      "type": "Event",
      "eventName": "BeginPlay",
      "posX": "0",
      "posY": "0"
    }
  }'
# Response includes nodeGuid, e.g., "A1B2C3D4"

# Add PrintString
curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{
    "verb": "add-node",
    "args": {
      "asset": "/Game/Blueprints/BP_Player",
      "type": "PrintString",
      "posX": "300",
      "posY": "0"
    }
  }'
# Response includes nodeGuid, e.g., "E5F6A7B8"

Step 2: Set the print string value:

curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{
    "verb": "set-pin-default",
    "args": {
      "asset": "/Game/Blueprints/BP_Player",
      "node": "E5F6A7B8",
      "pin": "InString",
      "value": "Hello World"
    }
  }'

Step 3: Connect BeginPlay exec to PrintString exec:

curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{
    "verb": "connect",
    "args": {
      "asset": "/Game/Blueprints/BP_Player",
      "srcnode": "A1B2C3D4",
      "srcpin": "then",
      "dstnode": "E5F6A7B8",
      "dstpin": "execute"
    }
  }'

Step 4: Compile and save:

curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{"verb": "compile", "args": {"asset": "/Game/Blueprints/BP_Player"}}'

curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{"verb": "save", "args": {"asset": "/Game/Blueprints/BP_Player"}}'

Example 2: Branch based on a variable#

Read a boolean variable bIsAlive and branch on it.

# Using batch to do it all in one commandlet launch
curl -X POST http://localhost:7850/baa/v1/batch \
  -H "Content-Type: application/json" \
  -d '{
    "defaultAsset": "/Game/Blueprints/BP_Player",
    "operations": [
      {
        "verb": "add-node",
        "args": {"type": "GetVariable", "varName": "bIsAlive", "posX": "0", "posY": "100"}
      },
      {
        "verb": "add-node",
        "args": {"type": "Branch", "posX": "250", "posY": "0"}
      }
    ]
  }'
# Returns GUIDs for both nodes. Then connect the GetVariable output
# to the Branch Condition pin:

After getting the GUIDs from the batch response (e.g., GetVariable = "C1D2E3F4", Branch = "G5H6I7J8"):

curl -X POST http://localhost:7850/baa/v1/execute \
  -H "Content-Type: application/json" \
  -d '{
    "verb": "connect",
    "args": {
      "asset": "/Game/Blueprints/BP_Player",
      "srcnode": "C1D2E3F4",
      "srcpin": "bIsAlive",
      "dstnode": "G5H6I7J8",
      "dstpin": "Condition"
    }
  }'

Example 3: Batch: add, connect, compile, save in one call#

This example adds a Delay node after a CustomEvent and compiles + saves, all in a single commandlet launch:

curl -X POST http://localhost:7850/baa/v1/batch \
  -H "Content-Type: application/json" \
  -d '{
    "defaultAsset": "/Game/Blueprints/BP_Enemy",
    "operations": [
      {
        "verb": "add-node",
        "args": {"type": "CustomEvent", "eventName": "OnSpawned", "posX": "0", "posY": "0"},
        "id": "evt"
      },
      {
        "verb": "add-node",
        "args": {"type": "Delay", "posX": "300", "posY": "0"},
        "id": "delay"
      },
      {
        "verb": "set-pin-default",
        "args": {"node": "$evt.nodeGuid", "pin": "Duration", "value": "2.0"},
        "comment": "This will fail if Delay Duration pin is not named Duration -- check detail export"
      },
      {
        "verb": "connect",
        "args": {
          "srcnode": "$evt.nodeGuid", "srcpin": "then",
          "dstnode": "$delay.nodeGuid", "dstpin": "execute"
        }
      },
      {"verb": "compile"},
      {"verb": "save"}
    ]
  }'

Note the use of $evt.nodeGuid and $delay.nodeGuid. Batch operations can reference results from earlier steps using $<id>.<field> syntax.

Example 4: Commandlet invocation (no HTTP server)#

When the editor and BAAServer are not running, use the one-shot commandlet:

"C:\Unreal\UE571Source\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" \
  "C:\Unreal\ProjectLeyline\CombatDemo\CombatDemo.uproject" \
  -run=BlueprintAIAssistant \
  -verb=add-node \
  -asset=/Game/Blueprints/BP_Player \
  -type=PrintString \
  -posX=300 -posY=0 \
  -compile -save \
  -nullrhi -nosplash -nosound -unattended

The -compile -save flags cause the commandlet to compile and save the Blueprint after adding the node, all in a single launch.


Tips#

  • Always get GUIDs first. Before connect, disconnect, set-pin-default, or remove-node, export the graph with --format=detail to get current GUIDs.
  • Use batch for multi-step operations. Each commandlet launch takes 30-60 seconds. Batching avoids repeated startup costs.
  • Pin names matter. Use the exact pin display name from the detail export. Common exec pins: execute (input), then (output). Common data pins vary by node type.
  • Idempotent adds. Running add-node twice with the same type and position returns the existing node rather than creating a duplicate.
  • Compile before ComponentBoundEvent. The Blueprint must be compiled before adding ComponentBoundEvent nodes so that component metadata is available.