Graph Editing
Graph editing verbs: add-node (40 types), connect, disconnect, set-pin-default, remove-node, trace-path.
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:
- Export the Blueprint with
--format=detail. This appends GUIDs after every node name. - Or use
read-graph -asset=<path> -graph=<name> --format=detail. - Or use
find-nodesto 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, orremove-node, export the graph with--format=detailto 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
detailexport. Common exec pins:execute(input),then(output). Common data pins vary by node type. - Idempotent adds. Running
add-nodetwice 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
ComponentBoundEventnodes so that component metadata is available.