AGIR
An Animation Blueprint is a binary node graph — state machines, cached poses, blend spaces,
layered blends, linked anims, transition rules — that you can normally only read by opening the
Anim Graph editor and clicking through it node by node. AGIR is that same graph written out as plain
text: every node, pose link, state, and transition as a compact document you can read in a diff, review
in a pull request, and compile straight back into the asset. It round-trips through
anim.decompile_agir and anim.compile_agir.
Why it matters
Diffable in version control
A .uasset shows up as an opaque blob in every review. Decompile the AnimBP to AGIR and a one-node change becomes a one-line diff — you see exactly which transition rule, crossfade duration, or blend mode moved. The same text lands in the asset-dump cache as agir.txt, so git log -p and grep both work on it.
Reviewable like code
State machines, cached-pose wiring, and blend graphs read top-to-bottom as text. A reviewer can reason about the graph’s structure without launching the editor or trusting a screenshot.
A format an AI can author
Field names are the engine’s own reflection CamelCase keys, not invented aliases, so an assistant generates or rewrites a graph from the same vocabulary the engine uses — then compiles it back into the asset. Full round-trip: this IR is not read-only.
Faithful and deterministic
Node GUIDs and canvas positions ride along in guid= and @(x, y) suffixes, so decompile → edit → compile preserves identity and layout. State machines, blend spaces, cached poses, layered blends, linked anims, and state aliases all survive the trip. Round-trip is logical: node colors and comments are dropped, structure and layout are kept.
A taste
A locomotion state machine decompiled straight out of the Anim Graph. Node types are their full
script path; %sequence_player_0 and %state_machine_0 are block-local ids;
an output line is the pose that flows out of a block.
entry anim_graph AnimGraph {
state_machine Locomotion { @(-512, -64)
state Idle { @(128, 0)
%sequence_player_0 = call `/Script/AnimGraph.AnimGraphNode_SequencePlayer`(Sequence: "/App/Anim/MM_Idle.MM_Idle") @(-256, -16)
output %sequence_player_0
}
state `Walk / Run` { @(384, 0)
%blend_space_player_0 = call `/Script/AnimGraph.AnimGraphNode_BlendSpacePlayer`(BlendSpace: "/App/Anim/BS_WalkRun.BS_WalkRun") @(-256, -16)
output %blend_space_player_0
}
transition Idle -> `Walk / Run` priority=1 rule=Idle_to_WalkRun crossfade_duration=0.2 blend_mode=2 logic_type=0
}
output %state_machine_0
}
How your assistant uses it
Your assistant reads a graph out as AGIR with anim.decompile_agir, edits the one line you
asked about, and compiles the edited text back into the same asset with anim.compile_agir
— no manual canvas clicking.
You: Slow the Idle → Walk crossfade in ABP_Manny to 0.35s.
call("anim.decompile_agir", {assetPath:"/App/Anim/ABP_Manny"})
→ {text:"entry anim_graph AnimGraph { ... crossfade_duration=0.2 ... }"}
call("anim.compile_agir", {context:"/App/Anim/ABP_Manny", mode:"Replace", save:true,
text:"entry anim_graph AnimGraph { ... crossfade_duration=0.35 ... }"})
→ {mode:"replace", assetPath:"/App/Anim/ABP_Manny", warnings:[]}
Done. The Idle → Walk crossfade is now 0.35s.
UAnimBlueprint graphs on UE 5.6.
Round-trip coverage spans state machines, blend spaces, cached poses, layered/linked anims, custom
transitions, and state aliases. Field names follow the engine’s reflection CamelCase, so decompile
an example of your own asset and mirror its exact keys before authoring a graph by hand.